DO NOT MERGE: Move AlarmManager to apex
Mechanical refactoring to move all except native code to the apex directory. Accesses across the jar boundary will be cleaned up in follow-ups. Also, moved alarm manager code into its own package for better organization. Test: Buids, boots. Existing tests: atest FrameworksMockingServicesTests:AlarmManagerServiceTest atest CtsAlarmManagerTestCases Bug: 181724498 Change-Id: Ida46491c1f1dff02dce4c50d3fafd4efbf977766 Merged-In: Ida46491c1f1dff02dce4c50d3fafd4efbf977766
This commit is contained in:
committed by
Julien Desprez
parent
ae64e2b7e9
commit
7c0ee35b1e
@@ -2,10 +2,7 @@ filegroup {
|
||||
name: "framework-jobscheduler-sources",
|
||||
srcs: [
|
||||
"java/**/*.java",
|
||||
"java/android/app/job/IJobCallback.aidl",
|
||||
"java/android/app/job/IJobScheduler.aidl",
|
||||
"java/android/app/job/IJobService.aidl",
|
||||
"java/android/os/IDeviceIdleController.aidl",
|
||||
"java/**/*.aidl",
|
||||
],
|
||||
path: "java",
|
||||
visibility: ["//frameworks/base"],
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.server;
|
||||
package com.android.server.alarm;
|
||||
|
||||
import static android.app.AlarmManager.ELAPSED_REALTIME;
|
||||
import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
|
||||
@@ -97,7 +97,14 @@ import com.android.internal.util.FrameworkStatsLog;
|
||||
import com.android.internal.util.IndentingPrintWriter;
|
||||
import com.android.internal.util.LocalLog;
|
||||
import com.android.internal.util.StatLogger;
|
||||
import com.android.server.AlarmManagerInternal;
|
||||
import com.android.server.AppStateTracker;
|
||||
import com.android.server.AppStateTracker.Listener;
|
||||
import com.android.server.DeviceIdleInternal;
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.SystemService;
|
||||
import com.android.server.SystemServiceManager;
|
||||
import com.android.server.usage.AppStandbyInternal;
|
||||
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
|
||||
|
||||
@@ -127,7 +134,7 @@ import java.util.function.Predicate;
|
||||
* Unit test:
|
||||
atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/AlarmManagerServiceTest.java
|
||||
*/
|
||||
class AlarmManagerService extends SystemService {
|
||||
public class AlarmManagerService extends SystemService {
|
||||
private static final int RTC_WAKEUP_MASK = 1 << RTC_WAKEUP;
|
||||
private static final int RTC_MASK = 1 << RTC;
|
||||
private static final int ELAPSED_REALTIME_WAKEUP_MASK = 1 << ELAPSED_REALTIME_WAKEUP;
|
||||
@@ -920,7 +927,7 @@ class AlarmManagerService extends SystemService {
|
||||
mInjector = injector;
|
||||
}
|
||||
|
||||
AlarmManagerService(Context context) {
|
||||
public AlarmManagerService(Context context) {
|
||||
this(context, new Injector(context));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"presubmit": [
|
||||
{
|
||||
"name": "FrameworksMockingServicesTests",
|
||||
"options": [
|
||||
{
|
||||
"include-filter": "com.android.server.alarm"
|
||||
},
|
||||
{
|
||||
"include-annotation": "android.platform.test.annotations.Presubmit"
|
||||
},
|
||||
{
|
||||
"exclude-annotation": "androidx.test.filters.FlakyTest"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
"postsubmit": [
|
||||
{
|
||||
"name": "CtsAlarmManagerTestCases"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -34,7 +34,7 @@ import "frameworks/base/core/proto/android/os/statsdata.proto";
|
||||
import "frameworks/base/core/proto/android/os/system_properties.proto";
|
||||
import "frameworks/base/core/proto/android/providers/settings.proto";
|
||||
import "frameworks/base/core/proto/android/server/activitymanagerservice.proto";
|
||||
import "frameworks/base/core/proto/android/server/alarmmanagerservice.proto";
|
||||
import "frameworks/base/core/proto/android/server/alarm/alarmmanagerservice.proto";
|
||||
import "frameworks/base/core/proto/android/server/bluetooth_manager_service.proto";
|
||||
import "frameworks/base/core/proto/android/server/fingerprint.proto";
|
||||
import "frameworks/base/core/proto/android/server/jobscheduler.proto";
|
||||
@@ -317,7 +317,7 @@ message IncidentProto {
|
||||
(section).args = "activity --proto processes"
|
||||
];
|
||||
|
||||
optional com.android.server.AlarmManagerServiceDumpProto alarm = 3016 [
|
||||
optional com.android.server.alarm.AlarmManagerServiceDumpProto alarm = 3016 [
|
||||
(section).type = SECTION_DUMPSYS,
|
||||
(section).args = "alarm --proto"
|
||||
];
|
||||
|
||||
@@ -23,7 +23,7 @@ import "frameworks/base/core/proto/android/os/worksource.proto";
|
||||
import "frameworks/base/core/proto/android/server/appstatetracker.proto";
|
||||
import "frameworks/base/core/proto/android/privacy.proto";
|
||||
|
||||
package com.android.server;
|
||||
package com.android.server.alarm;
|
||||
|
||||
option java_multiple_files = true;
|
||||
|
||||
@@ -23,7 +23,6 @@ import android.app.AppOpsManager.PackageOps;
|
||||
import android.app.IActivityManager;
|
||||
import android.app.IUidObserver;
|
||||
import android.app.usage.UsageStatsManager;
|
||||
import android.app.usage.UsageStatsManagerInternal;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -53,7 +52,6 @@ import com.android.internal.app.IAppOpsCallback;
|
||||
import com.android.internal.app.IAppOpsService;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.IndentingPrintWriter;
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.android.internal.util.StatLogger;
|
||||
import com.android.server.AppStateTrackerProto.ExemptedPackage;
|
||||
import com.android.server.AppStateTrackerProto.RunAnyInBackgroundRestrictedPackages;
|
||||
@@ -1181,7 +1179,7 @@ public class AppStateTracker {
|
||||
* @return whether force all apps standby is enabled or not.
|
||||
*
|
||||
*/
|
||||
boolean isForceAllAppsStandbyEnabled() {
|
||||
public boolean isForceAllAppsStandbyEnabled() {
|
||||
synchronized (mLock) {
|
||||
return mForceAllAppsStandby;
|
||||
}
|
||||
|
||||
@@ -1,20 +1,5 @@
|
||||
{
|
||||
"presubmit": [
|
||||
{
|
||||
"name": "FrameworksMockingServicesTests",
|
||||
"file_patterns": ["AlarmManagerService\\.java"],
|
||||
"options": [
|
||||
{
|
||||
"include-filter": "com.android.server."
|
||||
},
|
||||
{
|
||||
"include-annotation": "android.platform.test.annotations.Presubmit"
|
||||
},
|
||||
{
|
||||
"exclude-annotation": "androidx.test.filters.FlakyTest"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CtsLocationFineTestCases"
|
||||
},
|
||||
|
||||
@@ -76,7 +76,7 @@ cc_library_static {
|
||||
product_variables: {
|
||||
arc: {
|
||||
exclude_srcs: [
|
||||
"com_android_server_AlarmManagerService.cpp",
|
||||
"com_android_server_alarm_AlarmManagerService.cpp",
|
||||
],
|
||||
srcs: [
|
||||
":arctimersrcs",
|
||||
@@ -197,6 +197,6 @@ filegroup {
|
||||
filegroup {
|
||||
name: "lib_alarmManagerService_native",
|
||||
srcs: [
|
||||
"com_android_server_AlarmManagerService.cpp",
|
||||
"com_android_server_alarm_AlarmManagerService.cpp",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -210,7 +210,7 @@ int AlarmImpl::waitForAlarm()
|
||||
return result;
|
||||
}
|
||||
|
||||
static jint android_server_AlarmManagerService_setKernelTime(JNIEnv*, jobject, jlong nativeData, jlong millis)
|
||||
static jint android_server_alarm_AlarmManagerService_setKernelTime(JNIEnv*, jobject, jlong nativeData, jlong millis)
|
||||
{
|
||||
AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
|
||||
struct timeval tv;
|
||||
@@ -234,7 +234,7 @@ static jint android_server_AlarmManagerService_setKernelTime(JNIEnv*, jobject, j
|
||||
return ret;
|
||||
}
|
||||
|
||||
static jint android_server_AlarmManagerService_setKernelTimezone(JNIEnv*, jobject, jlong, jint minswest)
|
||||
static jint android_server_alarm_AlarmManagerService_setKernelTimezone(JNIEnv*, jobject, jlong, jint minswest)
|
||||
{
|
||||
struct timezone tz;
|
||||
|
||||
@@ -337,7 +337,7 @@ static void log_timerfd_create_error(clockid_t id)
|
||||
ALOGE("timerfd_create(%u) failed: %s", id, strerror(errno));
|
||||
}
|
||||
|
||||
static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject)
|
||||
static jlong android_server_alarm_AlarmManagerService_init(JNIEnv*, jobject)
|
||||
{
|
||||
int epollfd;
|
||||
TimerFds fds;
|
||||
@@ -392,7 +392,7 @@ static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject)
|
||||
return reinterpret_cast<jlong>(ret);
|
||||
}
|
||||
|
||||
static jlong android_server_AlarmManagerService_getNextAlarm(JNIEnv*, jobject, jlong nativeData, jint type)
|
||||
static jlong android_server_alarm_AlarmManagerService_getNextAlarm(JNIEnv*, jobject, jlong nativeData, jint type)
|
||||
{
|
||||
AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
|
||||
struct itimerspec spec;
|
||||
@@ -409,13 +409,13 @@ static jlong android_server_AlarmManagerService_getNextAlarm(JNIEnv*, jobject, j
|
||||
return static_cast<jlong>(millis);
|
||||
}
|
||||
|
||||
static void android_server_AlarmManagerService_close(JNIEnv*, jobject, jlong nativeData)
|
||||
static void android_server_alarm_AlarmManagerService_close(JNIEnv*, jobject, jlong nativeData)
|
||||
{
|
||||
AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
|
||||
delete impl;
|
||||
}
|
||||
|
||||
static jint android_server_AlarmManagerService_set(JNIEnv*, jobject, jlong nativeData, jint type, jlong seconds, jlong nanoseconds)
|
||||
static jint android_server_alarm_AlarmManagerService_set(JNIEnv*, jobject, jlong nativeData, jint type, jlong seconds, jlong nanoseconds)
|
||||
{
|
||||
AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
|
||||
struct timespec ts;
|
||||
@@ -432,7 +432,7 @@ static jint android_server_AlarmManagerService_set(JNIEnv*, jobject, jlong nativ
|
||||
return result >= 0 ? 0 : errno;
|
||||
}
|
||||
|
||||
static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv*, jobject, jlong nativeData)
|
||||
static jint android_server_alarm_AlarmManagerService_waitForAlarm(JNIEnv*, jobject, jlong nativeData)
|
||||
{
|
||||
AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
|
||||
int result = 0;
|
||||
@@ -453,18 +453,18 @@ static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv*, jobject, jl
|
||||
|
||||
static const JNINativeMethod sMethods[] = {
|
||||
/* name, signature, funcPtr */
|
||||
{"init", "()J", (void*)android_server_AlarmManagerService_init},
|
||||
{"close", "(J)V", (void*)android_server_AlarmManagerService_close},
|
||||
{"set", "(JIJJ)I", (void*)android_server_AlarmManagerService_set},
|
||||
{"waitForAlarm", "(J)I", (void*)android_server_AlarmManagerService_waitForAlarm},
|
||||
{"setKernelTime", "(JJ)I", (void*)android_server_AlarmManagerService_setKernelTime},
|
||||
{"setKernelTimezone", "(JI)I", (void*)android_server_AlarmManagerService_setKernelTimezone},
|
||||
{"getNextAlarm", "(JI)J", (void*)android_server_AlarmManagerService_getNextAlarm},
|
||||
{"init", "()J", (void*)android_server_alarm_AlarmManagerService_init},
|
||||
{"close", "(J)V", (void*)android_server_alarm_AlarmManagerService_close},
|
||||
{"set", "(JIJJ)I", (void*)android_server_alarm_AlarmManagerService_set},
|
||||
{"waitForAlarm", "(J)I", (void*)android_server_alarm_AlarmManagerService_waitForAlarm},
|
||||
{"setKernelTime", "(JJ)I", (void*)android_server_alarm_AlarmManagerService_setKernelTime},
|
||||
{"setKernelTimezone", "(JI)I", (void*)android_server_alarm_AlarmManagerService_setKernelTimezone},
|
||||
{"getNextAlarm", "(JI)J", (void*)android_server_alarm_AlarmManagerService_getNextAlarm},
|
||||
};
|
||||
|
||||
int register_android_server_AlarmManagerService(JNIEnv* env)
|
||||
int register_android_server_alarm_AlarmManagerService(JNIEnv* env)
|
||||
{
|
||||
return jniRegisterNativeMethods(env, "com/android/server/AlarmManagerService",
|
||||
return jniRegisterNativeMethods(env, "com/android/server/alarm/AlarmManagerService",
|
||||
sMethods, NELEM(sMethods));
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "BroadcastRadio/Tuner.h"
|
||||
|
||||
namespace android {
|
||||
int register_android_server_AlarmManagerService(JNIEnv* env);
|
||||
int register_android_server_alarm_AlarmManagerService(JNIEnv* env);
|
||||
int register_android_server_BatteryStatsService(JNIEnv* env);
|
||||
int register_android_server_ConsumerIrService(JNIEnv *env);
|
||||
int register_android_server_InputManager(JNIEnv* env);
|
||||
@@ -85,7 +85,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
|
||||
register_android_server_SerialService(env);
|
||||
register_android_server_InputManager(env);
|
||||
register_android_server_LightsService(env);
|
||||
register_android_server_AlarmManagerService(env);
|
||||
register_android_server_alarm_AlarmManagerService(env);
|
||||
register_android_server_UsbDeviceManager(env);
|
||||
register_android_server_UsbMidiDevice(env);
|
||||
register_android_server_UsbAlsaJackDetector(env);
|
||||
|
||||
@@ -306,6 +306,8 @@ public final class SystemServer {
|
||||
"com.android.server.blob.BlobStoreManagerService";
|
||||
private static final String ROLLBACK_MANAGER_SERVICE_CLASS =
|
||||
"com.android.server.rollback.RollbackManagerService";
|
||||
private static final String ALARM_MANAGER_SERVICE_CLASS =
|
||||
"com.android.server.alarm.AlarmManagerService";
|
||||
|
||||
private static final String TETHERING_CONNECTOR_CLASS = "android.net.ITetheringConnector";
|
||||
|
||||
@@ -1143,7 +1145,7 @@ public final class SystemServer {
|
||||
}
|
||||
|
||||
t.traceBegin("StartAlarmManagerService");
|
||||
mSystemServiceManager.startService(new AlarmManagerService(context));
|
||||
mSystemServiceManager.startService(ALARM_MANAGER_SERVICE_CLASS);
|
||||
t.traceEnd();
|
||||
|
||||
t.traceBegin("StartInputManagerService");
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.server;
|
||||
package com.android.server.alarm;
|
||||
|
||||
import static android.app.AlarmManager.ELAPSED_REALTIME;
|
||||
import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
|
||||
@@ -26,7 +26,6 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED;
|
||||
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
|
||||
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doCallRealMethod;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doThrow;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
|
||||
@@ -34,20 +33,20 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
|
||||
import static com.android.server.AlarmManagerService.ACTIVE_INDEX;
|
||||
import static com.android.server.AlarmManagerService.AlarmHandler.APP_STANDBY_BUCKET_CHANGED;
|
||||
import static com.android.server.AlarmManagerService.AlarmHandler.CHARGING_STATUS_CHANGED;
|
||||
import static com.android.server.AlarmManagerService.AlarmHandler.REMOVE_FOR_CANCELED;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_LONG_TIME;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_SHORT_TIME;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_WHITELIST_DURATION;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_LISTENER_TIMEOUT;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_MAX_INTERVAL;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_MIN_FUTURITY;
|
||||
import static com.android.server.AlarmManagerService.Constants.KEY_MIN_INTERVAL;
|
||||
import static com.android.server.AlarmManagerService.IS_WAKEUP_MASK;
|
||||
import static com.android.server.AlarmManagerService.TIME_CHANGED_MASK;
|
||||
import static com.android.server.AlarmManagerService.WORKING_INDEX;
|
||||
import static com.android.server.alarm.AlarmManagerService.ACTIVE_INDEX;
|
||||
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.APP_STANDBY_BUCKET_CHANGED;
|
||||
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.CHARGING_STATUS_CHANGED;
|
||||
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_FOR_CANCELED;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_LONG_TIME;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_SHORT_TIME;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_WHITELIST_DURATION;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_LISTENER_TIMEOUT;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_MAX_INTERVAL;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_MIN_FUTURITY;
|
||||
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_MIN_INTERVAL;
|
||||
import static com.android.server.alarm.AlarmManagerService.IS_WAKEUP_MASK;
|
||||
import static com.android.server.alarm.AlarmManagerService.TIME_CHANGED_MASK;
|
||||
import static com.android.server.alarm.AlarmManagerService.WORKING_INDEX;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
@@ -77,6 +76,7 @@ import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.PowerManager;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.UserHandle;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.provider.Settings;
|
||||
@@ -87,6 +87,10 @@ import androidx.test.runner.AndroidJUnit4;
|
||||
|
||||
import com.android.dx.mockito.inline.extended.MockedVoidMethod;
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.server.AlarmManagerInternal;
|
||||
import com.android.server.AppStateTracker;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.SystemService;
|
||||
import com.android.server.usage.AppStandbyInternal;
|
||||
|
||||
import org.junit.After;
|
||||
@@ -255,7 +259,8 @@ public class AlarmManagerServiceTest {
|
||||
.spyStatic(ActivityManager.class)
|
||||
.mockStatic(LocalServices.class)
|
||||
.spyStatic(Looper.class)
|
||||
.spyStatic(Settings.Global.class)
|
||||
.mockStatic(Settings.Global.class)
|
||||
.mockStatic(ServiceManager.class)
|
||||
.spyStatic(UserHandle.class)
|
||||
.strictness(Strictness.WARN)
|
||||
.startMocking();
|
||||
@@ -280,7 +285,6 @@ public class AlarmManagerServiceTest {
|
||||
mInjector = new Injector(mMockContext);
|
||||
mService = new AlarmManagerService(mMockContext, mInjector);
|
||||
spyOn(mService);
|
||||
doNothing().when(mService).publishBinderService(any(), any());
|
||||
|
||||
mService.onStart();
|
||||
spyOn(mService.mHandler);
|
||||
@@ -13,26 +13,28 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.server;
|
||||
package com.android.server.alarm;
|
||||
|
||||
import static android.app.AlarmManager.RTC;
|
||||
import static android.app.AlarmManager.RTC_WAKEUP;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
|
||||
import com.android.internal.util.ObjectUtils;
|
||||
import com.android.server.AlarmManagerService.Alarm;
|
||||
import com.android.server.alarm.AlarmManagerService.Alarm;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@Presubmit
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class BackgroundRestrictedAlarmsTest {
|
||||
Reference in New Issue
Block a user