Commit 3a6ec6e1 authored by Michael Thiessen's avatar Michael Thiessen Committed by Commit Bot

Refactor TouchlessUiCoordinator onto ChromeActivity

We need all Activities running in NoTouch mode to use the UI coordinator
to support dialog actions, etc. So this moves ownership of the
TouchlessUiCoordinator into ChromeActivity, and restricts the touchless
URL bar and tooltips to NoTouchActivity.

#issue 962059, presubmit is broken.
NOPRESUBMIT=true

Bug: 961734
Change-Id: Ib8fb701c4bb981726428a7f81a55fc9fc15bccf1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1606570Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Commit-Queue: Michael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#659078}
parent e909a507
...@@ -54,7 +54,6 @@ import org.chromium.chrome.browser.survey.SurveyController; ...@@ -54,7 +54,6 @@ import org.chromium.chrome.browser.survey.SurveyController;
import org.chromium.chrome.browser.tab.AuthenticatorNavigationInterceptor; import org.chromium.chrome.browser.tab.AuthenticatorNavigationInterceptor;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.touchless.TouchlessModelCoordinator; import org.chromium.chrome.browser.touchless.TouchlessModelCoordinator;
import org.chromium.chrome.browser.touchless.TouchlessUiController;
import org.chromium.chrome.browser.touchless.TouchlessUiCoordinator; import org.chromium.chrome.browser.touchless.TouchlessUiCoordinator;
import org.chromium.chrome.browser.ui.ImmersiveModeManager; import org.chromium.chrome.browser.ui.ImmersiveModeManager;
import org.chromium.chrome.browser.usage_stats.DigitalWellbeingClient; import org.chromium.chrome.browser.usage_stats.DigitalWellbeingClient;
...@@ -395,28 +394,6 @@ public abstract class AppHooks { ...@@ -395,28 +394,6 @@ public abstract class AppHooks {
return null; return null;
} }
/**
* Do not use, in the process of being deleted.
*/
@Deprecated
public void attachTouchlessMenuCoordinator(ChromeActivity activity) {}
/**
* Do not use, in the process of being deleted.
*/
@Deprecated
public TouchlessUiController createTouchlessUiController(ChromeActivity activity) {
return null;
}
/**
* Do not use, in the process of being deleted.
*/
@Deprecated
public TouchlessUiController getTouchlessUiControllerForActivity(ChromeActivity activity) {
return null;
}
/** /**
* Checks the Google Play services availability on the this device. * Checks the Google Play services availability on the this device.
* *
...@@ -501,9 +478,4 @@ public abstract class AppHooks { ...@@ -501,9 +478,4 @@ public abstract class AppHooks {
* ChromeActivity initialization. * ChromeActivity initialization.
*/ */
public void startSystemSettingsObserver() {} public void startSystemSettingsObserver() {}
/**
* Initializes the lifecycle tracker for Touchless mode.
*/
public void initTouchlessLifecycleTracker() {}
} }
...@@ -29,6 +29,7 @@ import android.support.annotation.Nullable; ...@@ -29,6 +29,7 @@ import android.support.annotation.Nullable;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Pair; import android.util.Pair;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
...@@ -140,6 +141,7 @@ import org.chromium.chrome.browser.tabmodel.TabWindowManager; ...@@ -140,6 +141,7 @@ import org.chromium.chrome.browser.tabmodel.TabWindowManager;
import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.browser.toolbar.ToolbarManager;
import org.chromium.chrome.browser.toolbar.top.Toolbar; import org.chromium.chrome.browser.toolbar.top.Toolbar;
import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer; import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer;
import org.chromium.chrome.browser.touchless.TouchlessUiCoordinator;
import org.chromium.chrome.browser.translate.TranslateBridge; import org.chromium.chrome.browser.translate.TranslateBridge;
import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.ui.system.StatusBarColorController; import org.chromium.chrome.browser.ui.system.StatusBarColorController;
...@@ -346,6 +348,11 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -346,6 +348,11 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
*/ */
private RootUiCoordinator mRootUiCoordinator; private RootUiCoordinator mRootUiCoordinator;
/**
* Coordinates Touchless UI across ChromeActivity-derived classes.
*/
private TouchlessUiCoordinator mTouchlessUiCoordinator;
private List<MenuOrKeyboardActionHandler> mMenuActionHandlers = new ArrayList<>(); private List<MenuOrKeyboardActionHandler> mMenuActionHandlers = new ArrayList<>();
@Override @Override
...@@ -368,6 +375,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -368,6 +375,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
// a recommended pattern. // a recommended pattern.
mRootUiCoordinator = new RootUiCoordinator(this); mRootUiCoordinator = new RootUiCoordinator(this);
// See comments on #getTouchlessUiCoordinator for why we're doing this here.
getTouchlessUiCoordinator();
VrModuleProvider.getDelegate().doPreInflationStartup(this, getSavedInstanceState()); VrModuleProvider.getDelegate().doPreInflationStartup(this, getSavedInstanceState());
// Force a partner customizations refresh if it has yet to be initialized. This can happen // Force a partner customizations refresh if it has yet to be initialized. This can happen
...@@ -1343,6 +1353,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1343,6 +1353,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
*/ */
@Override @Override
public SnackbarManager getSnackbarManager() { public SnackbarManager getSnackbarManager() {
if (getTouchlessUiCoordinator() != null) {
return getTouchlessUiCoordinator().getSnackbarManager();
}
boolean useBottomSheetContainer = mBottomSheetController != null boolean useBottomSheetContainer = mBottomSheetController != null
&& mBottomSheetController.getBottomSheet().isSheetOpen() && mBottomSheetController.getBottomSheet().isSheetOpen()
&& !mBottomSheetController.getBottomSheet().isClosing(); && !mBottomSheetController.getBottomSheet().isClosing();
...@@ -1352,6 +1365,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1352,6 +1365,9 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
@Override @Override
protected ModalDialogManager createModalDialogManager() { protected ModalDialogManager createModalDialogManager() {
if (getTouchlessUiCoordinator() != null) {
return getTouchlessUiCoordinator().createModalDialogManager();
}
return new ModalDialogManager( return new ModalDialogManager(
new AppModalPresenter(this), ModalDialogManager.ModalDialogType.APP); new AppModalPresenter(this), ModalDialogManager.ModalDialogType.APP);
} }
...@@ -2571,6 +2587,31 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -2571,6 +2587,31 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
return getToolbarLayoutId() != NO_TOOLBAR_LAYOUT; return getToolbarLayoutId() != NO_TOOLBAR_LAYOUT;
} }
/**
* TODO(mthiesse): Figure out a way to clean this up. The problem is that the
* TouchlessUiCoordinator has an implementation of the ModalDialogManager, which is created in
* AsyncInitializationActivity#onCreateInternal, before any ChromeActivity init functions are
* called, and making AsyncInitializationActivity aware of the TouchlessUiCoordinator would be
* wrong. Hence, we create the UiCoordinator as soon as somebody tries to use it, but we also
* need to make sure it gets initialized early on regardless of whether somebody tries to use it
* as it monitors Lifecycles, etc.
*/
private TouchlessUiCoordinator getTouchlessUiCoordinator() {
if (mTouchlessUiCoordinator == null && FeatureUtilities.isNoTouchModeEnabled()) {
mTouchlessUiCoordinator = AppHooks.get().createTouchlessUiCoordinator(this);
}
return mTouchlessUiCoordinator;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (getTouchlessUiCoordinator() != null
&& getTouchlessUiCoordinator().dispatchKeyEvent(event)) {
return true;
}
return super.dispatchKeyEvent(event);
}
/** Returns {@link BottomSheetController}, if present. */ /** Returns {@link BottomSheetController}, if present. */
@Nullable @Nullable
public BottomSheetController getBottomSheetController() { public BottomSheetController getBottomSheetController() {
......
...@@ -135,8 +135,6 @@ public class ChromeApplication extends Application { ...@@ -135,8 +135,6 @@ public class ChromeApplication extends Application {
// Disable MemoryPressureMonitor polling when Chrome goes to the background. // Disable MemoryPressureMonitor polling when Chrome goes to the background.
ApplicationStatus.registerApplicationStateListener( ApplicationStatus.registerApplicationStateListener(
ChromeApplication::updateMemoryPressurePolling); ChromeApplication::updateMemoryPressurePolling);
AppHooks.get().initTouchlessLifecycleTracker();
} }
// Write installed modules to crash keys. This needs to be done as early as possible so that // Write installed modules to crash keys. This needs to be done as early as possible so that
......
...@@ -10,12 +10,10 @@ import android.content.Intent; ...@@ -10,12 +10,10 @@ import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.SystemClock; import android.os.SystemClock;
import android.view.KeyEvent;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeInactivityTracker; import org.chromium.chrome.browser.ChromeInactivityTracker;
import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler;
...@@ -26,7 +24,6 @@ import org.chromium.chrome.browser.UrlConstants; ...@@ -26,7 +24,6 @@ import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabRedirectHandler; import org.chromium.chrome.browser.tab.TabRedirectHandler;
import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.tab.TabState;
...@@ -34,7 +31,6 @@ import org.chromium.chrome.browser.tabmodel.document.TabDelegate; ...@@ -34,7 +31,6 @@ import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.common.Referrer; import org.chromium.content_public.common.Referrer;
import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.PageTransition;
import org.chromium.ui.modaldialog.ModalDialogManager;
/** /**
* An Activity used to display WebContents on devices that don't support touch. * An Activity used to display WebContents on devices that don't support touch.
...@@ -208,11 +204,6 @@ public class NoTouchActivity extends SingleTabActivity { ...@@ -208,11 +204,6 @@ public class NoTouchActivity extends SingleTabActivity {
@Override @Override
protected void initializeToolbar() {} protected void initializeToolbar() {}
@Override
public ModalDialogManager createModalDialogManager() {
return getUiCoordinator().createModalDialogManager();
}
@Override @Override
protected ChromeFullscreenManager createFullscreenManager() { protected ChromeFullscreenManager createFullscreenManager() {
return new ChromeFullscreenManager(this, ChromeFullscreenManager.ControlsPosition.NONE); return new ChromeFullscreenManager(this, ChromeFullscreenManager.ControlsPosition.NONE);
...@@ -250,12 +241,6 @@ public class NoTouchActivity extends SingleTabActivity { ...@@ -250,12 +241,6 @@ public class NoTouchActivity extends SingleTabActivity {
@Override @Override
public void performPreInflationStartup() { public void performPreInflationStartup() {
super.performPreInflationStartup(); super.performPreInflationStartup();
getUiCoordinator();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return getUiCoordinator().dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
} }
@Override @Override
...@@ -271,27 +256,8 @@ public class NoTouchActivity extends SingleTabActivity { ...@@ -271,27 +256,8 @@ public class NoTouchActivity extends SingleTabActivity {
getFullscreenManager().exitPersistentFullscreenMode(); getFullscreenManager().exitPersistentFullscreenMode();
} }
private TouchlessUiCoordinator getUiCoordinator() {
if (mUiCoordinator == null) {
mUiCoordinator = AppHooks.get().createTouchlessUiCoordinator(this);
}
return mUiCoordinator;
}
@Override
public SnackbarManager getSnackbarManager() {
return getUiCoordinator().getSnackbarManager();
}
@Override @Override
protected TabDelegate createTabDelegate(boolean incognito) { protected TabDelegate createTabDelegate(boolean incognito) {
return new TouchlessTabDelegate(incognito); return new TouchlessTabDelegate(incognito);
} }
/**
* TODO(mthiesse): Delete this, it's to keep downstream compiling with a 3-sided patch.
*/
public TouchlessUiController getTouchlessUiController() {
return null;
}
} }
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.touchless;
import android.view.KeyEvent;
import org.chromium.ui.modelutil.PropertyModel;
/** A controller for touchless UI. */
public interface TouchlessUiController {
/**
* Add a model to the queue to be shown.
* @param model The model to add.
*/
default void addModelToQueue(PropertyModel model) {}
/**
* Remove a model from the queue to be shown.
* @param model The model to remove.
*/
default void removeModelFromQueue(PropertyModel model) {}
/**
* A notification that a key event occurred.
* @param event The event object.
* @return Whether the event was consumed.
*/
boolean onKeyEvent(KeyEvent event);
/**
* Clean up anything that needs to be.
*/
void destroy();
}
...@@ -53,6 +53,8 @@ public class TouchlessUiCoordinatorImpl ...@@ -53,6 +53,8 @@ public class TouchlessUiCoordinatorImpl
@Override @Override
public void onPostInflationStartup() { public void onPostInflationStartup() {
// Only NoTouchActivity wants the progress bar and tooltips.
if (!(mActivity instanceof NoTouchActivity)) return;
ViewGroup coordinatorLayout = (ViewGroup) mActivity.findViewById(R.id.coordinator); ViewGroup coordinatorLayout = (ViewGroup) mActivity.findViewById(R.id.coordinator);
mTooltipView = new TooltipView(mActivity); mTooltipView = new TooltipView(mActivity);
mProgressBarView = new ProgressBarView(mActivity); mProgressBarView = new ProgressBarView(mActivity);
...@@ -65,8 +67,11 @@ public class TouchlessUiCoordinatorImpl ...@@ -65,8 +67,11 @@ public class TouchlessUiCoordinatorImpl
@Override @Override
public void onFinishNativeInitialization() { public void onFinishNativeInitialization() {
mKeyFunctionsIPHCoordinator = // Only NoTouchActivity wants the tooltips.
new KeyFunctionsIPHCoordinator(mTooltipView, mActivity.getActivityTabProvider()); if (mActivity instanceof NoTouchActivity) {
mKeyFunctionsIPHCoordinator = new KeyFunctionsIPHCoordinator(
mTooltipView, mActivity.getActivityTabProvider());
}
mTouchlessZoomHelper = new TouchlessZoomHelper(mActivity.getActivityTabProvider()); mTouchlessZoomHelper = new TouchlessZoomHelper(mActivity.getActivityTabProvider());
} }
......
...@@ -44,7 +44,6 @@ touchless_java_sources = [ ...@@ -44,7 +44,6 @@ touchless_java_sources = [
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessSuggestionsBinder.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessSuggestionsBinder.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabDelegate.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabDelegate.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabObserver.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabObserver.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiController.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiCoordinator.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiCoordinator.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiCoordinatorImpl.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiCoordinatorImpl.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessZoomHelper.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessZoomHelper.java",
...@@ -71,7 +70,6 @@ touchless_junit_test_java_sources = [ "touchless/junit/src/org/chromium/chrome/b ...@@ -71,7 +70,6 @@ touchless_junit_test_java_sources = [ "touchless/junit/src/org/chromium/chrome/b
touchess_fallback_java_sources = [ touchess_fallback_java_sources = [
"touchless/fallback/java/src/org/chromium/chrome/browser/touchless/TouchlessDelegate.java", "touchless/fallback/java/src/org/chromium/chrome/browser/touchless/TouchlessDelegate.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessModelCoordinator.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessModelCoordinator.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiController.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiCoordinator.java", "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiCoordinator.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogProperties.java", "touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogProperties.java",
] ]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment