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

Commit 552943ca authored by Diogo Ferreira's avatar Diogo Ferreira Committed by Abhisek Devkota
Browse files

Recents: Port "Development shortcut" (2/2)

This patch includes the equivalent of our Development Shortcuts in
CM11 recents. Recents is very different now and this is mostly a rewrite.

The semantics changed a bit as well. The current code already has special
developer behavior when long-pressing the app icon and that is also where
the developer shortcuts are hooked. If the app icon is long-pressed and
developer shortcuts are active, a menu will be shown with the several available
options.

Fixes CML-61

Change-Id: I391a360b3dd88e179c2315503d18125f8d0b3792
parent 3abebe2d
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -5340,6 +5340,14 @@ public final class Settings {
         */
        public static final String ADVANCED_REBOOT = "advanced_reboot";

        /**
         * Whether to display a menu containing 'Wipe data', 'Force close' and other options
         * in the notification area and in the recent app list
         * @hide
         */
        public static final String DEVELOPMENT_SHORTCUT = "development_shortcut";


        /**
         * This are the settings to be backed up.
         *
@@ -5392,7 +5400,8 @@ public final class Settings {
            UI_NIGHT_MODE,
            SLEEP_TIMEOUT,
            PRIVACY_GUARD_DEFAULT,
            ADVANCED_REBOOT
            ADVANCED_REBOOT,
            DEVELOPMENT_SHORTCUT
        };

        /**
+3 −0
Original line number Diff line number Diff line
@@ -20,4 +20,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/recent_remove_item" android:title="@string/status_bar_recent_remove_item_title" />
    <item android:id="@+id/recent_inspect_item" android:title="@string/status_bar_recent_inspect_item_title" />
    <item android:id="@+id/recent_force_stop" android:title="@string/advanced_dev_option_force_stop" />
    <item android:id="@+id/recent_wipe_app" android:title="@string/advanced_dev_option_wipe_app" />
    <item android:id="@+id/recent_uninstall" android:title="@string/advanced_dev_option_uninstall" />
</menu>
+5 −0
Original line number Diff line number Diff line
@@ -25,4 +25,9 @@
    <string name="screenshot_delete_action">Delete</string>
    <string name="screenshot_delete_confirmation">Screenshot deleted.</string>

    <!-- Development shortcuts -->
    <string name="advanced_dev_option_wipe_app">Wipe app data</string>
    <string name="advanced_dev_option_force_stop">Force stop</string>
    <string name="advanced_dev_option_uninstall">Uninstall</string>

</resources>
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
        <item name="android:windowAnimationStyle">@style/Animation.RecentsActivity</item>
    </style>

    <style name="RecentsTheme" parent="@android:style/Theme">
    <style name="RecentsTheme" parent="@android:style/Theme.Material.Wallpaper">
        <!-- NoTitle -->
        <item name="android:windowNoTitle">true</item>
        <!-- Misc -->
+91 −0
Original line number Diff line number Diff line
@@ -17,16 +17,26 @@
package com.android.systemui.recents.views;

import android.animation.ValueAnimator;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.net.Uri;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
import android.widget.FrameLayout;
import android.widget.PopupMenu;
import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
@@ -75,6 +85,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
    int mFocusedTaskIndex = -1;
    int mPrevAccessibilityFocusedIndex = -1;

    private PopupMenu mPopup;

    // Optimizations
    int mStackViewsAnimationDuration;
    boolean mStackViewsDirty = true;
@@ -1025,6 +1037,85 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
        }
    }

    @Override
    public void onTaskViewLongClicked(final TaskView tv) {
        final PopupMenu popup = new PopupMenu(getContext(), tv.mHeaderView.mApplicationIcon);
        mPopup = popup;
        popup.getMenuInflater().inflate(R.menu.recent_popup_menu, popup.getMenu());

        final Task task = tv.getTask();
        final String packageName = task.key.baseIntent.getComponent().getPackageName();

        try {
            PackageManager pm = (PackageManager) getContext().getPackageManager();
            ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
            DevicePolicyManager dpm = (DevicePolicyManager) getContext()
                    .getSystemService(Context.DEVICE_POLICY_SERVICE);

            boolean hasActiveAdmins = dpm.packageHasActiveAdmins(packageName);
            boolean isClearable = (appInfo.flags &
                    (ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA | ApplicationInfo.FLAG_SYSTEM)) !=
                    ApplicationInfo.FLAG_SYSTEM;
            if (!isClearable || hasActiveAdmins) {
                popup.getMenu().findItem(R.id.recent_wipe_app).setEnabled(false);
                popup.getMenu().findItem(R.id.recent_uninstall).setEnabled(false);
            }
        } catch (PackageManager.NameNotFoundException ex) {
        }
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.recent_remove_item:
                        onTaskViewDismissed(tv);
                        break;
                    case R.id.recent_inspect_item:
                        onTaskViewAppInfoClicked(tv);
                        break;
                    case R.id.recent_force_stop:
                    {
                        ActivityManager am = (ActivityManager) getContext()
                                .getSystemService(Context.ACTIVITY_SERVICE);
                        am.forceStopPackage(packageName);
                        onTaskViewDismissed(tv);
                        break;
                    }
                    case R.id.recent_wipe_app:
                    {
                        ActivityManager am = (ActivityManager) getContext()
                                .getSystemService(Context.ACTIVITY_SERVICE);
                        am.clearApplicationUserData(packageName, new IPackageDataObserver.Stub() {
                            @Override
                            public void onRemoveCompleted(String packageName, boolean succeeded) {}
                        });
                        onTaskViewDismissed(tv);
                        break;
                    }
                    case R.id.recent_uninstall:
                    {
                        Uri packageUri = Uri.parse("package:" + packageName);
                        Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
                        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, true);
                        getContext().startActivity(uninstallIntent);
                        onTaskViewDismissed(tv);
                        break;
                    }
                    default:
                        return false;
                }
                return true;
            }
        });
        popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
            @Override
            public void onDismiss(PopupMenu menu) {
                mPopup = null;
            }
        });
        popup.show();
    }


    @Override
    public void onTaskViewClicked(TaskView tv, Task task, boolean lockToTask) {
        // Cancel any doze triggers
Loading