summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeilin Xu <xuweilin@google.com>2023-11-09 15:30:43 -0800
committerWeilin Xu <xuweilin@google.com>2023-11-22 10:16:27 -0800
commit477ccf4a2e0566e5b254304a2f1550bfe1b15d12 (patch)
treef8cf412074af57aad87306361e931ac6db0d8072
parentbbb111bf0179dc2a76357c2ecd3b3d319fa7e3f8 (diff)
downloadsystemlibs-477ccf4a2e0566e5b254304a2f1550bfe1b15d12.tar.gz
Implement comparator for program selector and info
Implemented the cmparator for program selector and program info in car radio system-lib so that program info list can be grouped and sorted based on identifier type and frequency in radio app. Bug: 309692570 Test: see program list order in radio KS Change-Id: I07304f046c14592c4d2091d4ca5092c73beb1213
-rw-r--r--car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java9
-rw-r--r--car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java53
2 files changed, 62 insertions, 0 deletions
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
index 9fe173f..c96521a 100644
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
+++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
@@ -30,6 +30,7 @@ import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Comparator;
import java.util.Objects;
/**
@@ -262,4 +263,12 @@ public class ProgramInfoExt {
}
return null;
}
+ public static class ProgramInfoComparator implements Comparator<RadioManager.ProgramInfo> {
+ @Override
+ public int compare(RadioManager.ProgramInfo info1, RadioManager.ProgramInfo info2) {
+ Comparator<ProgramSelector> selectorComparator =
+ new ProgramSelectorExt.ProgramSelectorComparator();
+ return selectorComparator.compare(info1.getSelector(), info2.getSelector());
+ }
+ }
}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
index d1be9d6..8d597c8 100644
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
+++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
@@ -29,6 +29,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.text.DecimalFormat;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -597,4 +598,56 @@ public class ProgramSelectorExt {
}
}
}
+
+ public static class ProgramSelectorComparator implements Comparator<ProgramSelector> {
+ @Override
+ public int compare(ProgramSelector selector1, ProgramSelector selector2) {
+ int type1 = selector1.getPrimaryId().getType();
+ int type2 = selector2.getPrimaryId().getType();
+ int frequency1 = getFrequency(selector1);
+ int frequency2 = getFrequency(selector2);
+ if (isAmFmProgram(selector1) && isAmFmProgram(selector2)) {
+ if (frequency1 != frequency2) {
+ return frequency1 > frequency2 ? 1 : -1;
+ }
+ int subchannel1 = selector1.getPrimaryId().getType()
+ == ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT
+ ? IdentifierExt.asHdPrimary(selector1.getPrimaryId()).getSubchannel() : 0;
+ int subchannel2 = selector2.getPrimaryId().getType()
+ == ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT
+ ? IdentifierExt.asHdPrimary(selector2.getPrimaryId()).getSubchannel() : 0;
+ if (subchannel1 != subchannel2) {
+ return subchannel1 > subchannel2 ? 1 : -1;
+ }
+ return selector1.getPrimaryId().getType() - selector2.getPrimaryId().getType();
+ } else if (type1 == ProgramSelector.IDENTIFIER_TYPE_DAB_DMB_SID_EXT
+ && type2 == ProgramSelector.IDENTIFIER_TYPE_DAB_DMB_SID_EXT) {
+ if (frequency1 != frequency2) {
+ return frequency1 > frequency2 ? 1 : -1;
+ }
+ IdentifierExt.DabPrimary dabPrimary1 = IdentifierExt.asDabPrimary(
+ selector1.getPrimaryId());
+ IdentifierExt.DabPrimary dabPrimary2 = IdentifierExt.asDabPrimary(
+ selector2.getPrimaryId());
+ int ecc1 = dabPrimary1.getEcc();
+ int ecc2 = dabPrimary2.getEcc();
+ if (ecc1 != ecc2) {
+ return ecc1 > ecc2 ? 1 : -1;
+ }
+ int sId1 = dabPrimary1.getSId();
+ int sId2 = dabPrimary2.getSId();
+ if (sId1 != sId2) {
+ return sId1 > sId2 ? 1 : -1;
+ }
+ int sCIds1 = dabPrimary1.getSCIdS();
+ int sCIds2 = dabPrimary2.getSCIdS();
+ if (sCIds1 != sCIds2) {
+ return sCIds1 > sCIds2 ? 1 : -1;
+ }
+ return getDabEnsemble(selector1) > getDabEnsemble(selector2) ? 1 : -1;
+ }
+ return type1 > type2 || (type1 == type2 && selector1.getPrimaryId().getValue()
+ > selector2.getPrimaryId().getValue()) ? 1 : -1;
+ }
+ }
}