Files
Daniel Elliott c080f0d97f Add Discord community version (64-bit only)
- 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
2026-02-18 15:48:36 -08:00

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;
}
}