diff options
author | Hyein Yu <hyeinyu@google.com> | 2021-10-23 11:54:50 +0000 |
---|---|---|
committer | Hyein Yu <hyeinyu@google.com> | 2021-11-02 07:05:05 +0000 |
commit | 85c4344afcce01e3de414b108068fa84a95eee67 (patch) | |
tree | b6c2ef548b8c9b00be02f2b4f5335bb069d3afb2 | |
parent | 91e79eb03535902fab21c90d3a12fae01fa9da9b (diff) | |
download | CellBroadcastReceiver-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
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 |