Merge "[Settings] Code refactor for performance"

This commit is contained in:
Bonian Chen
2022-12-07 10:25:49 +00:00
committed by Android (Google) Code Review
3 changed files with 62 additions and 14 deletions

View File

@@ -51,6 +51,8 @@ import com.android.settingslib.widget.LayoutPreference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@SearchIndexable @SearchIndexable
public class MyDeviceInfoFragment extends DashboardFragment public class MyDeviceInfoFragment extends DashboardFragment
@@ -105,14 +107,9 @@ public class MyDeviceInfoFragment extends DashboardFragment
Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle) { Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>(); final List<AbstractPreferenceController> controllers = new ArrayList<>();
final SlotSimStatus slotSimStatus = new SlotSimStatus(context); final ExecutorService executor = (fragment == null) ? null :
for (int slotIndex = 0; slotIndex < slotSimStatus.size(); slotIndex ++) { Executors.newSingleThreadExecutor();
SimStatusPreferenceController slotRecord = final SlotSimStatus slotSimStatus = new SlotSimStatus(context, executor);
new SimStatusPreferenceController(context,
slotSimStatus.getPreferenceKey(slotIndex));
slotRecord.init(fragment, slotSimStatus);
controllers.add(slotRecord);
}
controllers.add(new IpAddressPreferenceController(context, lifecycle)); controllers.add(new IpAddressPreferenceController(context, lifecycle));
controllers.add(new WifiMacAddressPreferenceController(context, lifecycle)); controllers.add(new WifiMacAddressPreferenceController(context, lifecycle));
@@ -123,6 +120,17 @@ public class MyDeviceInfoFragment extends DashboardFragment
controllers.add(new FeedbackPreferenceController(fragment, context)); controllers.add(new FeedbackPreferenceController(fragment, context));
controllers.add(new FccEquipmentIdPreferenceController(context)); controllers.add(new FccEquipmentIdPreferenceController(context));
controllers.add(new UptimePreferenceController(context, lifecycle)); controllers.add(new UptimePreferenceController(context, lifecycle));
for (int slotIndex = 0; slotIndex < slotSimStatus.size(); slotIndex ++) {
SimStatusPreferenceController slotRecord =
new SimStatusPreferenceController(context,
slotSimStatus.getPreferenceKey(slotIndex));
slotRecord.init(fragment, slotSimStatus);
controllers.add(slotRecord);
}
if (executor != null) {
executor.shutdown();
}
return controllers; return controllers;
} }

View File

@@ -21,6 +21,10 @@ import android.telephony.TelephonyManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.util.Log; import android.util.Log;
import java.util.concurrent.Executor;
import java.util.concurrent.Phaser;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* A class for showing a summary of status of sim slots. * A class for showing a summary of status of sim slots.
*/ */
@@ -28,7 +32,8 @@ public class SlotSimStatus {
private static final String TAG = "SlotSimStatus"; private static final String TAG = "SlotSimStatus";
private int mNumberOfSlots; private final AtomicInteger mNumberOfSlots = new AtomicInteger(0);
private final Phaser mBlocker = new Phaser(1);
private int mBasePreferenceOrdering; private int mBasePreferenceOrdering;
private static final String KEY_SIM_STATUS = "sim_status"; private static final String KEY_SIM_STATUS = "sim_status";
@@ -38,11 +43,32 @@ public class SlotSimStatus {
* @param context Context * @param context Context
*/ */
public SlotSimStatus(Context context) { public SlotSimStatus(Context context) {
TelephonyManager telMgr = context.getSystemService(TelephonyManager.class); this(context, null);
if (telMgr == null) {
return;
} }
mNumberOfSlots = telMgr.getPhoneCount();
/**
* Construct of class.
* @param context Context
* @param executor executor for offload to thread
*/
public SlotSimStatus(Context context, Executor executor) {
if (executor == null) {
queryRecords(context);
} else {
executor.execute(() -> queryRecords(context));
}
}
protected void queryRecords(Context context) {
TelephonyManager telMgr = context.getSystemService(TelephonyManager.class);
if (telMgr != null) {
mNumberOfSlots.set(telMgr.getPhoneCount());
}
mBlocker.arrive();
}
protected void waitForResult() {
mBlocker.awaitAdvance(0);
} }
/** /**
@@ -58,7 +84,8 @@ public class SlotSimStatus {
* @return number of slots * @return number of slots
*/ */
public int size() { public int size() {
return mNumberOfSlots; waitForResult();
return mNumberOfSlots.get();
} }
/** /**

View File

@@ -33,6 +33,9 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class SlotSimStatusTest { public class SlotSimStatusTest {
@@ -58,6 +61,16 @@ public class SlotSimStatusTest {
assertEquals(new Integer(target.size()), new Integer(2)); assertEquals(new Integer(target.size()), new Integer(2));
} }
@Test
public void size_returnNumberOfPhone_whenQueryInBackgroundThread() {
doReturn(2).when(mTelephonyManager).getPhoneCount();
ExecutorService executor = Executors.newSingleThreadExecutor();
SlotSimStatus target = new SlotSimStatus(mContext, executor);
assertEquals(new Integer(target.size()), new Integer(2));
}
@Test @Test
public void getPreferenceOrdering_returnOrdering_whenQuery() { public void getPreferenceOrdering_returnOrdering_whenQuery() {
doReturn(2).when(mTelephonyManager).getPhoneCount(); doReturn(2).when(mTelephonyManager).getPhoneCount();