From 0bfef6381211ecc2b42bd6f6be412f9e89cce4cd Mon Sep 17 00:00:00 2001 From: Chandan Nath Date: Mon, 28 Jan 2019 21:15:13 +0000 Subject: [PATCH] [Multi-user] Change Backup Settings page to support multi-user. With multi-user backup, backup will be available or secondary users and profiles too. 1. When there are profile users, this CL changes UI flow A to B A. Settings Homepage -> System -> Google Backup Settings for primary user to B. Settings Homepage -> System -> Profile Select Dialog -> Google Backup Settings for chosen profile. Change done as per https://g3doc.corp.google.com/company/teams/apps-android-settings/howto/ia.md?cl=head 2. Functionality remains the same when there are no profiles (BackupSettingsHelper, BackupSettingsContentProvider) 3. Also, enabled Backup Settings for secondary users. (Previously, backup settings were only shown for system user).(SettingsGateway) Bug: 121198738 Test: 1) System -> Backup -> shows Profile Select Dialog -> Backup page for selected profile 2) On secondary user without profile, System -> Backup (with summary) -> Backup page for secondary user. Change-Id: I6e21279978a5dfc6eca6f5a34bbfc15a34eac68b --- AndroidManifest.xml | 26 +++-- res/xml/system_dashboard_fragment.xml | 11 -- .../android/settings/SettingsActivity.java | 6 - ...pSettingsActivityPreferenceController.java | 54 --------- .../backup/BackupSettingsContentProvider.java | 78 +++++++++++++ .../backup/BackupSettingsFragment.java | 2 +- .../settings/backup/BackupSettingsHelper.java | 21 +++- ...y.java => UserBackupSettingsActivity.java} | 26 ++--- .../core/gateway/SettingsGateway.java | 2 + ...tingsActivityPreferenceControllerTest.java | 110 ------------------ .../backup/BackupSettingsHelperTest.java | 41 ++++++- ...va => UserBackupSettingsActivityTest.java} | 34 ++---- .../settings/backup/BackupIntentTest.java | 17 +-- 13 files changed, 179 insertions(+), 249 deletions(-) delete mode 100644 src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java create mode 100644 src/com/android/settings/backup/BackupSettingsContentProvider.java rename src/com/android/settings/backup/{BackupSettingsActivity.java => UserBackupSettingsActivity.java} (84%) delete mode 100644 tests/robotests/src/com/android/settings/backup/BackupSettingsActivityPreferenceControllerTest.java rename tests/robotests/src/com/android/settings/backup/{BackupSettingsActivityTest.java => UserBackupSettingsActivityTest.java} (82%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a12c9825111..ee301519321 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2777,13 +2777,17 @@ android:value="com.android.settings.webview.WebViewAppPicker" /> - + + + + android:icon="@drawable/ic_settings_backup"> - @@ -2791,10 +2795,16 @@ - - + + + + + + + + - - - - - getNonIndexableKeys(Context context) { - final List keys = super.getNonIndexableKeys(context); - - // For non-primary user, no backup is available, so don't show it in search - // TODO: http://b/22388012 - if (UserHandle.myUserId() != UserHandle.USER_SYSTEM) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Not a system user, not indexing the screen"); - } - keys.add(BACKUP_SEARCH_INDEX_KEY); - } - - return keys; - } }; @VisibleForTesting diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index 7ba36887c4d..bb292a154f2 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -49,6 +49,7 @@ import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminSe import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails; import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings; import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings; +import com.android.settings.backup.UserBackupSettingsActivity; import com.android.settings.backup.PrivacySettings; import com.android.settings.backup.ToggleBackupSettingFragment; import com.android.settings.biometrics.face.FaceSettings; @@ -298,5 +299,6 @@ public class SettingsGateway { Settings.DateTimeSettingsActivity.class.getName(), Settings.EnterprisePrivacySettingsActivity.class.getName(), Settings.MyDeviceInfoActivity.class.getName(), + UserBackupSettingsActivity.class.getName(), }; } diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityPreferenceControllerTest.java deleted file mode 100644 index 97ddc4bc1ad..00000000000 --- a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityPreferenceControllerTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2017 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.backup; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.verify; - -import android.app.backup.BackupManager; -import android.content.Context; -import android.os.UserManager; - -import androidx.preference.Preference; - -import com.android.settings.R; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.shadow.api.Shadow; -import org.robolectric.shadows.ShadowApplication; -import org.robolectric.shadows.ShadowUserManager; - -@RunWith(RobolectricTestRunner.class) -public class BackupSettingsActivityPreferenceControllerTest { - - private static final String KEY_BACKUP_SETTINGS = "backup_settings"; - - private Context mContext; - private BackupManager mBackupManager; - private UserManager mUserManager; - - @Mock - private Preference mBackupPreference; - - private BackupSettingsActivityPreferenceController mController; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - - mContext = RuntimeEnvironment.application; - mBackupManager = new BackupManager(mContext); - - final ShadowApplication shadowApplication = ShadowApplication.getInstance(); - shadowApplication.grantPermissions(android.Manifest.permission.BACKUP); - shadowApplication.setSystemService(Context.BACKUP_SERVICE, mBackupManager); - - mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - - mController = new BackupSettingsActivityPreferenceController(mContext, KEY_BACKUP_SETTINGS); - } - - @Test - public void updateState_backupOn() { - mBackupManager.setBackupEnabled(true); - - mController.updateState(mBackupPreference); - String summaryString = mContext.getString(R.string.backup_summary_state_on); - verify(mBackupPreference).setSummary(summaryString); - } - - @Test - public void updateState_backupOff() { - mBackupManager.setBackupEnabled(false); - - mController.updateState(mBackupPreference); - String summaryString = mContext.getString(R.string.backup_summary_state_off); - verify(mBackupPreference).setSummary(summaryString); - } - - @Test - public void isAvailable_systemUser() { - final ShadowUserManager sum = Shadow.extract(mUserManager); - sum.setIsAdminUser(true); - - assertThat(mController.isAvailable()).isTrue(); - } - - @Test - public void isAvailable_nonSystemUser() { - final ShadowUserManager sum = Shadow.extract(mUserManager); - sum.setIsAdminUser(false); - - assertThat(mController.isAvailable()).isFalse(); - } - - @Test - public void getPreferenceKey() { - assertThat(mController.getPreferenceKey()).isEqualTo(KEY_BACKUP_SETTINGS); - } -} diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java index 9a809cc7ba2..ee8912af56f 100644 --- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java +++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java @@ -31,12 +31,16 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.UserInfo; import android.content.res.Resources; import android.os.IBinder; import android.os.RemoteException; +import android.os.UserHandle; +import android.os.UserManager; import com.android.settings.R; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,11 +51,12 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowUserManager; @RunWith(RobolectricTestRunner.class) @Config(shadows = BackupSettingsHelperTest.ShadowBackupManagerStub.class) public class BackupSettingsHelperTest { - private static final String DEFAULT_SETTINGS_CLASSNAME = "com.android.settings.Settings$PrivacySettingsActivity"; @@ -72,12 +77,46 @@ public class BackupSettingsHelperTest { @Mock private static IBackupManager mBackupManager; + private ShadowUserManager mUserManager; + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application.getApplicationContext()); when(mBackupManager.getCurrentTransport()).thenReturn("test_transport"); mBackupSettingsHelper = new BackupSettingsHelper(mContext); + mUserManager = Shadow.extract(mContext.getSystemService(Context.USER_SERVICE)); + } + + @Test + public void testGetSummary_backupEnabledOnlyOneProfile_showsOn() throws Exception { + mUserManager.addUserProfile(new UserHandle(0)); + when(mBackupManager.isBackupEnabled()).thenReturn(true); + + String backupSummary = mBackupSettingsHelper.getSummary(); + + assertThat(backupSummary).isEqualTo(mContext.getString(R.string.backup_summary_state_on)); + } + + @Test + public void testGetSummary_backupDisabledOnlyOneProfile_showsOff() throws Exception { + mUserManager.addUserProfile(new UserHandle(0)); + when(mBackupManager.isBackupEnabled()).thenReturn(false); + + String backupSummary = mBackupSettingsHelper.getSummary(); + + assertThat(backupSummary).isEqualTo(mContext.getString(R.string.backup_summary_state_off)); + } + + @Test + public void testGetSummary_TwoProfiles_returnsNull() throws Exception { + mUserManager.addUserProfile(new UserHandle(0)); + mUserManager.addUserProfile(new UserHandle(10)); + when(mBackupManager.isBackupEnabled()).thenReturn(true); + + String backupSummary = mBackupSettingsHelper.getSummary(); + + assertThat(backupSummary).isNull(); } @Test diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java b/tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java similarity index 82% rename from tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java rename to tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java index 931bc1e7ee0..19a6051f143 100644 --- a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java @@ -35,8 +35,6 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; -import com.android.settings.search.SearchIndexableRaw; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -54,14 +52,12 @@ import org.robolectric.annotation.Implements; import org.robolectric.annotation.Resetter; import org.robolectric.shadows.ShadowPackageManager; -import java.util.List; - @RunWith(RobolectricTestRunner.class) -@Config(shadows = {BackupSettingsActivityTest.ShadowBackupSettingsHelper.class, - BackupSettingsActivityTest.ShadowUserHandle.class}) -public class BackupSettingsActivityTest { - private ActivityController mActivityController; - private BackupSettingsActivity mActivity; +@Config(shadows = {UserBackupSettingsActivityTest.ShadowBackupSettingsHelper.class, + UserBackupSettingsActivityTest.ShadowUserHandle.class}) +public class UserBackupSettingsActivityTest { + private ActivityController mActivityController; + private UserBackupSettingsActivity mActivity; private Application mApplication; private ShadowPackageManager mPackageManager; private static boolean mIsBackupProvidedByOEM; @@ -81,7 +77,7 @@ public class BackupSettingsActivityTest { MockitoAnnotations.initMocks(this); mApplication = RuntimeEnvironment.application; - mActivityController = Robolectric.buildActivity(BackupSettingsActivity.class); + mActivityController = Robolectric.buildActivity(UserBackupSettingsActivity.class); mActivity = mActivityController.get(); mPackageManager = Shadows.shadowOf(mApplication.getPackageManager()); when(mIntent.getComponent()).thenReturn(mComponent); @@ -130,9 +126,9 @@ public class BackupSettingsActivityTest { @Test public void getNonIndexableKeys_SystemUser() { - assertThat(BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex( + assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex( mApplication, true)).isNotEmpty(); - assertThat(BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys( + assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys( mApplication)).isEmpty(); } @@ -140,16 +136,10 @@ public class BackupSettingsActivityTest { public void getNonIndexableKeys_NonSystemUser() { ShadowUserHandle.setUid(1); // Non-SYSTEM user. - final List indexableRaws = - BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex( - mApplication, true); - final List nonIndexableKeys = - BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys( - mApplication); - - assertThat(indexableRaws).isNotNull(); - assertThat(indexableRaws).isNotEmpty(); - assertThat(nonIndexableKeys).isNotEmpty(); + assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex( + mApplication, true)).isNotEmpty(); + assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys( + mApplication)).isEmpty(); } @Implements(BackupSettingsHelper.class) diff --git a/tests/unit/src/com/android/settings/backup/BackupIntentTest.java b/tests/unit/src/com/android/settings/backup/BackupIntentTest.java index 18fb17a59a0..0115c569aef 100644 --- a/tests/unit/src/com/android/settings/backup/BackupIntentTest.java +++ b/tests/unit/src/com/android/settings/backup/BackupIntentTest.java @@ -37,12 +37,9 @@ import java.util.List; @RunWith(AndroidJUnit4.class) @SmallTest public class BackupIntentTest { - private static final String INTENT_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"; - private static final String INTENT_BACKUP_SETTINGS = - "android.settings.BACKUP_AND_RESET_SETTINGS"; private static final String BACKUP_SETTINGS_ACTIVITY = - "com.android.settings.backup.BackupSettingsActivity"; + "com.android.settings.backup.UserBackupSettingsActivity"; private Context mContext; @@ -52,17 +49,6 @@ public class BackupIntentTest { mContext = instrumentation.getTargetContext(); } - @Test - public void testBackupSettingsIntentResolvesToOnlyOneActivity(){ - PackageManager pm = mContext.getPackageManager(); - Intent intent = new Intent(INTENT_BACKUP_SETTINGS); - List activities = pm.queryIntentActivities(intent, 0); - assertThat(activities).isNotNull(); - assertThat(activities.size()).isEqualTo(1); - assertThat(activities.get(0).activityInfo.getComponentName().getClassName()). - isEqualTo(BACKUP_SETTINGS_ACTIVITY); - } - @Test public void testPrivacySettingsIntentResolvesToOnlyOneActivity(){ PackageManager pm = mContext.getPackageManager(); @@ -73,5 +59,4 @@ public class BackupIntentTest { assertThat(activities.get(0).activityInfo.getComponentName().getClassName()). isEqualTo(BACKUP_SETTINGS_ACTIVITY); } - }