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

Commit 9325f9b9 authored by Joanne Chung's avatar Joanne Chung
Browse files

Fix system toolbar doesn't use correct theme.

The toolbar should set the theme to the app's theme. Because the
service cannot get the application context, we should pass this
information from application to service.

Bug: 218833400
Test: manual. Use light/dark theme for app, the toolbar shows with
the same theme
Test: atest TextViewIntegrationTest
Test: atest android.widget.TextViewActivityTest

Change-Id: I6d4e4e117c680ce57e760a87987059eded09b2bc
parent 26756ac2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ public final class DefaultSelectionToolbarRenderService extends SelectionToolbar

        if (mToolbarCache.indexOfKey(callingUid) < 0) {
            RemoteSelectionToolbar toolbar = new RemoteSelectionToolbar(this,
                    widgetToken, showInfo.getHostInputToken(),
                    widgetToken, showInfo,
                    callbackWrapper, this::transferTouch);
            mToolbarCache.put(callingUid, new Pair<>(widgetToken, toolbar));
        }
+4 −9
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
@@ -162,15 +161,14 @@ final class RemoteSelectionToolbar {
    private final Rect mTempContentRectForRoot = new Rect();
    private final int[] mTempCoords = new int[2];

    RemoteSelectionToolbar(Context context, long selectionToolbarToken, IBinder hostInputToken,
    RemoteSelectionToolbar(Context context, long selectionToolbarToken, ShowInfo showInfo,
            SelectionToolbarRenderService.RemoteCallbackWrapper callbackWrapper,
            SelectionToolbarRenderService.TransferTouchListener transferTouchListener) {
        mContext = applyDefaultTheme(context);
        mContext = applyDefaultTheme(context, showInfo.isIsLightTheme());
        mSelectionToolbarToken = selectionToolbarToken;
        mCallbackWrapper = callbackWrapper;
        mTransferTouchListener = transferTouchListener;
        mHostInputToken = hostInputToken;

        mHostInputToken = showInfo.getHostInputToken();
        mContentContainer = createContentContainer(mContext);
        mMarginHorizontal = mContext.getResources()
                .getDimensionPixelSize(R.dimen.floating_toolbar_horizontal_margin);
@@ -1359,12 +1357,9 @@ final class RemoteSelectionToolbar {
    /**
     * Returns a re-themed context with controlled look and feel for views.
     */
    private static Context applyDefaultTheme(Context originalContext) {
        TypedArray a = originalContext.obtainStyledAttributes(new int[]{R.attr.isLightTheme});
        boolean isLightTheme = a.getBoolean(0, true);
    private static Context applyDefaultTheme(Context originalContext, boolean isLightTheme) {
        int themeId =
                isLightTheme ? R.style.Theme_DeviceDefault_Light : R.style.Theme_DeviceDefault;
        a.recycle();
        return new ContextThemeWrapper(originalContext, themeId);
    }

+31 −8
Original line number Diff line number Diff line
@@ -75,6 +75,11 @@ public final class ShowInfo implements Parcelable {
    @NonNull
    private final IBinder mHostInputToken;

    /**
     * If the host application uses light theme.
     */
    private final boolean mIsLightTheme;



    // Code below generated by codegen v1.0.23.
@@ -109,6 +114,8 @@ public final class ShowInfo implements Parcelable {
     * @param hostInputToken
     *   The host application's input token, this allows the remote render service to transfer
     *   the touch focus to the host application.
     * @param isLightTheme
     *   If the host application uses light theme.
     */
    @DataClass.Generated.Member
    public ShowInfo(
@@ -118,7 +125,8 @@ public final class ShowInfo implements Parcelable {
            @NonNull Rect contentRect,
            int suggestedWidth,
            @NonNull Rect viewPortOnScreen,
            @NonNull IBinder hostInputToken) {
            @NonNull IBinder hostInputToken,
            boolean isLightTheme) {
        this.mWidgetToken = widgetToken;
        this.mLayoutRequired = layoutRequired;
        this.mMenuItems = menuItems;
@@ -134,6 +142,7 @@ public final class ShowInfo implements Parcelable {
        this.mHostInputToken = hostInputToken;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mHostInputToken);
        this.mIsLightTheme = isLightTheme;

        // onConstructed(); // You can define this method to get a callback
    }
@@ -196,6 +205,14 @@ public final class ShowInfo implements Parcelable {
        return mHostInputToken;
    }

    /**
     * If the host application uses light theme.
     */
    @DataClass.Generated.Member
    public boolean isIsLightTheme() {
        return mIsLightTheme;
    }

    @Override
    @DataClass.Generated.Member
    public String toString() {
@@ -209,7 +226,8 @@ public final class ShowInfo implements Parcelable {
                "contentRect = " + mContentRect + ", " +
                "suggestedWidth = " + mSuggestedWidth + ", " +
                "viewPortOnScreen = " + mViewPortOnScreen + ", " +
                "hostInputToken = " + mHostInputToken +
                "hostInputToken = " + mHostInputToken + ", " +
                "isLightTheme = " + mIsLightTheme +
        " }";
    }

@@ -232,7 +250,8 @@ public final class ShowInfo implements Parcelable {
                && java.util.Objects.equals(mContentRect, that.mContentRect)
                && mSuggestedWidth == that.mSuggestedWidth
                && java.util.Objects.equals(mViewPortOnScreen, that.mViewPortOnScreen)
                && java.util.Objects.equals(mHostInputToken, that.mHostInputToken);
                && java.util.Objects.equals(mHostInputToken, that.mHostInputToken)
                && mIsLightTheme == that.mIsLightTheme;
    }

    @Override
@@ -249,6 +268,7 @@ public final class ShowInfo implements Parcelable {
        _hash = 31 * _hash + mSuggestedWidth;
        _hash = 31 * _hash + java.util.Objects.hashCode(mViewPortOnScreen);
        _hash = 31 * _hash + java.util.Objects.hashCode(mHostInputToken);
        _hash = 31 * _hash + Boolean.hashCode(mIsLightTheme);
        return _hash;
    }

@@ -258,9 +278,10 @@ public final class ShowInfo implements Parcelable {
        // You can override field parcelling by defining methods like:
        // void parcelFieldName(Parcel dest, int flags) { ... }

        byte flg = 0;
        int flg = 0;
        if (mLayoutRequired) flg |= 0x2;
        dest.writeByte(flg);
        if (mIsLightTheme) flg |= 0x80;
        dest.writeInt(flg);
        dest.writeLong(mWidgetToken);
        dest.writeParcelableList(mMenuItems, flags);
        dest.writeTypedObject(mContentRect, flags);
@@ -280,8 +301,9 @@ public final class ShowInfo implements Parcelable {
        // You can override field unparcelling by defining methods like:
        // static FieldType unparcelFieldName(Parcel in) { ... }

        byte flg = in.readByte();
        int flg = in.readInt();
        boolean layoutRequired = (flg & 0x2) != 0;
        boolean isLightTheme = (flg & 0x80) != 0;
        long widgetToken = in.readLong();
        List<ToolbarMenuItem> menuItems = new java.util.ArrayList<>();
        in.readParcelableList(menuItems, ToolbarMenuItem.class.getClassLoader());
@@ -305,6 +327,7 @@ public final class ShowInfo implements Parcelable {
        this.mHostInputToken = hostInputToken;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mHostInputToken);
        this.mIsLightTheme = isLightTheme;

        // onConstructed(); // You can define this method to get a callback
    }
@@ -324,10 +347,10 @@ public final class ShowInfo implements Parcelable {
    };

    @DataClass.Generated(
            time = 1643186262604L,
            time = 1645108384245L,
            codegenVersion = "1.0.23",
            sourceFile = "frameworks/base/core/java/android/view/selectiontoolbar/ShowInfo.java",
            inputSignatures = "private final  long mWidgetToken\nprivate final  boolean mLayoutRequired\nprivate final @android.annotation.NonNull java.util.List<android.view.selectiontoolbar.ToolbarMenuItem> mMenuItems\nprivate final @android.annotation.NonNull android.graphics.Rect mContentRect\nprivate final  int mSuggestedWidth\nprivate final @android.annotation.NonNull android.graphics.Rect mViewPortOnScreen\nprivate final @android.annotation.NonNull android.os.IBinder mHostInputToken\nclass ShowInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genEqualsHashCode=true)")
            inputSignatures = "private final  long mWidgetToken\nprivate final  boolean mLayoutRequired\nprivate final @android.annotation.NonNull java.util.List<android.view.selectiontoolbar.ToolbarMenuItem> mMenuItems\nprivate final @android.annotation.NonNull android.graphics.Rect mContentRect\nprivate final  int mSuggestedWidth\nprivate final @android.annotation.NonNull android.graphics.Rect mViewPortOnScreen\nprivate final @android.annotation.NonNull android.os.IBinder mHostInputToken\nprivate final  boolean mIsLightTheme\nclass ShowInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genEqualsHashCode=true)")
    @Deprecated
    private void __metadata() {}

+11 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiThread;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -107,6 +108,7 @@ public final class RemoteFloatingToolbarPopup implements FloatingToolbarPopup {
    private int mSuggestedWidth;
    private final Rect mScreenViewPort = new Rect();
    private boolean mWidthChanged = true;
    private final boolean mIsLightTheme;

    private final int[] mCoordsOnScreen = new int[2];
    private final int[] mCoordsOnWindow = new int[2];
@@ -116,9 +118,17 @@ public final class RemoteFloatingToolbarPopup implements FloatingToolbarPopup {
        mPopupWindow = createPopupWindow(context);
        mSelectionToolbarManager = context.getSystemService(SelectionToolbarManager.class);
        mSelectionToolbarCallback = new SelectionToolbarCallbackImpl(this);
        mIsLightTheme = isLightTheme(context);
        mFloatingToolbarToken = NO_TOOLBAR_ID;
    }

    private boolean isLightTheme(Context context) {
        TypedArray a = context.obtainStyledAttributes(new int[]{R.attr.isLightTheme});
        boolean isLightTheme = a.getBoolean(0, true);
        a.recycle();
        return isLightTheme;
    }

    @UiThread
    @Override
    public void show(List<MenuItem> menuItems,
@@ -155,7 +165,7 @@ public final class RemoteFloatingToolbarPopup implements FloatingToolbarPopup {
                contentRect,
                suggestWidth,
                mScreenViewPort,
                mParent.getViewRootImpl().getInputToken());
                mParent.getViewRootImpl().getInputToken(), mIsLightTheme);
        if (DEBUG) {
            Log.v(FloatingToolbar.FLOATING_TOOLBAR_TAG,
                    "RemoteFloatingToolbarPopup.show() for " + showInfo);