1616
1717package com .android .server ;
1818
19- import static android .provider .Settings .Secure .SCREENSAVER_ACTIVATE_ON_DOCK ;
20- import static android .provider .Settings .Secure .SCREENSAVER_ENABLED ;
21-
2219import android .content .ContentResolver ;
2320import android .content .Context ;
2421import android .content .Intent ;
2724import android .media .RingtoneManager ;
2825import android .net .Uri ;
2926import android .os .Handler ;
30- import android .os .Looper ;
3127import android .os .Message ;
32- import android .os .RemoteException ;
33- import android .os .ServiceManager ;
3428import android .os .PowerManager ;
3529import android .os .SystemClock ;
3630import android .os .UEventObserver ;
3731import android .os .UserHandle ;
3832import android .provider .Settings ;
39- import android .service .dreams .IDreamManager ;
4033import android .util .Log ;
4134import android .util .Slog ;
4235
4841 */
4942final class DockObserver extends UEventObserver {
5043 private static final String TAG = DockObserver .class .getSimpleName ();
51- private static final boolean LOG = false ;
5244
5345 private static final String DOCK_UEVENT_MATCH = "DEVPATH=/devices/virtual/switch/dock" ;
5446 private static final String DOCK_STATE_PATH = "/sys/class/switch/dock/state" ;
5547
56- private static final int DEFAULT_SCREENSAVER_ENABLED = 1 ;
57- private static final int DEFAULT_SCREENSAVER_ACTIVATED_ON_DOCK = 1 ;
58-
5948 private static final int MSG_DOCK_STATE_CHANGED = 0 ;
6049
6150 private final Object mLock = new Object ();
@@ -66,11 +55,16 @@ final class DockObserver extends UEventObserver {
6655 private boolean mSystemReady ;
6756
6857 private final Context mContext ;
58+ private final PowerManager mPowerManager ;
59+ private final PowerManager .WakeLock mWakeLock ;
6960
7061 public DockObserver (Context context ) {
7162 mContext = context ;
72- init (); // set initial status
7363
64+ mPowerManager = (PowerManager )mContext .getSystemService (Context .POWER_SERVICE );
65+ mWakeLock = mPowerManager .newWakeLock (PowerManager .PARTIAL_WAKE_LOCK , TAG );
66+
67+ init (); // set initial status
7468 startObserving (DOCK_UEVENT_MATCH );
7569 }
7670
@@ -87,17 +81,9 @@ public void onUEvent(UEventObserver.UEvent event) {
8781 mPreviousDockState = mDockState ;
8882 mDockState = newState ;
8983 if (mSystemReady ) {
90- // Don't force screen on when undocking from the desk dock.
91- // The change in power state will do this anyway.
92- // FIXME - we should be configurable.
93- if ((mPreviousDockState != Intent .EXTRA_DOCK_STATE_DESK
94- && mPreviousDockState != Intent .EXTRA_DOCK_STATE_LE_DESK
95- && mPreviousDockState != Intent .EXTRA_DOCK_STATE_HE_DESK ) ||
96- mDockState != Intent .EXTRA_DOCK_STATE_UNDOCKED ) {
97- PowerManager pm =
98- (PowerManager )mContext .getSystemService (Context .POWER_SERVICE );
99- pm .wakeUp (SystemClock .uptimeMillis ());
100- }
84+ // Wake up immediately when docked or undocked.
85+ mPowerManager .wakeUp (SystemClock .uptimeMillis ());
86+
10187 updateLocked ();
10288 }
10389 }
@@ -138,15 +124,16 @@ void systemReady() {
138124 }
139125
140126 private void updateLocked () {
127+ mWakeLock .acquire ();
141128 mHandler .sendEmptyMessage (MSG_DOCK_STATE_CHANGED );
142129 }
143130
144131 private void handleDockStateChange () {
145132 synchronized (mLock ) {
146133 Slog .i (TAG , "Dock state changed: " + mDockState );
147134
135+ // Skip the dock intent if not yet provisioned.
148136 final ContentResolver cr = mContext .getContentResolver ();
149-
150137 if (Settings .Global .getInt (cr ,
151138 Settings .Global .DEVICE_PROVISIONED , 0 ) == 0 ) {
152139 Slog .i (TAG , "Device not provisioned, skipping dock broadcast" );
@@ -158,16 +145,8 @@ private void handleDockStateChange() {
158145 intent .addFlags (Intent .FLAG_RECEIVER_REPLACE_PENDING );
159146 intent .putExtra (Intent .EXTRA_DOCK_STATE , mDockState );
160147
161- // Check if this is Bluetooth Dock
162- // TODO(BT): Get Dock address.
163- // String address = null;
164- // if (address != null) {
165- // intent.putExtra(BluetoothDevice.EXTRA_DEVICE,
166- // BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address));
167- // }
168-
169- // User feedback to confirm dock connection. Particularly
170- // useful for flaky contact pins...
148+ // Play a sound to provide feedback to confirm dock connection.
149+ // Particularly useful for flaky contact pins...
171150 if (Settings .Global .getInt (cr ,
172151 Settings .Global .DOCK_SOUNDS_ENABLED , 1 ) == 1 ) {
173152 String whichSound = null ;
@@ -204,42 +183,14 @@ private void handleDockStateChange() {
204183 }
205184 }
206185
207- IDreamManager mgr = IDreamManager .Stub .asInterface (ServiceManager .getService ("dreams" ));
208- if (mgr != null ) {
209- // dreams feature enabled
210- boolean undocked = mDockState == Intent .EXTRA_DOCK_STATE_UNDOCKED ;
211- if (undocked ) {
212- try {
213- if (mgr .isDreaming ()) {
214- mgr .awaken ();
215- }
216- } catch (RemoteException e ) {
217- Slog .w (TAG , "Unable to awaken!" , e );
218- }
219- } else {
220- if (isScreenSaverEnabled (mContext ) && isScreenSaverActivatedOnDock (mContext )) {
221- try {
222- mgr .dream ();
223- } catch (RemoteException e ) {
224- Slog .w (TAG , "Unable to dream!" , e );
225- }
226- }
227- }
228- } else {
229- // dreams feature not enabled, send legacy intent
230- mContext .sendStickyBroadcastAsUser (intent , UserHandle .ALL );
231- }
232- }
233- }
186+ // Send the dock event intent.
187+ // There are many components in the system watching for this so as to
188+ // adjust audio routing, screen orientation, etc.
189+ mContext .sendStickyBroadcastAsUser (intent , UserHandle .ALL );
234190
235- private static boolean isScreenSaverEnabled (Context context ) {
236- return Settings .Secure .getInt (context .getContentResolver (),
237- SCREENSAVER_ENABLED , DEFAULT_SCREENSAVER_ENABLED ) != 0 ;
238- }
239-
240- private static boolean isScreenSaverActivatedOnDock (Context context ) {
241- return Settings .Secure .getInt (context .getContentResolver (),
242- SCREENSAVER_ACTIVATE_ON_DOCK , DEFAULT_SCREENSAVER_ACTIVATED_ON_DOCK ) != 0 ;
191+ // Release the wake lock that was acquired when the message was posted.
192+ mWakeLock .release ();
193+ }
243194 }
244195
245196 private final Handler mHandler = new Handler (true /*async*/ ) {
0 commit comments