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

Commit da062dc6 authored by Jens Doll's avatar Jens Doll Committed by DvTonder
Browse files

Add pie control optimizations for Phone UI.

This commit brings some pie control tweaks to the Phone UI. These
tweaks make the pie controls react to several conditions that are
are special to the Phone UI. That means that this piece of code
is more deeply embedded within the SystemUI code.

This mostly adds the foloowing behaviour, that is Phone UI
dependent:
* Disable BOTTOM trigger when notification area is expanded
* Disable LEFT and RIGHT trigger when a keyguard is active
* Enable search light feature

Patch Set 3:
* CyanogenMod Code Style.
* setDisabledFlags now belongs to navigation bar callbacks

Patch Set 5:
* Removed duplicated .observe()

Patch Set 10:
* Fixed unintended trigger activation

Patch Set 13:
* Searchlight opens directly on the bottom (on the lock screen)

Patch Set 15:
* Fix conflict/rebase

Change-Id: I551745b69791adca75190c54282be19d85db75a9
parent 9422b3f0
Loading
Loading
Loading
Loading
+53 −9
Original line number Diff line number Diff line
@@ -165,6 +165,10 @@ public abstract class BaseStatusBar extends SystemUI implements
    protected PieController mPieController;
    protected PieLayout mPieContainer;
    private int mPieTriggerSlots;
    private int mPieTriggerMask = Position.LEFT.FLAG
            | Position.BOTTOM.FLAG
            | Position.RIGHT.FLAG
            | Position.TOP.FLAG;
    private View[] mPieTrigger = new View[Position.values().length];
    private PieSettingsObserver mSettingsObserver;

@@ -205,6 +209,12 @@ public abstract class BaseStatusBar extends SystemUI implements
                                        + event.getAxisValue(MotionEvent.AXIS_Y) + ") with position: "
                                        + tracker.position.name());
                            }
                            if (tracker.position == Position.BOTTOM
                                    && mPieController.isSearchLightEnabled()) {
                                // if we are at the bottom and nothing else is there, use a
                                // search light!
                                showSearchPanel();
                            } else {
                                // send the activation to the controller
                                mPieController.activateFromTrigger(v, event, tracker.position);
                                // forward a spoofed ACTION_DOWN event
@@ -212,6 +222,7 @@ public abstract class BaseStatusBar extends SystemUI implements
                                echo.setAction(MotionEvent.ACTION_DOWN);
                                return mPieContainer.onTouch(v, echo);
                            }
                        }
                        break;
                    default:
                        // whatever it was, we are giving up on this one
@@ -794,12 +805,30 @@ public abstract class BaseStatusBar extends SystemUI implements
                 if (DEBUG) Slog.d(TAG, "opening search panel");
                 if (mSearchPanelView != null) {
                     mSearchPanelView.show(true, true);

                     View bottom = mPieTrigger[Position.BOTTOM.INDEX];
                     if (bottom != null) {
                         WindowManager.LayoutParams lp =
                                 (android.view.WindowManager.LayoutParams) bottom.getLayoutParams();
                         lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
                         lp.flags |= WindowManager.LayoutParams.FLAG_SLIPPERY;
                         mWindowManager.updateViewLayout(bottom, lp);
                     }
                 }
                 break;
             case MSG_CLOSE_SEARCH_PANEL:
                 if (DEBUG) Slog.d(TAG, "closing search panel");
                 if (mSearchPanelView != null && mSearchPanelView.isShowing()) {
                     mSearchPanelView.show(false, true);

                     View bottom = mPieTrigger[Position.BOTTOM.INDEX];
                     if (bottom != null) {
                         WindowManager.LayoutParams lp =
                                 (android.view.WindowManager.LayoutParams) bottom.getLayoutParams();
                         lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
                         lp.flags &= ~WindowManager.LayoutParams.FLAG_SLIPPERY;
                         mWindowManager.updateViewLayout(bottom, lp);
                     }
                 }
                 break;
            }
@@ -1373,7 +1402,10 @@ public abstract class BaseStatusBar extends SystemUI implements
            }

            // add or update pie triggers
            if (DEBUG) Slog.d(TAG, "AttachPie with trigger position flags: " + mPieTriggerSlots);
            if (DEBUG) {
                Slog.d(TAG, "AttachPie with trigger position flags: "
                        + mPieTriggerSlots + " masked: " + (mPieTriggerSlots & mPieTriggerMask));
            }

            refreshPieTriggers();

