121 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.transition;
 | |
| 
 | |
| import android.view.View;
 | |
| import android.view.ViewGroup;
 | |
| import android.widget.FrameLayout;
 | |
| import java.util.ArrayList;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| class GhostViewHolder extends FrameLayout {
 | |
|     private boolean mAttached;
 | |
|     private ViewGroup mParent;
 | |
| 
 | |
|     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);
 | |
|         this.mAttached = true;
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.ViewGroup
 | |
|     public void onViewAdded(View view) {
 | |
|         if (!this.mAttached) {
 | |
|             throw new IllegalStateException("This GhostViewHolder is detached!");
 | |
|         }
 | |
|         super.onViewAdded(view);
 | |
|     }
 | |
| 
 | |
|     @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;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     static GhostViewHolder getHolder(ViewGroup viewGroup) {
 | |
|         return (GhostViewHolder) viewGroup.getTag(R.id.ghost_view_holder);
 | |
|     }
 | |
| 
 | |
|     void popToOverlayTop() {
 | |
|         if (!this.mAttached) {
 | |
|             throw new IllegalStateException("This GhostViewHolder is detached!");
 | |
|         }
 | |
|         ViewGroupUtils.getOverlay(this.mParent).remove(this);
 | |
|         ViewGroupUtils.getOverlay(this.mParent).add(this);
 | |
|     }
 | |
| 
 | |
|     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);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     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, (ArrayList<View>) arrayList2)) {
 | |
|                 i = i2 + 1;
 | |
|             } else {
 | |
|                 childCount = i2 - 1;
 | |
|             }
 | |
|             arrayList2.clear();
 | |
|         }
 | |
|         return i;
 | |
|     }
 | |
| 
 | |
|     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;
 | |
|     }
 | |
| 
 | |
|     private static void getParents(View view, ArrayList<View> arrayList) {
 | |
|         Object 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;
 | |
|     }
 | |
| }
 |