discord-jadx/app/src/main/java/androidx/transition/GhostViewHolder.java

125 lines
4.1 KiB
Java

package androidx.transition;
import android.annotation.SuppressLint;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import java.util.ArrayList;
@SuppressLint({"ViewConstructor"})
public class GhostViewHolder extends FrameLayout {
private boolean mAttached = true;
@NonNull
private ViewGroup mParent;
public GhostViewHolder(ViewGroup viewGroup) {
super(viewGroup.getContext());
setClipChildren(false);
this.mParent = viewGroup;
viewGroup.setTag(R.id.ghost_view_holder, this);
ViewGroupUtils.getOverlay(this.mParent).add(this);
}
public static GhostViewHolder getHolder(@NonNull ViewGroup viewGroup) {
return (GhostViewHolder) viewGroup.getTag(R.id.ghost_view_holder);
}
private int getInsertIndex(ArrayList<View> arrayList) {
ArrayList arrayList2 = new ArrayList();
int childCount = getChildCount() - 1;
int i = 0;
while (i <= childCount) {
int i2 = (i + childCount) / 2;
getParents(((GhostViewPort) getChildAt(i2)).mView, arrayList2);
if (isOnTop(arrayList, arrayList2)) {
i = i2 + 1;
} else {
childCount = i2 - 1;
}
arrayList2.clear();
}
return i;
}
private static void getParents(View view, ArrayList<View> arrayList) {
ViewParent parent = view.getParent();
if (parent instanceof ViewGroup) {
getParents((View) parent, arrayList);
}
arrayList.add(view);
}
private static boolean isOnTop(View view, View view2) {
ViewGroup viewGroup = (ViewGroup) view.getParent();
int childCount = viewGroup.getChildCount();
if (view.getZ() != view2.getZ()) {
return view.getZ() > view2.getZ();
}
for (int i = 0; i < childCount; i++) {
View childAt = viewGroup.getChildAt(ViewGroupUtils.getChildDrawingOrder(viewGroup, i));
if (childAt == view) {
return false;
}
if (childAt == view2) {
break;
}
}
return true;
}
private static boolean isOnTop(ArrayList<View> arrayList, ArrayList<View> arrayList2) {
if (arrayList.isEmpty() || arrayList2.isEmpty() || arrayList.get(0) != arrayList2.get(0)) {
return true;
}
int min = Math.min(arrayList.size(), arrayList2.size());
for (int i = 1; i < min; i++) {
View view = arrayList.get(i);
View view2 = arrayList2.get(i);
if (view != view2) {
return isOnTop(view, view2);
}
}
return arrayList2.size() == min;
}
public void addGhostView(GhostViewPort ghostViewPort) {
ArrayList<View> arrayList = new ArrayList<>();
getParents(ghostViewPort.mView, arrayList);
int insertIndex = getInsertIndex(arrayList);
if (insertIndex < 0 || insertIndex >= getChildCount()) {
addView(ghostViewPort);
} else {
addView(ghostViewPort, insertIndex);
}
}
@Override // android.view.ViewGroup
public void onViewAdded(View view) {
if (this.mAttached) {
super.onViewAdded(view);
return;
}
throw new IllegalStateException("This GhostViewHolder is detached!");
}
@Override // android.view.ViewGroup
public void onViewRemoved(View view) {
super.onViewRemoved(view);
if ((getChildCount() == 1 && getChildAt(0) == view) || getChildCount() == 0) {
this.mParent.setTag(R.id.ghost_view_holder, null);
ViewGroupUtils.getOverlay(this.mParent).remove(this);
this.mAttached = false;
}
}
public void popToOverlayTop() {
if (this.mAttached) {
ViewGroupUtils.getOverlay(this.mParent).remove(this);
ViewGroupUtils.getOverlay(this.mParent).add(this);
return;
}
throw new IllegalStateException("This GhostViewHolder is detached!");
}
}