Add autofill service setting in managed profile

Previously, there was no way to change the autofill service of the
personal and managed profile independently. After 'uncloning' the
setting in ag/4666330, we now introduce a separate UI control
for each profile.

BUG: 38033559
Test: Tested manually by setting up a work profile and verifying that
the setting can be changed independently. Also verified that the
additional UI does not show without a managed profile.

Change-Id: I1c42fc4335bc319ca7f6fd1b7b10c781343ca248
This commit is contained in:
Zimuzo
2018-08-01 17:44:56 +01:00
parent 64771b5382
commit fcf3f58618
10 changed files with 390 additions and 40 deletions

View File

@@ -17,65 +17,196 @@
package com.android.settings.applications.defaultapps;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.RuntimeEnvironment.application;
import android.app.Activity;
import android.app.AppOpsManager;
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.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceScreen;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowProcess;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settingslib.applications.DefaultAppInfo;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = {
SettingsShadowResources.SettingsShadowTheme.class,
ShadowProcess.class,
ShadowSecureSettings.class
})
public class DefaultAutofillPickerTest {
private static final String TEST_APP_KEY = "foo.bar/foo.bar.Baz";
private static final String MAIN_APP_KEY = "main.foo.bar/foo.bar.Baz";
private static final String MANAGED_APP_KEY = "managed.foo.bar/foo.bar.Baz";
private static final int MANAGED_PROFILE_UID = 10;
private static final int MAIN_PROFILE_UID = 0;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Activity mActivity;
private FragmentActivity mActivity;
@Mock
private UserManager mUserManager;
@Mock
private AppOpsManager mAppOpsManager;
@Mock
private PackageManager mPackageManager;
@Mock
private PreferenceScreen mScreen;
private DefaultAutofillPicker mPicker;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest();
Resources res = application.getResources();
when(mActivity.getApplicationContext()).thenReturn(mActivity);
when(mActivity.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
when(mActivity.getTheme()).thenReturn(res.newTheme());
when(mActivity.getResources()).thenReturn(res);
mPicker = spy(new DefaultAutofillPicker());
mPicker.onAttach((Context) mActivity);
doReturn(application.getApplicationContext()).when(mPicker).getContext();
doReturn(mActivity).when(mPicker).getActivity();
doReturn(res).when(mPicker).getResources();
doReturn(mScreen).when(mPicker).getPreferenceScreen();
doNothing().when(mPicker).onCreatePreferences(any(), any());
doNothing().when(mPicker).updateCandidates();
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
}
@Test
public void setAndGetDefaultAppKey_shouldUpdateDefaultAutoFill() {
assertThat(mPicker.setDefaultKey(TEST_APP_KEY)).isTrue();
assertThat(mPicker.getDefaultKey()).isEqualTo(TEST_APP_KEY);
mPicker.onAttach((Context) mActivity);
ReflectionHelpers.setField(
mPicker, "mUserId", MAIN_PROFILE_UID * UserHandle.PER_USER_RANGE);
assertThat(mPicker.setDefaultKey(MAIN_APP_KEY)).isTrue();
ReflectionHelpers.setField(
mPicker, "mUserId", MANAGED_PROFILE_UID * UserHandle.PER_USER_RANGE);
assertThat(mPicker.setDefaultKey(MANAGED_APP_KEY)).isTrue();
ReflectionHelpers.setField(
mPicker, "mUserId", MAIN_PROFILE_UID * UserHandle.PER_USER_RANGE);
assertThat(mPicker.getDefaultKey()).isEqualTo(MAIN_APP_KEY);
ReflectionHelpers.setField(
mPicker, "mUserId", MANAGED_PROFILE_UID * UserHandle.PER_USER_RANGE);
assertThat(mPicker.getDefaultKey()).isEqualTo(MANAGED_APP_KEY);
}
@Test
public void getConfirmationMessage_shouldNotBeNull() {
mPicker.onAttach((Context) mActivity);
final DefaultAppInfo info = mock(DefaultAppInfo.class);
when(info.loadLabel()).thenReturn("test_app_name");
assertThat(mPicker.getConfirmationMessage(info)).isNotNull();
}
@Test
public void mUserId_shouldDeriveUidFromManagedCaller() {
setupUserManager();
setupCaller();
ShadowProcess.setMyUid(MANAGED_PROFILE_UID * UserHandle.PER_USER_RANGE);
mPicker.onAttach((Context) mActivity);
mPicker.onCreate(null);
assertUserId(MANAGED_PROFILE_UID);
}
@Test
public void mUserId_shouldDeriveUidFromMainCaller() {
setupUserManager();
setupCaller();
ShadowProcess.setMyUid(MAIN_PROFILE_UID * UserHandle.PER_USER_RANGE);
mPicker.onAttach((Context) mActivity);
mPicker.onCreate(null);
assertUserId(MAIN_PROFILE_UID);
}
@Test
public void mUserId_shouldDeriveUidFromManagedClick() {
setupUserManager();
setupClick(/* forWork= */ true);
ShadowProcess.setMyUid(MAIN_PROFILE_UID * UserHandle.PER_USER_RANGE);
mPicker.onAttach((Context) mActivity);
mPicker.onCreate(null);
assertUserId(MANAGED_PROFILE_UID);
}
@Test
public void mUserId_shouldDeriveUidFromMainClick() {
setupUserManager();
setupClick(/* forWork= */ false);
ShadowProcess.setMyUid(MAIN_PROFILE_UID * UserHandle.PER_USER_RANGE);
mPicker.onAttach((Context) mActivity);
mPicker.onCreate(null);
assertUserId(MAIN_PROFILE_UID);
}
private void setupUserManager() {
UserHandle mainUserHandle = new UserHandle(MAIN_PROFILE_UID);
UserHandle managedUserHandle = new UserHandle(MANAGED_PROFILE_UID);
UserInfo managedUserInfo = new UserInfo(
MANAGED_PROFILE_UID, "managed", UserInfo.FLAG_MANAGED_PROFILE);
when(mUserManager.getUserProfiles())
.thenReturn(Arrays.asList(mainUserHandle, managedUserHandle));
when(mUserManager.getUserInfo(MANAGED_PROFILE_UID))
.thenReturn(managedUserInfo);
when(mUserManager.getUserHandle()).thenReturn(MAIN_PROFILE_UID);
}
private void setupCaller() {
Intent intent = new Intent();
intent.putExtra("package_name", "any package name");
when(mActivity.getIntent()).thenReturn(intent);
}
private void setupClick(boolean forWork) {
Bundle bundle = new Bundle();
bundle.putBoolean("for_work", forWork);
doReturn(bundle).when(mPicker).getArguments();
}
private void assertUserId(int userId) {
assertThat((Integer) ReflectionHelpers.getField(mPicker, "mUserId"))
.isEqualTo(userId);
}
}