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);