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

Commit 82d07983 authored by jackqdyulei's avatar jackqdyulei
Browse files

Create Controller for app buttons

These two buttons(uninstall + forcestop) are used in both battery page
and app page, we should move the logic for these two buttons into one
place.

This cl creates the AppButtonsPreferenceController for the above
purpose. This cl only copies the logic to controller but hasn't make
InstalledAppDetails use this controller.

Since DialogFragment could not use function in controller directly,
the controller expose DialogListener and all the fragments must
implement this interface. Then they can delegate the method call
to controller directly.

The following cl will:
1. Make the InstalledAppDetails be compatible to controller
2. Make the InstalledAppDetails use this controller.

Bug: 35810915
Test: RunSettingsRoboTests
Change-Id: Ie2aa8064bcec3003233896c18be772825b12930a
parent ddba9667
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -129,4 +129,25 @@ public interface DevicePolicyManagerWrapper {
     * @see android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts
     */
    List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user);

    /**
     * Calls {@code DevicePolicyManager.isDeviceOwnerAppOnAnyUser()}.
     *
     * @see android.app.admin.DevicePolicyManager#isDeviceOwnerAppOnAnyUser
     */
    boolean isDeviceOwnerAppOnAnyUser(String packageName);

    /**
     * Calls {@code DevicePolicyManager.packageHasActiveAdmins()}.
     *
     * @see android.app.admin.DevicePolicyManager#packageHasActiveAdmins
     */
    boolean packageHasActiveAdmins(String packageName);

    /**
     * Calls {@code DevicePolicyManager.isUninstallInQueue()}.
     *
     * @see android.app.admin.DevicePolicyManager#isUninstallInQueue
     */
    boolean isUninstallInQueue(String packageName);
}
+15 −0
Original line number Diff line number Diff line
@@ -101,4 +101,19 @@ public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrappe
    public List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user) {
        return mDpm.getOwnerInstalledCaCerts(user);
    }

    @Override
    public boolean isDeviceOwnerAppOnAnyUser(String packageName) {
        return mDpm.isDeviceOwnerAppOnAnyUser(packageName);
    }

    @Override
    public boolean packageHasActiveAdmins(String packageName) {
        return mDpm.packageHasActiveAdmins(packageName);
    }

    @Override
    public boolean isUninstallInQueue(String packageName) {
        return mDpm.isUninstallInQueue(packageName);
    }
}
+57 −5
Original line number Diff line number Diff line
@@ -16,11 +16,19 @@

package com.android.settings.fuelgauge;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
@@ -36,6 +44,8 @@ import com.android.settings.Utils;
import com.android.settings.applications.AppHeaderController;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.PreferenceController;
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.ApplicationsState;

@@ -50,7 +60,8 @@ import java.util.List;
 *
 * This fragment will replace {@link PowerUsageDetail}
 */
