diff options
author | Daniel Sandler <dsandler@android.com> | 2013-04-16 20:19:09 -0400 |
---|---|---|
committer | Daniel Sandler <dsandler@android.com> | 2013-04-18 08:21:49 -0400 |
commit | 6396c7205a7c5b16dae5b2e0ba11079005ad7762 (patch) | |
tree | 052994396a501b0a5cfaabb5613fdb0529b8e909 /policy | |
parent | 37f58dccecd778f5af1f1f1db492c75ec5fcabd6 (diff) | |
download | frameworks_base-6396c7205a7c5b16dae5b2e0ba11079005ad7762.zip frameworks_base-6396c7205a7c5b16dae5b2e0ba11079005ad7762.tar.gz frameworks_base-6396c7205a7c5b16dae5b2e0ba11079005ad7762.tar.bz2 |
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
Diffstat (limited to 'policy')
-rw-r--r-- | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 95 |
1 files changed, 93 insertions, 2 deletions
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: + * <ul> + * <li>The device is not in either car mode or desk mode + * <li>The device is in car mode but ENABLE_CAR_DOCK_HOME_CAPTURE is false + * <li>The device is in desk mode but ENABLE_DESK_DOCK_HOME_CAPTURE is false + * <li>The device is in car mode but there's no CAR_DOCK app with METADATA_DOCK_HOME + * <li>The device is in desk mode but there's no DESK_DOCK app with METADATA_DOCK_HOME + * </ul> + * @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); |