OSDN Git Service

Cancel a screenshot notification after a share target is chosen.
authorAdam Powell <adamp@google.com>
Fri, 17 Apr 2015 19:13:40 +0000 (12:13 -0700)
committerAdam Powell <adamp@google.com>
Sat, 18 Apr 2015 02:42:52 +0000 (19:42 -0700)
Use the (relatively) new API for supplying a callback when a user
makes a selection from the system ChooserActivity to clear out the
screenshot notification after it has been shared to another app.

Change-Id: If023a26d690c5ae8e29f28e2422f694ae4b654cb

packages/SystemUI/AndroidManifest.xml
packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java

index a8a4baa..24f6931 100644 (file)
             </intent-filter>
         </receiver>
 
+        <!-- Callback for dismissing screenshot notification after a share target is picked -->
+        <receiver android:name=".screenshot.GlobalScreenshot$TargetChosenReceiver"
+                  android:exported="false" />
+
         <!-- started from UsbDeviceSettingsManager -->
         <activity android:name=".usb.UsbConfirmActivity"
             android:exported="true"
index 105bf0f..715f4e4 100644 (file)
@@ -25,6 +25,7 @@ import android.app.Notification;
 import android.app.Notification.BigPictureStyle;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -242,7 +243,12 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi
             sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
             sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
 
-            Intent chooserIntent = Intent.createChooser(sharingIntent, null);
+            final PendingIntent callback = PendingIntent.getBroadcast(context, 0,
+                    new Intent(context, GlobalScreenshot.TargetChosenReceiver.class)
+                            .putExtra(GlobalScreenshot.CANCEL_ID, mNotificationId),
+                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
+            Intent chooserIntent = Intent.createChooser(sharingIntent, null,
+                    callback.getIntentSender());
             chooserIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
                     | Intent.FLAG_ACTIVITY_NEW_TASK);
 
@@ -341,6 +347,8 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi
 class GlobalScreenshot {
     private static final String TAG = "GlobalScreenshot";
 
+    static final String CANCEL_ID = "android:cancel_id";
+
     private static final int SCREENSHOT_FLASH_TO_PEAK_DURATION = 130;
     private static final int SCREENSHOT_DROP_IN_DURATION = 430;
     private static final int SCREENSHOT_DROP_OUT_DELAY = 500;
@@ -732,4 +740,22 @@ class GlobalScreenshot {
                 .build();
         nManager.notify(R.id.notification_screenshot, n);
     }
+
+    /**
+     * Removes the notification for a screenshot after a share target is chosen.
+     */
+    public static class TargetChosenReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (!intent.hasExtra(CANCEL_ID)) {
+                return;
+            }
+
+            final NotificationManager nm =
+                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+
+            final int id = intent.getIntExtra(CANCEL_ID, 0);
+            nm.cancel(id);
+        }
+    }
 }