Ignore broadcast intent from additional profile.

- Use isAdditionalProfile() to ignore intent from either work or private profile.

Bug: 354828134
Test: atest SettingsRoboTests:com.android.settings.fuelgauge.batteryusage
Flag: EXEMPT bug fix
Change-Id: Ic0c91d956e4bfcd53576629efab4be847c94155e
This commit is contained in:
mxyyiyi
2024-07-23 12:58:05 +08:00
parent 7a01fb2679
commit d4965bd5cc
12 changed files with 131 additions and 24 deletions

View File

@@ -63,8 +63,8 @@ public final class BatteryUsageBroadcastReceiver extends BroadcastReceiver {
} }
final String action = intent.getAction(); final String action = intent.getAction();
Log.d(TAG, "onReceive:" + action); Log.d(TAG, "onReceive:" + action);
if (com.android.settingslib.fuelgauge.BatteryUtils.isWorkProfile(context)) { if (com.android.settingslib.fuelgauge.BatteryUtils.isAdditionalProfile(context)) {
Log.w(TAG, "do nothing for work profile action=" + action); Log.w(TAG, "do nothing for an additional profile action=" + action);
return; return;
} }
DatabaseUtils.recordDateTime(context, action); DatabaseUtils.recordDateTime(context, action);

View File

