diff options
author | Weilin Xu <xuweilin@google.com> | 2023-11-09 15:30:43 -0800 |
---|---|---|
committer | Weilin Xu <xuweilin@google.com> | 2023-11-22 10:16:27 -0800 |
commit | 477ccf4a2e0566e5b254304a2f1550bfe1b15d12 (patch) | |
tree | f8cf412074af57aad87306361e931ac6db0d8072 | |
parent | bbb111bf0179dc2a76357c2ecd3b3d319fa7e3f8 (diff) | |
download | systemlibs-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
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; + } + } } |