Merge "Fix exempt vs unexempt scheduled sync standby bucket logic" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
d44e0e38e3
@@ -1844,7 +1844,7 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_REPORT_SYNC_SCHEDULED:
|
case MSG_REPORT_SYNC_SCHEDULED:
|
||||||
final boolean exempted = msg.arg1 > 0 ? true : false;
|
final boolean exempted = msg.arg2 > 0 ? true : false;
|
||||||
if (exempted) {
|
if (exempted) {
|
||||||
reportExemptedSyncScheduled((String) msg.obj, msg.arg1);
|
reportExemptedSyncScheduled((String) msg.obj, msg.arg1);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ import androidx.test.filters.SmallTest;
|
|||||||
import androidx.test.runner.AndroidJUnit4;
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
import com.android.server.SystemService;
|
import com.android.server.SystemService;
|
||||||
|
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -87,6 +88,7 @@ import java.util.Arrays;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -127,6 +129,15 @@ public class AppStandbyControllerTests {
|
|||||||
private MyInjector mInjector;
|
private MyInjector mInjector;
|
||||||
private AppStandbyController mController;
|
private AppStandbyController mController;
|
||||||
|
|
||||||
|
private CountDownLatch mStateChangedLatch = new CountDownLatch(1);
|
||||||
|
private AppIdleStateChangeListener mListener = new AppIdleStateChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onAppIdleStateChanged(String packageName, int userId,
|
||||||
|
boolean idle, int bucket, int reason) {
|
||||||
|
mStateChangedLatch.countDown();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static class MyContextWrapper extends ContextWrapper {
|
static class MyContextWrapper extends ContextWrapper {
|
||||||
PackageManager mockPm = mock(PackageManager.class);
|
PackageManager mockPm = mock(PackageManager.class);
|
||||||
|
|
||||||
@@ -156,6 +167,7 @@ public class AppStandbyControllerTests {
|
|||||||
String mBoundWidgetPackage = PACKAGE_EXEMPTED_1;
|
String mBoundWidgetPackage = PACKAGE_EXEMPTED_1;
|
||||||
int[] mRunningUsers = new int[] {USER_ID};
|
int[] mRunningUsers = new int[] {USER_ID};
|
||||||
List<UserHandle> mCrossProfileTargets = Collections.emptyList();
|
List<UserHandle> mCrossProfileTargets = Collections.emptyList();
|
||||||
|
boolean mDeviceIdleMode = false;
|
||||||
|
|
||||||
MyInjector(Context context, Looper looper) {
|
MyInjector(Context context, Looper looper) {
|
||||||
super(context, looper);
|
super(context, looper);
|
||||||
@@ -251,7 +263,7 @@ public class AppStandbyControllerTests {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDeviceIdleMode() {
|
public boolean isDeviceIdleMode() {
|
||||||
return false;
|
return mDeviceIdleMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -327,6 +339,7 @@ public class AppStandbyControllerTests {
|
|||||||
controller.getAppStandbyBucket(PACKAGE_1, USER_ID,
|
controller.getAppStandbyBucket(PACKAGE_1, USER_ID,
|
||||||
mInjector.mElapsedRealtime, false));
|
mInjector.mElapsedRealtime, false));
|
||||||
|
|
||||||
|
controller.addListener(mListener);
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1055,6 +1068,46 @@ public class AppStandbyControllerTests {
|
|||||||
STANDBY_BUCKET_WORKING_SET, getStandbyBucket(USER_ID2, mController, PACKAGE_1));
|
STANDBY_BUCKET_WORKING_SET, getStandbyBucket(USER_ID2, mController, PACKAGE_1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnexemptedSyncScheduled() throws Exception {
|
||||||
|
mStateChangedLatch = new CountDownLatch(1);
|
||||||
|
mController.addListener(mListener);
|
||||||
|
assertEquals("Test package did not start in the Never bucket", STANDBY_BUCKET_NEVER,
|
||||||
|
getStandbyBucket(mController, PACKAGE_1));
|
||||||
|
|
||||||
|
mController.postReportSyncScheduled(PACKAGE_1, USER_ID, false);
|
||||||
|
mStateChangedLatch.await(100, TimeUnit.MILLISECONDS);
|
||||||
|
assertEquals("Unexempted sync scheduled should bring the package out of the Never bucket",
|
||||||
|
STANDBY_BUCKET_WORKING_SET, getStandbyBucket(mController, PACKAGE_1));
|
||||||
|
|
||||||
|
setAndAssertBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM);
|
||||||
|
|
||||||
|
mStateChangedLatch = new CountDownLatch(1);
|
||||||
|
mController.postReportSyncScheduled(PACKAGE_1, USER_ID, false);
|
||||||
|
mStateChangedLatch.await(100, TimeUnit.MILLISECONDS);
|
||||||
|
assertEquals("Unexempted sync scheduled should not elevate a non Never bucket",
|
||||||
|
STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExemptedSyncScheduled() throws Exception {
|
||||||
|
setAndAssertBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM);
|
||||||
|
mInjector.mDeviceIdleMode = true;
|
||||||
|
mStateChangedLatch = new CountDownLatch(1);
|
||||||
|
mController.postReportSyncScheduled(PACKAGE_1, USER_ID, true);
|
||||||
|
mStateChangedLatch.await(100, TimeUnit.MILLISECONDS);
|
||||||
|
assertEquals("Exempted sync scheduled in doze should set bucket to working set",
|
||||||
|
STANDBY_BUCKET_WORKING_SET, getStandbyBucket(mController, PACKAGE_1));
|
||||||
|
|
||||||
|
setAndAssertBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM);
|
||||||
|
mInjector.mDeviceIdleMode = false;
|
||||||
|
mStateChangedLatch = new CountDownLatch(1);
|
||||||
|
mController.postReportSyncScheduled(PACKAGE_1, USER_ID, true);
|
||||||
|
mStateChangedLatch.await(100, TimeUnit.MILLISECONDS);
|
||||||
|
assertEquals("Exempted sync scheduled while not in doze should set bucket to active",
|
||||||
|
STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController, PACKAGE_1));
|
||||||
|
}
|
||||||
|
|
||||||
private String getAdminAppsStr(int userId) {
|
private String getAdminAppsStr(int userId) {
|
||||||
return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
|
return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
|
||||||
}
|
}
|
||||||
@@ -1095,4 +1148,12 @@ public class AppStandbyControllerTests {
|
|||||||
private void setActiveAdmins(int userId, String... admins) {
|
private void setActiveAdmins(int userId, String... admins) {
|
||||||
mController.setActiveAdminApps(new ArraySet<>(Arrays.asList(admins)), userId);
|
mController.setActiveAdminApps(new ArraySet<>(Arrays.asList(admins)), userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setAndAssertBucket(String pkg, int user, int bucket, int reason) throws Exception {
|
||||||
|
mStateChangedLatch = new CountDownLatch(1);
|
||||||
|
mController.setAppStandbyBucket(pkg, user, bucket, reason);
|
||||||
|
mStateChangedLatch.await(100, TimeUnit.MILLISECONDS);
|
||||||
|
assertEquals("Failed to set package bucket", bucket,
|
||||||
|
getStandbyBucket(mController, PACKAGE_1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user