Merge "Fix a strict mode violation in SystemUpdatePrefController" into pi-dev
diff --git a/src/com/android/settings/search/DeviceIndexFeatureProvider.java b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
index d529b97..a171844 100644
--- a/src/com/android/settings/search/DeviceIndexFeatureProvider.java
+++ b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
@@ -47,7 +47,9 @@
             List<String> keywords);
 
     default void updateIndex(Context context, boolean force) {
-        if (!isIndexingEnabled()) return;
+        if (!isIndexingEnabled()) {
+            return;
+        }
 
         if (!force && Objects.equals(
                 Settings.Secure.getString(context.getContentResolver(), INDEX_VERSION), VERSION)) {
@@ -55,9 +57,9 @@
             return;
         }
 
-        ComponentName jobComponent = new ComponentName(context.getPackageName(),
+        final ComponentName jobComponent = new ComponentName(context.getPackageName(),
                 DeviceIndexUpdateJobService.class.getName());
-        int jobId = context.getResources().getInteger(R.integer.device_index_update);
+        final int jobId = context.getResources().getInteger(R.integer.device_index_update);
         // Schedule a job so that we know it'll be able to complete, but try to run as
         // soon as possible.
         context.getSystemService(JobScheduler.class).schedule(
diff --git a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
index 55448e2..22742e5 100644
--- a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
+++ b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
@@ -23,6 +23,7 @@
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
+import android.util.Log;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.Utils;
@@ -32,10 +33,14 @@
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+
 public class VisiblePatternProfilePreferenceController extends TogglePreferenceController
         implements LifecycleObserver, OnResume {
 
     private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
+    private static final String TAG = "VisPtnProfPrefCtrl";
 
     private final LockPatternUtils mLockPatternUtils;
     private final UserManager mUm;
@@ -45,7 +50,7 @@
     private Preference mPreference;
 
     public VisiblePatternProfilePreferenceController(Context context) {
-         this(context, null /* lifecycle */);
+        this(context, null /* lifecycle */);
     }
 
     // TODO (b/73074893) Replace this constructor without Lifecycle using setter method instead.
@@ -63,12 +68,25 @@
 
     @Override
     public int getAvailabilityStatus() {
-        if (mLockPatternUtils.isSecure(mProfileChallengeUserId)
-                && mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId)
-                == PASSWORD_QUALITY_SOMETHING) {
-            return AVAILABLE;
+        final FutureTask<Integer> futureTask = new FutureTask<>(
+                // Put the API call in a future to avoid StrictMode violation.
+                () -> {
+                    final boolean isSecure = mLockPatternUtils.isSecure(mProfileChallengeUserId);
+                    final boolean hasPassword = mLockPatternUtils
+                            .getKeyguardStoredPasswordQuality(mProfileChallengeUserId)
+                            == PASSWORD_QUALITY_SOMETHING;
+                    if (isSecure && hasPassword) {
+                        return AVAILABLE;
+                    }
+                    return DISABLED_FOR_USER;
+                });
+        try {
+            futureTask.run();
+            return futureTask.get();
+        } catch (InterruptedException | ExecutionException e) {
+            Log.w(TAG, "Error getting lock pattern state.");
+            return DISABLED_FOR_USER;
         }
-        return DISABLED_FOR_USER;
     }
 
     @Override
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 6d6c0ec..af165da 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -26,7 +26,6 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.net.wifi.WifiManager;
-import android.os.StrictMode;
 import android.provider.Settings;
 import android.provider.SettingsSlicesContract;
 import android.support.annotation.VisibleForTesting;
@@ -155,11 +154,6 @@
 
     @Override
     public Slice onBindSlice(Uri sliceUri) {
-        // TODO: Remove this when all slices are not breaking strict mode
-        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
-                .permitAll()
-                .build());
-
         String path = sliceUri.getPath();
         // If adding a new Slice, do not directly match Slice URIs.
         // Use {@link SlicesDatabaseAccessor}.
diff --git a/src/com/android/settings/system/SystemUpdatePreferenceController.java b/src/com/android/settings/system/SystemUpdatePreferenceController.java
index 7bc76a2..88715bf 100644
--- a/src/com/android/settings/system/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/system/SystemUpdatePreferenceController.java
@@ -35,6 +35,9 @@
 import com.android.settings.Utils;
 import com.android.settings.core.BasePreferenceController;
 
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+
 public class SystemUpdatePreferenceController extends BasePreferenceController {
 
     private static final String TAG = "SysUpdatePrefContr";
@@ -84,9 +87,19 @@
 
     @Override
     public CharSequence getSummary() {
-        final Bundle updateInfo = mUpdateManager.retrieveSystemUpdateInfo();
         CharSequence summary = mContext.getString(R.string.android_version_summary,
                 Build.VERSION.RELEASE);
+        final FutureTask<Bundle> bundleFutureTask = new FutureTask<>(
+                // Put the API call in a future to avoid StrictMode violation.
+                () -> mUpdateManager.retrieveSystemUpdateInfo());
+        final Bundle updateInfo;
+        try {
+            bundleFutureTask.run();
+            updateInfo = bundleFutureTask.get();
+        } catch (InterruptedException | ExecutionException e) {
+            Log.w(TAG, "Error getting system update info.");
+            return summary;
+        }
         switch (updateInfo.getInt(SystemUpdateManager.KEY_STATUS)) {
             case SystemUpdateManager.STATUS_WAITING_DOWNLOAD:
             case SystemUpdateManager.STATUS_IN_PROGRESS:
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 0b9961a..a0bd33a 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -28,6 +28,7 @@
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
+import android.os.StrictMode;
 import android.provider.SettingsSlicesContract;
 
 import com.android.settings.testutils.DatabaseTestUtils;
@@ -53,16 +54,17 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 public class SettingsSliceProviderTest {
 
-    private final String KEY = "KEY";
-    private final String INTENT_PATH = SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY;
-    private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY;
-    private final String TITLE = "title";
-    private final String SUMMARY = "summary";
-    private final String SCREEN_TITLE = "screen title";
-    private final String FRAGMENT_NAME = "fragment name";
-    private final int ICON = 1234; // I declare a thumb war
-    private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
-    private final String PREF_CONTROLLER = FakeToggleController.class.getName();
+    private static final String KEY = "KEY";
+    private static final String INTENT_PATH =
+            SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY;
+    private static final String TITLE = "title";
+    private static final String SUMMARY = "summary";
+    private static final String SCREEN_TITLE = "screen title";
+    private static final String FRAGMENT_NAME = "fragment name";
+    private static final int ICON = 1234; // I declare a thumb war
+    private static final Uri URI = Uri.parse("content://com.android.settings.slices/test");
+    private static final String PREF_CONTROLLER = FakeToggleController.class.getName();
+
     private Context mContext;
     private SettingsSliceProvider mProvider;
     private SQLiteDatabase mDb;
@@ -148,6 +150,18 @@
     }
 
     @Test
+    public void onBindSlice_shouldNotOverrideStrictMode() {
+        final StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy();
+        SliceData data = getDummyData();
+        mProvider.mSliceWeakDataCache.put(data.getUri(), data);
+        mProvider.onBindSlice(data.getUri());
+
+        final StrictMode.ThreadPolicy newThreadPolicy = StrictMode.getThreadPolicy();
+
+        assertThat(newThreadPolicy.toString()).isEqualTo(oldThreadPolicy.toString());
+    }
+
+    @Test
     public void testLoadSlice_cachedEntryRemovedOnUnpin() {
         SliceData data = getDummyData();
         mProvider.mSliceDataCache.put(data.getUri(), data);