218 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package com.google.android.material.internal;
 | |
| 
 | |
| import android.content.Context;
 | |
| import android.graphics.Canvas;
 | |
| import android.graphics.Rect;
 | |
| import android.graphics.drawable.Drawable;
 | |
| import android.view.MotionEvent;
 | |
| import android.view.View;
 | |
| import android.view.ViewGroup;
 | |
| import android.view.ViewParent;
 | |
| import androidx.core.view.ViewCompat;
 | |
| import java.lang.reflect.InvocationTargetException;
 | |
| import java.lang.reflect.Method;
 | |
| import java.util.ArrayList;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| class ViewOverlayApi14 implements ViewOverlayImpl {
 | |
|     protected OverlayViewGroup overlayViewGroup;
 | |
| 
 | |
|     ViewOverlayApi14(Context context, ViewGroup viewGroup, View view) {
 | |
|         this.overlayViewGroup = new OverlayViewGroup(context, viewGroup, view, this);
 | |
|     }
 | |
| 
 | |
|     static ViewOverlayApi14 createFrom(View view) {
 | |
|         ViewGroup contentView = ViewUtils.getContentView(view);
 | |
|         if (contentView == null) {
 | |
|             return null;
 | |
|         }
 | |
|         int childCount = contentView.getChildCount();
 | |
|         for (int i = 0; i < childCount; i++) {
 | |
|             View childAt = contentView.getChildAt(i);
 | |
|             if (childAt instanceof OverlayViewGroup) {
 | |
|                 return ((OverlayViewGroup) childAt).viewOverlay;
 | |
|             }
 | |
|         }
 | |
|         return new ViewGroupOverlayApi14(contentView.getContext(), contentView, view);
 | |
|     }
 | |
| 
 | |
|     @Override // com.google.android.material.internal.ViewOverlayImpl
 | |
|     public void add(Drawable drawable) {
 | |
|         this.overlayViewGroup.add(drawable);
 | |
|     }
 | |
| 
 | |
|     @Override // com.google.android.material.internal.ViewOverlayImpl
 | |
|     public void remove(Drawable drawable) {
 | |
|         this.overlayViewGroup.remove(drawable);
 | |
|     }
 | |
| 
 | |
|     static class OverlayViewGroup extends ViewGroup {
 | |
|         static Method invalidateChildInParentFastMethod;
 | |
|         private boolean disposed;
 | |
|         ArrayList<Drawable> drawables;
 | |
|         ViewGroup hostView;
 | |
|         View requestingView;
 | |
|         ViewOverlayApi14 viewOverlay;
 | |
| 
 | |
|         @Override // android.view.ViewGroup, android.view.View
 | |
|         public boolean dispatchTouchEvent(MotionEvent motionEvent) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         @Override // android.view.ViewGroup, android.view.View
 | |
|         protected void onLayout(boolean z, int i, int i2, int i3, int i4) {
 | |
|         }
 | |
| 
 | |
|         static {
 | |
|             try {
 | |
|                 invalidateChildInParentFastMethod = ViewGroup.class.getDeclaredMethod("invalidateChildInParentFast", Integer.TYPE, Integer.TYPE, Rect.class);
 | |
|             } catch (NoSuchMethodException unused) {
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         OverlayViewGroup(Context context, ViewGroup viewGroup, View view, ViewOverlayApi14 viewOverlayApi14) {
 | |
|             super(context);
 | |
|             this.drawables = null;
 | |
|             this.hostView = viewGroup;
 | |
|             this.requestingView = view;
 | |
|             setRight(viewGroup.getWidth());
 | |
|             setBottom(viewGroup.getHeight());
 | |
|             viewGroup.addView(this);
 | |
|             this.viewOverlay = viewOverlayApi14;
 | |
|         }
 | |
| 
 | |
|         public void add(Drawable drawable) {
 | |
|             assertNotDisposed();
 | |
|             if (this.drawables == null) {
 | |
|                 this.drawables = new ArrayList<>();
 | |
|             }
 | |
|             if (this.drawables.contains(drawable)) {
 | |
|                 return;
 | |
|             }
 | |
|             this.drawables.add(drawable);
 | |
|             invalidate(drawable.getBounds());
 | |
|             drawable.setCallback(this);
 | |
|         }
 | |
| 
 | |
|         public void remove(Drawable drawable) {
 | |
|             ArrayList<Drawable> arrayList = this.drawables;
 | |
|             if (arrayList != null) {
 | |
|                 arrayList.remove(drawable);
 | |
|                 invalidate(drawable.getBounds());
 | |
|                 drawable.setCallback(null);
 | |
|                 disposeIfEmpty();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         @Override // android.view.View
 | |
|         protected boolean verifyDrawable(Drawable drawable) {
 | |
|             ArrayList<Drawable> arrayList;
 | |
|             return super.verifyDrawable(drawable) || ((arrayList = this.drawables) != null && arrayList.contains(drawable));
 | |
|         }
 | |
| 
 | |
|         public void add(View view) {
 | |
|             assertNotDisposed();
 | |
|             if (view.getParent() instanceof ViewGroup) {
 | |
|                 ViewGroup viewGroup = (ViewGroup) view.getParent();
 | |
|                 if (viewGroup != this.hostView && viewGroup.getParent() != null && ViewCompat.isAttachedToWindow(viewGroup)) {
 | |
|                     int[] iArr = new int[2];
 | |
|                     int[] iArr2 = new int[2];
 | |
|                     viewGroup.getLocationOnScreen(iArr);
 | |
|                     this.hostView.getLocationOnScreen(iArr2);
 | |
|                     ViewCompat.offsetLeftAndRight(view, iArr[0] - iArr2[0]);
 | |
|                     ViewCompat.offsetTopAndBottom(view, iArr[1] - iArr2[1]);
 | |
|                 }
 | |
|                 viewGroup.removeView(view);
 | |
|                 if (view.getParent() != null) {
 | |
|                     viewGroup.removeView(view);
 | |
|                 }
 | |
|             }
 | |
|             super.addView(view);
 | |
|         }
 | |
| 
 | |
|         public void remove(View view) {
 | |
|             super.removeView(view);
 | |
|             disposeIfEmpty();
 | |
|         }
 | |
| 
 | |
|         private void assertNotDisposed() {
 | |
|             if (this.disposed) {
 | |
|                 throw new IllegalStateException("This overlay was disposed already. Please use a new one via ViewGroupUtils.getOverlay()");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void disposeIfEmpty() {
 | |
|             if (getChildCount() == 0) {
 | |
|                 ArrayList<Drawable> arrayList = this.drawables;
 | |
|                 if (arrayList == null || arrayList.size() == 0) {
 | |
|                     this.disposed = true;
 | |
|                     this.hostView.removeView(this);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         @Override // android.view.View, android.graphics.drawable.Drawable.Callback
 | |
|         public void invalidateDrawable(Drawable drawable) {
 | |
|             invalidate(drawable.getBounds());
 | |
|         }
 | |
| 
 | |
|         @Override // android.view.ViewGroup, android.view.View
 | |
|         protected void dispatchDraw(Canvas canvas) {
 | |
|             this.hostView.getLocationOnScreen(new int[2]);
 | |
|             this.requestingView.getLocationOnScreen(new int[2]);
 | |
|             canvas.translate(r0[0] - r1[0], r0[1] - r1[1]);
 | |
|             canvas.clipRect(new Rect(0, 0, this.requestingView.getWidth(), this.requestingView.getHeight()));
 | |
|             super.dispatchDraw(canvas);
 | |
|             ArrayList<Drawable> arrayList = this.drawables;
 | |
|             int size = arrayList == null ? 0 : arrayList.size();
 | |
|             for (int i = 0; i < size; i++) {
 | |
|                 this.drawables.get(i).draw(canvas);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void getOffset(int[] iArr) {
 | |
|             int[] iArr2 = new int[2];
 | |
|             int[] iArr3 = new int[2];
 | |
|             this.hostView.getLocationOnScreen(iArr2);
 | |
|             this.requestingView.getLocationOnScreen(iArr3);
 | |
|             iArr[0] = iArr3[0] - iArr2[0];
 | |
|             iArr[1] = iArr3[1] - iArr2[1];
 | |
|         }
 | |
| 
 | |
|         protected ViewParent invalidateChildInParentFast(int i, int i2, Rect rect) {
 | |
|             if (this.hostView == null || invalidateChildInParentFastMethod == null) {
 | |
|                 return null;
 | |
|             }
 | |
|             try {
 | |
|                 getOffset(new int[2]);
 | |
|                 invalidateChildInParentFastMethod.invoke(this.hostView, Integer.valueOf(i), Integer.valueOf(i2), rect);
 | |
|                 return null;
 | |
|             } catch (IllegalAccessException e) {
 | |
|                 e.printStackTrace();
 | |
|                 return null;
 | |
|             } catch (InvocationTargetException e2) {
 | |
|                 e2.printStackTrace();
 | |
|                 return null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         @Override // android.view.ViewGroup, android.view.ViewParent
 | |
|         public ViewParent invalidateChildInParent(int[] iArr, Rect rect) {
 | |
|             if (this.hostView == null) {
 | |
|                 return null;
 | |
|             }
 | |
|             rect.offset(iArr[0], iArr[1]);
 | |
|             if (this.hostView != null) {
 | |
|                 iArr[0] = 0;
 | |
|                 iArr[1] = 0;
 | |
|                 int[] iArr2 = new int[2];
 | |
|                 getOffset(iArr2);
 | |
|                 rect.offset(iArr2[0], iArr2[1]);
 | |
|                 return super.invalidateChildInParent(iArr, rect);
 | |
|             }
 | |
|             invalidate(rect);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| }
 |