summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManish Dungriyal <mdungriyal@google.com>2023-04-21 10:19:09 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-21 10:19:09 +0000
commit32df980cf4b3d7c0448a639c3f040bbc82074cc2 (patch)
treec8af848f10661264ec2eaf4b5495796af5ea1440
parentdc9da112083c33f28c7bcb1a10e99bd3d48ea24b (diff)
parent8f68f572212b51442ea39e291043dc3d5fadc5b8 (diff)
downloadTelephony-aml_ase_341410000.tar.gz
Update QnsTimer Handler on device active mode. am: 8f68f57221aml_wif_341711020aml_wif_341610000aml_wif_341510000aml_wif_341410080aml_wif_341310010aml_wif_341110010aml_wif_341011010aml_wif_340913010aml_uwb_341710010aml_uwb_341513070aml_uwb_341511050aml_uwb_341310300aml_uwb_341310030aml_uwb_341111010aml_uwb_341011000aml_tet_341712060aml_tet_341610020aml_tet_341511010aml_tet_341411060aml_tet_341310230aml_tet_341112070aml_tet_341010040aml_tet_340913030aml_swc_341711000aml_swc_341619000aml_swc_341513600aml_swc_341312300aml_swc_341312020aml_swc_341111000aml_swc_341011020aml_swc_340922010aml_sta_341710000aml_sta_341615000aml_sta_341511040aml_sta_341410000aml_sta_341311010aml_sta_341114000aml_sta_341111000aml_sta_341010020aml_sta_340912000aml_sta_340911000aml_sdk_341710000aml_sdk_341510000aml_sdk_341410000aml_sdk_341110080aml_sdk_341110000aml_sdk_341010000aml_sdk_340912010aml_sch_341510000aml_res_341510000aml_res_341410010aml_res_341311030aml_res_341110000aml_res_340912000aml_per_341711000aml_per_341614000aml_per_341510010aml_per_341410020aml_per_341311000aml_per_341110020aml_per_341110010aml_per_341011100aml_per_341011020aml_per_340916010aml_odp_341717000aml_odp_341610000aml_neu_341510000aml_neu_341010080aml_neu_341010000aml_net_341710020aml_net_341610030aml_net_341510050aml_net_341510000aml_net_341411030aml_net_341311010aml_net_341310020aml_net_341111030aml_net_341014000aml_net_340913000aml_mpr_341713020aml_mpr_341614010aml_mpr_341511070aml_mpr_341411070aml_mpr_341313030aml_mpr_341111030aml_mpr_341111020aml_mpr_341015090aml_mpr_341015030aml_mpr_340919000aml_med_341711000aml_med_341619000aml_med_341513600aml_med_341312300aml_med_341312020aml_med_341111000aml_med_341011000aml_med_340922010aml_ips_341611000aml_ips_341510000aml_ips_340914280aml_ips_340914200aml_ips_340914000aml_ext_341716000aml_ext_341620040aml_ext_341518010aml_ext_341414010aml_ext_341317010aml_ext_341131030aml_ext_341027030aml_doc_341713000aml_doc_341610010aml_doc_341510050aml_doc_341312010aml_doc_341112000aml_doc_341012000aml_doc_340916000aml_con_341614000aml_con_341511080aml_con_341410300aml_con_341310090aml_con_341110000aml_cbr_341710000aml_cbr_341610000aml_cbr_341510010aml_cbr_341410010aml_cbr_341311010aml_cbr_341110000aml_cbr_341011000aml_cbr_340914000aml_ase_341510000aml_ase_341410000aml_ase_341310010aml_ase_341113000aml_ase_340913000aml_art_341711000aml_art_341615020aml_art_341514450aml_art_341514410aml_art_341411300aml_art_341311100aml_art_341110110aml_art_341110060aml_art_341010050aml_art_340915060aml_ads_341720000aml_ads_341615050aml_ads_341517040aml_ads_341413000aml_ads_341316030aml_ads_341131050aml_ads_341027030aml_ads_340915050aml_adb_341520010aml_adb_341517070aml_adb_340912530aml_adb_340912350aml_adb_340912200aml_adb_340912000android14-mainline-wifi-releaseandroid14-mainline-uwb-releaseandroid14-mainline-tethering-releaseandroid14-mainline-sdkext-releaseandroid14-mainline-resolv-releaseandroid14-mainline-permission-releaseandroid14-mainline-os-statsd-releaseandroid14-mainline-networking-releaseandroid14-mainline-mediaprovider-releaseandroid14-mainline-media-swcodec-releaseandroid14-mainline-media-releaseandroid14-mainline-extservices-releaseandroid14-mainline-conscrypt-releaseandroid14-mainline-cellbroadcast-releaseandroid14-mainline-art-releaseandroid14-mainline-appsearch-releaseandroid14-mainline-adservices-releaseandroid14-mainline-adbd-release
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/Telephony/+/22767896 Change-Id: I3a7f07bedfef91c40881a46d987ee6d52fbfaaac Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--services/QualifiedNetworksService/src/com/android/telephony/qns/QnsTimer.java69
-rw-r--r--services/QualifiedNetworksService/tests/src/com/android/telephony/qns/QnsTimerTest.java34
2 files changed, 78 insertions, 25 deletions
diff --git a/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsTimer.java b/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsTimer.java
index f2439bd..7630054 100644
--- a/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsTimer.java
+++ b/services/QualifiedNetworksService/src/com/android/telephony/qns/QnsTimer.java
@@ -45,6 +45,11 @@ class QnsTimer {
private static final String TAG = QnsTimer.class.getSimpleName();
private static final int EVENT_QNS_TIMER_EXPIRED = 1;
+
+ private static final int MIN_ALARM_CALL_ACTIVE_DELAY_MS = 0;
+ private static final int MIN_ALARM_SCREEN_OFF_DELAY_MS = 10000;
+ private static final int MIN_ALARM_DEVICE_LIGHT_IDLE_DELAY_MS = 30000;
+ private static final int MIN_ALARM_DEVICE_IDLE_DELAY_MS = 60000;
static final String ACTION_ALARM_TIMER_EXPIRED =
"com.android.telephony.qns.action.ALARM_TIMER_EXPIRED";
@@ -56,11 +61,11 @@ class QnsTimer {
private final BroadcastReceiver mBroadcastReceiver;
private final PriorityQueue<TimerInfo> mTimerInfos;
private PendingIntent mPendingIntent;
- private long mMinAlarmTimeMs = 10000;
+ private long mMinAlarmTimeMs = MIN_ALARM_SCREEN_OFF_DELAY_MS;
private int mCurrentAlarmTimerId = INVALID_ID;
private int mCurrentHandlerTimerId = INVALID_ID;
private boolean mIsAlarmRequired;
- @VisibleForTesting final Handler mHandler;
+ @VisibleForTesting Handler mHandler;
private long mLastAlarmTriggerAtMs = Long.MAX_VALUE;
private int mCallType = CALL_TYPE_IDLE;
@@ -100,7 +105,7 @@ class QnsTimer {
mHandler.post(
() -> {
mTimerInfos.add(timerInfo);
- updateToShortestDelay(mIsAlarmRequired, true);
+ updateToShortestDelay(mIsAlarmRequired, false /* forceUpdate */);
});
return timerId;
}
@@ -120,7 +125,7 @@ class QnsTimer {
logd("Cancel timerId=" + timerId);
TimerInfo timerInfo = new TimerInfo(timerId);
if (mTimerInfos.remove(timerInfo) && timerId == mCurrentAlarmTimerId) {
- updateToShortestDelay(mIsAlarmRequired, true);
+ updateToShortestDelay(mIsAlarmRequired, false /* forceUpdate */);
}
});
}
@@ -136,20 +141,20 @@ class QnsTimer {
if (mCallType == CALL_TYPE_IDLE && type != CALL_TYPE_IDLE) {
mHandler.post(
() -> {
- mMinAlarmTimeMs = 0;
+ mMinAlarmTimeMs = MIN_ALARM_CALL_ACTIVE_DELAY_MS;
if (mIsAlarmRequired) {
- updateToShortestDelay(true, false);
+ updateToShortestDelay(true, true /* forceUpdate */);
}
});
}
mCallType = type;
if (mCallType == CALL_TYPE_IDLE && mIsAlarmRequired) {
if (mPowerManager.isDeviceIdleMode()) {
- mMinAlarmTimeMs = 60000;
+ mMinAlarmTimeMs = MIN_ALARM_DEVICE_IDLE_DELAY_MS;
} else if (mPowerManager.isDeviceLightIdleMode()) {
- mMinAlarmTimeMs = 30000;
+ mMinAlarmTimeMs = MIN_ALARM_DEVICE_LIGHT_IDLE_DELAY_MS;
} else {
- mMinAlarmTimeMs = 10000; // SCREEN_OFF case
+ mMinAlarmTimeMs = MIN_ALARM_SCREEN_OFF_DELAY_MS; // SCREEN_OFF case
}
}
}
@@ -161,11 +166,10 @@ class QnsTimer {
* respective handlers.
*
* @param isAlarmRequired flag indicates if timer is need to setup with Alarm.
- * @param skipTimerUpdate flag indicates if current scheduled alarm timers needs any change.
- * This flag will be false when call type changes or device moves or come out of idle state
- * because such cases mandates timer update.
+ * @param forceUpdate flag indicates to update the delay time for handler and/or alarm
+ * forcefully.
*/
- private void updateToShortestDelay(boolean isAlarmRequired, boolean skipTimerUpdate) {
+ private void updateToShortestDelay(boolean isAlarmRequired, boolean forceUpdate) {
TimerInfo timerInfo = mTimerInfos.peek();
long elapsedTime = getSystemElapsedRealTime();
while (timerInfo != null && timerInfo.getExpireAtElapsedMillis() <= elapsedTime) {
@@ -181,14 +185,14 @@ class QnsTimer {
}
long delay = timerInfo.getExpireAtElapsedMillis() - elapsedTime;
// Delayed Handler will always set for shortest delay.
- if (timerInfo.getTimerId() != mCurrentHandlerTimerId) {
+ if (timerInfo.getTimerId() != mCurrentHandlerTimerId || forceUpdate) {
mHandler.removeMessages(EVENT_QNS_TIMER_EXPIRED);
mHandler.sendEmptyMessageDelayed(EVENT_QNS_TIMER_EXPIRED, delay);
mCurrentHandlerTimerId = timerInfo.getTimerId();
}
// Alarm will always set for shortest from Math.max(delay, mMinAlarmTimeMs)
- if (timerInfo.getTimerId() != mCurrentAlarmTimerId || !skipTimerUpdate) {
+ if (timerInfo.getTimerId() != mCurrentAlarmTimerId || forceUpdate) {
if (isAlarmRequired) {
delay = Math.max(delay, mMinAlarmTimeMs);
// check if smaller timer alarm is already running for active timer info.
@@ -245,10 +249,13 @@ class QnsTimer {
case Intent.ACTION_SCREEN_OFF:
mHandler.post(
() -> {
- mMinAlarmTimeMs = (mCallType == CALL_TYPE_IDLE) ? 10000 : 0;
+ mMinAlarmTimeMs =
+ (mCallType == CALL_TYPE_IDLE)
+ ? MIN_ALARM_SCREEN_OFF_DELAY_MS
+ : MIN_ALARM_CALL_ACTIVE_DELAY_MS;
if (!mIsAlarmRequired) {
mIsAlarmRequired = true;
- updateToShortestDelay(true, false);
+ updateToShortestDelay(true, true /* forceUpdate */);
}
});
break;
@@ -257,7 +264,7 @@ class QnsTimer {
() -> {
if (mIsAlarmRequired) {
mIsAlarmRequired = false;
- updateToShortestDelay(false, false);
+ updateToShortestDelay(false, true /* forceUpdate */);
}
});
break;
@@ -265,13 +272,19 @@ class QnsTimer {
mHandler.post(
() -> {
if (mPowerManager.isDeviceLightIdleMode()) {
- mMinAlarmTimeMs = (mCallType == CALL_TYPE_IDLE) ? 30000 : 0;
+ mMinAlarmTimeMs =
+ (mCallType == CALL_TYPE_IDLE)
+ ? MIN_ALARM_DEVICE_LIGHT_IDLE_DELAY_MS
+ : MIN_ALARM_CALL_ACTIVE_DELAY_MS;
if (!mIsAlarmRequired) {
mIsAlarmRequired = true;
- updateToShortestDelay(true, false);
+ updateToShortestDelay(true, true /* forceUpdate */);
}
} else {
- mMinAlarmTimeMs = (mCallType == CALL_TYPE_IDLE) ? 10000 : 0;
+ mMinAlarmTimeMs =
+ (mCallType == CALL_TYPE_IDLE)
+ ? MIN_ALARM_SCREEN_OFF_DELAY_MS
+ : MIN_ALARM_CALL_ACTIVE_DELAY_MS;
}
});
break;
@@ -279,13 +292,19 @@ class QnsTimer {
mHandler.post(
() -> {
if (mPowerManager.isDeviceIdleMode()) {
- mMinAlarmTimeMs = (mCallType == CALL_TYPE_IDLE) ? 60000 : 0;
+ mMinAlarmTimeMs =
+ (mCallType == CALL_TYPE_IDLE)
+ ? MIN_ALARM_DEVICE_IDLE_DELAY_MS
+ : MIN_ALARM_CALL_ACTIVE_DELAY_MS;
if (!mIsAlarmRequired) {
mIsAlarmRequired = true;
- updateToShortestDelay(true, false);
+ updateToShortestDelay(true, true /* forceUpdate */);
}
} else {
- mMinAlarmTimeMs = (mCallType == CALL_TYPE_IDLE) ? 10000 : 0;
+ mMinAlarmTimeMs =
+ (mCallType == CALL_TYPE_IDLE)
+ ? MIN_ALARM_SCREEN_OFF_DELAY_MS
+ : MIN_ALARM_CALL_ACTIVE_DELAY_MS;
}
});
break;
@@ -307,7 +326,7 @@ class QnsTimer {
switch (msg.what) {
case EVENT_QNS_TIMER_EXPIRED:
logd("Timer expired");
- updateToShortestDelay(mIsAlarmRequired, true);
+ updateToShortestDelay(mIsAlarmRequired, false /* forceUpdate */);
break;
default:
break;
diff --git a/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/QnsTimerTest.java b/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/QnsTimerTest.java
index c4acd5a..50a36b5 100644
--- a/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/QnsTimerTest.java
+++ b/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/QnsTimerTest.java
@@ -35,6 +35,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
+import android.os.HandlerThread;
import android.os.Message;
import android.os.PowerManager;
import android.os.SystemClock;
@@ -51,6 +52,8 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.concurrent.CountDownLatch;
+
@RunWith(AndroidJUnit4.class)
public class QnsTimerTest extends QnsTest {
@@ -306,4 +309,35 @@ public class QnsTimerTest extends QnsTest {
// assume 100ms as max delay in execution
assertTrue(delay < setDelay && delay > setDelay - 100);
}
+
+ @Test
+ public void testDeviceMovesToActiveState() {
+ int setDelay = 30000;
+ CountDownLatch latch = new CountDownLatch(2);
+ HandlerThread ht = new HandlerThread("");
+ ht.start();
+ Handler tempHandler = spy(new Handler(ht.getLooper()));
+ when(mPowerManager.isDeviceLightIdleMode()).thenReturn(true, false);
+ mBroadcastReceiver.onReceive(sMockContext, new Intent(Intent.ACTION_SCREEN_OFF));
+ mBroadcastReceiver.onReceive(
+ sMockContext, new Intent(PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED));
+ mQnsTimer.registerTimer(mMessage, setDelay);
+ waitForDelayedHandlerAction(mQnsTimer.mHandler, 10, 200);
+ verify(mAlarmManager)
+ .setExactAndAllowWhileIdle(anyInt(), anyLong(), isA(PendingIntent.class));
+ waitForDelayedHandlerAction(mQnsTimer.mHandler, 10, 5000);
+
+ mQnsTimer.mHandler = tempHandler;
+ mBroadcastReceiver.onReceive(
+ sMockContext, new Intent(PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED));
+ mBroadcastReceiver.onReceive(sMockContext, new Intent(Intent.ACTION_SCREEN_ON));
+ waitForDelayedHandlerAction(mQnsTimer.mHandler, 10, 200);
+ verify(mAlarmManager).cancel(isA(PendingIntent.class));
+
+ // Handler should reset for the updated delay
+ verify(tempHandler).removeMessages(EVENT_QNS_TIMER_EXPIRED);
+ verify(tempHandler).sendEmptyMessageDelayed(anyInt(), anyLong());
+ assertTrue(mQnsTimer.mHandler.hasMessages(EVENT_QNS_TIMER_EXPIRED));
+ ht.quit();
+ }
}