@@ -1387,11 +1419,23 @@ public abstract class BaseStatusBar extends SystemUI implements
        }
    }

    public void updatePieTriggerMask(int newMask) {
        int oldState = mPieTriggerSlots & mPieTriggerMask;
        mPieTriggerMask = newMask;

        // first we check, if it would make a change
        if ((mPieTriggerSlots & mPieTriggerMask) != oldState) {
            if (isPieEnabled()) {
                refreshPieTriggers();
            }
        }
    }

    // This should only be called, when is is clear that the pie controls are active
    private void refreshPieTriggers() {
        for (Position g : Position.values()) {
            View trigger = mPieTrigger[g.INDEX];
            if (trigger == null && (mPieTriggerSlots & g.FLAG) != 0) {
            if (trigger == null && (mPieTriggerSlots & mPieTriggerMask & g.FLAG) != 0) {
                trigger = new View(mContext);
                trigger.setClickable(false);
                trigger.setLongClickable(false);
@@ -1406,7 +1450,7 @@ public abstract class BaseStatusBar extends SystemUI implements
                }
                mWindowManager.addView(trigger, getPieTriggerLayoutParams(g));
                mPieTrigger[g.INDEX] = trigger;
            } else if (trigger != null && (mPieTriggerSlots & g.FLAG) == 0) {
            } else if (trigger != null && (mPieTriggerSlots & mPieTriggerMask & g.FLAG) == 0) {
                mWindowManager.removeView(trigger);
                mPieTrigger[g.INDEX] = null;
            } else if (trigger != null) {
+16 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NotificationRowLayout;
import com.android.systemui.statusbar.policy.OnSizeChangedListener;
import com.android.systemui.statusbar.policy.Prefs;
import com.android.systemui.statusbar.policy.PieController.Position;
import com.android.systemui.statusbar.powerwidget.PowerWidget;

public class PhoneStatusBar extends BaseStatusBar {
@@ -2220,6 +2221,21 @@ public class PhoneStatusBar extends BaseStatusBar {
        }
        propagateMenuVisibility(showMenu);

        // hide pie triggers when keyguard is visible
        try {
            if (mWindowManagerService.isKeyguardLocked()) {
                updatePieTriggerMask(Position.BOTTOM.FLAG
                        | Position.TOP.FLAG);
            } else {
                updatePieTriggerMask(Position.LEFT.FLAG
                        | Position.BOTTOM.FLAG
                        | Position.RIGHT.FLAG
                        | Position.TOP.FLAG);
            }
        } catch (RemoteException e) {
            // nothing else to do ...
        }

        // See above re: lights-out policy for legacy apps.
        if (showMenu) setLightsOn(true);
    }
+15 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.PieController.Position;

public class PhoneStatusBarView extends PanelBar {
    private static final String TAG = "PhoneStatusBarView";
@@ -164,6 +165,12 @@ public class PhoneStatusBarView extends PanelBar {
        mBar.makeExpandedInvisibleSoon();
        mFadingPanel = null;
        mLastFullyOpenedPanel = null;

        // show up you pie controls
        mBar.updatePieTriggerMask(Position.LEFT.FLAG
                | Position.TOP.FLAG
                | Position.RIGHT.FLAG
                | Position.TOP.FLAG);
    }

    @Override
@@ -172,6 +179,14 @@ public class PhoneStatusBarView extends PanelBar {
        if (openPanel != mLastFullyOpenedPanel) {
            openPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
        }

        // back off you pie controls!
        if (mShouldFade) {
            mBar.updatePieTriggerMask(Position.LEFT.FLAG
                    | Position.RIGHT.FLAG
                    | Position.TOP.FLAG);
        }

        mFadingPanel = openPanel;
        mLastFullyOpenedPanel = openPanel;
        mShouldFade = true; // now you own the fade, mister
+81 −22
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import android.hardware.input.InputManager;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.Vibrator;
@@ -43,6 +45,7 @@ import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.util.Slog;
import android.view.HapticFeedbackConstants;
import android.view.IWindowManager;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
@@ -74,7 +77,8 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
        HOME,
        RECENT,
        MENU,
        SEARCH
        SEARCH,
        SEARCHLIGHT
    };

    public static final float EMPTY_ANGLE = 10;
@@ -89,6 +93,7 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
     */
    private BaseStatusBar mStatusBar;
    private Vibrator mVibrator;
    private IWindowManager mWm;
    private int mBatteryLevel;
    private int mBatteryStatus;
    private boolean mHasTelephony;
@@ -98,6 +103,7 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
    private PieSliceContainer mNavigationSlice;
    private PieSysInfo mSysInfo;
    private PieItem mMenuButton;
    private PieItem mSearchLight;

    private int mNavigationIconHints = 0;
    private int mDisabledFlags = 0;
@@ -249,12 +255,20 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,

    private SettingsObserver mSettingsObserver = new SettingsObserver(mHandler);

    private BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() {
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
                mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
                         BatteryManager.BATTERY_STATUS_UNKNOWN);
            } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                // Give up on screen off. what's the point in pie controls if you don't see them?
                if (mPieContainer != null) {
                    mPieContainer.exit();
                }
            }
        }
    };

