- Added realracing3-community.apk (71.57 MB) - Removed 32-bit support (armeabi-v7a) - Only includes arm64-v8a libraries - Decompiled source code included - Added README-community.md with analysis
264 lines
12 KiB
Java
264 lines
12 KiB
Java
package androidx.work.impl.background.systemalarm;
|
|
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.os.Bundle;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.annotation.WorkerThread;
|
|
import androidx.work.Clock;
|
|
import androidx.work.Logger;
|
|
import androidx.work.impl.ExecutionListener;
|
|
import androidx.work.impl.StartStopToken;
|
|
import androidx.work.impl.StartStopTokens;
|
|
import androidx.work.impl.WorkDatabase;
|
|
import androidx.work.impl.background.systemalarm.SystemAlarmDispatcher;
|
|
import androidx.work.impl.model.WorkGenerationalId;
|
|
import androidx.work.impl.model.WorkSpec;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
|
|
/* loaded from: classes.dex */
|
|
public class CommandHandler implements ExecutionListener {
|
|
static final String ACTION_CONSTRAINTS_CHANGED = "ACTION_CONSTRAINTS_CHANGED";
|
|
static final String ACTION_DELAY_MET = "ACTION_DELAY_MET";
|
|
static final String ACTION_EXECUTION_COMPLETED = "ACTION_EXECUTION_COMPLETED";
|
|
static final String ACTION_RESCHEDULE = "ACTION_RESCHEDULE";
|
|
static final String ACTION_SCHEDULE_WORK = "ACTION_SCHEDULE_WORK";
|
|
static final String ACTION_STOP_WORK = "ACTION_STOP_WORK";
|
|
private static final String KEY_NEEDS_RESCHEDULE = "KEY_NEEDS_RESCHEDULE";
|
|
private static final String KEY_WORKSPEC_GENERATION = "KEY_WORKSPEC_GENERATION";
|
|
private static final String KEY_WORKSPEC_ID = "KEY_WORKSPEC_ID";
|
|
private static final String TAG = Logger.tagWithPrefix("CommandHandler");
|
|
static final long WORK_PROCESSING_TIME_IN_MS = 600000;
|
|
private final Clock mClock;
|
|
private final Context mContext;
|
|
private final StartStopTokens mStartStopTokens;
|
|
private final Map<WorkGenerationalId, DelayMetCommandHandler> mPendingDelayMet = new HashMap();
|
|
private final Object mLock = new Object();
|
|
|
|
public static Intent createScheduleWorkIntent(@NonNull Context context, @NonNull WorkGenerationalId workGenerationalId) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_SCHEDULE_WORK);
|
|
return writeWorkGenerationalId(intent, workGenerationalId);
|
|
}
|
|
|
|
private static Intent writeWorkGenerationalId(@NonNull Intent intent, @NonNull WorkGenerationalId workGenerationalId) {
|
|
intent.putExtra(KEY_WORKSPEC_ID, workGenerationalId.getWorkSpecId());
|
|
intent.putExtra(KEY_WORKSPEC_GENERATION, workGenerationalId.getGeneration());
|
|
return intent;
|
|
}
|
|
|
|
public static WorkGenerationalId readWorkGenerationalId(@NonNull Intent intent) {
|
|
return new WorkGenerationalId(intent.getStringExtra(KEY_WORKSPEC_ID), intent.getIntExtra(KEY_WORKSPEC_GENERATION, 0));
|
|
}
|
|
|
|
public static Intent createDelayMetIntent(@NonNull Context context, @NonNull WorkGenerationalId workGenerationalId) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_DELAY_MET);
|
|
return writeWorkGenerationalId(intent, workGenerationalId);
|
|
}
|
|
|
|
public static Intent createStopWorkIntent(@NonNull Context context, @NonNull String str) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_STOP_WORK);
|
|
intent.putExtra(KEY_WORKSPEC_ID, str);
|
|
return intent;
|
|
}
|
|
|
|
public static Intent createStopWorkIntent(@NonNull Context context, @NonNull WorkGenerationalId workGenerationalId) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_STOP_WORK);
|
|
return writeWorkGenerationalId(intent, workGenerationalId);
|
|
}
|
|
|
|
public static Intent createConstraintsChangedIntent(@NonNull Context context) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_CONSTRAINTS_CHANGED);
|
|
return intent;
|
|
}
|
|
|
|
public static Intent createRescheduleIntent(@NonNull Context context) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_RESCHEDULE);
|
|
return intent;
|
|
}
|
|
|
|
public static Intent createExecutionCompletedIntent(@NonNull Context context, @NonNull WorkGenerationalId workGenerationalId, boolean z) {
|
|
Intent intent = new Intent(context, (Class<?>) SystemAlarmService.class);
|
|
intent.setAction(ACTION_EXECUTION_COMPLETED);
|
|
intent.putExtra(KEY_NEEDS_RESCHEDULE, z);
|
|
return writeWorkGenerationalId(intent, workGenerationalId);
|
|
}
|
|
|
|
public CommandHandler(@NonNull Context context, Clock clock, @NonNull StartStopTokens startStopTokens) {
|
|
this.mContext = context;
|
|
this.mClock = clock;
|
|
this.mStartStopTokens = startStopTokens;
|
|
}
|
|
|
|
@Override // androidx.work.impl.ExecutionListener
|
|
public void onExecuted(@NonNull WorkGenerationalId workGenerationalId, boolean z) {
|
|
synchronized (this.mLock) {
|
|
try {
|
|
DelayMetCommandHandler remove = this.mPendingDelayMet.remove(workGenerationalId);
|
|
this.mStartStopTokens.remove(workGenerationalId);
|
|
if (remove != null) {
|
|
remove.onExecuted(z);
|
|
}
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean hasPendingCommands() {
|
|
boolean z;
|
|
synchronized (this.mLock) {
|
|
z = !this.mPendingDelayMet.isEmpty();
|
|
}
|
|
return z;
|
|
}
|
|
|
|
@WorkerThread
|
|
public void onHandleIntent(@NonNull Intent intent, int i, @NonNull SystemAlarmDispatcher systemAlarmDispatcher) {
|
|
String action = intent.getAction();
|
|
if (ACTION_CONSTRAINTS_CHANGED.equals(action)) {
|
|
handleConstraintsChanged(intent, i, systemAlarmDispatcher);
|
|
return;
|
|
}
|
|
if (ACTION_RESCHEDULE.equals(action)) {
|
|
handleReschedule(intent, i, systemAlarmDispatcher);
|
|
return;
|
|
}
|
|
if (!hasKeys(intent.getExtras(), KEY_WORKSPEC_ID)) {
|
|
Logger.get().error(TAG, "Invalid request for " + action + " , requires " + KEY_WORKSPEC_ID + " .");
|
|
return;
|
|
}
|
|
if (ACTION_SCHEDULE_WORK.equals(action)) {
|
|
handleScheduleWorkIntent(intent, i, systemAlarmDispatcher);
|
|
return;
|
|
}
|
|
if (ACTION_DELAY_MET.equals(action)) {
|
|
handleDelayMet(intent, i, systemAlarmDispatcher);
|
|
return;
|
|
}
|
|
if (ACTION_STOP_WORK.equals(action)) {
|
|
handleStopWork(intent, systemAlarmDispatcher);
|
|
return;
|
|
}
|
|
if (ACTION_EXECUTION_COMPLETED.equals(action)) {
|
|
handleExecutionCompleted(intent, i);
|
|
return;
|
|
}
|
|
Logger.get().warning(TAG, "Ignoring intent " + intent);
|
|
}
|
|
|
|
private void handleScheduleWorkIntent(@NonNull Intent intent, int i, @NonNull SystemAlarmDispatcher systemAlarmDispatcher) {
|
|
WorkGenerationalId readWorkGenerationalId = readWorkGenerationalId(intent);
|
|
Logger logger = Logger.get();
|
|
String str = TAG;
|
|
logger.debug(str, "Handling schedule work for " + readWorkGenerationalId);
|
|
WorkDatabase workDatabase = systemAlarmDispatcher.getWorkManager().getWorkDatabase();
|
|
workDatabase.beginTransaction();
|
|
try {
|
|
WorkSpec workSpec = workDatabase.workSpecDao().getWorkSpec(readWorkGenerationalId.getWorkSpecId());
|
|
if (workSpec == null) {
|
|
Logger.get().warning(str, "Skipping scheduling " + readWorkGenerationalId + " because it's no longer in the DB");
|
|
return;
|
|
}
|
|
if (workSpec.state.isFinished()) {
|
|
Logger.get().warning(str, "Skipping scheduling " + readWorkGenerationalId + "because it is finished.");
|
|
return;
|
|
}
|
|
long calculateNextRunTime = workSpec.calculateNextRunTime();
|
|
if (!workSpec.hasConstraints()) {
|
|
Logger.get().debug(str, "Setting up Alarms for " + readWorkGenerationalId + "at " + calculateNextRunTime);
|
|
Alarms.setAlarm(this.mContext, workDatabase, readWorkGenerationalId, calculateNextRunTime);
|
|
} else {
|
|
Logger.get().debug(str, "Opportunistically setting an alarm for " + readWorkGenerationalId + "at " + calculateNextRunTime);
|
|
Alarms.setAlarm(this.mContext, workDatabase, readWorkGenerationalId, calculateNextRunTime);
|
|
systemAlarmDispatcher.getTaskExecutor().getMainThreadExecutor().execute(new SystemAlarmDispatcher.AddRunnable(systemAlarmDispatcher, createConstraintsChangedIntent(this.mContext), i));
|
|
}
|
|
workDatabase.setTransactionSuccessful();
|
|
} finally {
|
|
workDatabase.endTransaction();
|
|
}
|
|
}
|
|
|
|
private void handleDelayMet(@NonNull Intent intent, int i, @NonNull SystemAlarmDispatcher systemAlarmDispatcher) {
|
|
synchronized (this.mLock) {
|
|
try {
|
|
WorkGenerationalId readWorkGenerationalId = readWorkGenerationalId(intent);
|
|
Logger logger = Logger.get();
|
|
String str = TAG;
|
|
logger.debug(str, "Handing delay met for " + readWorkGenerationalId);
|
|
if (!this.mPendingDelayMet.containsKey(readWorkGenerationalId)) {
|
|
DelayMetCommandHandler delayMetCommandHandler = new DelayMetCommandHandler(this.mContext, i, systemAlarmDispatcher, this.mStartStopTokens.tokenFor(readWorkGenerationalId));
|
|
this.mPendingDelayMet.put(readWorkGenerationalId, delayMetCommandHandler);
|
|
delayMetCommandHandler.handleProcessWork();
|
|
} else {
|
|
Logger.get().debug(str, "WorkSpec " + readWorkGenerationalId + " is is already being handled for ACTION_DELAY_MET");
|
|
}
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void handleStopWork(@NonNull Intent intent, @NonNull SystemAlarmDispatcher systemAlarmDispatcher) {
|
|
List<StartStopToken> remove;
|
|
Bundle extras = intent.getExtras();
|
|
String string = extras.getString(KEY_WORKSPEC_ID);
|
|
if (extras.containsKey(KEY_WORKSPEC_GENERATION)) {
|
|
int i = extras.getInt(KEY_WORKSPEC_GENERATION);
|
|
remove = new ArrayList<>(1);
|
|
StartStopToken remove2 = this.mStartStopTokens.remove(new WorkGenerationalId(string, i));
|
|
if (remove2 != null) {
|
|
remove.add(remove2);
|
|
}
|
|
} else {
|
|
remove = this.mStartStopTokens.remove(string);
|
|
}
|
|
for (StartStopToken startStopToken : remove) {
|
|
Logger.get().debug(TAG, "Handing stopWork work for " + string);
|
|
systemAlarmDispatcher.getWorkerLauncher().stopWork(startStopToken);
|
|
Alarms.cancelAlarm(this.mContext, systemAlarmDispatcher.getWorkManager().getWorkDatabase(), startStopToken.getId());
|
|
systemAlarmDispatcher.onExecuted(startStopToken.getId(), false);
|
|
}
|
|
}
|
|
|
|
private void handleConstraintsChanged(@NonNull Intent intent, int i, @NonNull SystemAlarmDispatcher systemAlarmDispatcher) {
|
|
Logger.get().debug(TAG, "Handling constraints changed " + intent);
|
|
new ConstraintsCommandHandler(this.mContext, this.mClock, i, systemAlarmDispatcher).handleConstraintsChanged();
|
|
}
|
|
|
|
private void handleReschedule(@NonNull Intent intent, int i, @NonNull SystemAlarmDispatcher systemAlarmDispatcher) {
|
|
Logger.get().debug(TAG, "Handling reschedule " + intent + ", " + i);
|
|
systemAlarmDispatcher.getWorkManager().rescheduleEligibleWork();
|
|
}
|
|
|
|
private void handleExecutionCompleted(@NonNull Intent intent, int i) {
|
|
WorkGenerationalId readWorkGenerationalId = readWorkGenerationalId(intent);
|
|
boolean z = intent.getExtras().getBoolean(KEY_NEEDS_RESCHEDULE);
|
|
Logger.get().debug(TAG, "Handling onExecutionCompleted " + intent + ", " + i);
|
|
onExecuted(readWorkGenerationalId, z);
|
|
}
|
|
|
|
private static boolean hasKeys(@Nullable Bundle bundle, @NonNull String... strArr) {
|
|
if (bundle == null || bundle.isEmpty()) {
|
|
return false;
|
|
}
|
|
for (String str : strArr) {
|
|
if (bundle.get(str) == null) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|