526 lines
23 KiB
Java
526 lines
23 KiB
Java
package androidx.fragment.app;
|
|
|
|
import android.util.Log;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import androidx.core.os.CancellationSignal;
|
|
import androidx.core.view.ViewCompat;
|
|
import androidx.fragment.R;
|
|
import java.util.ArrayList;
|
|
import java.util.HashSet;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
|
|
/* loaded from: classes.dex */
|
|
abstract class SpecialEffectsController {
|
|
private final ViewGroup mContainer;
|
|
final ArrayList<Operation> mPendingOperations = new ArrayList<>();
|
|
final ArrayList<Operation> mRunningOperations = new ArrayList<>();
|
|
boolean mOperationDirectionIsPop = false;
|
|
boolean mIsContainerPostponed = false;
|
|
|
|
abstract void executeOperations(List<Operation> list, boolean z);
|
|
|
|
public ViewGroup getContainer() {
|
|
return this.mContainer;
|
|
}
|
|
|
|
void updateOperationDirection(boolean z) {
|
|
this.mOperationDirectionIsPop = z;
|
|
}
|
|
|
|
static SpecialEffectsController getOrCreateController(ViewGroup viewGroup, FragmentManager fragmentManager) {
|
|
return getOrCreateController(viewGroup, fragmentManager.getSpecialEffectsControllerFactory());
|
|
}
|
|
|
|
static SpecialEffectsController getOrCreateController(ViewGroup viewGroup, SpecialEffectsControllerFactory specialEffectsControllerFactory) {
|
|
Object tag = viewGroup.getTag(R.id.special_effects_controller_view_tag);
|
|
if (tag instanceof SpecialEffectsController) {
|
|
return (SpecialEffectsController) tag;
|
|
}
|
|
SpecialEffectsController createController = specialEffectsControllerFactory.createController(viewGroup);
|
|
viewGroup.setTag(R.id.special_effects_controller_view_tag, createController);
|
|
return createController;
|
|
}
|
|
|
|
SpecialEffectsController(ViewGroup viewGroup) {
|
|
this.mContainer = viewGroup;
|
|
}
|
|
|
|
Operation.LifecycleImpact getAwaitingCompletionLifecycleImpact(FragmentStateManager fragmentStateManager) {
|
|
Operation findPendingOperation = findPendingOperation(fragmentStateManager.getFragment());
|
|
Operation.LifecycleImpact lifecycleImpact = findPendingOperation != null ? findPendingOperation.getLifecycleImpact() : null;
|
|
Operation findRunningOperation = findRunningOperation(fragmentStateManager.getFragment());
|
|
return (findRunningOperation == null || !(lifecycleImpact == null || lifecycleImpact == Operation.LifecycleImpact.NONE)) ? lifecycleImpact : findRunningOperation.getLifecycleImpact();
|
|
}
|
|
|
|
private Operation findPendingOperation(Fragment fragment) {
|
|
Iterator<Operation> it = this.mPendingOperations.iterator();
|
|
while (it.hasNext()) {
|
|
Operation next = it.next();
|
|
if (next.getFragment().equals(fragment) && !next.isCanceled()) {
|
|
return next;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private Operation findRunningOperation(Fragment fragment) {
|
|
Iterator<Operation> it = this.mRunningOperations.iterator();
|
|
while (it.hasNext()) {
|
|
Operation next = it.next();
|
|
if (next.getFragment().equals(fragment) && !next.isCanceled()) {
|
|
return next;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
void enqueueAdd(Operation.State state, FragmentStateManager fragmentStateManager) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing add operation for fragment " + fragmentStateManager.getFragment());
|
|
}
|
|
enqueue(state, Operation.LifecycleImpact.ADDING, fragmentStateManager);
|
|
}
|
|
|
|
void enqueueShow(FragmentStateManager fragmentStateManager) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing show operation for fragment " + fragmentStateManager.getFragment());
|
|
}
|
|
enqueue(Operation.State.VISIBLE, Operation.LifecycleImpact.NONE, fragmentStateManager);
|
|
}
|
|
|
|
void enqueueHide(FragmentStateManager fragmentStateManager) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing hide operation for fragment " + fragmentStateManager.getFragment());
|
|
}
|
|
enqueue(Operation.State.GONE, Operation.LifecycleImpact.NONE, fragmentStateManager);
|
|
}
|
|
|
|
void enqueueRemove(FragmentStateManager fragmentStateManager) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing remove operation for fragment " + fragmentStateManager.getFragment());
|
|
}
|
|
enqueue(Operation.State.REMOVED, Operation.LifecycleImpact.REMOVING, fragmentStateManager);
|
|
}
|
|
|
|
private void enqueue(Operation.State state, Operation.LifecycleImpact lifecycleImpact, FragmentStateManager fragmentStateManager) {
|
|
synchronized (this.mPendingOperations) {
|
|
CancellationSignal cancellationSignal = new CancellationSignal();
|
|
Operation findPendingOperation = findPendingOperation(fragmentStateManager.getFragment());
|
|
if (findPendingOperation != null) {
|
|
findPendingOperation.mergeWith(state, lifecycleImpact);
|
|
return;
|
|
}
|
|
final FragmentStateManagerOperation fragmentStateManagerOperation = new FragmentStateManagerOperation(state, lifecycleImpact, fragmentStateManager, cancellationSignal);
|
|
this.mPendingOperations.add(fragmentStateManagerOperation);
|
|
fragmentStateManagerOperation.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.SpecialEffectsController.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
if (SpecialEffectsController.this.mPendingOperations.contains(fragmentStateManagerOperation)) {
|
|
fragmentStateManagerOperation.getFinalState().applyState(fragmentStateManagerOperation.getFragment().mView);
|
|
}
|
|
}
|
|
});
|
|
fragmentStateManagerOperation.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.SpecialEffectsController.2
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
SpecialEffectsController.this.mPendingOperations.remove(fragmentStateManagerOperation);
|
|
SpecialEffectsController.this.mRunningOperations.remove(fragmentStateManagerOperation);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
void markPostponedState() {
|
|
synchronized (this.mPendingOperations) {
|
|
updateFinalState();
|
|
this.mIsContainerPostponed = false;
|
|
int size = this.mPendingOperations.size() - 1;
|
|
while (true) {
|
|
if (size < 0) {
|
|
break;
|
|
}
|
|
Operation operation = this.mPendingOperations.get(size);
|
|
Operation.State from = Operation.State.from(operation.getFragment().mView);
|
|
if (operation.getFinalState() == Operation.State.VISIBLE && from != Operation.State.VISIBLE) {
|
|
this.mIsContainerPostponed = operation.getFragment().isPostponed();
|
|
break;
|
|
}
|
|
size--;
|
|
}
|
|
}
|
|
}
|
|
|
|
void forcePostponedExecutePendingOperations() {
|
|
if (this.mIsContainerPostponed) {
|
|
this.mIsContainerPostponed = false;
|
|
executePendingOperations();
|
|
}
|
|
}
|
|
|
|
void executePendingOperations() {
|
|
if (this.mIsContainerPostponed) {
|
|
return;
|
|
}
|
|
if (!ViewCompat.isAttachedToWindow(this.mContainer)) {
|
|
forceCompleteAllOperations();
|
|
this.mOperationDirectionIsPop = false;
|
|
return;
|
|
}
|
|
synchronized (this.mPendingOperations) {
|
|
if (!this.mPendingOperations.isEmpty()) {
|
|
ArrayList arrayList = new ArrayList(this.mRunningOperations);
|
|
this.mRunningOperations.clear();
|
|
Iterator it = arrayList.iterator();
|
|
while (it.hasNext()) {
|
|
Operation operation = (Operation) it.next();
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Cancelling operation " + operation);
|
|
}
|
|
operation.cancel();
|
|
if (!operation.isComplete()) {
|
|
this.mRunningOperations.add(operation);
|
|
}
|
|
}
|
|
updateFinalState();
|
|
ArrayList arrayList2 = new ArrayList(this.mPendingOperations);
|
|
this.mPendingOperations.clear();
|
|
this.mRunningOperations.addAll(arrayList2);
|
|
Iterator it2 = arrayList2.iterator();
|
|
while (it2.hasNext()) {
|
|
((Operation) it2.next()).onStart();
|
|
}
|
|
executeOperations(arrayList2, this.mOperationDirectionIsPop);
|
|
this.mOperationDirectionIsPop = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void forceCompleteAllOperations() {
|
|
String str;
|
|
String str2;
|
|
boolean isAttachedToWindow = ViewCompat.isAttachedToWindow(this.mContainer);
|
|
synchronized (this.mPendingOperations) {
|
|
updateFinalState();
|
|
Iterator<Operation> it = this.mPendingOperations.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().onStart();
|
|
}
|
|
Iterator it2 = new ArrayList(this.mRunningOperations).iterator();
|
|
while (it2.hasNext()) {
|
|
Operation operation = (Operation) it2.next();
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("SpecialEffectsController: ");
|
|
if (isAttachedToWindow) {
|
|
str2 = "";
|
|
} else {
|
|
str2 = "Container " + this.mContainer + " is not attached to window. ";
|
|
}
|
|
sb.append(str2);
|
|
sb.append("Cancelling running operation ");
|
|
sb.append(operation);
|
|
Log.v("FragmentManager", sb.toString());
|
|
}
|
|
operation.cancel();
|
|
}
|
|
Iterator it3 = new ArrayList(this.mPendingOperations).iterator();
|
|
while (it3.hasNext()) {
|
|
Operation operation2 = (Operation) it3.next();
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
StringBuilder sb2 = new StringBuilder();
|
|
sb2.append("SpecialEffectsController: ");
|
|
if (isAttachedToWindow) {
|
|
str = "";
|
|
} else {
|
|
str = "Container " + this.mContainer + " is not attached to window. ";
|
|
}
|
|
sb2.append(str);
|
|
sb2.append("Cancelling pending operation ");
|
|
sb2.append(operation2);
|
|
Log.v("FragmentManager", sb2.toString());
|
|
}
|
|
operation2.cancel();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void updateFinalState() {
|
|
Iterator<Operation> it = this.mPendingOperations.iterator();
|
|
while (it.hasNext()) {
|
|
Operation next = it.next();
|
|
if (next.getLifecycleImpact() == Operation.LifecycleImpact.ADDING) {
|
|
next.mergeWith(Operation.State.from(next.getFragment().requireView().getVisibility()), Operation.LifecycleImpact.NONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
static class Operation {
|
|
private State mFinalState;
|
|
private final Fragment mFragment;
|
|
private LifecycleImpact mLifecycleImpact;
|
|
private final List<Runnable> mCompletionListeners = new ArrayList();
|
|
private final HashSet<CancellationSignal> mSpecialEffectsSignals = new HashSet<>();
|
|
private boolean mIsCanceled = false;
|
|
private boolean mIsComplete = false;
|
|
|
|
enum LifecycleImpact {
|
|
NONE,
|
|
ADDING,
|
|
REMOVING
|
|
}
|
|
|
|
public State getFinalState() {
|
|
return this.mFinalState;
|
|
}
|
|
|
|
public final Fragment getFragment() {
|
|
return this.mFragment;
|
|
}
|
|
|
|
LifecycleImpact getLifecycleImpact() {
|
|
return this.mLifecycleImpact;
|
|
}
|
|
|
|
final boolean isCanceled() {
|
|
return this.mIsCanceled;
|
|
}
|
|
|
|
final boolean isComplete() {
|
|
return this.mIsComplete;
|
|
}
|
|
|
|
void onStart() {
|
|
}
|
|
|
|
enum State {
|
|
REMOVED,
|
|
VISIBLE,
|
|
GONE,
|
|
INVISIBLE;
|
|
|
|
static State from(View view) {
|
|
return (view.getAlpha() == 0.0f && view.getVisibility() == 0) ? INVISIBLE : from(view.getVisibility());
|
|
}
|
|
|
|
static State from(int i) {
|
|
if (i == 0) {
|
|
return VISIBLE;
|
|
}
|
|
if (i == 4) {
|
|
return INVISIBLE;
|
|
}
|
|
if (i == 8) {
|
|
return GONE;
|
|
}
|
|
throw new IllegalArgumentException("Unknown visibility " + i);
|
|
}
|
|
|
|
void applyState(View view) {
|
|
int i = AnonymousClass3.$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[ordinal()];
|
|
if (i == 1) {
|
|
ViewGroup viewGroup = (ViewGroup) view.getParent();
|
|
if (viewGroup != null) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Removing view " + view + " from container " + viewGroup);
|
|
}
|
|
viewGroup.removeView(view);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
if (i == 2) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Setting view " + view + " to VISIBLE");
|
|
}
|
|
view.setVisibility(0);
|
|
return;
|
|
}
|
|
if (i == 3) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Setting view " + view + " to GONE");
|
|
}
|
|
view.setVisibility(8);
|
|
return;
|
|
}
|
|
if (i != 4) {
|
|
return;
|
|
}
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: Setting view " + view + " to INVISIBLE");
|
|
}
|
|
view.setVisibility(4);
|
|
}
|
|
}
|
|
|
|
Operation(State state, LifecycleImpact lifecycleImpact, Fragment fragment, CancellationSignal cancellationSignal) {
|
|
this.mFinalState = state;
|
|
this.mLifecycleImpact = lifecycleImpact;
|
|
this.mFragment = fragment;
|
|
cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() { // from class: androidx.fragment.app.SpecialEffectsController.Operation.1
|
|
@Override // androidx.core.os.CancellationSignal.OnCancelListener
|
|
public void onCancel() {
|
|
Operation.this.cancel();
|
|
}
|
|
});
|
|
}
|
|
|
|
public String toString() {
|
|
return "Operation {" + Integer.toHexString(System.identityHashCode(this)) + "} {mFinalState = " + this.mFinalState + "} {mLifecycleImpact = " + this.mLifecycleImpact + "} {mFragment = " + this.mFragment + "}";
|
|
}
|
|
|
|
final void cancel() {
|
|
if (isCanceled()) {
|
|
return;
|
|
}
|
|
this.mIsCanceled = true;
|
|
if (this.mSpecialEffectsSignals.isEmpty()) {
|
|
complete();
|
|
return;
|
|
}
|
|
Iterator it = new ArrayList(this.mSpecialEffectsSignals).iterator();
|
|
while (it.hasNext()) {
|
|
((CancellationSignal) it.next()).cancel();
|
|
}
|
|
}
|
|
|
|
final void mergeWith(State state, LifecycleImpact lifecycleImpact) {
|
|
int i = AnonymousClass3.$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact[lifecycleImpact.ordinal()];
|
|
if (i == 1) {
|
|
if (this.mFinalState == State.REMOVED) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: For fragment " + this.mFragment + " mFinalState = REMOVED -> VISIBLE. mLifecycleImpact = " + this.mLifecycleImpact + " to ADDING.");
|
|
}
|
|
this.mFinalState = State.VISIBLE;
|
|
this.mLifecycleImpact = LifecycleImpact.ADDING;
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
if (i == 2) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: For fragment " + this.mFragment + " mFinalState = " + this.mFinalState + " -> REMOVED. mLifecycleImpact = " + this.mLifecycleImpact + " to REMOVING.");
|
|
}
|
|
this.mFinalState = State.REMOVED;
|
|
this.mLifecycleImpact = LifecycleImpact.REMOVING;
|
|
return;
|
|
}
|
|
if (i == 3 && this.mFinalState != State.REMOVED) {
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: For fragment " + this.mFragment + " mFinalState = " + this.mFinalState + " -> " + state + ". ");
|
|
}
|
|
this.mFinalState = state;
|
|
}
|
|
}
|
|
|
|
final void addCompletionListener(Runnable runnable) {
|
|
this.mCompletionListeners.add(runnable);
|
|
}
|
|
|
|
public final void markStartedSpecialEffect(CancellationSignal cancellationSignal) {
|
|
onStart();
|
|
this.mSpecialEffectsSignals.add(cancellationSignal);
|
|
}
|
|
|
|
public final void completeSpecialEffect(CancellationSignal cancellationSignal) {
|
|
if (this.mSpecialEffectsSignals.remove(cancellationSignal) && this.mSpecialEffectsSignals.isEmpty()) {
|
|
complete();
|
|
}
|
|
}
|
|
|
|
public void complete() {
|
|
if (this.mIsComplete) {
|
|
return;
|
|
}
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "SpecialEffectsController: " + this + " has called complete.");
|
|
}
|
|
this.mIsComplete = true;
|
|
Iterator<Runnable> it = this.mCompletionListeners.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().run();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.fragment.app.SpecialEffectsController$3, reason: invalid class name */
|
|
static /* synthetic */ class AnonymousClass3 {
|
|
static final /* synthetic */ int[] $SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact;
|
|
static final /* synthetic */ int[] $SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State;
|
|
|
|
static {
|
|
int[] iArr = new int[Operation.LifecycleImpact.values().length];
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact = iArr;
|
|
try {
|
|
iArr[Operation.LifecycleImpact.ADDING.ordinal()] = 1;
|
|
} catch (NoSuchFieldError unused) {
|
|
}
|
|
try {
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact[Operation.LifecycleImpact.REMOVING.ordinal()] = 2;
|
|
} catch (NoSuchFieldError unused2) {
|
|
}
|
|
try {
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact[Operation.LifecycleImpact.NONE.ordinal()] = 3;
|
|
} catch (NoSuchFieldError unused3) {
|
|
}
|
|
int[] iArr2 = new int[Operation.State.values().length];
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State = iArr2;
|
|
try {
|
|
iArr2[Operation.State.REMOVED.ordinal()] = 1;
|
|
} catch (NoSuchFieldError unused4) {
|
|
}
|
|
try {
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[Operation.State.VISIBLE.ordinal()] = 2;
|
|
} catch (NoSuchFieldError unused5) {
|
|
}
|
|
try {
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[Operation.State.GONE.ordinal()] = 3;
|
|
} catch (NoSuchFieldError unused6) {
|
|
}
|
|
try {
|
|
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[Operation.State.INVISIBLE.ordinal()] = 4;
|
|
} catch (NoSuchFieldError unused7) {
|
|
}
|
|
}
|
|
}
|
|
|
|
private static class FragmentStateManagerOperation extends Operation {
|
|
private final FragmentStateManager mFragmentStateManager;
|
|
|
|
FragmentStateManagerOperation(Operation.State state, Operation.LifecycleImpact lifecycleImpact, FragmentStateManager fragmentStateManager, CancellationSignal cancellationSignal) {
|
|
super(state, lifecycleImpact, fragmentStateManager.getFragment(), cancellationSignal);
|
|
this.mFragmentStateManager = fragmentStateManager;
|
|
}
|
|
|
|
@Override // androidx.fragment.app.SpecialEffectsController.Operation
|
|
void onStart() {
|
|
if (getLifecycleImpact() == Operation.LifecycleImpact.ADDING) {
|
|
Fragment fragment = this.mFragmentStateManager.getFragment();
|
|
View findFocus = fragment.mView.findFocus();
|
|
if (findFocus != null) {
|
|
fragment.setFocusedView(findFocus);
|
|
if (FragmentManager.isLoggingEnabled(2)) {
|
|
Log.v("FragmentManager", "requestFocus: Saved focused view " + findFocus + " for Fragment " + fragment);
|
|
}
|
|
}
|
|
View requireView = getFragment().requireView();
|
|
if (requireView.getParent() == null) {
|
|
this.mFragmentStateManager.addViewToContainer();
|
|
requireView.setAlpha(0.0f);
|
|
}
|
|
if (requireView.getAlpha() == 0.0f && requireView.getVisibility() == 0) {
|
|
requireView.setVisibility(4);
|
|
}
|
|
requireView.setAlpha(fragment.getPostOnViewCreatedAlpha());
|
|
}
|
|
}
|
|
|
|
@Override // androidx.fragment.app.SpecialEffectsController.Operation
|
|
public void complete() {
|
|
super.complete();
|
|
this.mFragmentStateManager.moveToExpectedState();
|
|
}
|
|
}
|
|
}
|