OSDN Git Service

Activate Dreams (screen saver) when desk-docked.
authorDaniel Sandler <dsandler@android.com>
Wed, 16 Nov 2011 19:10:22 +0000 (11:10 -0800)
committerDaniel Sandler <dsandler@android.com>
Wed, 16 Nov 2011 19:34:09 +0000 (11:34 -0800)
SystemUI's DreamsDockLauncher now responds to low-level dock
events (Intent.ACTION_DOCK_EVENT) by immediately invoking
the user's selected screen saver.

(The high-level DESK_DOCK behavior is no longer enabled; see
change I7884f65.)

Bug: 5591015
Change-Id: I01a9bc6b181d55493f891ccc220631ddc461808a

packages/SystemUI/AndroidManifest.xml
packages/SystemUI/src/com/android/systemui/DreamsDockLauncher.java

index aa36b07..dff41c9 100644 (file)
             </intent-filter>
         </receiver>
 
-        <!-- handle dock insertion, launch screensaver instead -->
+        <!-- should you need to launch the screensaver, this is a good way to do it -->
         <activity android:name=".DreamsDockLauncher"
                 android:theme="@android:style/Theme.Dialog"
                 android:label="@string/dreams_dock_launcher">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.DESK_DOCK" />
             </intent-filter>
         </activity>
 
+        <!-- launch screensaver on (desk) dock event -->
+        <receiver android:name=".DreamsDockLauncher$DockEventReceiver" 
+            android:exported="true"
+            >
+            <intent-filter>
+                <action android:name="android.intent.action.DOCK_EVENT" />
+            </intent-filter>
+        </receiver>
+
+
         <activity android:name=".usb.UsbStorageActivity"
                 android:excludeFromRecents="true">
         </activity>
index def785b..0035296 100644 (file)
@@ -12,14 +12,22 @@ import android.util.Slog;
 
 public class DreamsDockLauncher extends Activity {
     private static final String TAG = "DreamsDockLauncher";
+
+    // Launch the screen saver if started as an activity.
     @Override
     protected void onCreate (Bundle icicle) {
         super.onCreate(icicle);
+        launchDream(this);
+        finish();
+    }
+
+    private static void launchDream(Context context) {
         try {
             String component = Settings.Secure.getString(
-                    getContentResolver(), Settings.Secure.DREAM_COMPONENT);
+                    context.getContentResolver(), Settings.Secure.DREAM_COMPONENT);
             if (component == null) {
-                component = getResources().getString(com.android.internal.R.string.config_defaultDreamComponent);
+                component = context.getResources().getString(
+                    com.android.internal.R.string.config_defaultDreamComponent);
             }
             if (component != null) {
                 ComponentName cn = ComponentName.unflattenFromString(component);
@@ -29,7 +37,8 @@ public class DreamsDockLauncher extends Activity {
                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
                         | Intent.FLAG_ACTIVITY_NO_USER_ACTION
                         );
-                startActivity(zzz);
+                Slog.v(TAG, "Starting screen saver on dock event: " + component);
+                context.startActivity(zzz);
             } else {
                 Slog.e(TAG, "Couldn't start screen saver: none selected");
             }
@@ -37,6 +46,22 @@ public class DreamsDockLauncher extends Activity {
             // no screensaver? give up
             Slog.e(TAG, "Couldn't start screen saver: none installed");
         }
-        finish();
+    }
+
+    // Trap low-level dock events and launch the screensaver.
+    public static class DockEventReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) {
+                Bundle extras = intent.getExtras();
+                int state = extras
+                        .getInt(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED);
+                if (state == Intent.EXTRA_DOCK_STATE_DESK
+                        || state == Intent.EXTRA_DOCK_STATE_LE_DESK
+                        || state == Intent.EXTRA_DOCK_STATE_HE_DESK) {
+                    launchDream(context);
+                }
+            }
+        }
     }
 }