Reafactor DataProcessManager Callback Function Logic

Keep the current thread for period job flow; only call handler back to
the main thread in UI flow.

Bug: 374570240
Fix: 374570240
Test: manual
Flag: EXEMPT bug fix
Change-Id: Ie923dbbd858c0c7000fa16a6c639f56624b2ece5
This commit is contained in:
Zaiyue Xue
2024-10-22 12:45:39 +08:00
parent cba6429800
commit bdaadc471b
4 changed files with 22 additions and 54 deletions

View File

@@ -20,8 +20,6 @@ import android.app.usage.UsageEvents;
import android.content.Context; import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.BatteryUsageStats; import android.os.BatteryUsageStats;
import android.os.Handler;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -117,11 +115,9 @@ public final class BatteryUsageDataLoader {
private static void preprocessBatteryUsageSlots( private static void preprocessBatteryUsageSlots(
final Context context, final UserIdsSeries userIdsSeries) { final Context context, final UserIdsSeries userIdsSeries) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
final Handler handler = new Handler(Looper.getMainLooper());
final BatteryLevelData batteryLevelData = final BatteryLevelData batteryLevelData =
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
context, context,
handler,
userIdsSeries, userIdsSeries,
/* isFromPeriodJob= */ true, /* isFromPeriodJob= */ true,
batteryDiffDataMap -> { batteryDiffDataMap -> {

View File

@@ -19,8 +19,6 @@ package com.android.settings.fuelgauge.batteryusage;
import android.app.usage.UsageEvents; import android.app.usage.UsageEvents;
import android.content.Context; import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
@@ -82,7 +80,6 @@ public class DataProcessManager {
private final long mLastFullChargeTimestamp; private final long mLastFullChargeTimestamp;
private final boolean mIsFromPeriodJob; private final boolean mIsFromPeriodJob;
private final Context mContext; private final Context mContext;
private final Handler mHandler;
private final UserIdsSeries mUserIdsSeries; private final UserIdsSeries mUserIdsSeries;
private final OnBatteryDiffDataMapLoadedListener mCallbackFunction; private final OnBatteryDiffDataMapLoadedListener mCallbackFunction;
private final List<AppUsageEvent> mAppUsageEventList = new ArrayList<>(); private final List<AppUsageEvent> mAppUsageEventList = new ArrayList<>();
@@ -123,7 +120,6 @@ public class DataProcessManager {
/** Constructor when there exists battery level data. */ /** Constructor when there exists battery level data. */
DataProcessManager( DataProcessManager(
Context context, Context context,
Handler handler,
final UserIdsSeries userIdsSeries, final UserIdsSeries userIdsSeries,
final boolean isFromPeriodJob, final boolean isFromPeriodJob,
final long rawStartTimestamp, final long rawStartTimestamp,
@@ -132,7 +128,6 @@ public class DataProcessManager {
@NonNull final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay, @NonNull final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay,
@NonNull final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) { @NonNull final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mHandler = handler;
mUserIdsSeries = userIdsSeries; mUserIdsSeries = userIdsSeries;
mIsFromPeriodJob = isFromPeriodJob; mIsFromPeriodJob = isFromPeriodJob;
mRawStartTimestamp = rawStartTimestamp; mRawStartTimestamp = rawStartTimestamp;
@@ -145,11 +140,9 @@ public class DataProcessManager {
/** Constructor when there is no battery level data. */ /** Constructor when there is no battery level data. */
DataProcessManager( DataProcessManager(
Context context, Context context,
Handler handler,
final UserIdsSeries userIdsSeries, final UserIdsSeries userIdsSeries,
@NonNull final OnBatteryDiffDataMapLoadedListener callbackFunction) { @NonNull final OnBatteryDiffDataMapLoadedListener callbackFunction) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mHandler = handler;
mUserIdsSeries = userIdsSeries; mUserIdsSeries = userIdsSeries;
mCallbackFunction = callbackFunction; mCallbackFunction = callbackFunction;
mIsFromPeriodJob = false; mIsFromPeriodJob = false;
@@ -444,12 +437,8 @@ public class DataProcessManager {
@Override @Override
protected void onPostExecute(final Map<Long, BatteryDiffData> batteryDiffDataMap) { protected void onPostExecute(final Map<Long, BatteryDiffData> batteryDiffDataMap) {
// Post results back to main thread to refresh UI. if (mCallbackFunction != null) {
if (mHandler != null && mCallbackFunction != null) {
mHandler.post(
() -> {
mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap); mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap);
});
} }
} }
}.execute(); }.execute();
@@ -534,12 +523,8 @@ public class DataProcessManager {
@Override @Override
protected void onPostExecute(final Map<Long, BatteryDiffData> batteryDiffDataMap) { protected void onPostExecute(final Map<Long, BatteryDiffData> batteryDiffDataMap) {
// Post results back to main thread to refresh UI. if (mCallbackFunction != null) {
if (mHandler != null && mCallbackFunction != null) {
mHandler.post(
() -> {
mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap); mCallbackFunction.onBatteryDiffDataMapLoaded(batteryDiffDataMap);
});
} }
} }
}.execute(); }.execute();
@@ -581,7 +566,6 @@ public class DataProcessManager {
@Nullable @Nullable
public static BatteryLevelData getBatteryLevelData( public static BatteryLevelData getBatteryLevelData(
Context context, Context context,
@Nullable Handler handler,
final UserIdsSeries userIdsSeries, final UserIdsSeries userIdsSeries,
final boolean isFromPeriodJob, final boolean isFromPeriodJob,
final OnBatteryDiffDataMapLoadedListener onBatteryUsageMapLoadedListener) { final OnBatteryDiffDataMapLoadedListener onBatteryUsageMapLoadedListener) {
@@ -601,7 +585,6 @@ public class DataProcessManager {
final BatteryLevelData batteryLevelData = final BatteryLevelData batteryLevelData =
getPeriodBatteryLevelData( getPeriodBatteryLevelData(
context, context,
handler,
userIdsSeries, userIdsSeries,
startTimestamp, startTimestamp,
lastFullChargeTime, lastFullChargeTime,
@@ -621,7 +604,6 @@ public class DataProcessManager {
private static BatteryLevelData getPeriodBatteryLevelData( private static BatteryLevelData getPeriodBatteryLevelData(
Context context, Context context,
@Nullable Handler handler,
final UserIdsSeries userIdsSeries, final UserIdsSeries userIdsSeries,
final long startTimestamp, final long startTimestamp,
final long lastFullChargeTime, final long lastFullChargeTime,
@@ -639,7 +621,6 @@ public class DataProcessManager {
return null; return null;
} }
handler = handler != null ? handler : new Handler(Looper.getMainLooper());
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
sFakeBatteryHistoryMap != null sFakeBatteryHistoryMap != null
? sFakeBatteryHistoryMap ? sFakeBatteryHistoryMap
@@ -650,8 +631,7 @@ public class DataProcessManager {
lastFullChargeTime); lastFullChargeTime);
if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) { if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
Log.d(TAG, "batteryHistoryMap is null in getPeriodBatteryLevelData()"); Log.d(TAG, "batteryHistoryMap is null in getPeriodBatteryLevelData()");
new DataProcessManager( new DataProcessManager(context, userIdsSeries, onBatteryDiffDataMapLoadedListener)
context, handler, userIdsSeries, onBatteryDiffDataMapLoadedListener)
.start(); .start();
return null; return null;
} }
@@ -680,8 +660,7 @@ public class DataProcessManager {
DataProcessor.getLevelDataThroughProcessedHistoryMap( DataProcessor.getLevelDataThroughProcessedHistoryMap(
context, processedBatteryHistoryMap); context, processedBatteryHistoryMap);
if (batteryLevelData == null) { if (batteryLevelData == null) {
new DataProcessManager( new DataProcessManager(context, userIdsSeries, onBatteryDiffDataMapLoadedListener)
context, handler, userIdsSeries, onBatteryDiffDataMapLoadedListener)
.start(); .start();
Log.d(TAG, "getBatteryLevelData() returns null"); Log.d(TAG, "getBatteryLevelData() returns null");
return null; return null;
@@ -690,7 +669,6 @@ public class DataProcessManager {
// Start the async task to compute diff usage data and load labels and icons. // Start the async task to compute diff usage data and load labels and icons.
new DataProcessManager( new DataProcessManager(
context, context,
handler,
userIdsSeries, userIdsSeries,
isFromPeriodJob, isFromPeriodJob,
startTimestamp, startTimestamp,

View File

@@ -214,6 +214,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
if (!isResumed() || mBatteryLevelData == null) { if (!isResumed() || mBatteryLevelData == null) {
return; return;
} }
mHandler.post(() -> {
mBatteryUsageMap = mBatteryUsageMap =
DataProcessor.generateBatteryUsageMap( DataProcessor.generateBatteryUsageMap(
getContext(), batteryDiffDataMap, mBatteryLevelData.orElse(null)); getContext(), batteryDiffDataMap, mBatteryLevelData.orElse(null));
@@ -228,6 +229,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
// No available battery usage and battery level data. // No available battery usage and battery level data.
mBatteryChartPreferenceController.showEmptyChart(); mBatteryChartPreferenceController.showEmptyChart();
} }
});
} }
private void onSelectedSlotDataUpdated() { private void onSelectedSlotDataUpdated() {
@@ -503,7 +505,6 @@ public class PowerUsageAdvanced extends PowerUsageBase {
public BatteryLevelData loadInBackground() { public BatteryLevelData loadInBackground() {
return DataProcessManager.getBatteryLevelData( return DataProcessManager.getBatteryLevelData(
getContext(), getContext(),
mHandler,
new UserIdsSeries(getContext(), /* isNonUIRequest= */ false), new UserIdsSeries(getContext(), /* isNonUIRequest= */ false),
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
PowerUsageAdvanced.this::onBatteryDiffDataMapUpdate); PowerUsageAdvanced.this::onBatteryDiffDataMapUpdate);

View File

@@ -110,7 +110,6 @@ public final class DataProcessManagerTest {
mDataProcessManager = mDataProcessManager =
new DataProcessManager( new DataProcessManager(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* rawStartTimestamp= */ 0L, /* rawStartTimestamp= */ 0L,
@@ -131,7 +130,6 @@ public final class DataProcessManagerTest {
final DataProcessManager dataProcessManager = final DataProcessManager dataProcessManager =
new DataProcessManager( new DataProcessManager(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* callbackFunction= */ null); /* callbackFunction= */ null);
assertThat(dataProcessManager.getShowScreenOnTime()).isFalse(); assertThat(dataProcessManager.getShowScreenOnTime()).isFalse();
@@ -257,7 +255,6 @@ public final class DataProcessManagerTest {
final DataProcessManager dataProcessManager = final DataProcessManager dataProcessManager =
new DataProcessManager( new DataProcessManager(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* rawStartTimestamp= */ 2L, /* rawStartTimestamp= */ 2L,
@@ -349,7 +346,6 @@ public final class DataProcessManagerTest {
assertThat( assertThat(
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* asyncResponseDelegate= */ null)) /* asyncResponseDelegate= */ null))
@@ -357,7 +353,6 @@ public final class DataProcessManagerTest {
assertThat( assertThat(
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* isFromPeriodJob= */ true, /* isFromPeriodJob= */ true,
/* asyncResponseDelegate= */ null)) /* asyncResponseDelegate= */ null))
@@ -379,7 +374,6 @@ public final class DataProcessManagerTest {
final BatteryLevelData resultData = final BatteryLevelData resultData =
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* asyncResponseDelegate= */ null); /* asyncResponseDelegate= */ null);
@@ -408,7 +402,6 @@ public final class DataProcessManagerTest {
final BatteryLevelData resultData = final BatteryLevelData resultData =
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null,
mUserIdsSeries, mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* asyncResponseDelegate= */ null); /* asyncResponseDelegate= */ null);