From 6396c7205a7c5b16dae5b2e0ba11079005ad7762 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Tue, 16 Apr 2013 20:19:09 -0400 Subject: Restore dock home support for car docks. While it's still not generally appropriate for the home key to do anything other than take you home, a car is a somewhat different context: because of the user's reduced ability to interact with the device, it's especially useful to temporarily replace the launcher with a car-optimized variant. While it would be ideal for the entire system (particularly the user's everyday Launcher) to dynamically reconfigure their UIs upon entering car mode, it's not the case today, and car home apps are a useful compromise. Quick test: $ adb shell am broadcast \ -a android.intent.action.DOCK_EVENT \ --ei android.intent.extra.DOCK_STATE 2 This reverts commit 7c135205f2f4c192299ad0215276e9e481bccaa5. Bug: 8234767 Change-Id: I17588fff46e7f5e3773d3ad202601a5642943444 --- .../internal/policy/impl/PhoneWindowManager.java | 95 +++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) (limited to 'policy') diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 7cb6b09..0b5d2a1 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -18,6 +18,7 @@ package com.android.internal.policy.impl; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AppOpsManager; +import android.app.IUiModeManager; import android.app.ProgressDialog; import android.app.SearchManager; import android.app.UiModeManager; @@ -31,6 +32,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.content.res.Resources; @@ -125,6 +127,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final boolean SHOW_STARTING_ANIMATIONS = true; static final boolean SHOW_PROCESSES_ON_ALT_MENU = false; + // Whether to allow dock apps with METADATA_DOCK_HOME to temporarily take over the Home key. + // No longer recommended for desk docks; still useful in car docks. + static final boolean ENABLE_CAR_DOCK_HOME_CAPTURE = true; + static final boolean ENABLE_DESK_DOCK_HOME_CAPTURE = false; + static final int LONG_PRESS_POWER_NOTHING = 0; static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1; static final int LONG_PRESS_POWER_SHUT_OFF = 2; @@ -247,6 +254,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mSystemReady; boolean mSystemBooted; boolean mHdmiPlugged; + int mUiMode; int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; int mLidOpenRotation; int mCarDockRotation; @@ -831,6 +839,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSettingsObserver.observe(); mShortcutManager = new ShortcutManager(context, mHandler); mShortcutManager.observe(); + mUiMode = context.getResources().getInteger( + com.android.internal.R.integer.config_defaultUiModeType); mHomeIntent = new Intent(Intent.ACTION_MAIN, null); mHomeIntent.addCategory(Intent.CATEGORY_HOME); mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK @@ -3948,6 +3958,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) { mDockMode = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED); + } else { + try { + IUiModeManager uiModeService = IUiModeManager.Stub.asInterface( + ServiceManager.getService(Context.UI_MODE_SERVICE)); + mUiMode = uiModeService.getCurrentModeType(); + } catch (RemoteException e) { + } } updateRotation(true); synchronized (mLock) { @@ -4577,9 +4594,70 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + /** + * Return an Intent to launch the currently active dock app as home. Returns + * null if the standard home should be launched, which is the case if any of the following is + * true: + * + * @return + */ + Intent createHomeDockIntent() { + Intent intent = null; + + // What home does is based on the mode, not the dock state. That + // is, when in car mode you should be taken to car home regardless + // of whether we are actually in a car dock. + if (mUiMode == Configuration.UI_MODE_TYPE_CAR) { + if (ENABLE_CAR_DOCK_HOME_CAPTURE) { + intent = mCarDockIntent; + } + } else if (mUiMode == Configuration.UI_MODE_TYPE_DESK) { + if (ENABLE_DESK_DOCK_HOME_CAPTURE) { + intent = mDeskDockIntent; + } + } + + if (intent == null) { + return null; + } + + ActivityInfo ai = null; + ResolveInfo info = mContext.getPackageManager().resolveActivityAsUser( + intent, + PackageManager.MATCH_DEFAULT_ONLY, + UserHandle.USER_CURRENT); + if (info != null) { + ai = info.activityInfo; + } + if (ai != null + && ai.metaData != null + && ai.metaData.getBoolean(Intent.METADATA_DOCK_HOME)) { + intent = new Intent(intent); + intent.setClassName(ai.packageName, ai.name); + return intent; + } + + return null; + } + void startDockOrHome() { awakenDreams(); - // We don't have dock home anymore. Home is home. If you lived here, you'd be home by now. + + Intent dock = createHomeDockIntent(); + if (dock != null) { + try { + mContext.startActivityAsUser(dock, UserHandle.CURRENT); + return; + } catch (ActivityNotFoundException e) { + } + } + mContext.startActivityAsUser(mHomeIntent, UserHandle.CURRENT); } @@ -4606,6 +4684,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else { ActivityManagerNative.getDefault().stopAppSwitches(); sendCloseSystemWindows(); + Intent dock = createHomeDockIntent(); + if (dock != null) { + int result = ActivityManagerNative.getDefault() + .startActivityAsUser(null, null, dock, + dock.resolveTypeIfNeeded(mContext.getContentResolver()), + null, null, 0, + ActivityManager.START_FLAG_ONLY_IF_NEEDED, + null, null, null, UserHandle.USER_CURRENT); + if (result == ActivityManager.START_RETURN_INTENT_TO_CALLER) { + return false; + } + } } int result = ActivityManagerNative.getDefault() .startActivityAsUser(null, null, mHomeIntent, @@ -4834,7 +4924,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mLastFocusNeedsMenu="); pw.println(mLastFocusNeedsMenu); } - pw.print(prefix); pw.print("mDockMode="); pw.print(mDockMode); + pw.print(prefix); pw.print("mUiMode="); pw.print(mUiMode); + pw.print(" mDockMode="); pw.print(mDockMode); pw.print(" mCarDockRotation="); pw.print(mCarDockRotation); pw.print(" mDeskDockRotation="); pw.println(mDeskDockRotation); pw.print(prefix); pw.print("mUserRotationMode="); pw.print(mUserRotationMode); -- cgit v1.1