Merge "Switches from Gesture nav if 3P Launcher is set as default" into qt-dev

This commit is contained in:
Mehdi Alizadeh
2019-05-23 01:19:37 +00:00
committed by Android (Google) Code Review

View File

@@ -17,12 +17,15 @@
package com.android.systemui.statusbar.phone; package com.android.systemui.statusbar.phone;
import static android.content.Intent.ACTION_OVERLAY_CHANGED; import static android.content.Intent.ACTION_OVERLAY_CHANGED;
import static android.content.Intent.ACTION_PREFERRED_ACTIVITY_CHANGED;
import static android.os.UserHandle.USER_CURRENT; import static android.os.UserHandle.USER_CURRENT;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
@@ -56,7 +59,7 @@ import javax.inject.Singleton;
public class NavigationModeController implements Dumpable { public class NavigationModeController implements Dumpable {
private static final String TAG = NavigationModeController.class.getSimpleName(); private static final String TAG = NavigationModeController.class.getSimpleName();
private static final boolean DEBUG = true; private static final boolean DEBUG = false;
public interface ModeChangedListener { public interface ModeChangedListener {
void onNavigationModeChanged(int mode); void onNavigationModeChanged(int mode);
@@ -76,11 +79,19 @@ public class NavigationModeController implements Dumpable {
private BroadcastReceiver mReceiver = new BroadcastReceiver() { private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_OVERLAY_CHANGED)) { switch (intent.getAction()) {
case ACTION_OVERLAY_CHANGED:
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "ACTION_OVERLAY_CHANGED"); Log.d(TAG, "ACTION_OVERLAY_CHANGED");
} }
updateCurrentInteractionMode(true /* notify */); updateCurrentInteractionMode(true /* notify */);
break;
case ACTION_PREFERRED_ACTIVITY_CHANGED:
if (DEBUG) {
Log.d(TAG, "ACTION_PREFERRED_ACTIVITY_CHANGED");
}
switchFromGestureNavModeIfNotSupportedByDefaultLauncher();
break;
} }
} }
}; };
@@ -116,6 +127,7 @@ public class NavigationModeController implements Dumpable {
// Update the nav mode for the current user // Update the nav mode for the current user
updateCurrentInteractionMode(true /* notify */); updateCurrentInteractionMode(true /* notify */);
switchFromGestureNavModeIfNotSupportedByDefaultLauncher();
// When switching users, defer enabling the gestural nav overlay until the user // When switching users, defer enabling the gestural nav overlay until the user
// is all set up // is all set up
@@ -140,7 +152,12 @@ public class NavigationModeController implements Dumpable {
overlayFilter.addDataSchemeSpecificPart("android", PatternMatcher.PATTERN_LITERAL); overlayFilter.addDataSchemeSpecificPart("android", PatternMatcher.PATTERN_LITERAL);
mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, overlayFilter, null, null); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, overlayFilter, null, null);
IntentFilter preferredActivityFilter = new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED);
mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, preferredActivityFilter, null,
null);
updateCurrentInteractionMode(false /* notify */); updateCurrentInteractionMode(false /* notify */);
switchFromGestureNavModeIfNotSupportedByDefaultLauncher();
// Check if we need to defer enabling gestural nav // Check if we need to defer enabling gestural nav
deferGesturalNavOverlayIfNecessary(); deferGesturalNavOverlayIfNecessary();
@@ -175,6 +192,10 @@ public class NavigationModeController implements Dumpable {
private int getCurrentInteractionMode(Context context) { private int getCurrentInteractionMode(Context context) {
int mode = context.getResources().getInteger( int mode = context.getResources().getInteger(
com.android.internal.R.integer.config_navBarInteractionMode); com.android.internal.R.integer.config_navBarInteractionMode);
if (DEBUG) {
Log.d(TAG, "getCurrentInteractionMode: mode=" + mMode
+ " contextUser=" + context.getUserId());
}
return mode; return mode;
} }
@@ -250,6 +271,10 @@ public class NavigationModeController implements Dumpable {
mUiOffloadThread.submit(() -> { mUiOffloadThread.submit(() -> {
try { try {
mOverlayManager.setEnabledExclusiveInCategory(overlayPkg, userId); mOverlayManager.setEnabledExclusiveInCategory(overlayPkg, userId);
if (DEBUG) {
Log.d(TAG, "setModeOverlay: overlayPackage=" + overlayPkg
+ " userId=" + userId);
}
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Failed to enable overlay " + overlayPkg + " for user " + userId); Log.e(TAG, "Failed to enable overlay " + overlayPkg + " for user " + userId);
} }
@@ -277,4 +302,27 @@ public class NavigationModeController implements Dumpable {
Log.d(TAG, " " + a.getAssetPath()); Log.d(TAG, " " + a.getAssetPath());
} }
} }
private void switchFromGestureNavModeIfNotSupportedByDefaultLauncher() {
if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL
&& !isGestureNavSupportedByDefaultLauncher(mCurrentUserContext)) {
setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT);
}
}
private boolean isGestureNavSupportedByDefaultLauncher(Context context) {
final ComponentName cn = context.getPackageManager().getHomeActivities(new ArrayList<>());
if (cn == null) {
// There is no default home app set for the current user, don't make any changes yet.
return true;
}
if (DEBUG) {
Log.d(TAG, "isGestureNavSupportedByDefaultLauncher: launcher=" + cn.getPackageName()
+ " contextUser=" + context.getUserId());
}
ComponentName recentsComponentName = ComponentName.unflattenFromString(context.getString(
com.android.internal.R.string.config_recentsComponentName));
return recentsComponentName.getPackageName().equals(cn.getPackageName());
}
} }