Show terms of service before install GSI/DSU

Test: settings->developer option->debug::DSU Loader
Bug: 144248769
Change-Id: Id5fa7f88544191736eb0c5db6334fd367c1be426
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index df87bf5..d06a0f2 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1949,6 +1949,9 @@
         <activity android:name=".development.DSULoader"
                   android:label="Select DSU Package"
                   android:theme="@android:style/Theme.DeviceDefault.Light.Dialog" />
+        <activity android:name=".development.DSUTermsOfServiceActivity"
+                  android:label="Terms of Service"
+                  android:theme="@android:style/Theme.DeviceDefault.Light.Dialog" />
 
         <activity android:name="Settings$WebViewAppPickerActivity"
                   android:label="@string/select_webview_provider_dialog_title" />
diff --git a/res/layout/dsu_terms_of_service.xml b/res/layout/dsu_terms_of_service.xml
new file mode 100644
index 0000000..8c75557
--- /dev/null
+++ b/res/layout/dsu_terms_of_service.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginTop="16dp"
+        android:layout_weight="1" >
+        <TextView android:id="@+id/tos_content"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dip"
+            android:layout_marginBottom="16dip"
+            android:textAppearance="?android:attr/textAppearanceSmall" />
+    </ScrollView>
+
+    <Button android:id="@+id/accept"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="16dip"
+        android:layout_marginBottom="16dip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/assistant_security_warning_agree"
+        android:gravity="center" />
+
+</LinearLayout>
diff --git a/src/com/android/settings/development/DSULoader.java b/src/com/android/settings/development/DSULoader.java
index 33458ea..36ce785 100644
--- a/src/com/android/settings/development/DSULoader.java
+++ b/src/com/android/settings/development/DSULoader.java
@@ -195,6 +195,7 @@
         private static final String OS_VERSION = "os_version";
         private static final String VNDK = "vndk";
         private static final String PUBKEY = "pubkey";
+        private static final String TOS = "tos";
 
         String mName = null;
         String mDetails = null;
@@ -202,6 +203,7 @@
         int mOsVersion = -1;
         int[] mVndk = null;
         String mPubKey = "";
+        URL mTosUrl = null;
         URL mUri;
 
         DSUPackage(JSONObject jsn) throws JSONException, MalformedURLException {
@@ -223,6 +225,9 @@
             if (jsn.has(PUBKEY)) {
                 mPubKey = jsn.getString(PUBKEY);
             }
+            if (jsn.has(TOS)) {
+                mTosUrl = new URL(jsn.getString(TOS));
+            }
         }
 
         int dessertNumber(String s, int base) {
@@ -318,10 +323,10 @@
             Slog.e(TAG, e.toString());
             return;
         }
-        new Thread(new Fetcher(url)).start();
         mAdapter = new DSUPackageListAdapter(this);
         setListAdapter(mAdapter);
         mAdapter.add(getResources().getString(R.string.dsu_loader_loading));
+        new Thread(new Fetcher(url)).start();
     }
 
     @Override
@@ -329,12 +334,25 @@
         Object selected = mAdapter.getItem(position);
         if (selected instanceof DSUPackage) {
             DSUPackage dsu = (DSUPackage) selected;
-            Intent intent = new Intent();
-            intent.setClassName(
-                    "com.android.dynsystem", "com.android.dynsystem.VerificationActivity");
-            intent.setData(Uri.parse(dsu.mUri.toString()));
-            intent.putExtra("KEY_PUBKEY", dsu.mPubKey);
-            startActivity(intent);
+            mAdapter.clear();
+            mAdapter.add(getResources().getString(R.string.dsu_loader_loading));
+            new Thread(new Runnable() {
+                public void run() {
+                    String termsOfService = "";
+                    if (dsu.mTosUrl != null) {
+                        try {
+                            termsOfService = readAll(dsu.mTosUrl);
+                        } catch (IOException e) {
+                            Slog.e(TAG, e.toString());
+                        }
+                    }
+                    Intent intent = new Intent(DSULoader.this, DSUTermsOfServiceActivity.class);
+                    intent.putExtra(DSUTermsOfServiceActivity.KEY_TOS, termsOfService);
+                    intent.setData(Uri.parse(dsu.mUri.toString()));
+                    intent.putExtra("KEY_PUBKEY", dsu.mPubKey);
+                    startActivity(intent);
+                }
+            }).start();
         }
         finish();
     }
diff --git a/src/com/android/settings/development/DSUTermsOfServiceActivity.java b/src/com/android/settings/development/DSUTermsOfServiceActivity.java
new file mode 100644
index 0000000..f88d4ef
--- /dev/null
+++ b/src/com/android/settings/development/DSUTermsOfServiceActivity.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+/** Activity shows terms of service for a given DSU package */
+public class DSUTermsOfServiceActivity extends Activity {
+    public static final String KEY_TOS = "KEY_TOS";
+
+    private void installDSU(Intent intent) {
+        intent.setClassName("com.android.dynsystem", "com.android.dynsystem.VerificationActivity");
+        startActivity(intent);
+        finish();
+    }
+
+    @Override
+    protected void onCreate(Bundle bundle) {
+        super.onCreate(bundle);
+        setContentView(R.layout.dsu_terms_of_service);
+        TextView tv = findViewById(R.id.tos_content);
+        Intent intent = getIntent();
+        if (!intent.hasExtra(KEY_TOS)) {
+            finish();
+        }
+        String tos = intent.getStringExtra(KEY_TOS);
+        if (TextUtils.isEmpty(tos)) {
+            installDSU(intent);
+        } else {
+            tv.setText(tos);
+            Button accept = findViewById(R.id.accept);
+            accept.setOnClickListener(
+                    new Button.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            installDSU(intent);
+                        }
+                    });
+        }
+    }
+}