From e29db6a2d2ba8d9458c88fe6c6dbb2164462773e Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 5 Mar 2010 13:45:51 -0500 Subject: [PATCH] Keep screen on when in car mode and the device is powered. BUG: 2477103 Signed-off-by: Mike Lockwood --- .../android/server/UiModeManagerService.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/services/java/com/android/server/UiModeManagerService.java b/services/java/com/android/server/UiModeManagerService.java index 90a0e5878c62d..71826ffddc7dc 100644 --- a/services/java/com/android/server/UiModeManagerService.java +++ b/services/java/com/android/server/UiModeManagerService.java @@ -38,10 +38,12 @@ import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; +import android.os.BatteryManager; import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.text.format.DateUtils; @@ -80,6 +82,9 @@ class UiModeManagerService extends IUiModeManager.Stub { private int mNightMode = UiModeManager.MODE_NIGHT_NO; private boolean mCarModeEnabled = false; + private boolean mCharging = false; + private final boolean mCarModeKeepsScreenOn; + private final boolean mDeskModeKeepsScreenOn; private boolean mComputedNightMode; private int mCurUiMode = 0; @@ -96,6 +101,7 @@ class UiModeManagerService extends IUiModeManager.Stub { private Location mLocation; private StatusBarManager mStatusBarManager; private KeyguardManager.KeyguardLock mKeyguardLock; + private final PowerManager.WakeLock mWakeLock; // 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 @@ -150,6 +156,18 @@ class UiModeManagerService extends IUiModeManager.Stub { } }; + private final BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mCharging = (intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0); + synchronized (mLock) { + if (mSystemReady) { + updateLocked(); + } + } + } + }; + // A LocationListener to initialize the network location provider. The location updates // are handled through the passive location provider. private final LocationListener mEmptyLocationListener = new LocationListener() { @@ -237,8 +255,18 @@ class UiModeManagerService extends IUiModeManager.Stub { new IntentFilter(ACTION_UPDATE_NIGHT_MODE)); mContext.registerReceiver(mDockModeReceiver, new IntentFilter(Intent.ACTION_DOCK_EVENT)); + mContext.registerReceiver(mBatteryReceiver, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); + mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG); mConfiguration.setToDefaults(); + + mCarModeKeepsScreenOn = (context.getResources().getInteger( + com.android.internal.R.integer.config_carDockKeepsScreenOn) == 1); + mDeskModeKeepsScreenOn = (context.getResources().getInteger( + com.android.internal.R.integer.config_deskDockKeepsScreenOn) == 1); } public void disableCarMode() { @@ -339,7 +367,7 @@ class UiModeManagerService extends IUiModeManager.Stub { } } } - + final void updateLocked() { long ident = Binder.clearCallingIdentity(); @@ -421,6 +449,18 @@ class UiModeManagerService extends IUiModeManager.Stub { mContext.sendOrderedBroadcast(new Intent(action), null, mResultReceiver, null, Activity.RESULT_OK, null, null); } + + // keep screen on when charging and in car mode + boolean keepScreenOn = mCharging && + ((mCarModeEnabled && mCarModeKeepsScreenOn) || + (mCurUiMode == Configuration.UI_MODE_TYPE_DESK && mDeskModeKeepsScreenOn)); + if (keepScreenOn != mWakeLock.isHeld()) { + if (keepScreenOn) { + mWakeLock.acquire(); + } else { + mWakeLock.release(); + } + } } finally { Binder.restoreCallingIdentity(ident); }