[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
This commit is contained in:
Chandan Nath
2019-01-28 21:15:13 +00:00
parent d3be363004
commit 0bfef63812
13 changed files with 179 additions and 249 deletions

View File

@@ -0,0 +1,176 @@
/*
* 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.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Application;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadows.ShadowPackageManager;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {UserBackupSettingsActivityTest.ShadowBackupSettingsHelper.class,
UserBackupSettingsActivityTest.ShadowUserHandle.class})
public class UserBackupSettingsActivityTest {
private ActivityController<UserBackupSettingsActivity> mActivityController;
private UserBackupSettingsActivity mActivity;
private Application mApplication;
private ShadowPackageManager mPackageManager;
private static boolean mIsBackupProvidedByOEM;
@Mock
private FragmentManager mFragmentManager;
@Mock
private FragmentTransaction mFragmentTransaction;
@Mock
private static Intent mIntent;
@Mock
private ComponentName mComponent;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mApplication = RuntimeEnvironment.application;
mActivityController = Robolectric.buildActivity(UserBackupSettingsActivity.class);
mActivity = mActivityController.get();
mPackageManager = Shadows.shadowOf(mApplication.getPackageManager());
when(mIntent.getComponent()).thenReturn(mComponent);
}
@After
public void resetShadows() {
ShadowUserHandle.reset();
}
@Test
public void onCreate_launchActivity() {
mIsBackupProvidedByOEM = false;
// Testing the scenario when the activity is disabled
mApplication.getPackageManager().setComponentEnabledSetting(mComponent,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
mActivityController.create();
// Verify that the component to launch was enabled.
final int flags = mPackageManager.getComponentEnabledSettingFlags(mComponent);
assertThat(flags & PackageManager.COMPONENT_ENABLED_STATE_ENABLED)
.isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
// Verify that the intent returned by BackupSettingsHelper.getIntentForBackupSettings()
// was launched.
assertThat(Shadows.shadowOf(mApplication).getNextStartedActivity()).isEqualTo(mIntent);
}
@Test
public void onCreate_hasManufacturerIntent() {
mIsBackupProvidedByOEM = true;
// Fragments are tested separately, so mock out the manager.
mActivity.setFragmentManager(mFragmentManager);
doReturn(mFragmentTransaction).when(mFragmentTransaction).replace(anyInt(),
any(Fragment.class));
doReturn(mFragmentTransaction).when(mFragmentManager).beginTransaction();
mActivityController.create();
assertThat(Shadows.shadowOf(mApplication).getNextStartedActivity()).isNull();
verify(mFragmentTransaction).replace(anyInt(), isA(BackupSettingsFragment.class));
}
@Test
public void getNonIndexableKeys_SystemUser() {
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
mApplication, true)).isNotEmpty();
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mApplication)).isEmpty();
}
@Test
public void getNonIndexableKeys_NonSystemUser() {
ShadowUserHandle.setUid(1); // Non-SYSTEM user.
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
mApplication, true)).isNotEmpty();
assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
mApplication)).isEmpty();
}
@Implements(BackupSettingsHelper.class)
public static class ShadowBackupSettingsHelper {
@Implementation
protected Intent getIntentForBackupSettings() {
return mIntent;
}
@Implementation
protected boolean isBackupProvidedByManufacturer() {
return mIsBackupProvidedByOEM;
}
}
@Implements(UserHandle.class)
public static class ShadowUserHandle {
private static int sUid = 0; // SYSTEM by default
public static void setUid(int uid) {
sUid = uid;
}
@Implementation
protected static int myUserId() {
return sUid;
}
@Resetter
public static void reset() {
sUid = 0;
}
}
}