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

Commit 94234193 authored by Michal Pražák's avatar Michal Pražák Committed by Bruno Martins
Browse files

SystemUI: add FloatingRotationButton for hw-key devices

Add floating rotation button for hardware key devices.
Screenshot: https://imgur.com/a/KPNGD43



Co-authored-by: default avatarTimi <timi.rautamaki@gmail.com>
Change-Id: I181d0b94cf1b740c20313ee556308f237cc3fd3f
parent 67c4912d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ public class RotationButtonController {
        return (disable2Flags & StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS) != 0;
    }

    RotationButtonController(Context context, @ColorInt int lightIconColor,
    public RotationButtonController(Context context, @ColorInt int lightIconColor,
            @ColorInt int darkIconColor) {
        mContext = context;
        mLightIconColor = lightIconColor;
@@ -136,7 +136,7 @@ public class RotationButtonController {
        mTaskStackListener = new TaskStackListenerImpl();
    }

    void setRotationButton(RotationButton rotationButton,
    public void setRotationButton(RotationButton rotationButton,
            Consumer<Boolean> visibilityChangedCallback) {
        mRotationButton = rotationButton;
        mRotationButton.setRotationButtonController(this);
@@ -179,7 +179,7 @@ public class RotationButtonController {
        TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
    }

    void setRotationCallback(Consumer<Integer> watcher) {
    public void setRotationCallback(Consumer<Integer> watcher) {
        mRotWatcherListener = watcher;
    }

@@ -287,7 +287,7 @@ public class RotationButtonController {
        mRotationButton.setDarkIntensity(darkIntensity);
    }

    void onRotationProposal(int rotation, int windowRotation, boolean isValid) {
    public void onRotationProposal(int rotation, int windowRotation, boolean isValid) {
        if (!mRotationButton.acceptRotationProposal() || (!mHomeRotationEnabled
                && mIsRecentsAnimationRunning)) {
            return;
+58 −1
Original line number Diff line number Diff line
@@ -25,32 +25,42 @@ import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.EventLog;
import android.util.Pair;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.Gravity;
import android.view.IWindowManager;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
import android.widget.LinearLayout;

import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.EventLogTags;
import com.android.systemui.navigationbar.gestural.FloatingRotationButton;
import com.android.systemui.navigationbar.RotationButton;
import com.android.systemui.navigationbar.RotationButtonController;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.util.leak.RotationUtils;

import java.util.function.Consumer;
import java.util.List;
import java.util.Objects;

public class PhoneStatusBarView extends PanelBar {
public class PhoneStatusBarView extends PanelBar implements Callbacks {
    private static final String TAG = "PhoneStatusBarView";
    private static final boolean DEBUG = StatusBar.DEBUG;
    private static final boolean DEBUG_GESTURES = false;
@@ -73,6 +83,7 @@ public class PhoneStatusBarView extends PanelBar {
    private DarkReceiver mBattery;
    private ClockController mClockController;
    private int mRotationOrientation = -1;
    private RotationButtonController mRotationButtonController;
    @Nullable
    private View mCenterIconSpace;
    @Nullable
@@ -93,6 +104,43 @@ public class PhoneStatusBarView extends PanelBar {
        super(context, attrs);
        mCommandQueue = Dependency.get(CommandQueue.class);
        mContentInsetsProvider = Dependency.get(StatusBarContentInsetsProvider.class);

        // Only create FRB here if there is no navbar
        if (!hasNavigationBar()) {
            final Context lightContext = new ContextThemeWrapper(context,
                    Utils.getThemeAttr(context, R.attr.lightIconTheme));
            final Context darkContext = new ContextThemeWrapper(context,
                    Utils.getThemeAttr(context, R.attr.darkIconTheme));
            final int lightIconColor =
                    Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor);
            final int darkIconColor =
                    Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor);
            final FloatingRotationButton floatingRotationButton =
                    new FloatingRotationButton(context);
            mRotationButtonController = new RotationButtonController(lightContext,
                    lightIconColor, darkIconColor);
            mRotationButtonController.setRotationButton(floatingRotationButton,
                    mRotationButtonListener);
        }
    }

    @Override
    public void onRotationProposal(final int rotation, boolean isValid) {
        if (mRotationButtonController != null && !hasNavigationBar()) {
            final int winRotation = getDisplay().getRotation();
            mRotationButtonController.onRotationProposal(rotation, winRotation, isValid);
        }
    }

    private final Consumer<Boolean> mRotationButtonListener = (visible) -> {};
    private final Consumer<Integer> mRotationWatcher = (rotation) -> {};

    private boolean hasNavigationBar() {
        try {
            IWindowManager windowManager = WindowManagerGlobal.getWindowManagerService();
            return windowManager.hasNavigationBar(Display.DEFAULT_DISPLAY);
        } catch (RemoteException ex) {}
        return false;
    }

    public void setBar(StatusBar bar) {
@@ -127,6 +175,11 @@ public class PhoneStatusBarView extends PanelBar {
        if (updateOrientationAndCutout()) {
            updateLayoutForCutout();
        }

        if (mRotationButtonController != null && !hasNavigationBar()) {
            mRotationButtonController.setRotationCallback(mRotationWatcher);
            mCommandQueue.addCallback(this);
        }
    }

    @Override
@@ -135,6 +188,10 @@ public class PhoneStatusBarView extends PanelBar {
        Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mBattery);
        mClockController.removeDarkReceiver();
        mDisplayCutout = null;

        if (mRotationButtonController != null) {
            mCommandQueue.removeCallback(this);
        }
    }

    @Override