Request ModemActivityInfo with Asynchronous request and cache
The message of requestModemActivityInfo processing is using the
UIThread of the phone process with blocking call. While waiting for
the response from modem, it can cause long processing time
resulting long shutdown time.
Test: manual; shutting down performs correctly, and it seems the
shuting down time decreases from 4 sec to 2.5 sec per my experience
Bug: 141732999
Change-Id: Iaa943612cd08f6f2b2d230df347edbbe390fb632
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index ce0e8f3..8e57811 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -1027,14 +1027,47 @@
onCompleted = obtainMessage(EVENT_GET_MODEM_ACTIVITY_INFO_DONE, request);
if (defaultPhone != null) {
defaultPhone.getModemActivityInfo(onCompleted, request.workSource);
+ } else {
+ ResultReceiver result = (ResultReceiver) request.argument;
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(TelephonyManager.MODEM_ACTIVITY_RESULT_KEY,
+ new ModemActivityInfo(0, 0, 0, new int[0], 0));
+ result.send(0, bundle);
}
break;
case EVENT_GET_MODEM_ACTIVITY_INFO_DONE:
ar = (AsyncResult) msg.obj;
request = (MainThreadRequest) ar.userObj;
+ ResultReceiver result = (ResultReceiver) request.argument;
+
+ ModemActivityInfo ret = new ModemActivityInfo(0, 0, 0, new int[0], 0);
if (ar.exception == null && ar.result != null) {
- request.result = ar.result;
+ // Update the last modem activity info and the result of the request.
+ ModemActivityInfo info = (ModemActivityInfo) ar.result;
+ if (isModemActivityInfoValid(info)) {
+ int[] mergedTxTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
+ int[] txTimeMs = info.getTransmitTimeMillis();
+ int[] lastModemTxTimeMs = mLastModemActivityInfo
+ .getTransmitTimeMillis();
+ for (int i = 0; i < mergedTxTimeMs.length; i++) {
+ mergedTxTimeMs[i] = txTimeMs[i] + lastModemTxTimeMs[i];
+ }
+ mLastModemActivityInfo.setTimestamp(info.getTimestamp());
+ mLastModemActivityInfo.setSleepTimeMillis(info.getSleepTimeMillis()
+ + mLastModemActivityInfo.getSleepTimeMillis());
+ mLastModemActivityInfo.setIdleTimeMillis(info.getIdleTimeMillis()
+ + mLastModemActivityInfo.getIdleTimeMillis());
+ mLastModemActivityInfo.setTransmitTimeMillis(mergedTxTimeMs);
+ mLastModemActivityInfo.setReceiveTimeMillis(
+ info.getReceiveTimeMillis()
+ + mLastModemActivityInfo.getReceiveTimeMillis());
+ }
+ ret = new ModemActivityInfo(mLastModemActivityInfo.getTimestamp(),
+ mLastModemActivityInfo.getSleepTimeMillis(),
+ mLastModemActivityInfo.getIdleTimeMillis(),
+ mLastModemActivityInfo.getTransmitTimeMillis(),
+ mLastModemActivityInfo.getReceiveTimeMillis());
} else {
if (ar.result == null) {
loge("queryModemActivityInfo: Empty response");
@@ -1045,10 +1078,9 @@
loge("queryModemActivityInfo: Unknown exception");
}
}
- // Result cannot be null. Return ModemActivityInfo with all fields set to 0.
- if (request.result == null) {
- request.result = new ModemActivityInfo(0, 0, 0, new int[0], 0);
- }
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(TelephonyManager.MODEM_ACTIVITY_RESULT_KEY, ret);
+ result.send(0, bundle);
notifyRequester(request);
break;
@@ -6641,38 +6673,7 @@
final long identity = Binder.clearCallingIdentity();
try {
- ModemActivityInfo ret = null;
- synchronized (mLastModemActivityInfo) {
- ModemActivityInfo info = (ModemActivityInfo) sendRequest(
- CMD_GET_MODEM_ACTIVITY_INFO,
- null, workSource);
- if (isModemActivityInfoValid(info)) {
- int[] mergedTxTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
- int[] txTimeMs = info.getTransmitTimeMillis();
- int[] lastModemTxTimeMs = mLastModemActivityInfo.getTransmitTimeMillis();
- for (int i = 0; i < mergedTxTimeMs.length; i++) {
- mergedTxTimeMs[i] = txTimeMs[i] + lastModemTxTimeMs[i];
- }
- mLastModemActivityInfo.setTimestamp(info.getTimestamp());
- mLastModemActivityInfo.setSleepTimeMillis(info.getSleepTimeMillis()
- + mLastModemActivityInfo.getSleepTimeMillis());
- mLastModemActivityInfo.setIdleTimeMillis(
- info.getIdleTimeMillis() + mLastModemActivityInfo.getIdleTimeMillis());
- mLastModemActivityInfo.setTransmitTimeMillis(mergedTxTimeMs);
- mLastModemActivityInfo.setReceiveTimeMillis(
- info.getReceiveTimeMillis() + mLastModemActivityInfo
- .getReceiveTimeMillis());
- }
-
- ret = new ModemActivityInfo(mLastModemActivityInfo.getTimestamp(),
- mLastModemActivityInfo.getSleepTimeMillis(),
- mLastModemActivityInfo.getIdleTimeMillis(),
- mLastModemActivityInfo.getTransmitTimeMillis(),
- mLastModemActivityInfo.getReceiveTimeMillis());
- }
- Bundle bundle = new Bundle();
- bundle.putParcelable(TelephonyManager.MODEM_ACTIVITY_RESULT_KEY, ret);
- result.send(0, bundle);
+ sendRequestAsync(CMD_GET_MODEM_ACTIVITY_INFO, result, null, workSource);
} finally {
Binder.restoreCallingIdentity(identity);
}