diff options
-rw-r--r-- | core/res/res/values/config.xml | 10 | ||||
-rw-r--r-- | services/java/com/android/server/DockObserver.java | 73 | ||||
-rw-r--r-- | services/java/com/android/server/PowerManagerService.java | 24 |
3 files changed, 72 insertions, 35 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5ee21b8..7695503 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -86,6 +86,12 @@ keeps the screen on. By default it does. Set to false to not keep on. --> <bool name="config_carDockKeepsScreenOn">true</bool> + <!-- Control whether being in the desk dock should enable accelerometer based screen orientation --> + <bool name="config_deskDockEnablesAccelerometer">false</bool> + + <!-- Control whether being in the car dock should enable accelerometer based screen orientation --> + <bool name="config_carDockEnablesAccelerometer">false</bool> + <!-- Indicate whether the lid state impacts the accessibility of the physical keyboard. 0 means it doesn't, 1 means it is accessible when the lid is open, 2 means it is accessible when the lid is @@ -113,5 +119,7 @@ <item>20</item> <item>30</item> </integer-array> - + + <bool name="config_use_strict_phone_number_comparation">false</bool> + </resources> diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java index 60195b9..8a4b45d 100644 --- a/services/java/com/android/server/DockObserver.java +++ b/services/java/com/android/server/DockObserver.java @@ -16,7 +16,9 @@ package com.android.server; +import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Handler; @@ -44,6 +46,43 @@ class DockObserver extends UEventObserver { private final Context mContext; private PowerManagerService mPowerManager; + + // The broadcast receiver which receives the result of the ordered broadcast sent when + // the dock state changes. The original ordered broadcast is sent with an initial result + // code of RESULT_OK. If any of the registered broadcast receivers changes this value, e.g., + // to RESULT_CANCELED, then the intent to start a dock app will not be sent. + private final BroadcastReceiver mResultReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (getResultCode() != Activity.RESULT_OK) { + return; + } + + // Launch a dock activity + String category; + switch (mDockState) { + case Intent.EXTRA_DOCK_STATE_CAR: + category = Intent.CATEGORY_CAR_DOCK; + break; + case Intent.EXTRA_DOCK_STATE_DESK: + category = Intent.CATEGORY_DESK_DOCK; + break; + default: + category = null; + break; + } + if (category != null) { + intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(category); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + mContext.startActivity(intent); + } catch (ActivityNotFoundException e) { + Log.w(TAG, e.getCause()); + } + } + } + }; public DockObserver(Context context, PowerManagerService pm) { mContext = context; @@ -111,31 +150,15 @@ class DockObserver extends UEventObserver { mPowerManager.userActivityWithForce(SystemClock.uptimeMillis(), false, true); Intent intent = new Intent(Intent.ACTION_DOCK_EVENT); intent.putExtra(Intent.EXTRA_DOCK_STATE, mDockState); - mContext.sendStickyBroadcast(intent); - - // Launch a dock activity - String category; - switch (mDockState) { - case Intent.EXTRA_DOCK_STATE_CAR: - category = Intent.CATEGORY_CAR_DOCK; - break; - case Intent.EXTRA_DOCK_STATE_DESK: - category = Intent.CATEGORY_DESK_DOCK; - break; - default: - category = null; - break; - } - if (category != null) { - intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(category); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - mContext.startActivity(intent); - } catch (ActivityNotFoundException e) { - Log.w(TAG, e.getCause()); - } - } + + // Send the ordered broadcast; the result receiver will receive after all + // broadcasts have been sent. If any broadcast receiver changes the result + // code from the initial value of RESULT_OK, then the result receiver will + // not launch the corresponding dock application. This gives apps a chance + // to override the behavior and stay in their app even when the device is + // placed into a dock. + mContext.sendStickyOrderedBroadcast( + intent, mResultReceiver, null, Activity.RESULT_OK, null, null); } } }; diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 84250bc..656d6ba 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -304,10 +304,7 @@ class PowerManagerService extends IPowerManager.Stub // temporarily set mUserActivityAllowed to true so this will work // even when the keyguard is on. synchronized (mLocks) { - boolean savedActivityAllowed = mUserActivityAllowed; - mUserActivityAllowed = true; - userActivity(SystemClock.uptimeMillis(), false); - mUserActivityAllowed = savedActivityAllowed; + forceUserActivityLocked(); } } } @@ -1714,6 +1711,13 @@ class PowerManagerService extends IPowerManager.Stub } } + private void forceUserActivityLocked() { + boolean savedActivityAllowed = mUserActivityAllowed; + mUserActivityAllowed = true; + userActivity(SystemClock.uptimeMillis(), false); + mUserActivityAllowed = savedActivityAllowed; + } + public void userActivityWithForce(long time, boolean noChangeLights, boolean force) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); userActivity(time, noChangeLights, OTHER_EVENT, force); @@ -2114,7 +2118,12 @@ class PowerManagerService extends IPowerManager.Stub Log.d(TAG, "disableProximityLockLocked"); } mSensorManager.unregisterListener(this); - mProximitySensorActive = false; + synchronized (mLocks) { + if (mProximitySensorActive) { + mProximitySensorActive = false; + forceUserActivityLocked(); + } + } } public void onSensorChanged(SensorEvent event) { @@ -2135,10 +2144,7 @@ class PowerManagerService extends IPowerManager.Stub Log.d(TAG, "onSensorChanged: proximity inactive, distance: " + distance); } mProximitySensorActive = false; - boolean savedActivityAllowed = mUserActivityAllowed; - mUserActivityAllowed = true; - userActivity(milliseconds, false); - mUserActivityAllowed = savedActivityAllowed; + forceUserActivityLocked(); } } } |