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

Commit 29d2bff7 authored by Alex Kershaw's avatar Alex Kershaw
Browse files

Don't display footer text when calling app is DPC.

If the calling app has admin rights (DA/DO/PO), don't display footer
text that the calling app is 'recommending' that a password is set.

Fixes: 131888973
Test: atest com.android.settings.password.SetNewPasswordActivityTest --verbose
Test: atest com.android.settings.password.ChooseLockGenericTest --verbose
Test: manual
Change-Id: I32785d33e6425416fc1dbba24540ece8917b58f3
parent 76cf0dbd
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;

import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;

import android.accessibilityservice.AccessibilityServiceInfo;
@@ -169,6 +170,12 @@ public class ChooseLockGeneric extends SettingsActivity {
        /** From intent extra {@link ChooseLockSettingsHelper#EXTRA_KEY_CALLER_APP_NAME}. */
        private String mCallerAppName = null;

        /**
         * The value from the intent extra {@link
         * ChooseLockSettingsHelper#EXTRA_KEY_IS_CALLING_APP_ADMIN}.
         */
        private boolean mIsCallingAppAdmin;

        protected boolean mForFingerprint = false;
        protected boolean mForFace = false;

@@ -217,6 +224,8 @@ public class ChooseLockGeneric extends SettingsActivity {
                    .getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE);
            mCallerAppName =
                    getActivity().getIntent().getStringExtra(EXTRA_KEY_CALLER_APP_NAME);
            mIsCallingAppAdmin = getActivity().getIntent()
                    .getBooleanExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, /* defValue= */ false);
            mForChangeCredRequiredForBoot = getArguments() != null && getArguments().getBoolean(
                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT);
            mUserManager = UserManager.get(getActivity());
@@ -490,7 +499,7 @@ public class ChooseLockGeneric extends SettingsActivity {
        protected void addPreferences() {
            addPreferencesFromResource(R.xml.security_settings_picker);

            if (!TextUtils.isEmpty(mCallerAppName)) {
            if (!TextUtils.isEmpty(mCallerAppName) && !mIsCallingAppAdmin) {
                FooterPreferenceMixinCompat footerMixin =
                        new FooterPreferenceMixinCompat(this, getSettingsLifecycle());
                FooterPreference footer = footerMixin.createFooterPreference();
+6 −0
Original line number Diff line number Diff line
@@ -60,6 +60,12 @@ public final class ChooseLockSettingsHelper {
     */
    public static final String EXTRA_KEY_CALLER_APP_NAME = "caller_app_name";

    /**
     * Intent extra indicating that the calling app is an admin, such as a Device Adimn, Device
     * Owner, or Profile Owner.
     */
    public static final String EXTRA_KEY_IS_CALLING_APP_ADMIN = "is_calling_app_admin";

    /**
     * When invoked via {@link ConfirmLockPassword.InternalActivity}, this flag
     * controls if we relax the enforcement of
+23 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;

import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;

import android.app.Activity;
@@ -30,6 +31,8 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager.PasswordComplexity;
import android.app.admin.PasswordMetrics;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
@@ -39,6 +42,8 @@ import com.android.settings.Utils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;

import java.util.List;

/**
 * Trampolines {@link DevicePolicyManager#ACTION_SET_NEW_PASSWORD} and
 * {@link DevicePolicyManager#ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} intent to the appropriate UI
@@ -116,10 +121,28 @@ public class SetNewPasswordActivity extends Activity implements SetNewPasswordCo
        if (mRequestedMinComplexity != PASSWORD_COMPLEXITY_NONE) {
            intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, mRequestedMinComplexity);
        }
        if (isCallingAppAdmin()) {
            intent.putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true);
        }
        startActivity(intent);
        finish();
    }

    private boolean isCallingAppAdmin() {
        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
        String callingAppPackageName = PasswordUtils.getCallingAppPackageName(getActivityToken());
        List<ComponentName> admins = devicePolicyManager.getActiveAdmins();
        if (admins == null) {
            return false;
        }
        for (ComponentName componentName : admins) {
            if (componentName.getPackageName().equals(callingAppPackageName)) {
                return true;
            }
        }
        return false;
    }

    private void logSetNewPasswordIntent() {
        final String callingAppPackageName =
                PasswordUtils.getCallingAppPackageName(getActivityToken());
+12 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;

import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;

import static com.google.common.truth.Truth.assertThat;
@@ -182,12 +183,22 @@ public class ChooseLockGenericTest {
        CharSequence expectedTitle =
                mActivity.getString(R.string.unlock_footer_none_complexity_requested, "app name");

        mFragment.updatePreferencesOrFinish(false /* isRecreatingActivity */);
        mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false);
        FooterPreference footer = mFragment.findPreference(FooterPreference.KEY_FOOTER);

        assertThat(footer.getTitle()).isEqualTo(expectedTitle);
    }

    @Test
    public void updatePreferencesOrFinish_callingAppIsAdmin_noFooter() {
        initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true));

        mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false);

        FooterPreference footer = mFragment.findPreference(FooterPreference.KEY_FOOTER);
        assertThat(footer).isNull();
    }

    @Test
    public void onActivityResult_requestcode0_shouldNotFinish() {
        initActivity(null);
+54 −8
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;

import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;

import static com.google.common.truth.Truth.assertThat;
@@ -32,8 +33,10 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
@@ -54,6 +57,8 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowActivity;
import org.robolectric.shadows.ShadowDevicePolicyManager;
import org.robolectric.shadows.ShadowLog;

@RunWith(RobolectricTestRunner.class)
public class SetNewPasswordActivityTest {
@@ -91,7 +96,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class).get();
        activity.launchChooseLock(new Bundle());
        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent intent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent intent = getLaunchChooseLockIntent(shadowActivity);

        assertThat(intent.getComponent())
                .isEqualTo(new ComponentName(activity, ChooseLockGeneric.class));
@@ -105,7 +110,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class).get();
        activity.launchChooseLock(new Bundle());
        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent intent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent intent = getLaunchChooseLockIntent(shadowActivity);

        assertThat(intent.getComponent())
                .isEqualTo(new ComponentName(activity, SetupChooseLockGeneric.class));
