summaryrefslogtreecommitdiffstats
path: root/policy
diff options
context:
space:
mode:
authorDaniel Sandler <dsandler@android.com>2013-04-19 11:10:23 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-04-19 11:10:23 -0700
commit8e251dc6da3fb93bc0cfff6dc004ccdad6f9901b (patch)
tree8656537b4c4ca842627ff1209f300ca09de4d5dd /policy
parent789ac6c97575be168c2955cea9236638c838d62a (diff)
parentb0efef2f73533c8d434c47d014f66e1171b19277 (diff)
downloadframeworks_base-8e251dc6da3fb93bc0cfff6dc004ccdad6f9901b.zip
frameworks_base-8e251dc6da3fb93bc0cfff6dc004ccdad6f9901b.tar.gz
frameworks_base-8e251dc6da3fb93bc0cfff6dc004ccdad6f9901b.tar.bz2
am b0efef2f: am f535c820: Merge "Restore dock home support for car docks." into jb-mr2-dev
* commit 'b0efef2f73533c8d434c47d014f66e1171b19277': Restore dock home support for car docks.
Diffstat (limited to 'policy')
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java95
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 2aa3e38..53c00fb 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;
@@ -124,6 +126,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;
@@ -253,6 +260,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;
@@ -849,6 +857,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
@@ -4057,6 +4067,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) {
@@ -4710,9 +4727,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);
}
@@ -4739,6 +4817,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,
@@ -4982,7 +5072,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);