import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
-import android.os.Bundle;
import android.os.UserManager;
import android.permission.PermissionControllerManager;
import android.text.TextUtils;
import com.android.internal.util.CollectionUtils;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.core.SubSettingLauncher;
/*
* Abstract base controller for the default app shortcut preferences that launches the default app
mRoleManager = context.getSystemService(RoleManager.class);
- // TODO: STOPSHIP(b/110557011): Remove this check once we have all default apps migrated.
- if (mRoleName != null) {
- final PermissionControllerManager permissionControllerManager =
- mContext.getSystemService(PermissionControllerManager.class);
- permissionControllerManager.isApplicationQualifiedForRole(mRoleName, mPackageName,
- mContext.getMainExecutor(), qualified -> {
- mAppQualified = qualified;
- refreshAvailability();
- });
- }
- }
-
- // TODO: STOPSHIP(b/110557011): Remove this once we have all default apps migrated.
- public DefaultAppShortcutPreferenceControllerBase(Context context, String preferenceKey,
- String packageName) {
- this(context, preferenceKey, null /* roleName */, packageName);
+ final PermissionControllerManager permissionControllerManager =
+ mContext.getSystemService(PermissionControllerManager.class);
+ permissionControllerManager.isApplicationQualifiedForRole(mRoleName, mPackageName,
+ mContext.getMainExecutor(), qualified -> {
+ mAppQualified = qualified;
+ refreshAvailability();
+ });
}
@Override
if (mContext.getSystemService(UserManager.class).isManagedProfile()) {
return DISABLED_FOR_USER;
}
- return hasAppCapability() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return mAppQualified ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
if (!TextUtils.equals(mPreferenceKey, preference.getKey())) {
return false;
}
- // TODO: STOPSHIP(b/110557011): Remove this check once we have all default apps migrated.
- if (mRoleName != null) {
- final Intent intent = new Intent(Intent.ACTION_MANAGE_DEFAULT_APP)
- .putExtra(Intent.EXTRA_ROLE_NAME, mRoleName);
- mContext.startActivity(intent);
- } else {
- final Bundle bundle = new Bundle();
- bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPreferenceKey);
- new SubSettingLauncher(mContext)
- .setDestination(DefaultAppSettings.class.getName())
- .setArguments(bundle)
- .setTitleRes(R.string.configure_apps)
- .setSourceMetricsCategory(SettingsEnums.PAGE_UNKNOWN)
- .launch();
- }
+ final Intent intent = new Intent(Intent.ACTION_MANAGE_DEFAULT_APP)
+ .putExtra(Intent.EXTRA_ROLE_NAME, mRoleName);
+ mContext.startActivity(intent);
return true;
}
/**
- * Check whether the app has the default app capability
- *
- * @return true if the app has the default app capability
- */
- protected boolean hasAppCapability() {
- // TODO: STOPSHIP(b/110557011): Remove this check once we have all default apps migrated.
- if (mRoleName != null) {
- return mAppQualified;
- }
- return false;
- }
-
- /**
* Check whether the app is the default app
*
* @return true if the app is the default app
*/
- protected boolean isDefaultApp() {
- // TODO: STOPSHIP(b/110557011): Remove this check once we have all default apps migrated.
- if (mRoleName != null) {
- final String packageName = CollectionUtils.firstOrNull(mRoleManager.getRoleHolders(
- mRoleName));
- return TextUtils.equals(mPackageName, packageName);
- }
- return false;
+ private boolean isDefaultApp() {
+ final String packageName = CollectionUtils.firstOrNull(mRoleManager.getRoleHolders(
+ mRoleName));
+ return TextUtils.equals(mPackageName, packageName);
}
}
package com.android.settings.applications.appinfo;
+import android.app.role.RoleManager;
import android.content.Context;
-import android.os.UserHandle;
-
-import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
public class DefaultBrowserShortcutPreferenceController
extends DefaultAppShortcutPreferenceControllerBase {
private static final String KEY = "default_browser";
public DefaultBrowserShortcutPreferenceController(Context context, String packageName) {
- super(context, KEY, packageName);
- }
-
- @Override
- protected boolean hasAppCapability() {
- return DefaultBrowserPreferenceController
- .hasBrowserPreference(mPackageName, mContext, UserHandle.myUserId());
+ super(context, KEY, RoleManager.ROLE_BROWSER, packageName);
}
-
- @Override
- protected boolean isDefaultApp() {
- return new DefaultBrowserPreferenceController(mContext)
- .isBrowserDefault(mPackageName, UserHandle.myUserId());
- }
-
}
package com.android.settings.applications.appinfo;
+import android.app.role.RoleManager;
import android.content.Context;
-import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceController;
-
public class DefaultEmergencyShortcutPreferenceController
extends DefaultAppShortcutPreferenceControllerBase {
private static final String KEY = "default_emergency_app";
public DefaultEmergencyShortcutPreferenceController(Context context, String packageName) {
- super(context, KEY, packageName);
- }
-
- @Override
- protected boolean hasAppCapability() {
- return DefaultEmergencyPreferenceController.hasEmergencyPreference(mPackageName, mContext);
+ super(context, KEY, RoleManager.ROLE_EMERGENCY, packageName);
}
-
- @Override
- protected boolean isDefaultApp() {
- return DefaultEmergencyPreferenceController.isEmergencyDefault(mPackageName, mContext);
- }
-
}
package com.android.settings.applications.appinfo;
+import android.app.role.RoleManager;
import android.content.Context;
-import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
-
public class DefaultHomeShortcutPreferenceController
extends DefaultAppShortcutPreferenceControllerBase {
private static final String KEY = "default_home";
public DefaultHomeShortcutPreferenceController(Context context, String packageName) {
- super(context, KEY, packageName);
- }
-
- @Override
- protected boolean hasAppCapability() {
- return DefaultHomePreferenceController.hasHomePreference(mPackageName, mContext);
+ super(context, KEY, RoleManager.ROLE_HOME, packageName);
}
-
- @Override
- protected boolean isDefaultApp() {
- return DefaultHomePreferenceController.isHomeDefault(mPackageName,
- mContext.getPackageManager());
- }
-
}
import androidx.preference.Preference;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.applications.DefaultAppSettings;
import org.junit.Before;
import org.junit.Test;
private ShadowUserManager mShadowUserManager;
private TestRolePreferenceController mController;
- private TestLegacyPreferenceController mLegacyController;
@Before
public void setUp() {
mShadowUserManager = shadowOf(mActivity.getSystemService(UserManager.class));
mController = new TestRolePreferenceController(mActivity);
when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
- mLegacyController = new TestLegacyPreferenceController(mActivity);
}
@Test
when(mRoleManager.getRoleHolders(eq(TEST_ROLE_NAME))).thenReturn(Collections.singletonList(
TEST_PACKAGE_NAME));
final CharSequence yesText = mActivity.getText(R.string.yes);
-
mController.updateState(mPreference);
+
verify(mPreference).setSummary(yesText);
}
public void updateState_notRoleHoler_shouldSetSummaryToNo() {
when(mRoleManager.getRoleHolders(eq(TEST_ROLE_NAME))).thenReturn(Collections.emptyList());
final CharSequence noText = mActivity.getText(R.string.no);
-
mController.updateState(mPreference);
+
verify(mPreference).setSummary(noText);
}
@Test
public void handlePreferenceTreeClick_shouldStartManageDefaultAppIntent() {
final ShadowActivity shadowActivity = shadowOf(mActivity);
-
mController.handlePreferenceTreeClick(mPreference);
final Intent intent = shadowActivity.getNextStartedActivity();
+
assertThat(intent).isNotNull();
assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MANAGE_DEFAULT_APP);
assertThat(intent.getStringExtra(Intent.EXTRA_ROLE_NAME)).isEqualTo(TEST_ROLE_NAME);
super(context, TEST_PREFERENCE_KEY, TEST_ROLE_NAME, TEST_PACKAGE_NAME);
}
}
-
- // TODO: STOPSHIP(b/110557011): Remove following tests once we have all default apps migrated.
-
- @Test
- public void getAvailabilityStatus_hasAppCapability_shouldReturnAvailable() {
- mShadowUserManager.setManagedProfile(false);
- mLegacyController.mHasAppCapability = true;
-
- assertThat(mLegacyController.getAvailabilityStatus()).isEqualTo(
- DefaultAppShortcutPreferenceControllerBase.AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_noAppCapability_shouldReturnDisabled() {
- mShadowUserManager.setManagedProfile(false);
- mLegacyController.mHasAppCapability = false;
-
- assertThat(mLegacyController.getAvailabilityStatus()).isEqualTo(
- DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void updateState_isDefaultApp_shouldSetSummaryToYes() {
- mLegacyController.mIsDefaultApp = true;
- final CharSequence yesText = mActivity.getText(R.string.yes);
-
- mLegacyController.updateState(mPreference);
- verify(mPreference).setSummary(yesText);
- }
-
- @Test
- public void updateState_notDefaultApp_shouldSetSummaryToNo() {
- mLegacyController.mIsDefaultApp = false;
- final CharSequence noText = mActivity.getText(R.string.no);
-
- mLegacyController.updateState(mPreference);
- verify(mPreference).setSummary(noText);
- }
-
- @Test
- public void handlePreferenceTreeClick_shouldStartDefaultAppSettings() {
- final ShadowActivity shadowActivity = shadowOf(mActivity);
-
- mLegacyController.handlePreferenceTreeClick(mPreference);
- final Intent intent = shadowActivity.getNextStartedActivity();
- assertThat(intent).isNotNull();
- assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
- DefaultAppSettings.class.getName());
- assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS).getString(
- SettingsActivity.EXTRA_FRAGMENT_ARG_KEY)).isEqualTo(TEST_PREFERENCE_KEY);
- }
-
- private class TestLegacyPreferenceController
- extends DefaultAppShortcutPreferenceControllerBase {
-
- private boolean mIsDefaultApp;
- private boolean mHasAppCapability;
-
- private TestLegacyPreferenceController(Context context) {
- super(context, TEST_PREFERENCE_KEY, TEST_PACKAGE_NAME);
- }
-
- @Override
- protected boolean hasAppCapability() {
- return mHasAppCapability;
- }
-
- @Override
- protected boolean isDefaultApp() {
- return mIsDefaultApp;
- }
- }
}
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
+import android.permission.PermissionControllerManager;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
+import org.robolectric.shadows.ShadowApplication;
@RunWith(RobolectricTestRunner.class)
public class DefaultBrowserShortcutPreferenceControllerTest {
@Mock
- private PackageManager mPackageManager;
+ private PermissionControllerManager mPermissionControllerManager;
- private Context mContext;
private DefaultBrowserShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
- mController = new DefaultBrowserShortcutPreferenceController(mContext, "Package1");
+ ShadowApplication.getInstance().setSystemService(Context.PERMISSION_CONTROLLER_SERVICE,
+ mPermissionControllerManager);
+ mController = new DefaultBrowserShortcutPreferenceController(RuntimeEnvironment.application,
+ "Package1");
}
@Test
public void getPreferenceKey_shouldReturnDefaultBrowser() {
assertThat(mController.getPreferenceKey()).isEqualTo("default_browser");
}
-
- @Test
- public void hasAppCapability_hasBrowserCapability_shouldReturnTrue() {
- List<ResolveInfo> resolveInfos = new ArrayList<>();
- resolveInfos.add(new ResolveInfo());
- when(mPackageManager.queryIntentActivitiesAsUser(argThat(intent-> intent != null
- && intent.getCategories().contains(Intent.CATEGORY_BROWSABLE)), anyInt(), anyInt()))
- .thenReturn(resolveInfos);
-
- assertThat(mController.hasAppCapability()).isTrue();
- }
-
- @Test
- public void hasAppCapability_noBrowserCapability_shouldReturnFalse() {
- assertThat(mController.hasAppCapability()).isFalse();
- }
-
- @Test
- public void isDefaultApp_isDefaultBrowser_shouldReturnTrue() {
- when(mPackageManager.getDefaultBrowserPackageNameAsUser(anyInt())).thenReturn("Package1");
-
- assertThat(mController.isDefaultApp()).isTrue();
- }
-
- @Test
- public void isDefaultApp_notDefaultBrowser_shouldReturnFalse() {
- assertThat(mController.isDefaultApp()).isFalse();
- }
}
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.app.role.RoleManager;
import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
+import android.permission.PermissionControllerManager;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import org.robolectric.shadows.ShadowApplication;
@RunWith(RobolectricTestRunner.class)
public class DefaultEmergencyShortcutPreferenceControllerTest {
@Mock
- private RoleManager mRoleManager;
- @Mock
- private PackageManager mPackageManager;
+ private PermissionControllerManager mPermissionControllerManager;
- private Context mContext;
private DefaultEmergencyShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
- when(mContext.getSystemService(RoleManager.class)).thenReturn(mRoleManager);
- mController = new DefaultEmergencyShortcutPreferenceController(mContext, "Package1");
+ ShadowApplication.getInstance().setSystemService(Context.PERMISSION_CONTROLLER_SERVICE,
+ mPermissionControllerManager);
+ mController = new DefaultEmergencyShortcutPreferenceController(
+ RuntimeEnvironment.application, "Package1");
}
@Test
public void getPreferenceKey_shouldReturnDefaultEmergency() {
assertThat(mController.getPreferenceKey()).isEqualTo("default_emergency_app");
}
-
- @Test
- public void hasAppCapability_hasEmergencyCapability_shouldReturnTrue() {
- List<ResolveInfo> resolveInfos = new ArrayList<>();
- resolveInfos.add(new ResolveInfo());
- when(mPackageManager.queryIntentActivities(argThat(intent-> intent != null
- && intent.getAction().equals(TelephonyManager.ACTION_EMERGENCY_ASSISTANCE)),
- anyInt())).thenReturn(resolveInfos);
-
- assertThat(mController.hasAppCapability()).isTrue();
- }
-
- @Test
- public void hasAppCapability_noEmergencyCapability_shouldReturnFalse() {
- assertThat(mController.hasAppCapability()).isFalse();
- }
-
- @Test
- public void isDefaultApp_isDefaultEmergency_shouldReturnTrue() {
- when(mRoleManager.getRoleHolders(RoleManager.ROLE_EMERGENCY))
- .thenReturn(Collections.singletonList("Package1"));
-
- assertThat(mController.isDefaultApp()).isTrue();
- }
-
- @Test
- public void isDefaultApp_notDefaultEmergency_shouldReturnFalse() {
- assertThat(mController.isDefaultApp()).isFalse();
- }
}
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyList;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
import android.content.Context;
-import android.content.pm.PackageManager;
-
-import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
+import android.permission.PermissionControllerManager;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowApplication;
@RunWith(RobolectricTestRunner.class)
public class DefaultHomeShortcutPreferenceControllerTest {
@Mock
- private PackageManager mPackageManager;
+ private PermissionControllerManager mPermissionControllerManager;
- private Context mContext;
private DefaultHomeShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- when(mContext.getPackageManager()).thenReturn(mPackageManager);
- mController = new DefaultHomeShortcutPreferenceController(mContext, "Package1");
+ ShadowApplication.getInstance().setSystemService(Context.PERMISSION_CONTROLLER_SERVICE,
+ mPermissionControllerManager);
+ mController = new DefaultHomeShortcutPreferenceController(RuntimeEnvironment.application,
+ "Package1");
}
@Test
public void getPreferenceKey_shouldReturnDefaultHome() {
assertThat(mController.getPreferenceKey()).isEqualTo("default_home");
}
-
- @Test
- @Config(shadows = ShadowDefaultHomePreferenceController.class)
- public void hasAppCapability_hasHomeCapability_shouldReturnTrue() {
- assertThat(mController.hasAppCapability()).isTrue();
- }
-
- @Test
- public void hasAppCapability_noHomeCapability_shouldReturnFalse() {
- assertThat(mController.hasAppCapability()).isFalse();
- }
-
- @Test
- public void isDefaultApp_isDefaultHome_shouldReturnTrue() {
- when(mPackageManager.getHomeActivities(anyList()))
- .thenReturn(new ComponentName("Package1", "cls1"));
- assertThat(mController.isDefaultApp()).isTrue();
- }
-
- @Test
- public void isDefaultApp_notDefaultHome_shouldReturnFalse() {
- when(mPackageManager.getHomeActivities(anyList()))
- .thenReturn(new ComponentName("pkg2", "cls1"));
- assertThat(mController.isDefaultApp()).isFalse();
- }
-
- @Implements(DefaultHomePreferenceController.class)
- public static class ShadowDefaultHomePreferenceController {
- @Implementation
- protected static boolean hasHomePreference(String pkg, Context context) {
- return true;
- }
- }
}