Merge "Handle PendingIntent cancellation v2" into rvc-dev

This commit is contained in:
Lyn Han
2020-04-30 03:43:08 +00:00
committed by Android (Google) Code Review
3 changed files with 37 additions and 2 deletions

View File

@@ -78,6 +78,7 @@ class Bubble implements BubbleViewProvider {
private BubbleViewInfoTask mInflationTask;
private boolean mInflateSynchronously;
private boolean mPendingIntentCanceled;
/**
* Presentational info about the flyout.
@@ -182,6 +183,14 @@ class Bubble implements BubbleViewProvider {
mIconView = null;
}
void setPendingIntentCanceled() {
mPendingIntentCanceled = true;
}
boolean getPendingIntentCanceled() {
return mPendingIntentCanceled;
}
/**
* Sets whether to perform inflation on the same thread as the caller. This method should only
* be used in tests, not in production.
@@ -294,6 +303,13 @@ class Bubble implements BubbleViewProvider {
return mLastUpdated;
}
/**
* @return if the bubble was ever expanded
*/
boolean getWasAccessed() {
return mLastAccessed != 0L;
}
/**
* @return the display id of the virtual display on which bubble contents is drawn.
*/

View File

@@ -54,6 +54,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.service.notification.NotificationListenerService;
@@ -176,6 +177,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
private IStatusBarService mBarService;
private SysUiState mSysUiState;
// Used to post to main UI thread
private Handler mHandler = new Handler();
// Used for determining view rect for touch interaction
private Rect mTempRect = new Rect();
@@ -808,7 +812,21 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
Bubble bubble = mBubbleData.getOrCreateBubble(notif);
bubble.setInflateSynchronously(mInflateSynchronously);
bubble.inflate(
b -> mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade),
b -> {
mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade);
if (bubble.getBubbleIntent() == null) {
return;
}
bubble.getBubbleIntent().registerCancelListener(pendingIntent -> {
if (bubble.getWasAccessed()) {
bubble.setPendingIntentCanceled();
return;
}
mHandler.post(
() -> removeBubble(bubble.getEntry(),
BubbleController.DISMISS_INVALID_INTENT));
});
},
mContext, mStackView, mBubbleIconFactory);
}

View File

@@ -480,7 +480,8 @@ public class BubbleData {
}
void overflowBubble(@DismissReason int reason, Bubble bubble) {
if (!(reason == BubbleController.DISMISS_AGED
if (bubble.getPendingIntentCanceled()
|| !(reason == BubbleController.DISMISS_AGED
|| reason == BubbleController.DISMISS_USER_GESTURE)) {
return;
}