summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyein Yu <hyeinyu@google.com>2021-10-23 11:54:50 +0000
committerHyein Yu <hyeinyu@google.com>2021-11-02 07:05:05 +0000
commit85c4344afcce01e3de414b108068fa84a95eee67 (patch)
treeb6c2ef548b8c9b00be02f2b4f5335bb069d3afb2
parent91e79eb03535902fab21c90d3a12fae01fa9da9b (diff)
downloadCellBroadcastReceiver-85c4344afcce01e3de414b108068fa84a95eee67.tar.gz
Additional Fix about mismatch of unread count when"Show full-screen messages" is OFF
This is additional fix for ag/15958392. ag/15958392 makes notification with empty list when onStop is called after user clicks the notification. In this commit, b/201597124 is fixed again. Bug: 201597124 Bug: 203778554 Test: Manual Test: atest com.android.cellbroadcastreceiver.unit.CellBroadcastAlertDialogTest Change-Id: I9807a45a9bd284c44137f3d7638c1584d5725d83
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java97
-rw-r--r--tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java14
-rw-r--r--tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java47
3 files changed, 132 insertions, 26 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java
index 00b6d688f..551429969 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java
@@ -331,6 +331,25 @@ public class CellBroadcastAlertDialog extends Activity {
}
}
+ Comparator<SmsCbMessage> mPriorityBasedComparator = (Comparator) (o1, o2) -> {
+ boolean isPresidentialAlert1 =
+ ((SmsCbMessage) o1).isCmasMessage()
+ && ((SmsCbMessage) o1).getCmasWarningInfo()
+ .getMessageClass() == SmsCbCmasInfo
+ .CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT;
+ boolean isPresidentialAlert2 =
+ ((SmsCbMessage) o2).isCmasMessage()
+ && ((SmsCbMessage) o2).getCmasWarningInfo()
+ .getMessageClass() == SmsCbCmasInfo
+ .CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT;
+ if (isPresidentialAlert1 ^ isPresidentialAlert2) {
+ return isPresidentialAlert1 ? 1 : -1;
+ }
+ Long time1 = new Long(((SmsCbMessage) o1).getReceivedTime());
+ Long time2 = new Long(((SmsCbMessage) o2).getReceivedTime());
+ return time2.compareTo(time1);
+ };
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -469,9 +488,14 @@ public class CellBroadcastAlertDialog extends Activity {
// Avoid doing this when activity will be recreated because of orientation change or if
// screen goes off
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- if (!(isChangingConfigurations() || getLatestMessage() == null) && pm.isScreenOn()) {
- CellBroadcastAlertService.addToNotificationBar(getLatestMessage(),
- CellBroadcastReceiverApp.getNewMessageList(),
+ ArrayList<SmsCbMessage> messageList = getNewMessageListIfNeeded(mMessageList,
+ CellBroadcastReceiverApp.getNewMessageList());
+ SmsCbMessage latestMessage = (messageList == null || (messageList.size() < 1)) ? null
+ : messageList.get(messageList.size() - 1);
+
+ if (!(isChangingConfigurations() || latestMessage == null) && pm.isScreenOn()) {
+ Log.d(TAG, "call addToNotificationBar when activity goes in background");
+ CellBroadcastAlertService.addToNotificationBar(latestMessage, messageList,
getApplicationContext(), true, true, false);
}
// Do not stop the audio here. Pressing power button should turn off screen but should not
@@ -676,6 +700,9 @@ public class CellBroadcastAlertDialog extends Activity {
* @param message CB message which is used to update alert text.
*/
private void updateAlertText(@NonNull SmsCbMessage message) {
+ if (message == null) {
+ return;
+ }
Context context = getApplicationContext();
int titleId = CellBroadcastResources.getDialogTitleResource(context, message);
@@ -809,28 +836,7 @@ public class CellBroadcastAlertDialog extends Activity {
.getBoolean(R.bool.show_cmas_messages_in_priority_order)) {
// Sort message list to show messages in a different order than received by
// prioritizing them. Presidential Alert only has top priority.
- Collections.sort(
- mMessageList,
- (Comparator) (o1, o2) -> {
- boolean isPresidentialAlert1 =
- ((SmsCbMessage) o1).isCmasMessage()
- && ((SmsCbMessage) o1).getCmasWarningInfo()
- .getMessageClass() == SmsCbCmasInfo
- .CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT;
- boolean isPresidentialAlert2 =
- ((SmsCbMessage) o2).isCmasMessage()
- && ((SmsCbMessage) o2).getCmasWarningInfo()
- .getMessageClass() == SmsCbCmasInfo
- .CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT;
- if (isPresidentialAlert1 ^ isPresidentialAlert2) {
- return isPresidentialAlert1 ? 1 : -1;
- }
- Long time1 =
- new Long(((SmsCbMessage) o1).getReceivedTime());
- Long time2 =
- new Long(((SmsCbMessage) o2).getReceivedTime());
- return time2.compareTo(time1);
- });
+ Collections.sort(mMessageList, mPriorityBasedComparator);
}
}
Log.d(TAG, "onNewIntent called with message list of size " + newMessageList.size());
@@ -1114,4 +1120,45 @@ public class CellBroadcastAlertDialog extends Activity {
setFinishOnTouchOutside(mMessageList.size() > 0 && mMessageList.size() == dismissCount);
}
}
+
+ /**
+ * If message list of dialog does not have message which is included in newMessageList,
+ * Create new list which includes both dialogMessageList and newMessageList
+ * without the duplicated message, and Return the new list.
+ * If not, just return dialogMessageList as default.
+ * @param dialogMessageList message list which this dialog activity is having
+ * @param newMessageList message list which is compared with dialogMessageList
+ * @return message list which is created with dialogMessageList and newMessageList
+ */
+ @VisibleForTesting
+ public ArrayList<SmsCbMessage> getNewMessageListIfNeeded(
+ @NonNull ArrayList<SmsCbMessage> dialogMessageList,
+ ArrayList<SmsCbMessage> newMessageList) {
+ if (newMessageList == null) {
+ return dialogMessageList;
+ }
+ ArrayList<SmsCbMessage> clonedNewMessageList = new ArrayList<>(newMessageList);
+ for (SmsCbMessage message : dialogMessageList) {
+ clonedNewMessageList.removeIf(
+ msg -> msg.getReceivedTime() == message.getReceivedTime());
+ }
+ Log.d(TAG, "clonedMessageList.size()=" + clonedNewMessageList.size());
+ if (clonedNewMessageList.size() > 0) {
+ ArrayList<SmsCbMessage> resultList = new ArrayList<>(dialogMessageList);
+ resultList.addAll(clonedNewMessageList);
+ Comparator<SmsCbMessage> comparator = (Comparator) (o1, o2) -> {
+ Long time1 = new Long(((SmsCbMessage) o1).getReceivedTime());
+ Long time2 = new Long(((SmsCbMessage) o2).getReceivedTime());
+ return time1.compareTo(time2);
+ };
+ if (CellBroadcastSettings.getResourcesForDefaultSubId(getApplicationContext())
+ .getBoolean(R.bool.show_cmas_messages_in_priority_order)) {
+ Log.d(TAG, "Use priority order Based Comparator");
+ comparator = mPriorityBasedComparator;
+ }
+ Collections.sort(resultList, comparator);
+ return resultList;
+ }
+ return dialogMessageList;
+ }
}
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java
index 8cb5c462e..6e8b2a70d 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java
@@ -21,6 +21,7 @@ import android.app.ResourcesManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
+import android.content.res.Resources;
import android.os.Handler;
import android.test.ActivityUnitTestCase;
import android.util.Log;
@@ -133,5 +134,18 @@ public class CellBroadcastActivityTestCase<T extends Activity> extends ActivityU
Log.d(TAG, "return real system service for " + name);
return super.getSystemService(name);
}
+
+ Resources mResources;
+ @Override
+ public Resources getResources() {
+ if (mResources != null) {
+ return mResources;
+ }
+ return super.getResources();
+ }
+
+ public void setResources(Resources resources) {
+ mResources = resources;
+ }
}
}
diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java
index 9168d5bf7..e314e29d1 100644
--- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java
+++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java
@@ -28,6 +28,7 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.content.Intent;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.os.Bundle;
import android.os.IPowerManager;
import android.os.IThermalService;
@@ -44,7 +45,6 @@ import android.widget.TextView;
import com.android.cellbroadcastreceiver.CellBroadcastAlertDialog;
import com.android.cellbroadcastreceiver.CellBroadcastAlertService;
-import com.android.cellbroadcastreceiver.CellBroadcastSettings;
import com.android.cellbroadcastreceiver.R;
import com.android.internal.telephony.gsm.SmsCbConstants;
@@ -90,6 +90,9 @@ public class CellBroadcastAlertDialogTest extends
private ArrayList<SmsCbMessage> mMessageList;
+ @Mock
+ Resources mMockResources;
+
@Override
protected Intent createActivityIntent() {
mMessageList = new ArrayList<>(1);
@@ -179,6 +182,48 @@ public class CellBroadcastAlertDialogTest extends
b.getCharSequence(Notification.EXTRA_TEXT));
}
+ public void testGetNewMessageListIfNeeded() throws Throwable {
+ CellBroadcastAlertDialog activity = startActivity();
+ mContext.setResources(mMockResources);
+ doReturn(false).when(mMockResources).getBoolean(
+ R.bool.show_cmas_messages_in_priority_order);
+ SmsCbMessage testMessage1 = CellBroadcastAlertServiceTest
+ .createMessageForCmasMessageClass(12412,
+ SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL,
+ mCmasMessageClass);
+ waitForMs(10);
+ SmsCbMessage testMessage2 = CellBroadcastAlertServiceTest
+ .createMessageForCmasMessageClass(12412,
+ SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY,
+ mCmasMessageClass);
+ ArrayList<SmsCbMessage> inputList1 = new ArrayList<>();
+ ArrayList<SmsCbMessage> inputList2 = new ArrayList<>();
+
+ inputList1.add(testMessage1);
+ ArrayList<SmsCbMessage> messageList = activity.getNewMessageListIfNeeded(
+ inputList1, inputList2);
+ assertTrue(messageList.size() == 1);
+ assertEquals(testMessage1.getReceivedTime(), messageList.get(0).getReceivedTime());
+
+ inputList2.add(testMessage1);
+ messageList = activity.getNewMessageListIfNeeded(inputList1, inputList2);
+ assertTrue(messageList.size() == 1);
+ assertEquals(testMessage1.getReceivedTime(), messageList.get(0).getReceivedTime());
+
+ inputList2.add(testMessage2);
+ messageList = activity.getNewMessageListIfNeeded(inputList1, inputList2);
+ assertTrue(messageList.size() == 2);
+ assertEquals(testMessage2.getReceivedTime(), messageList.get(1).getReceivedTime());
+
+ doReturn(true).when(mMockResources).getBoolean(
+ R.bool.show_cmas_messages_in_priority_order);
+ messageList = activity.getNewMessageListIfNeeded(inputList1, inputList2);
+ assertTrue(messageList.size() == 2);
+ assertEquals(testMessage1.getReceivedTime(), messageList.get(1).getReceivedTime());
+
+ mContext.setResources(null);
+ }
+
@InstrumentationTest
// This test has a module dependency (it uses the CellBroadcastContentProvider), so it is
// disabled for OEM testing because it is not a true unit test