63 lines
3.1 KiB
Java
63 lines
3.1 KiB
Java
package androidx.work.impl.background.systemalarm;
|
|
|
|
import android.app.AlarmManager;
|
|
import android.app.PendingIntent;
|
|
import android.content.Context;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.core.app.NotificationCompat;
|
|
import androidx.work.Logger;
|
|
import androidx.work.impl.WorkDatabase;
|
|
import androidx.work.impl.WorkManagerImpl;
|
|
import androidx.work.impl.model.SystemIdInfo;
|
|
import androidx.work.impl.model.SystemIdInfoDao;
|
|
import androidx.work.impl.utils.IdGenerator;
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
|
public class Alarms {
|
|
private static final String TAG = Logger.tagWithPrefix("Alarms");
|
|
|
|
private Alarms() {
|
|
}
|
|
|
|
public static void cancelAlarm(@NonNull Context context, @NonNull WorkManagerImpl workManagerImpl, @NonNull String str) {
|
|
SystemIdInfoDao systemIdInfoDao = workManagerImpl.getWorkDatabase().systemIdInfoDao();
|
|
SystemIdInfo systemIdInfo = systemIdInfoDao.getSystemIdInfo(str);
|
|
if (systemIdInfo != null) {
|
|
cancelExactAlarm(context, str, systemIdInfo.systemId);
|
|
Logger.get().debug(TAG, String.format("Removing SystemIdInfo for workSpecId (%s)", str), new Throwable[0]);
|
|
systemIdInfoDao.removeSystemIdInfo(str);
|
|
}
|
|
}
|
|
|
|
private static void cancelExactAlarm(@NonNull Context context, @NonNull String str, int i) {
|
|
AlarmManager alarmManager = (AlarmManager) context.getSystemService(NotificationCompat.CATEGORY_ALARM);
|
|
PendingIntent service = PendingIntent.getService(context, i, CommandHandler.createDelayMetIntent(context, str), 536870912);
|
|
if (service != null && alarmManager != null) {
|
|
Logger.get().debug(TAG, String.format("Cancelling existing alarm with (workSpecId, systemId) (%s, %s)", str, Integer.valueOf(i)), new Throwable[0]);
|
|
alarmManager.cancel(service);
|
|
}
|
|
}
|
|
|
|
public static void setAlarm(@NonNull Context context, @NonNull WorkManagerImpl workManagerImpl, @NonNull String str, long j) {
|
|
WorkDatabase workDatabase = workManagerImpl.getWorkDatabase();
|
|
SystemIdInfoDao systemIdInfoDao = workDatabase.systemIdInfoDao();
|
|
SystemIdInfo systemIdInfo = systemIdInfoDao.getSystemIdInfo(str);
|
|
if (systemIdInfo != null) {
|
|
cancelExactAlarm(context, str, systemIdInfo.systemId);
|
|
setExactAlarm(context, str, systemIdInfo.systemId, j);
|
|
return;
|
|
}
|
|
int nextAlarmManagerId = new IdGenerator(workDatabase).nextAlarmManagerId();
|
|
systemIdInfoDao.insertSystemIdInfo(new SystemIdInfo(str, nextAlarmManagerId));
|
|
setExactAlarm(context, str, nextAlarmManagerId, j);
|
|
}
|
|
|
|
private static void setExactAlarm(@NonNull Context context, @NonNull String str, int i, long j) {
|
|
AlarmManager alarmManager = (AlarmManager) context.getSystemService(NotificationCompat.CATEGORY_ALARM);
|
|
PendingIntent service = PendingIntent.getService(context, i, CommandHandler.createDelayMetIntent(context, str), 134217728);
|
|
if (alarmManager != null) {
|
|
alarmManager.setExact(0, j, service);
|
|
}
|
|
}
|
|
}
|