Fix disappearing message corner case.

We never properly registered the ExpirationListener, meaning we were
relying on the wait-notify loop of ExpirationManager to delete things.
This normally works, but fails when your phone goes to sleep. So I
properly registered the receiver, and then added a failsafe to re-run
the ExpirationManager if we're about to render an expired message.

Fixes #7906
This commit is contained in:
Greyson Parrelli 2018-06-18 20:47:13 -07:00
parent 42f1baaf61
commit 62c42a3513
4 changed files with 8 additions and 2 deletions

View file

@ -526,6 +526,8 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".service.ExpirationListener" />
<provider android:name=".providers.PartProvider" <provider android:name=".providers.PartProvider"
android:grantUriPermissions="true" android:grantUriPermissions="true"

View file

@ -559,6 +559,10 @@ public class ConversationItem extends LinearLayout
this.expirationTimer.setExpirationTime(messageRecord.getExpireStarted(), this.expirationTimer.setExpirationTime(messageRecord.getExpireStarted(),
messageRecord.getExpiresIn()); messageRecord.getExpiresIn());
this.expirationTimer.startAnimation(); this.expirationTimer.startAnimation();
if (messageRecord.getExpireStarted() + messageRecord.getExpiresIn() <= System.currentTimeMillis()) {
ApplicationContext.getInstance(context).getExpiringMessageManager().checkSchedule();
}
} else if (!messageRecord.isOutgoing() && !messageRecord.isMediaPending()) { } else if (!messageRecord.isOutgoing() && !messageRecord.isMediaPending()) {
new AsyncTask<Void, Void, Void>() { new AsyncTask<Void, Void, Void>() {
@Override @Override

View file

@ -21,6 +21,6 @@ public class ExpirationListener extends BroadcastReceiver {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent); alarmManager.cancel(pendingIntent);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + waitTimeMillis, pendingIntent); alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + waitTimeMillis, pendingIntent);
} }
} }

View file

@ -46,7 +46,7 @@ public class ExpiringMessageManager {
} }
} }
void checkSchedule() { public void checkSchedule() {
synchronized (expiringMessageReferences) { synchronized (expiringMessageReferences) {
expiringMessageReferences.notifyAll(); expiringMessageReferences.notifyAll();
} }