@@ -269,6 +283,7 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
        mContext = context;

        mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        mWm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));

        final PackageManager pm = mContext.getPackageManager();
        mHasTelephony = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
@@ -314,8 +329,13 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,

        // start listening for changes
        mSettingsObserver.observe();
        mContext.registerReceiver(mBatteryReceiver,

        mContext.registerReceiver(mBroadcastReceiver,
                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        mContext.registerReceiver(mBroadcastReceiver, filter);

        if (mHasTelephony) {
            TelephonyManager telephonyManager =
@@ -340,6 +360,12 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
                    R.drawable.ic_sysbar_search_side, minimumImageSize));
        }

        // search light has a width of 6 to take the complete space that normally
        // BACK HOME RECENT would occupy
        mSearchLight = constructItem(6, ButtonType.SEARCHLIGHT,
                R.drawable.search_light, minimumImageSize);
        mNavigationSlice.addItem(mSearchLight);

        mMenuButton = constructItem(1, ButtonType.MENU,
                R.drawable.ic_sysbar_menu, minimumImageSize);
        mNavigationSlice.addItem(mMenuButton);
@@ -443,13 +469,25 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
        final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0);

        PieItem item = findItem(ButtonType.BACK);
        if (item != null) item.show(!disableBack);
        if (item != null) {
            item.show(!disableBack);
        }
        item = findItem(ButtonType.HOME);
        if (item != null) item.show(!disableHome);
        if (item != null) {
            item.show(!disableHome);
        }
        item = findItem(ButtonType.RECENT);
        if (item != null) item.show(!disableRecent);
        if (item != null) {
            item.show(!disableRecent);
        }
        item = findItem(ButtonType.SEARCH);
        if (item != null) item.show(!disableRecent && !disableSearch);
        if (item != null) {
            item.show(!disableRecent && !disableSearch);
        }
        // enable searchlight when nothing except search is enabled
        if (mSearchLight != null) {
            mSearchLight.show(disableHome && disableRecent && disableBack && !disableSearch);
        }
        setMenuVisibility(mShowMenu);
    }

@@ -508,7 +546,8 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
                }
                break;
            case SEARCH:
                launchAssistAction();
            case SEARCHLIGHT:
                launchAssistAction(type == ButtonType.SEARCHLIGHT);
                break;
        }
    }
@@ -525,7 +564,22 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
        }
    }

    private void launchAssistAction() {
    private void launchAssistAction(boolean force) {
        boolean isKeyguardShowing = false;
        try {
            isKeyguardShowing = mWm.isKeyguardLocked();
        } catch (RemoteException e) {
            // oh damn ...
        }

        if (isKeyguardShowing && force) {
            // Have keyguard show the bouncer and launch the activity if the user succeeds.
            try {
                mWm.showAssistant();
            } catch (RemoteException e) {
                // too bad, so sad...
            }
        } else {
            Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);

@@ -541,11 +595,16 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
                }
            }
        }
    }

    public boolean isShowing() {
        return mPieContainer != null && mPieContainer.isShowing();
    }

    public boolean isSearchLightEnabled() {
        return mSearchLight != null && (mSearchLight.flags & PieDrawable.VISIBLE) != 0;
    }

    public String getOperatorState() {
        if (!mHasTelephony) {
            return null;