@@ -110,8 +110,8 @@ public class BatteryUsageContentProvider extends ContentProvider {
@Override @Override
public boolean onCreate() { public boolean onCreate() {
if (BatteryUtils.isWorkProfile(getContext())) { if (BatteryUtils.isAdditionalProfile(getContext())) {
Log.w(TAG, "do not create provider for work profile"); Log.w(TAG, "do not create provider for an additional profile");
return false; return false;
} }
mClock = Clock.systemUTC(); mClock = Clock.systemUTC();

View File

@@ -54,8 +54,8 @@ public final class BootBroadcastReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
final String action = intent == null ? "" : intent.getAction(); final String action = intent == null ? "" : intent.getAction();
if (BatteryUtils.isWorkProfile(context)) { if (BatteryUtils.isAdditionalProfile(context)) {
Log.w(TAG, "do not start job for work profile action=" + action); Log.w(TAG, "do not start job for an additional profile action=" + action);
return; return;
} }

View File

@@ -70,6 +70,7 @@ public final class DatabaseUtils {
/** Clear memory threshold for device booting phase. */ /** Clear memory threshold for device booting phase. */
private static final long CLEAR_MEMORY_THRESHOLD_MS = Duration.ofMinutes(5).toMillis(); private static final long CLEAR_MEMORY_THRESHOLD_MS = Duration.ofMinutes(5).toMillis();
private static final long CLEAR_MEMORY_DELAYED_MS = Duration.ofSeconds(2).toMillis(); private static final long CLEAR_MEMORY_DELAYED_MS = Duration.ofSeconds(2).toMillis();
private static final long INVALID_TIMESTAMP = 0L; private static final long INVALID_TIMESTAMP = 0L;
@@ -527,9 +528,11 @@ public final class DatabaseUtils {
return startCalendar.getTimeInMillis(); return startCalendar.getTimeInMillis();
} }
/** Returns the context with profile parent identity when current user is work profile. */ /**
* Returns the context with profile parent identity when current user is an additional profile.
*/
public static Context getParentContext(Context context) { public static Context getParentContext(Context context) {
if (com.android.settingslib.fuelgauge.BatteryUtils.isWorkProfile(context)) { if (com.android.settingslib.fuelgauge.BatteryUtils.isAdditionalProfile(context)) {
try { try {
return context.createPackageContextAsUser( return context.createPackageContextAsUser(
/* packageName= */ context.getPackageName(), /* packageName= */ context.getPackageName(),

View File

@@ -50,10 +50,10 @@ public final class PeriodicJobReceiver extends BroadcastReceiver {
Log.w(TAG, "receive unexpected action=" + action); Log.w(TAG, "receive unexpected action=" + action);
return; return;
} }
if (BatteryUtils.isWorkProfile(context)) { if (BatteryUtils.isAdditionalProfile(context)) {
BatteryUsageLogUtils.writeLog( BatteryUsageLogUtils.writeLog(
context, Action.SCHEDULE_JOB, "do not refresh job for work profile"); context, Action.SCHEDULE_JOB, "do not refresh job for an additional profile");
Log.w(TAG, "do not refresh job for work profile action=" + action); Log.w(TAG, "do not refresh job for an additional profile action=" + action);
return; return;
} }
BatteryUsageLogUtils.writeLog(context, Action.EXECUTE_JOB, ""); BatteryUsageLogUtils.writeLog(context, Action.EXECUTE_JOB, "");

View File

@@ -49,8 +49,8 @@ public final class BugReportContentProvider extends ContentProvider {
Log.w(TAG, "failed to dump BatteryUsage state: null application context"); Log.w(TAG, "failed to dump BatteryUsage state: null application context");
return; return;
} }
if (BatteryUtils.isWorkProfile(context)) { if (BatteryUtils.isAdditionalProfile(context)) {
Log.w(TAG, "ignore battery usage states dump in the work profile"); Log.w(TAG, "ignore battery usage states dump in the additional profile");
return; return;
} }
writer.println("dump BatteryUsage and AppUsage states:"); writer.println("dump BatteryUsage and AppUsage states:");

View File

@@ -28,9 +28,9 @@ import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserManager;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before; import org.junit.Before;
@@ -49,6 +49,7 @@ public final class BatteryUsageBroadcastReceiverTest {
private FakeFeatureFactory mFakeFeatureFactory; private FakeFeatureFactory mFakeFeatureFactory;
@Mock private PackageManager mPackageManager; @Mock private PackageManager mPackageManager;
@Mock private UserManager mUserManager;
@Before @Before
public void setUp() { public void setUp() {
@@ -57,6 +58,7 @@ public final class BatteryUsageBroadcastReceiverTest {
mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mBatteryUsageBroadcastReceiver = new BatteryUsageBroadcastReceiver(); mBatteryUsageBroadcastReceiver = new BatteryUsageBroadcastReceiver();
doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
DatabaseUtils.getSharedPreferences(mContext).edit().clear().apply(); DatabaseUtils.getSharedPreferences(mContext).edit().clear().apply();
} }
@@ -69,7 +71,17 @@ public final class BatteryUsageBroadcastReceiverTest {
@Test @Test
public void onReceive_workProfile_doNothing() { public void onReceive_workProfile_doNothing() {
BatteryTestUtils.setWorkProfile(mContext); doReturn(true).when(mUserManager).isManagedProfile();
mBatteryUsageBroadcastReceiver.onReceive(
mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));
assertThat(mBatteryUsageBroadcastReceiver.mFetchBatteryUsageData).isFalse();
}
@Test
public void onReceive_privateProfile_doNothing() {
doReturn(true).when(mUserManager).isPrivateProfile();
mBatteryUsageBroadcastReceiver.onReceive( mBatteryUsageBroadcastReceiver.onReceive(
mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING)); mContext, new Intent(BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING));

View File

@@ -19,12 +19,16 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertThrows;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.UserManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
@@ -39,6 +43,8 @@ import com.android.settings.testutils.FakeClock;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import java.time.Duration; import java.time.Duration;
@@ -62,9 +68,14 @@ public final class BatteryUsageContentProviderTest {
private Context mContext; private Context mContext;
private BatteryUsageContentProvider mProvider; private BatteryUsageContentProvider mProvider;
@Mock
private UserManager mUserManager;
@Before @Before
public void setUp() { public void setUp() {
mContext = ApplicationProvider.getApplicationContext(); MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
mProvider = new BatteryUsageContentProvider(); mProvider = new BatteryUsageContentProvider();
mProvider.attachInfo(mContext, /* info= */ null); mProvider.attachInfo(mContext, /* info= */ null);
BatteryTestUtils.setUpBatteryStateDatabase(mContext); BatteryTestUtils.setUpBatteryStateDatabase(mContext);
@@ -77,7 +88,13 @@ public final class BatteryUsageContentProviderTest {
@Test @Test
public void onCreate_withWorkProfileMode_returnsFalse() { public void onCreate_withWorkProfileMode_returnsFalse() {
BatteryTestUtils.setWorkProfile(mContext); doReturn(true).when(mUserManager).isManagedProfile();
assertThat(mProvider.onCreate()).isFalse();
}
@Test
public void onCreate_withPrivateProfileMode_returnsFalse() {
doReturn(true).when(mUserManager).isPrivateProfile();
assertThat(mProvider.onCreate()).isFalse(); assertThat(mProvider.onCreate()).isFalse();
} }

View File

@@ -18,6 +18,9 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
import android.app.AlarmManager; import android.app.AlarmManager;
@@ -26,6 +29,7 @@ import android.app.usage.UsageStatsManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.UserManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
@@ -37,6 +41,8 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows; import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowAlarmManager; import org.robolectric.shadows.ShadowAlarmManager;
@@ -55,10 +61,15 @@ public final class BootBroadcastReceiverTest {
private ShadowAlarmManager mShadowAlarmManager; private ShadowAlarmManager mShadowAlarmManager;
private PeriodicJobManager mPeriodicJobManager; private PeriodicJobManager mPeriodicJobManager;
@Mock
private UserManager mUserManager;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
mContext = ApplicationProvider.getApplicationContext(); mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
mPeriodicJobManager = PeriodicJobManager.getInstance(mContext); mPeriodicJobManager = PeriodicJobManager.getInstance(mContext);
mShadowAlarmManager = shadowOf(mContext.getSystemService(AlarmManager.class)); mShadowAlarmManager = shadowOf(mContext.getSystemService(AlarmManager.class));
mReceiver = new BootBroadcastReceiver(); mReceiver = new BootBroadcastReceiver();
@@ -78,7 +89,15 @@ public final class BootBroadcastReceiverTest {
@Test @Test
public void onReceive_withWorkProfile_notRefreshesJob() { public void onReceive_withWorkProfile_notRefreshesJob() {
BatteryTestUtils.setWorkProfile(mContext); doReturn(true).when(mUserManager).isManagedProfile();
mReceiver.onReceive(mContext, new Intent(Intent.ACTION_BOOT_COMPLETED));
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull();
}
@Test
public void onReceive_withPrivateProfile_notRefreshesJob() {
doReturn(true).when(mUserManager).isPrivateProfile();
mReceiver.onReceive(mContext, new Intent(Intent.ACTION_BOOT_COMPLETED)); mReceiver.onReceive(mContext, new Intent(Intent.ACTION_BOOT_COMPLETED));
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull(); assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull();

View File

@@ -47,7 +47,6 @@ import android.os.UserManager;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity; import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
import com.android.settings.testutils.BatteryTestUtils;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -450,6 +449,26 @@ public final class DatabaseUtilsTest {
assertThat(batteryHistMap).isEmpty(); assertThat(batteryHistMap).isEmpty();
} }
@Test
public void getHistoryMap_withPrivateProfile_returnExpectedMap()
throws PackageManager.NameNotFoundException {
doReturn("com.fake.package").when(mContext).getPackageName();
doReturn(mMockContext)
.when(mContext)
.createPackageContextAsUser("com.fake.package", /* flags= */ 0, UserHandle.OWNER);
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(UserHandle.CURRENT).when(mContext).getUser();
doReturn(true).when(mUserManager).isPrivateProfile();
doReturn(UserHandle.SYSTEM).when(mUserManager).getProfileParent(UserHandle.CURRENT);
DatabaseUtils.sFakeSupplier = () -> getMatrixCursor();
final Map<Long, Map<String, BatteryHistEntry>> batteryHistMap =
DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, 0);
assertThat(batteryHistMap).isEmpty();
}
@Test @Test
public void removeUsageSource_hasNoData() { public void removeUsageSource_hasNoData() {
DatabaseUtils.removeUsageSource(mContext); DatabaseUtils.removeUsageSource(mContext);

View File

@@ -18,11 +18,15 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.UserManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
@@ -34,6 +38,8 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowAlarmManager; import org.robolectric.shadows.ShadowAlarmManager;
@@ -53,12 +59,17 @@ public final class PeriodicJobReceiverTest {
private PeriodicJobManager mPeriodicJobManager; private PeriodicJobManager mPeriodicJobManager;
private ShadowAlarmManager mShadowAlarmManager; private ShadowAlarmManager mShadowAlarmManager;
@Mock
private UserManager mUserManager;
@Before @Before
public void setUp() { public void setUp() {
mContext = ApplicationProvider.getApplicationContext(); MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
mPeriodicJobManager = PeriodicJobManager.getInstance(mContext); mPeriodicJobManager = PeriodicJobManager.getInstance(mContext);
mShadowAlarmManager = shadowOf(mContext.getSystemService(AlarmManager.class)); mShadowAlarmManager = shadowOf(mContext.getSystemService(AlarmManager.class));
mReceiver = new PeriodicJobReceiver(); mReceiver = new PeriodicJobReceiver();
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
// Inserts fake data into database for testing. // Inserts fake data into database for testing.
final BatteryStateDatabase database = BatteryTestUtils.setUpBatteryStateDatabase(mContext); final BatteryStateDatabase database = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
@@ -114,7 +125,14 @@ public final class PeriodicJobReceiverTest {
@Test @Test
public void onReceive_inWorkProfileMode_notRefreshesJob() { public void onReceive_inWorkProfileMode_notRefreshesJob() {
BatteryTestUtils.setWorkProfile(mContext); doReturn(true).when(mUserManager).isManagedProfile();
mReceiver.onReceive(mContext, JOB_UPDATE_INTENT);
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull();
}
@Test
public void onReceive_inPrivateProfileMode_notRefreshesJob() {
doReturn(true).when(mUserManager).isPrivateProfile();
mReceiver.onReceive(mContext, JOB_UPDATE_INTENT); mReceiver.onReceive(mContext, JOB_UPDATE_INTENT);
assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull(); assertThat(mShadowAlarmManager.peekNextScheduledAlarm()).isNull();
} }

View File

@@ -18,7 +18,11 @@ package com.android.settings.fuelgauge.batteryusage.bugreport;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import android.content.Context; import android.content.Context;
import android.os.UserManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
@@ -27,6 +31,8 @@ import com.android.settings.testutils.BatteryTestUtils;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import java.io.FileDescriptor; import java.io.FileDescriptor;
@@ -46,11 +52,17 @@ public final class BugReportContentProviderTest {
private StringWriter mStringWriter; private StringWriter mStringWriter;
private BugReportContentProvider mBugReportContentProvider; private BugReportContentProvider mBugReportContentProvider;
@Mock
private UserManager mUserManager;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mStringWriter = new StringWriter(); mStringWriter = new StringWriter();
mPrintWriter = new PrintWriter(mStringWriter); mPrintWriter = new PrintWriter(mStringWriter);
mContext = ApplicationProvider.getApplicationContext(); mContext = spy(ApplicationProvider.getApplicationContext());
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
mBugReportContentProvider = new BugReportContentProvider(); mBugReportContentProvider = new BugReportContentProvider();
mBugReportContentProvider.attachInfo(mContext, /* info= */ null); mBugReportContentProvider.attachInfo(mContext, /* info= */ null);
// Inserts fake data into database for testing. // Inserts fake data into database for testing.
@@ -77,7 +89,14 @@ public final class BugReportContentProviderTest {
@Test @Test
public void dump_inWorkProfileMode_notDumpsBatteryUsageData() { public void dump_inWorkProfileMode_notDumpsBatteryUsageData() {
BatteryTestUtils.setWorkProfile(mContext); doReturn(true).when(mUserManager).isManagedProfile();
mBugReportContentProvider.dump(FileDescriptor.out, mPrintWriter, new String[] {});
assertThat(mStringWriter.toString()).isEmpty();
}
@Test
public void dump_inPrivateProfileMode_notDumpsBatteryUsageData() {
doReturn(true).when(mUserManager).isPrivateProfile();
mBugReportContentProvider.dump(FileDescriptor.out, mPrintWriter, new String[] {}); mBugReportContentProvider.dump(FileDescriptor.out, mPrintWriter, new String[] {});
assertThat(mStringWriter.toString()).isEmpty(); assertThat(mStringWriter.toString()).isEmpty();
} }