diff --git a/broadcastradio/aidl/default/BroadcastRadio.cpp b/broadcastradio/aidl/default/BroadcastRadio.cpp
index 3af560f..4d6d81d 100644
--- a/broadcastradio/aidl/default/BroadcastRadio.cpp
+++ b/broadcastradio/aidl/default/BroadcastRadio.cpp
@@ -66,12 +66,7 @@
 
     prop.maker = "Android";
     prop.product = virtualRadio.getName();
-    prop.supportedIdentifierTypes = vector<IdentifierType>({
-            IdentifierType::AMFM_FREQUENCY_KHZ,
-            IdentifierType::RDS_PI,
-            IdentifierType::HD_STATION_ID_EXT,
-            IdentifierType::DAB_SID_EXT,
-    });
+    prop.supportedIdentifierTypes = virtualRadio.getSupportedIdentifierTypes();
     prop.vendorInfo = vector<VendorKeyValue>({
             {"com.android.sample", "sample"},
     });
@@ -352,7 +347,9 @@
     }
     // The list is not sorted here since it has already stored in VirtualRadio.
     bool hasAmFmFrequency = utils::hasAmFmFrequency(current);
-    uint32_t currentFreq = hasAmFmFrequency ? utils::getAmFmFrequency(current) : 0;
+    bool hasDabSId = utils::hasId(current, IdentifierType::DAB_SID_EXT);
+    uint32_t currentChannel =
+            hasAmFmFrequency ? utils::getAmFmFrequency(current) : utils::getDabSId(current);
     auto found =
             std::lower_bound(mProgramList.begin(), mProgramList.end(), VirtualProgram({current}));
     if (directionUp) {
@@ -364,18 +361,22 @@
             // jump to the first selector which is greater than and of the same band as the current
             // program selector.
             if (utils::tunesTo(current, found->selector)) found++;
-            if (skipSubChannel && hasAmFmFrequency) {
-                auto firstFound = found;
-                while (utils::getAmFmFrequency(found->selector) == currentFreq) {
-                    if (found < mProgramList.end() - 1) {
-                        found++;
-                    } else {
-                        found = mProgramList.begin();
-                    }
-                    if (found == firstFound) {
-                        // Only one main channel exists in the program list, the tuner cannot skip
-                        // sub-channel to the next program selector.
-                        return false;
+            if (skipSubChannel) {
+                if (hasAmFmFrequency || hasDabSId) {
+                    auto firstFound = found;
+                    while ((hasAmFmFrequency &&
+                            utils::getAmFmFrequency(found->selector) == currentChannel) ||
+                           (hasDabSId && utils::getDabSId(found->selector) == currentChannel)) {
+                        if (found < mProgramList.end() - 1) {
+                            found++;
+                        } else {
+                            found = mProgramList.begin();
+                        }
+                        if (found == firstFound) {
+                            // Only one main channel exists in the program list, the tuner cannot
+                            // skip sub-channel to the next program selector.
+                            return false;
+                        }
                     }
                 }
             }
@@ -394,9 +395,11 @@
             // Otherwise, the tuner will jump to the first selector less than and of the same band
             // as the current program selector.
             found--;
-            if (hasAmFmFrequency && utils::hasAmFmFrequency(found->selector)) {
-                uint32_t nextFreq = utils::getAmFmFrequency(found->selector);
-                if (nextFreq != currentFreq) {
+            if ((hasAmFmFrequency && utils::hasAmFmFrequency(found->selector)) ||
+                (hasDabSId && utils::hasId(found->selector, IdentifierType::DAB_SID_EXT))) {
+                uint32_t nextChannel = hasAmFmFrequency ? utils::getAmFmFrequency(found->selector)
+                                                        : utils::getDabSId(found->selector);
+                if (nextChannel != currentChannel) {
                     jumpToFirstSubChannelLocked(found);
                 } else if (skipSubChannel) {
                     jumpToFirstSubChannelLocked(found);
@@ -429,16 +432,28 @@
 }
 
 void BroadcastRadio::jumpToFirstSubChannelLocked(vector<VirtualProgram>::const_iterator& it) const {
-    if (!utils::hasAmFmFrequency(it->selector) || it == mProgramList.begin()) {
+    if (it == mProgramList.begin()) {
         return;
     }
-    uint32_t currentFrequency = utils::getAmFmFrequency(it->selector);
-    it--;
-    while (it != mProgramList.begin() && utils::hasAmFmFrequency(it->selector) &&
-           utils::getAmFmFrequency(it->selector) == currentFrequency) {
+    bool hasAmFmFrequency = utils::hasAmFmFrequency(it->selector);
+    bool hasDabSId = utils::hasId(it->selector, IdentifierType::DAB_SID_EXT);
+    if (hasAmFmFrequency || hasDabSId) {
+        uint32_t currentChannel = hasAmFmFrequency ? utils::getAmFmFrequency(it->selector)
+                                                   : utils::getDabSId(it->selector);
         it--;
+        while (it != mProgramList.begin()) {
+            if (hasAmFmFrequency && utils::hasAmFmFrequency(it->selector) &&
+                utils::getAmFmFrequency(it->selector) == currentChannel) {
+                it--;
+            } else if (hasDabSId && utils::hasId(it->selector, IdentifierType::DAB_SID_EXT) &&
+                       utils::getDabSId(it->selector) == currentChannel) {
+                it--;
+            } else {
+                break;
+            }
+        }
+        it++;
     }
-    it++;
 }
 
 ScopedAStatus BroadcastRadio::seek(bool directionUp, bool skipSubChannel) {
