Fix a strict mode violation in SystemUpdatePrefController

Change-Id: I4770b878b6f69318f08f8974c5c4d2690c5611d4
Merged-In: I4770b878b6f69318f08f8974c5c4d2690c5611d4
Fixes: 78626509
Test: robotests
This commit is contained in:
Fan Zhang
2018-05-09 15:42:00 -07:00
parent 3a9fbac582
commit 4ca363470b
5 changed files with 67 additions and 26 deletions

View File

@@ -47,7 +47,9 @@ public interface DeviceIndexFeatureProvider {
List<String> keywords); List<String> keywords);
default void updateIndex(Context context, boolean force) { default void updateIndex(Context context, boolean force) {
if (!isIndexingEnabled()) return; if (!isIndexingEnabled()) {
return;
}
if (!force && Objects.equals( if (!force && Objects.equals(
Settings.Secure.getString(context.getContentResolver(), INDEX_VERSION), VERSION)) { Settings.Secure.getString(context.getContentResolver(), INDEX_VERSION), VERSION)) {
@@ -55,9 +57,9 @@ public interface DeviceIndexFeatureProvider {
return; return;
} }
ComponentName jobComponent = new ComponentName(context.getPackageName(), final ComponentName jobComponent = new ComponentName(context.getPackageName(),
DeviceIndexUpdateJobService.class.getName()); 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 // Schedule a job so that we know it'll be able to complete, but try to run as
// soon as possible. // soon as possible.
context.getSystemService(JobScheduler.class).schedule( context.getSystemService(JobScheduler.class).schedule(

View File

@@ -23,6 +23,7 @@ import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceScreen;
import android.util.Log;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.settings.Utils; import com.android.settings.Utils;
@@ -32,10 +33,14 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.core.lifecycle.events.OnResume;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class VisiblePatternProfilePreferenceController extends TogglePreferenceController public class VisiblePatternProfilePreferenceController extends TogglePreferenceController
implements LifecycleObserver, OnResume { implements LifecycleObserver, OnResume {
private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile"; private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
private static final String TAG = "VisPtnProfPrefCtrl";
private final LockPatternUtils mLockPatternUtils; private final LockPatternUtils mLockPatternUtils;
private final UserManager mUm; private final UserManager mUm;
@@ -63,12 +68,25 @@ public class VisiblePatternProfilePreferenceController extends TogglePreferenceC
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
if (mLockPatternUtils.isSecure(mProfileChallengeUserId) final FutureTask<Integer> futureTask = new FutureTask<>(
&& mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId) // Put the API call in a future to avoid StrictMode violation.
== PASSWORD_QUALITY_SOMETHING) { () -> {
final boolean isSecure = mLockPatternUtils.isSecure(mProfileChallengeUserId);
final boolean hasPassword = mLockPatternUtils
.getKeyguardStoredPasswordQuality(mProfileChallengeUserId)
== PASSWORD_QUALITY_SOMETHING;
if (isSecure && hasPassword) {
return AVAILABLE; return AVAILABLE;
} }
return DISABLED_FOR_USER; 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;
}
} }
@Override @Override

View File

@@ -26,7 +26,6 @@ import android.content.Intent;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.StrictMode;
import android.provider.Settings; import android.provider.Settings;
import android.provider.SettingsSlicesContract; import android.provider.SettingsSlicesContract;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
@@ -155,11 +154,6 @@ public class SettingsSliceProvider extends SliceProvider {
@Override @Override
public Slice onBindSlice(Uri sliceUri) { 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(); String path = sliceUri.getPath();
// If adding a new Slice, do not directly match Slice URIs. // If adding a new Slice, do not directly match Slice URIs.
// Use {@link SlicesDatabaseAccessor}. // Use {@link SlicesDatabaseAccessor}.

View File

@@ -35,6 +35,9 @@ import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class SystemUpdatePreferenceController extends BasePreferenceController { public class SystemUpdatePreferenceController extends BasePreferenceController {
private static final String TAG = "SysUpdatePrefContr"; private static final String TAG = "SysUpdatePrefContr";
@@ -84,9 +87,19 @@ public class SystemUpdatePreferenceController extends BasePreferenceController {
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
final Bundle updateInfo = mUpdateManager.retrieveSystemUpdateInfo();
CharSequence summary = mContext.getString(R.string.android_version_summary, CharSequence summary = mContext.getString(R.string.android_version_summary,
Build.VERSION.RELEASE); 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)) { switch (updateInfo.getInt(SystemUpdateManager.KEY_STATUS)) {
case SystemUpdateManager.STATUS_WAITING_DOWNLOAD: case SystemUpdateManager.STATUS_WAITING_DOWNLOAD:
case SystemUpdateManager.STATUS_IN_PROGRESS: case SystemUpdateManager.STATUS_IN_PROGRESS:

View File

@@ -28,6 +28,7 @@ import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; import android.net.Uri;
import android.os.StrictMode;
import android.provider.SettingsSlicesContract; import android.provider.SettingsSlicesContract;
import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.DatabaseTestUtils;
@@ -53,16 +54,17 @@ import androidx.slice.Slice;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
public class SettingsSliceProviderTest { public class SettingsSliceProviderTest {
private final String KEY = "KEY"; private static final String KEY = "KEY";
private final String INTENT_PATH = SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY; private static final String INTENT_PATH =
private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY; SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY;
private final String TITLE = "title"; private static final String TITLE = "title";
private final String SUMMARY = "summary"; private static final String SUMMARY = "summary";
private final String SCREEN_TITLE = "screen title"; private static final String SCREEN_TITLE = "screen title";
private final String FRAGMENT_NAME = "fragment name"; private static final String FRAGMENT_NAME = "fragment name";
private final int ICON = 1234; // I declare a thumb war private static final int ICON = 1234; // I declare a thumb war
private final Uri URI = Uri.parse("content://com.android.settings.slices/test"); private static final Uri URI = Uri.parse("content://com.android.settings.slices/test");
private final String PREF_CONTROLLER = FakeToggleController.class.getName(); private static final String PREF_CONTROLLER = FakeToggleController.class.getName();
private Context mContext; private Context mContext;
private SettingsSliceProvider mProvider; private SettingsSliceProvider mProvider;
private SQLiteDatabase mDb; private SQLiteDatabase mDb;
@@ -147,6 +149,18 @@ public class SettingsSliceProviderTest {
assertThat(cachedData).isNull(); assertThat(cachedData).isNull();
} }
@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 @Test
public void testLoadSlice_cachedEntryRemovedOnUnpin() { public void testLoadSlice_cachedEntryRemovedOnUnpin() {
SliceData data = getDummyData(); SliceData data = getDummyData();