Merge "Adjust tap targets in history" into rvc-dev am: 7c4557bec8 am: ceac4f44b9

Change-Id: Ib835a71df1f54be8544e4d85f872dd9e43defcba
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index f07c66c..b0c3b65 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -315,10 +315,7 @@
                         .setButton1Text(R.string.clear_user_data_text)
                         .setButton1Icon(R.drawable.ic_settings_delete);
             }
-            mButtonsPref
-                    .setButton1Text(R.string.clear_user_data_text)
-                    .setButton1Icon(R.drawable.ic_settings_delete)
-                    .setButton1OnClickListener(v -> handleClearDataClick());
+            mButtonsPref.setButton1OnClickListener(v -> handleClearDataClick());
         }
 
         if (mAppsControlDisallowedBySystem) {
diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
index 1078a21..6a13a96 100644
--- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
@@ -97,7 +97,7 @@
             // New version - uses a separate screen.
             new SubSettingLauncher(mFragment.getContext())
                     .setDestination(UsbDetailsFragment.class.getName())
-                    .setTitleRes(R.string.device_details_title)
+                    .setTitleRes(R.string.usb_preference)
                     .setSourceMetricsCategory(mFragment.getMetricsCategory())
                     .launch();
             return true;
diff --git a/src/com/android/settings/datetime/timezone/OWNERS b/src/com/android/settings/datetime/timezone/OWNERS
index 02cf23c..7ad770a 100644
--- a/src/com/android/settings/datetime/timezone/OWNERS
+++ b/src/com/android/settings/datetime/timezone/OWNERS
@@ -1,6 +1,5 @@
 # Default reviewers for this and subdirectories.
 vichang@google.com
-tobiast@google.com
 nfuller@google.com
 
 # Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index 626390a..2eda9d9 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -176,7 +176,11 @@
 
     private void dismissProgressBar() {
         if (mProgressDialog != null && mProgressDialog.isShowing()) {
-            mProgressDialog.dismiss();
+            try {
+                mProgressDialog.dismiss();
+            } catch (IllegalArgumentException e) {
+                // Ignore exception since the dialog will be gone anyway.
+            }
         }
     }
 
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 14450a3..fbb2c41 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -156,8 +156,13 @@
 
     private void createPanelContent() {
         final FragmentActivity activity = getActivity();
+        if (activity == null) {
+            return;
+        }
+
         if (mLayoutView == null) {
             activity.finish();
+            return;
         }
 
         mPanelSlices = mLayoutView.findViewById(R.id.panel_parent_layout);
@@ -183,6 +188,7 @@
 
         if (mPanel == null) {
             activity.finish();
+            return;
         }
 
         mPanel.registerCallback(new LocalPanelCallback());
diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java
index 373d6a9..afa7cdd 100644
--- a/src/com/android/settings/users/EditUserInfoController.java
+++ b/src/com/android/settings/users/EditUserInfoController.java
@@ -95,8 +95,7 @@
     }
 
     public void onSaveInstanceState(Bundle outState) {
-        if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing()
-                && mEditUserPhotoController != null) {
+        if (mEditUserInfoDialog != null && mEditUserPhotoController != null) {
             // Bitmap cannot be stored into bundle because it may exceed parcel limit
             // Store it in a temporary file instead
             File file = mEditUserPhotoController.saveNewUserPhotoBitmap();
diff --git a/src/com/android/settings/vpn2/ConfigDialog.java b/src/com/android/settings/vpn2/ConfigDialog.java
index a0aac19..4c50b74 100644
--- a/src/com/android/settings/vpn2/ConfigDialog.java
+++ b/src/com/android/settings/vpn2/ConfigDialog.java
@@ -342,14 +342,14 @@
         mView.findViewById(R.id.vpn_proxy_fields).setVisibility(visible);
     }
 
-    private boolean hasAdvancedOptionsEnabled() {
+    private boolean isAdvancedOptionsEnabled() {
         return mSearchDomains.getText().length() > 0 || mDnsServers.getText().length() > 0 ||
                     mRoutes.getText().length() > 0 || mProxyHost.getText().length() > 0
                     || mProxyPort.getText().length() > 0;
     }
 
     private void configureAdvancedOptionsVisibility() {
-        if (mShowOptions.isChecked() || hasAdvancedOptionsEnabled()) {
+        if (mShowOptions.isChecked() || isAdvancedOptionsEnabled()) {
             mView.findViewById(R.id.options).setVisibility(View.VISIBLE);
             mShowOptions.setVisibility(View.GONE);
 
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 735fecc..a59f137 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -34,6 +34,7 @@
 import android.telephony.ims.ImsMmTelManager;
 import android.telephony.ims.ProvisioningManager;
 import android.text.TextUtils;
+import android.text.util.Linkify;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -183,6 +184,7 @@
 
         mEmptyView = getView().findViewById(android.R.id.empty);
         setEmptyView(mEmptyView);
+        mEmptyView.setAutoLinkMask(Linkify.WEB_URLS);
         final Resources res = getResourcesForSubId();
         final String emptyViewText = res.getString(R.string.wifi_calling_off_explanation,
                 res.getString(R.string.wifi_calling_off_explanation_2));
diff --git a/tests/perftests/AndroidManifest.xml b/tests/perftests/AndroidManifest.xml
index 4ce6a54..8aae24a 100644
--- a/tests/perftests/AndroidManifest.xml
+++ b/tests/perftests/AndroidManifest.xml
@@ -22,7 +22,7 @@
     </application>
 
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.settings"
+        android:targetPackage="com.android.settings.tests.perf"
         android:label="Settings Performance Test Cases">
     </instrumentation>
 
diff --git a/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java b/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java
index 5140be2..ec2a311 100644
--- a/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java
+++ b/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java
@@ -15,8 +15,17 @@
  */
 package com.android.settings.tests.perf;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static junit.framework.TestCase.fail;
+
 import android.app.Instrumentation;
 import android.os.Bundle;
+import android.util.Log;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiSelector;
+import android.support.test.uiautomator.Until;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
@@ -26,23 +35,119 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 @RunWith(AndroidJUnit4.class)
 public class LaunchSettingsTest {
+    private static class Page {
+        String action;
+        String displayName;
+        String title;
+
+        Page(String action, String displayName, String title) {
+            this.action = action;
+            this.displayName = displayName;
+            this.title = title;
+        }
+    }
+
+    private static final int TIME_OUT = 5000;
+    private static final int TEST_TIME = 10;
+    private static final Pattern PATTERN = Pattern.compile("TotalTime:\\s[0-9]*");
+    private static final Page[] PAGES;
+
+    static {
+        PAGES = new Page[]{
+                new Page("android.settings.SETTINGS", "Search settings", "Settings"),
+                new Page("android.settings.WIFI_SETTINGS", "Use Wi‑Fi", "Wi-Fi"),
+                new Page("android.settings.BLUETOOTH_SETTINGS", "Connected devices", "BlueTooth"),
+                new Page("android.settings.APPLICATION_SETTINGS", "App info", "Application"),
+                new Page("android.intent.action.POWER_USAGE_SUMMARY", "Battery", "Battery")
+        };
+    }
+
+    private Bundle mBundle;
+    private UiDevice mDevice;
+    private Instrumentation mInstrumentation;
+    private Map<String, ArrayList<Integer>> mResult;
 
     @Before
     public void setUp() throws Exception {
+        mBundle = new Bundle();
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        mResult = new LinkedHashMap<>();
+        mDevice.pressHome();
+        mDevice.waitForIdle(TIME_OUT);
+
+        for (Page page : PAGES) {
+            mResult.put(page.title, new ArrayList<Integer>());
+        }
     }
 
     @After
     public void tearDown() throws Exception {
+        putResultToBundle();
+        mInstrumentation.sendStatus(0, mBundle);
     }
 
     @Test
-    public void testReportMetrics() throws Exception {
-        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
-        final Bundle result = new Bundle();
-        result.putString("LaunchSettingsTest_metric_key1", "1000");
-        result.putString("LaunchSettingsTest_metric_key2", "5000");
-        instrumentation.sendStatus(0, result);
+    public void settingsPerformanceTest() throws Exception {
+        for (int i = 0; i < TEST_TIME; i++) {
+            for (Page page : PAGES) {
+                executePreformanceTest(page.action, page.displayName, page.title);
+            }
+        }
     }
-}
+
+    private void executePreformanceTest(String action, String displayName, String title)
+            throws Exception {
+        final String mString = mDevice.executeShellCommand("am start -W -a" + action);
+        mDevice.wait(Until.findObject(By.text(displayName)), TIME_OUT);
+        handleLaunchResult(title, mString);
+        closeApp();
+        mDevice.waitForIdle(TIME_OUT);
+    }
+
+    private void handleLaunchResult(String title, String s) {
+        Matcher mMatcher = PATTERN.matcher(s);
+        if (mMatcher.find()) {
+            mResult.get(title).add(Integer.valueOf(mMatcher.group().split("\\s")[1]));
+        } else {
+            fail("Some pages can't be found");
+        }
+    }
+
+    private void closeApp() throws Exception {
+        mDevice.executeShellCommand("am force-stop com.android.settings");
+        Thread.sleep(1000);
+    }
+
+    private void putResultToBundle() {
+        for (String string : mResult.keySet()) {
+            mBundle.putString(String.format("LaunchSettingsTest_%s_%s", string, "max"),
+                    getMax(mResult.get(string)));
+            mBundle.putString(String.format("LaunchSettingsTest_%s_%s", string, "min"),
+                    getMin(mResult.get(string)));
+            mBundle.putString(String.format("LaunchSettingsTest_%s_%s", string, "avg"),
+                    getAvg(mResult.get(string)));
+        }
+    }
+
+    private String getMax(ArrayList<Integer> launchResult) {
+        return String.format("%s", launchResult.isEmpty() ? "null" : Collections.max(launchResult));
+    }
+
+    private String getMin(ArrayList<Integer> launchResult) {
+        return String.format("%s", launchResult.isEmpty() ? "null" : Collections.min(launchResult));
+    }
+
+    private String getAvg(ArrayList<Integer> launchResult) {
+        return String.valueOf((int) launchResult.stream().mapToInt(i -> i).average().orElse(0));
+    }
+}
\ No newline at end of file