Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3064ca58 authored by Hai Zhang's avatar Hai Zhang
Browse files

Migrate all default app shortcut preference to use roles.

Bug: 124452117
Test: build
Change-Id: I19375dc21bfcd932a263c49330dc9a040a446beb
parent d3824aa4
Loading
Loading
Loading
Loading
+15 −57
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ import android.app.role.RoleManager;
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;
@@ -28,10 +27,7 @@ import androidx.preference.PreferenceScreen;

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
@@ -58,8 +54,6 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre

        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,
@@ -68,13 +62,6 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre
                    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);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
@@ -98,7 +85,7 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre
        if (mContext.getSystemService(UserManager.class).isManagedProfile()) {
            return DISABLED_FOR_USER;
        }
        return hasAppCapability() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
        return mAppQualified ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }

    @Override
@@ -112,49 +99,20 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre
        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();
        }
        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) {
    private boolean isDefaultApp() {
        final String packageName = CollectionUtils.firstOrNull(mRoleManager.getRoleHolders(
                mRoleName));
        return TextUtils.equals(mPackageName, packageName);
    }
        return false;
    }
}
+2 −17
Original line number Diff line number Diff line
@@ -14,10 +14,8 @@

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 {
@@ -25,19 +23,6 @@ public class DefaultBrowserShortcutPreferenceController
    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());
    }

}
+2 −14
Original line number Diff line number Diff line
@@ -14,27 +14,15 @@

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);
    }

}
+2 −15
Original line number Diff line number Diff line
@@ -14,28 +14,15 @@

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());
    }

}
+3 −79
Original line number Diff line number Diff line
@@ -34,8 +34,6 @@ import android.permission.PermissionControllerManager;
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;
@@ -73,7 +71,6 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
    private ShadowUserManager mShadowUserManager;

    private TestRolePreferenceController mController;
    private TestLegacyPreferenceController mLegacyController;

    @Before
    public void setUp() {
@@ -86,7 +83,6 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
        mShadowUserManager = shadowOf(mActivity.getSystemService(UserManager.class));
        mController = new TestRolePreferenceController(mActivity);
        when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
        mLegacyController = new TestLegacyPreferenceController(mActivity);
    }

    @Test
@@ -141,8 +137,8 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
        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);
    }

@@ -150,17 +146,17 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
    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);
@@ -172,76 +168,4 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
            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;
        }
    }
}
Loading