public class AdvancedPowerUsageDetail extends PowerUsageBase {
public class AdvancedPowerUsageDetail extends PowerUsageBase implements
        ButtonActionDialogFragment.AppButtonsDialogListener {

    public static final String TAG = "AdvancedPowerUsageDetail";
    public static final String EXTRA_UID = "extra_uid";
@@ -67,6 +78,9 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase {
    private static final String KEY_PREF_POWER_USAGE = "app_power_usage";
    private static final String KEY_PREF_HEADER = "header_view";

    private static final int REQUEST_UNINSTALL = 0;
    private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;

    @VisibleForTesting
    LayoutPreference mHeaderPreference;
    @VisibleForTesting
@@ -77,6 +91,11 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase {
    private Preference mForegroundPreference;
    private Preference mBackgroundPreference;
    private Preference mPowerUsagePreference;
    private AppButtonsPreferenceController mAppButtonsPreferenceController;

    private DevicePolicyManagerWrapper mDpm;
    private UserManager mUserManager;
    private PackageManager mPackageManager;

    public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
            BatteryStatsHelper helper, int which, BatteryEntry entry, String usagePercent) {
@@ -112,6 +131,17 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase {
                R.string.details_title, null, new UserHandle(UserHandle.myUserId()));
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        mState = ApplicationsState.getInstance(getActivity().getApplication());
        mDpm = new DevicePolicyManagerWrapperImpl(
                (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
        mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
        mPackageManager = activity.getPackageManager();
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
@@ -120,7 +150,6 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase {
        mBackgroundPreference = findPreference(KEY_PREF_BACKGROUND);
        mPowerUsagePreference = findPreference(KEY_PREF_POWER_USAGE);
        mHeaderPreference = (LayoutPreference) findPreference(KEY_PREF_HEADER);
        mState = ApplicationsState.getInstance(getActivity().getApplication());

        final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
        if (packageName != null) {
@@ -160,7 +189,13 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase {

        if (mAppEntry == null) {
            controller.setLabel(bundle.getString(EXTRA_LABEL));
            controller.setIcon(getContext().getDrawable(bundle.getInt(EXTRA_ICON_ID)));

            final int iconId = bundle.getInt(EXTRA_ICON_ID, 0);
            if (iconId == 0) {
                controller.setIcon(context.getPackageManager().getDefaultActivityIcon());
            } else {
                controller.setIcon(context.getDrawable(bundle.getInt(EXTRA_ICON_ID)));
            }
        } else {
            mState.ensureIcon(mAppEntry);
            controller.setLabel(mAppEntry);
@@ -196,9 +231,26 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase {
        controllers.add(new BackgroundActivityPreferenceController(context, uid));
        controllers.add(new BatteryOptimizationPreferenceController(
                (SettingsActivity) getActivity(), this));
        controllers.add(
                new AppButtonsPreferenceController(getActivity(), getLifecycle(), packageName));
        mAppButtonsPreferenceController = new AppButtonsPreferenceController(
                (SettingsActivity) getActivity(), this, getLifecycle(), packageName, mState, mDpm,
                mUserManager, mPackageManager, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN);
        controllers.add(mAppButtonsPreferenceController);

        return controllers;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (mAppButtonsPreferenceController != null) {
            mAppButtonsPreferenceController.handleActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    public void handleDialogClick(int id) {
        if (mAppButtonsPreferenceController != null) {
            mAppButtonsPreferenceController.handleDialogClick(id);
        }
    }
}
+628 −12

File changed.

Preview size limit exceeded, changes collapsed.

+104 −0
Original line number Diff line number Diff line
package com.android.settings.fuelgauge;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.IntDef;
import android.support.annotation.VisibleForTesting;

import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Fragment to show the dialog for uninstall or forcestop. This fragment uses function in
 * target fragment to handle the dialog button click.
 */
public class ButtonActionDialogFragment extends InstrumentedDialogFragment implements
        DialogInterface.OnClickListener {

    /**
     * Interface to handle the dialog click
     */
    interface AppButtonsDialogListener {
        void handleDialogClick(int type);
    }

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({
            DialogType.DISABLE,
            DialogType.SPECIAL_DISABLE,
            DialogType.FORCE_STOP
    })
    public @interface DialogType {
        int DISABLE = 0;
        int SPECIAL_DISABLE = 1;
        int FORCE_STOP = 2;
    }

    private static final String ARG_ID = "id";
    @VisibleForTesting
    int mId;

    public static ButtonActionDialogFragment newInstance(@DialogType int id) {
        ButtonActionDialogFragment dialogFragment = new ButtonActionDialogFragment();
        Bundle args = new Bundle(1);
        args.putInt(ARG_ID, id);
        dialogFragment.setArguments(args);

        return dialogFragment;
    }

    @Override
    public int getMetricsCategory() {
        //TODO(35810915): update the metrics label because for now this fragment will be shown
        // in two screens
        return MetricsProto.MetricsEvent.DIALOG_APP_INFO_ACTION;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Bundle bundle = getArguments();
        mId = bundle.getInt(ARG_ID);
        Dialog dialog = createDialog(mId);
        if (dialog == null) {
            throw new IllegalArgumentException("unknown id " + mId);
        }
        return dialog;
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        final AppButtonsDialogListener lsn =
                (AppButtonsDialogListener) getTargetFragment();
        lsn.handleDialogClick(mId);
    }

    private AlertDialog createDialog(int id) {
        final Context context = getContext();
        switch (id) {
            case DialogType.DISABLE:
            case DialogType.SPECIAL_DISABLE:
                return new AlertDialog.Builder(context)
                        .setMessage(R.string.app_disable_dlg_text)
                        .setPositiveButton(R.string.app_disable_dlg_positive, this)
                        .setNegativeButton(R.string.dlg_cancel, null)
                        .create();
            case DialogType.FORCE_STOP:
                return new AlertDialog.Builder(context)
                        .setTitle(R.string.force_stop_dlg_title)
                        .setMessage(R.string.force_stop_dlg_text)
                        .setPositiveButton(R.string.dlg_ok, this)
                        .setNegativeButton(R.string.dlg_cancel, null)
                        .create();
        }
        return null;
    }
}
Loading