@@ -149,7 +154,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();

        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
        assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD);
        assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isTrue();
        assertThat(actualIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE))
@@ -179,7 +184,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();

        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
        assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD);
        assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
        assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
@@ -207,7 +212,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();

        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
        assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD);
        assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
        assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
@@ -234,7 +239,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();

        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
        assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD);
        assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
        assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
@@ -262,7 +267,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();

        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
        assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD);
        assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
        assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
@@ -289,7 +294,7 @@ public class SetNewPasswordActivityTest {
                Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();

        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
        Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
        assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD);
        assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
        assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
@@ -301,4 +306,45 @@ public class SetNewPasswordActivityTest {
                PKG_NAME,
                Integer.MIN_VALUE);
    }

    @Test
    @Config(shadows = {ShadowPasswordUtils.class})
    public void launchChooseLock_callingAppIsAdmin_setsAdminExtra() {
        SetNewPasswordActivity activity =
                Robolectric.buildActivity(SetNewPasswordActivity.class).get();
        DevicePolicyManager devicePolicyManager =
                (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
        Shadows.shadowOf(devicePolicyManager).setActiveAdmin(buildTestComponentName(PKG_NAME));
        ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);

        activity.launchChooseLock(new Bundle());

        Intent intent = getLaunchChooseLockIntent(Shadows.shadowOf(activity));
        assertThat(intent.hasExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN)).isTrue();
    }

    @Test
    @Config(shadows = {ShadowPasswordUtils.class})
    public void launchChooseLock_callingAppIsNotAdmin_doesNotSetAdminExtra() {
        SetNewPasswordActivity activity =
                Robolectric.buildActivity(SetNewPasswordActivity.class).get();
        DevicePolicyManager devicePolicyManager =
                (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
        Shadows.shadowOf(devicePolicyManager)
                .setActiveAdmin(buildTestComponentName("other_pkg_name"));
        ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);

        activity.launchChooseLock(new Bundle());

        Intent intent = getLaunchChooseLockIntent(Shadows.shadowOf(activity));
        assertThat(intent.hasExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN)).isFalse();
    }

    private ComponentName buildTestComponentName(String packageName) {
        return new ComponentName(packageName, "clazz");
    }

    private Intent getLaunchChooseLockIntent(ShadowActivity shadowActivity) {
        return shadowActivity.getNextStartedActivityForResult().intent;
    }
}