309 lines
15 KiB
Java
309 lines
15 KiB
Java
package androidx.activity.result;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.content.Intent;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import androidx.activity.result.contract.ActivityResultContract;
|
|
import androidx.annotation.MainThread;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.core.app.ActivityOptionsCompat;
|
|
import androidx.lifecycle.Lifecycle;
|
|
import androidx.lifecycle.LifecycleEventObserver;
|
|
import androidx.lifecycle.LifecycleOwner;
|
|
import c.d.b.a.a;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
public abstract class ActivityResultRegistry {
|
|
private static final int INITIAL_REQUEST_CODE_VALUE = 65536;
|
|
private static final String KEY_COMPONENT_ACTIVITY_PENDING_RESULTS = "KEY_COMPONENT_ACTIVITY_PENDING_RESULT";
|
|
private static final String KEY_COMPONENT_ACTIVITY_RANDOM_OBJECT = "KEY_COMPONENT_ACTIVITY_RANDOM_OBJECT";
|
|
private static final String KEY_COMPONENT_ACTIVITY_REGISTERED_KEYS = "KEY_COMPONENT_ACTIVITY_REGISTERED_KEYS";
|
|
private static final String KEY_COMPONENT_ACTIVITY_REGISTERED_RCS = "KEY_COMPONENT_ACTIVITY_REGISTERED_RCS";
|
|
private static final String LOG_TAG = "ActivityResultRegistry";
|
|
public final transient Map<String, CallbackAndContract<?>> mKeyToCallback = new HashMap();
|
|
private final Map<String, LifecycleContainer> mKeyToLifecycleContainers = new HashMap();
|
|
private final Map<String, Integer> mKeyToRc = new HashMap();
|
|
public final Map<String, Object> mParsedPendingResults = new HashMap();
|
|
public final Bundle mPendingResults = new Bundle();
|
|
private Random mRandom = new Random();
|
|
private final Map<Integer, String> mRcToKey = new HashMap();
|
|
|
|
/* renamed from: androidx.activity.result.ActivityResultRegistry$1 reason: invalid class name */
|
|
public class AnonymousClass1 implements LifecycleEventObserver {
|
|
public final /* synthetic */ ActivityResultCallback val$callback;
|
|
public final /* synthetic */ ActivityResultContract val$contract;
|
|
public final /* synthetic */ String val$key;
|
|
|
|
public AnonymousClass1(String str, ActivityResultCallback activityResultCallback, ActivityResultContract activityResultContract) {
|
|
this.val$key = str;
|
|
this.val$callback = activityResultCallback;
|
|
this.val$contract = activityResultContract;
|
|
}
|
|
|
|
@Override // androidx.lifecycle.LifecycleEventObserver
|
|
public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner, @NonNull Lifecycle.Event event) {
|
|
if (Lifecycle.Event.ON_START.equals(event)) {
|
|
ActivityResultRegistry.this.mKeyToCallback.put(this.val$key, new CallbackAndContract<>(this.val$callback, this.val$contract));
|
|
if (ActivityResultRegistry.this.mParsedPendingResults.containsKey(this.val$key)) {
|
|
Object obj = ActivityResultRegistry.this.mParsedPendingResults.get(this.val$key);
|
|
ActivityResultRegistry.this.mParsedPendingResults.remove(this.val$key);
|
|
this.val$callback.onActivityResult(obj);
|
|
}
|
|
ActivityResult activityResult = (ActivityResult) ActivityResultRegistry.this.mPendingResults.getParcelable(this.val$key);
|
|
if (activityResult != null) {
|
|
ActivityResultRegistry.this.mPendingResults.remove(this.val$key);
|
|
this.val$callback.onActivityResult(this.val$contract.parseResult(activityResult.getResultCode(), activityResult.getData()));
|
|
}
|
|
} else if (Lifecycle.Event.ON_STOP.equals(event)) {
|
|
ActivityResultRegistry.this.mKeyToCallback.remove(this.val$key);
|
|
} else if (Lifecycle.Event.ON_DESTROY.equals(event)) {
|
|
ActivityResultRegistry.this.unregister(this.val$key);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.activity.result.ActivityResultRegistry$2 reason: invalid class name */
|
|
public class AnonymousClass2 extends ActivityResultLauncher<I> {
|
|
public final /* synthetic */ ActivityResultContract val$contract;
|
|
public final /* synthetic */ String val$key;
|
|
public final /* synthetic */ int val$requestCode;
|
|
|
|
public AnonymousClass2(int i, ActivityResultContract activityResultContract, String str) {
|
|
this.val$requestCode = i;
|
|
this.val$contract = activityResultContract;
|
|
this.val$key = str;
|
|
}
|
|
|
|
@Override // androidx.activity.result.ActivityResultLauncher
|
|
@NonNull
|
|
public ActivityResultContract<I, ?> getContract() {
|
|
return this.val$contract;
|
|
}
|
|
|
|
@Override // androidx.activity.result.ActivityResultLauncher
|
|
public void launch(I i, @Nullable ActivityOptionsCompat activityOptionsCompat) {
|
|
ActivityResultRegistry.this.onLaunch(this.val$requestCode, this.val$contract, i, activityOptionsCompat);
|
|
}
|
|
|
|
@Override // androidx.activity.result.ActivityResultLauncher
|
|
public void unregister() {
|
|
ActivityResultRegistry.this.unregister(this.val$key);
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.activity.result.ActivityResultRegistry$3 reason: invalid class name */
|
|
public class AnonymousClass3 extends ActivityResultLauncher<I> {
|
|
public final /* synthetic */ ActivityResultContract val$contract;
|
|
public final /* synthetic */ String val$key;
|
|
public final /* synthetic */ int val$requestCode;
|
|
|
|
public AnonymousClass3(int i, ActivityResultContract activityResultContract, String str) {
|
|
this.val$requestCode = i;
|
|
this.val$contract = activityResultContract;
|
|
this.val$key = str;
|
|
}
|
|
|
|
@Override // androidx.activity.result.ActivityResultLauncher
|
|
@NonNull
|
|
public ActivityResultContract<I, ?> getContract() {
|
|
return this.val$contract;
|
|
}
|
|
|
|
@Override // androidx.activity.result.ActivityResultLauncher
|
|
public void launch(I i, @Nullable ActivityOptionsCompat activityOptionsCompat) {
|
|
ActivityResultRegistry.this.onLaunch(this.val$requestCode, this.val$contract, i, activityOptionsCompat);
|
|
}
|
|
|
|
@Override // androidx.activity.result.ActivityResultLauncher
|
|
public void unregister() {
|
|
ActivityResultRegistry.this.unregister(this.val$key);
|
|
}
|
|
}
|
|
|
|
public static class CallbackAndContract<O> {
|
|
public final ActivityResultCallback<O> mCallback;
|
|
public final ActivityResultContract<?, O> mContract;
|
|
|
|
public CallbackAndContract(ActivityResultCallback<O> activityResultCallback, ActivityResultContract<?, O> activityResultContract) {
|
|
this.mCallback = activityResultCallback;
|
|
this.mContract = activityResultContract;
|
|
}
|
|
}
|
|
|
|
public static class LifecycleContainer {
|
|
public final Lifecycle mLifecycle;
|
|
private final ArrayList<LifecycleEventObserver> mObservers = new ArrayList<>();
|
|
|
|
public LifecycleContainer(@NonNull Lifecycle lifecycle) {
|
|
this.mLifecycle = lifecycle;
|
|
}
|
|
|
|
public void addObserver(@NonNull LifecycleEventObserver lifecycleEventObserver) {
|
|
this.mLifecycle.addObserver(lifecycleEventObserver);
|
|
this.mObservers.add(lifecycleEventObserver);
|
|
}
|
|
|
|
public void clearObservers() {
|
|
Iterator<LifecycleEventObserver> it = this.mObservers.iterator();
|
|
while (it.hasNext()) {
|
|
this.mLifecycle.removeObserver(it.next());
|
|
}
|
|
this.mObservers.clear();
|
|
}
|
|
}
|
|
|
|
private void bindRcKey(int i, String str) {
|
|
this.mRcToKey.put(Integer.valueOf(i), str);
|
|
this.mKeyToRc.put(str, Integer.valueOf(i));
|
|
}
|
|
|
|
private <O> void doDispatch(String str, int i, @Nullable Intent intent, @Nullable CallbackAndContract<O> callbackAndContract) {
|
|
ActivityResultCallback<O> activityResultCallback;
|
|
if (callbackAndContract == null || (activityResultCallback = callbackAndContract.mCallback) == null) {
|
|
this.mParsedPendingResults.remove(str);
|
|
this.mPendingResults.putParcelable(str, new ActivityResult(i, intent));
|
|
return;
|
|
}
|
|
activityResultCallback.onActivityResult(callbackAndContract.mContract.parseResult(i, intent));
|
|
}
|
|
|
|
private int generateRandomNumber() {
|
|
int nextInt = this.mRandom.nextInt(2147418112);
|
|
while (true) {
|
|
int i = nextInt + 65536;
|
|
if (!this.mRcToKey.containsKey(Integer.valueOf(i))) {
|
|
return i;
|
|
}
|
|
nextInt = this.mRandom.nextInt(2147418112);
|
|
}
|
|
}
|
|
|
|
private int registerKey(String str) {
|
|
Integer num = this.mKeyToRc.get(str);
|
|
if (num != null) {
|
|
return num.intValue();
|
|
}
|
|
int generateRandomNumber = generateRandomNumber();
|
|
bindRcKey(generateRandomNumber, str);
|
|
return generateRandomNumber;
|
|
}
|
|
|
|
@MainThread
|
|
public final boolean dispatchResult(int i, int i2, @Nullable Intent intent) {
|
|
String str = this.mRcToKey.get(Integer.valueOf(i));
|
|
if (str == null) {
|
|
return false;
|
|
}
|
|
doDispatch(str, i2, intent, this.mKeyToCallback.get(str));
|
|
return true;
|
|
}
|
|
|
|
@MainThread
|
|
public final <O> boolean dispatchResult(int i, @SuppressLint({"UnknownNullness"}) O o) {
|
|
ActivityResultCallback<?> activityResultCallback;
|
|
String str = this.mRcToKey.get(Integer.valueOf(i));
|
|
if (str == null) {
|
|
return false;
|
|
}
|
|
CallbackAndContract<?> callbackAndContract = this.mKeyToCallback.get(str);
|
|
if (callbackAndContract == null || (activityResultCallback = callbackAndContract.mCallback) == null) {
|
|
this.mPendingResults.remove(str);
|
|
this.mParsedPendingResults.put(str, o);
|
|
return true;
|
|
}
|
|
activityResultCallback.onActivityResult(o);
|
|
return true;
|
|
}
|
|
|
|
@MainThread
|
|
public abstract <I, O> void onLaunch(int i, @NonNull ActivityResultContract<I, O> activityResultContract, @SuppressLint({"UnknownNullness"}) I i2, @Nullable ActivityOptionsCompat activityOptionsCompat);
|
|
|
|
public final void onRestoreInstanceState(@Nullable Bundle bundle) {
|
|
if (bundle != null) {
|
|
ArrayList<Integer> integerArrayList = bundle.getIntegerArrayList("KEY_COMPONENT_ACTIVITY_REGISTERED_RCS");
|
|
ArrayList<String> stringArrayList = bundle.getStringArrayList("KEY_COMPONENT_ACTIVITY_REGISTERED_KEYS");
|
|
if (!(stringArrayList == null || integerArrayList == null)) {
|
|
int size = stringArrayList.size();
|
|
for (int i = 0; i < size; i++) {
|
|
bindRcKey(integerArrayList.get(i).intValue(), stringArrayList.get(i));
|
|
}
|
|
this.mRandom = (Random) bundle.getSerializable("KEY_COMPONENT_ACTIVITY_RANDOM_OBJECT");
|
|
this.mPendingResults.putAll(bundle.getBundle("KEY_COMPONENT_ACTIVITY_PENDING_RESULT"));
|
|
}
|
|
}
|
|
}
|
|
|
|
public final void onSaveInstanceState(@NonNull Bundle bundle) {
|
|
bundle.putIntegerArrayList("KEY_COMPONENT_ACTIVITY_REGISTERED_RCS", new ArrayList<>(this.mRcToKey.keySet()));
|
|
bundle.putStringArrayList("KEY_COMPONENT_ACTIVITY_REGISTERED_KEYS", new ArrayList<>(this.mRcToKey.values()));
|
|
bundle.putBundle("KEY_COMPONENT_ACTIVITY_PENDING_RESULT", (Bundle) this.mPendingResults.clone());
|
|
bundle.putSerializable("KEY_COMPONENT_ACTIVITY_RANDOM_OBJECT", this.mRandom);
|
|
}
|
|
|
|
/* JADX DEBUG: Multi-variable search result rejected for r6v0, resolved type: androidx.activity.result.ActivityResultCallback<O> */
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
@NonNull
|
|
public final <I, O> ActivityResultLauncher<I> register(@NonNull String str, @NonNull ActivityResultContract<I, O> activityResultContract, @NonNull ActivityResultCallback<O> activityResultCallback) {
|
|
int registerKey = registerKey(str);
|
|
this.mKeyToCallback.put(str, new CallbackAndContract<>(activityResultCallback, activityResultContract));
|
|
if (this.mParsedPendingResults.containsKey(str)) {
|
|
Object obj = this.mParsedPendingResults.get(str);
|
|
this.mParsedPendingResults.remove(str);
|
|
activityResultCallback.onActivityResult(obj);
|
|
}
|
|
ActivityResult activityResult = (ActivityResult) this.mPendingResults.getParcelable(str);
|
|
if (activityResult != null) {
|
|
this.mPendingResults.remove(str);
|
|
activityResultCallback.onActivityResult(activityResultContract.parseResult(activityResult.getResultCode(), activityResult.getData()));
|
|
}
|
|
return new AnonymousClass3(registerKey, activityResultContract, str);
|
|
}
|
|
|
|
@NonNull
|
|
public final <I, O> ActivityResultLauncher<I> register(@NonNull String str, @NonNull LifecycleOwner lifecycleOwner, @NonNull ActivityResultContract<I, O> activityResultContract, @NonNull ActivityResultCallback<O> activityResultCallback) {
|
|
Lifecycle lifecycle = lifecycleOwner.getLifecycle();
|
|
if (!lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
|
|
int registerKey = registerKey(str);
|
|
LifecycleContainer lifecycleContainer = this.mKeyToLifecycleContainers.get(str);
|
|
if (lifecycleContainer == null) {
|
|
lifecycleContainer = new LifecycleContainer(lifecycle);
|
|
}
|
|
lifecycleContainer.addObserver(new AnonymousClass1(str, activityResultCallback, activityResultContract));
|
|
this.mKeyToLifecycleContainers.put(str, lifecycleContainer);
|
|
return new AnonymousClass2(registerKey, activityResultContract, str);
|
|
}
|
|
throw new IllegalStateException("LifecycleOwner " + lifecycleOwner + " is attempting to register while current state is " + lifecycle.getCurrentState() + ". LifecycleOwners must call register before they are STARTED.");
|
|
}
|
|
|
|
@MainThread
|
|
public final void unregister(@NonNull String str) {
|
|
Integer remove = this.mKeyToRc.remove(str);
|
|
if (remove != null) {
|
|
this.mRcToKey.remove(remove);
|
|
}
|
|
this.mKeyToCallback.remove(str);
|
|
if (this.mParsedPendingResults.containsKey(str)) {
|
|
StringBuilder Q = a.Q("Dropping pending result for request ", str, ": ");
|
|
Q.append(this.mParsedPendingResults.get(str));
|
|
Log.w("ActivityResultRegistry", Q.toString());
|
|
this.mParsedPendingResults.remove(str);
|
|
}
|
|
if (this.mPendingResults.containsKey(str)) {
|
|
StringBuilder Q2 = a.Q("Dropping pending result for request ", str, ": ");
|
|
Q2.append(this.mPendingResults.getParcelable(str));
|
|
Log.w("ActivityResultRegistry", Q2.toString());
|
|
this.mPendingResults.remove(str);
|
|
}
|
|
LifecycleContainer lifecycleContainer = this.mKeyToLifecycleContainers.get(str);
|
|
if (lifecycleContainer != null) {
|
|
lifecycleContainer.clearObservers();
|
|
this.mKeyToLifecycleContainers.remove(str);
|
|
}
|
|
}
|
|
}
|