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

Commit f459d407 authored by Shraddha Basantwani's avatar Shraddha Basantwani Committed by Android (Google) Code Review
Browse files

Merge "Add biometric authentication for package modification" into tm-qpr-dev

parents 6e347e2d 06342081
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -114,6 +114,7 @@ import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settingslib.widget.ActionBarShadowController;
import com.android.settingslib.widget.AdaptiveIcon;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@@ -1247,4 +1248,19 @@ public final class Utils extends com.android.settingslib.Utils {
        final UserManager userManager = context.getSystemService(UserManager.class);
        return userManager != null && userManager.isSystemUser();
    }

    /**
     * Returns {@code true} if the supplied package is a protected package. Otherwise, returns
     * {@code false}.
     *
     * @param context the context
     * @param packageName the package name
     */
    public static boolean isProtectedPackage(
            @NonNull Context context, @NonNull String packageName) {
        final List<String> protectedPackageNames = Arrays.asList(context.getResources()
                .getStringArray(com.android.internal.R.array
                        .config_biometric_protected_package_names));
        return protectedPackageNames != null && protectedPackageNames.contains(packageName);
    }
}
+47 −19
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
@@ -249,12 +250,20 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
                    } else {
                        showDialogInner(ButtonActionDialogFragment.DialogType.DISABLE);
                    }
                } else if (mAppEntry.info.enabled) {
                    requireAuthAndExecute(() -> {
                        mMetricsFeatureProvider.action(
                                mActivity,
                                SettingsEnums.ACTION_SETTINGS_DISABLE_APP,
                                getPackageNameForMetric());
                        AsyncTask.execute(new DisableChangerRunnable(mPm,
                                mAppEntry.info.packageName,
                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT));
                    });
                } else {
                    mMetricsFeatureProvider.action(
                            mActivity,
                            mAppEntry.info.enabled
                                    ? SettingsEnums.ACTION_SETTINGS_DISABLE_APP
                                    : SettingsEnums.ACTION_SETTINGS_ENABLE_APP,
                            SettingsEnums.ACTION_SETTINGS_ENABLE_APP,
                            getPackageNameForMetric());
                    AsyncTask.execute(new DisableChangerRunnable(mPm, mAppEntry.info.packageName,
                            PackageManager.COMPONENT_ENABLED_STATE_DEFAULT));
@@ -303,13 +312,28 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
        }
    }

    /**
     * Runs the given action with restricted lock authentication if it is a protected package.
     *
     * @param action The action to run.
     */
    private void requireAuthAndExecute(Runnable action) {
        if (Utils.isProtectedPackage(mContext, mAppEntry.info.packageName)) {
            AppInfoDashboardFragment.showLockScreen(mContext, () -> action.run());
        } else {
            action.run();
        }
    }

    public void handleDialogClick(int id) {
        switch (id) {
            case ButtonActionDialogFragment.DialogType.DISABLE:
                requireAuthAndExecute(() -> {
                    mMetricsFeatureProvider.action(mActivity,
                            SettingsEnums.ACTION_SETTINGS_DISABLE_APP);
                    AsyncTask.execute(new DisableChangerRunnable(mPm, mAppEntry.info.packageName,
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER));
                });
                break;
            case ButtonActionDialogFragment.DialogType.SPECIAL_DISABLE:
                mMetricsFeatureProvider.action(mActivity,
@@ -317,7 +341,9 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
                uninstallPkg(mAppEntry.info.packageName, false, true);
                break;
            case ButtonActionDialogFragment.DialogType.FORCE_STOP:
                requireAuthAndExecute(() -> {
                    forceStopPackage(mAppEntry.info.packageName);
                });
                break;
        }
    }
@@ -547,6 +573,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp

    @VisibleForTesting
    void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) {
        requireAuthAndExecute(() -> {
            stopListeningToPackageRemove();
            // Create new intent to launch Uninstaller activity
            Uri packageUri = Uri.parse("package:" + packageName);
@@ -557,6 +584,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
                    mActivity, SettingsEnums.ACTION_SETTINGS_UNINSTALL_APP);
            mFragment.startActivityForResult(uninstallIntent, mRequestUninstall);
            mDisableAfterUninstall = andDisable;
        });
    }

    @VisibleForTesting
+2 −1
Original line number Diff line number Diff line
@@ -430,7 +430,8 @@ public class AppInfoDashboardFragment extends DashboardFragment
        }
    }

    private static void showLockScreen(Context context, Runnable successRunnable) {
    /** Shows the lock screen if the keyguard is secured. */
    public static void showLockScreen(Context context, Runnable successRunnable) {
        final KeyguardManager keyguardManager = context.getSystemService(
                KeyguardManager.class);

+3 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
@@ -81,6 +82,7 @@ import org.robolectric.util.ReflectionHelpers;

import java.util.Set;

@Config(shadows = {ShadowUtils.class})
@RunWith(RobolectricTestRunner.class)
public class AppButtonsPreferenceControllerTest {

@@ -166,6 +168,7 @@ public class AppButtonsPreferenceControllerTest {
    @After
    public void tearDown() {
        ShadowAppUtils.reset();
        ShadowUtils.reset();
    }

    @Test
+11 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ public class ShadowUtils {
    private static ArraySet<String> sResultLinks = new ArraySet<>();
    private static boolean sIsBatteryPresent;
    private static boolean sIsMultipleBiometricsSupported;
    private static boolean sIsProtectedPackage;

    @Implementation
    protected static int enforceSameOwner(Context context, int userId) {
@@ -82,6 +83,7 @@ public class ShadowUtils {
        sResultLinks = new ArraySet<>();
        sIsBatteryPresent = true;
        sIsMultipleBiometricsSupported = false;
        sIsProtectedPackage = false;
    }

    public static void setIsDemoUser(boolean isDemoUser) {
@@ -188,4 +190,13 @@ public class ShadowUtils {
    public static void setIsMultipleBiometricsSupported(boolean isMultipleBiometricsSupported) {
        sIsMultipleBiometricsSupported = isMultipleBiometricsSupported;
    }

    @Implementation
    protected static boolean isProtectedPackage(Context context, String packageName) {
        return sIsProtectedPackage;
    }

    public static void setIsProtectedPackage(boolean isProtectedPackage) {
        sIsProtectedPackage = isProtectedPackage;
    }
}