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

Commit b7f55ec5 authored by Yohei Yukawa's avatar Yohei Yukawa Committed by Android (Google) Code Review
Browse files

Merge "Update the IME nav UI when gesture navigation mode changes"

parents ef4713d4 177e4aaf
Loading
Loading
Loading
Loading
+55 −1
Original line number Diff line number Diff line
@@ -16,19 +16,27 @@

package android.inputmethodservice;

import static android.content.Intent.ACTION_OVERLAY_CHANGED;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Insets;
import android.graphics.Rect;
import android.graphics.Region;
import android.inputmethodservice.navigationbar.NavigationBarFrame;
import android.inputmethodservice.navigationbar.NavigationBarView;
import android.os.PatternMatcher;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowInsets;
@@ -109,6 +117,9 @@ final class NavigationBarController {
        @Nullable
        Insets mLastInsets;

        @Nullable
        private BroadcastReceiver mSystemOverlayChangedReceiver;

        Impl(@NonNull InputMethodService inputMethodService) {
            mService = inputMethodService;
        }
@@ -136,6 +147,9 @@ final class NavigationBarController {
            if (!mRenderGesturalNavButtons) {
                return;
            }
            if (mNavigationBarFrame != null) {
                return;
            }
            final View rawDecorView = mService.mWindow.getWindow().getDecorView();
            if (!(rawDecorView instanceof ViewGroup)) {
                return;
@@ -175,6 +189,17 @@ final class NavigationBarController {
            mNavigationBarFrame.setBackground(null);
        }

        private void uninstallNavigationBarFrameIfNecessary() {
            if (mNavigationBarFrame == null) {
                return;
            }
            final ViewParent parent = mNavigationBarFrame.getParent();
            if (parent instanceof ViewGroup) {
                ((ViewGroup) parent).removeView(mNavigationBarFrame);
            }
            mNavigationBarFrame = null;
        }

        @Override
        public void updateTouchableInsets(@NonNull InputMethodService.Insets originalInsets,
                @NonNull ViewTreeObserver.InternalInsetsInfo dest) {
@@ -284,11 +309,38 @@ final class NavigationBarController {
                return;
            }
            mRenderGesturalNavButtons = isGesturalNavigationEnabled();
            if (mSystemOverlayChangedReceiver == null) {
                final IntentFilter intentFilter = new IntentFilter(ACTION_OVERLAY_CHANGED);
                intentFilter.addDataScheme(IntentFilter.SCHEME_PACKAGE);
                intentFilter.addDataSchemeSpecificPart("android", PatternMatcher.PATTERN_LITERAL);
                mSystemOverlayChangedReceiver = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        if (mDestroyed) {
                            return;
                        }
                        mRenderGesturalNavButtons = isGesturalNavigationEnabled();
                        if (mRenderGesturalNavButtons) {
                            installNavigationBarFrameIfNecessary();
                        } else {
                            uninstallNavigationBarFrameIfNecessary();
                        }
                    }
                };
                mService.registerReceiver(mSystemOverlayChangedReceiver, intentFilter);
            }
            installNavigationBarFrameIfNecessary();
        }

        @Override
        public void onDestroy() {
            if (mDestroyed) {
                return;
            }
            if (mSystemOverlayChangedReceiver != null) {
                mService.unregisterReceiver(mSystemOverlayChangedReceiver);
                mSystemOverlayChangedReceiver = null;
            }
            mDestroyed = true;
        }

@@ -322,7 +374,9 @@ final class NavigationBarController {

        @Override
        public String toDebugString() {
            return "{mRenderGesturalNavButtons=" + mRenderGesturalNavButtons + "}";
            return "{mRenderGesturalNavButtons=" + mRenderGesturalNavButtons
                    + " mNavigationBarFrame=" + mNavigationBarFrame
                    + "}";
        }
    }
}