421 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			421 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package com.google.android.material.bottomsheet;
 | |
| 
 | |
| import android.content.Context;
 | |
| import android.content.DialogInterface;
 | |
| import android.content.res.ColorStateList;
 | |
| import android.content.res.TypedArray;
 | |
| import android.graphics.Color;
 | |
| import android.os.Build;
 | |
| import android.os.Bundle;
 | |
| import android.util.TypedValue;
 | |
| import android.view.MotionEvent;
 | |
| import android.view.View;
 | |
| import android.view.ViewGroup;
 | |
| import android.view.Window;
 | |
| import android.widget.FrameLayout;
 | |
| import androidx.appcompat.app.AppCompatDialog;
 | |
| import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | |
| import androidx.core.view.AccessibilityDelegateCompat;
 | |
| import androidx.core.view.OnApplyWindowInsetsListener;
 | |
| import androidx.core.view.ViewCompat;
 | |
| import androidx.core.view.WindowCompat;
 | |
| import androidx.core.view.WindowInsetsCompat;
 | |
| import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 | |
| import com.google.android.material.R;
 | |
| import com.google.android.material.bottomsheet.BottomSheetBehavior;
 | |
| import com.google.android.material.color.MaterialColors;
 | |
| import com.google.android.material.internal.EdgeToEdgeUtils;
 | |
| import com.google.android.material.internal.ViewUtils;
 | |
| import com.google.android.material.motion.MaterialBackOrchestrator;
 | |
| import com.google.android.material.shape.MaterialShapeDrawable;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| public class BottomSheetDialog extends AppCompatDialog {
 | |
|     private MaterialBackOrchestrator backOrchestrator;
 | |
|     private BottomSheetBehavior<FrameLayout> behavior;
 | |
|     private FrameLayout bottomSheet;
 | |
|     private BottomSheetBehavior.BottomSheetCallback bottomSheetCallback;
 | |
|     boolean cancelable;
 | |
|     private boolean canceledOnTouchOutside;
 | |
|     private boolean canceledOnTouchOutsideSet;
 | |
|     private FrameLayout container;
 | |
|     private CoordinatorLayout coordinator;
 | |
|     boolean dismissWithAnimation;
 | |
|     private EdgeToEdgeCallback edgeToEdgeCallback;
 | |
|     private boolean edgeToEdgeEnabled;
 | |
| 
 | |
|     public boolean getDismissWithAnimation() {
 | |
|         return this.dismissWithAnimation;
 | |
|     }
 | |
| 
 | |
|     public boolean getEdgeToEdgeEnabled() {
 | |
|         return this.edgeToEdgeEnabled;
 | |
|     }
 | |
| 
 | |
|     public void setDismissWithAnimation(boolean z) {
 | |
|         this.dismissWithAnimation = z;
 | |
|     }
 | |
| 
 | |
|     public BottomSheetDialog(Context context) {
 | |
|         this(context, 0);
 | |
|         this.edgeToEdgeEnabled = getContext().getTheme().obtainStyledAttributes(new int[]{R.attr.enableEdgeToEdge}).getBoolean(0, false);
 | |
|     }
 | |
| 
 | |
|     public BottomSheetDialog(Context context, int i) {
 | |
|         super(context, getThemeResId(context, i));
 | |
|         this.cancelable = true;
 | |
|         this.canceledOnTouchOutside = true;
 | |
|         this.bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() { // from class: com.google.android.material.bottomsheet.BottomSheetDialog.5
 | |
|             @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|             public void onSlide(View view, float f) {
 | |
|             }
 | |
| 
 | |
|             @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|             public void onStateChanged(View view, int i2) {
 | |
|                 if (i2 == 5) {
 | |
|                     BottomSheetDialog.this.cancel();
 | |
|                 }
 | |
|             }
 | |
|         };
 | |
|         supportRequestWindowFeature(1);
 | |
|         this.edgeToEdgeEnabled = getContext().getTheme().obtainStyledAttributes(new int[]{R.attr.enableEdgeToEdge}).getBoolean(0, false);
 | |
|     }
 | |
| 
 | |
|     protected BottomSheetDialog(Context context, boolean z, DialogInterface.OnCancelListener onCancelListener) {
 | |
|         super(context, z, onCancelListener);
 | |
|         this.cancelable = true;
 | |
|         this.canceledOnTouchOutside = true;
 | |
|         this.bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() { // from class: com.google.android.material.bottomsheet.BottomSheetDialog.5
 | |
|             @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|             public void onSlide(View view, float f) {
 | |
|             }
 | |
| 
 | |
|             @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|             public void onStateChanged(View view, int i2) {
 | |
|                 if (i2 == 5) {
 | |
|                     BottomSheetDialog.this.cancel();
 | |
|                 }
 | |
|             }
 | |
|         };
 | |
|         supportRequestWindowFeature(1);
 | |
|         this.cancelable = z;
 | |
|         this.edgeToEdgeEnabled = getContext().getTheme().obtainStyledAttributes(new int[]{R.attr.enableEdgeToEdge}).getBoolean(0, false);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.app.AppCompatDialog, androidx.activity.ComponentDialog, android.app.Dialog
 | |
|     public void setContentView(int i) {
 | |
|         super.setContentView(wrapInBottomSheet(i, null, null));
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.app.AppCompatDialog, androidx.activity.ComponentDialog, android.app.Dialog
 | |
|     protected void onCreate(Bundle bundle) {
 | |
|         super.onCreate(bundle);
 | |
|         Window window = getWindow();
 | |
|         if (window != null) {
 | |
|             window.setStatusBarColor(0);
 | |
|             window.addFlags(Integer.MIN_VALUE);
 | |
|             if (Build.VERSION.SDK_INT < 23) {
 | |
|                 window.addFlags(67108864);
 | |
|             }
 | |
|             window.setLayout(-1, -1);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.app.AppCompatDialog, androidx.activity.ComponentDialog, android.app.Dialog
 | |
|     public void setContentView(View view) {
 | |
|         super.setContentView(wrapInBottomSheet(0, view, null));
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.app.AppCompatDialog, androidx.activity.ComponentDialog, android.app.Dialog
 | |
|     public void setContentView(View view, ViewGroup.LayoutParams layoutParams) {
 | |
|         super.setContentView(wrapInBottomSheet(0, view, layoutParams));
 | |
|     }
 | |
| 
 | |
|     @Override // android.app.Dialog
 | |
|     public void setCancelable(boolean z) {
 | |
|         super.setCancelable(z);
 | |
|         if (this.cancelable != z) {
 | |
|             this.cancelable = z;
 | |
|             BottomSheetBehavior<FrameLayout> bottomSheetBehavior = this.behavior;
 | |
|             if (bottomSheetBehavior != null) {
 | |
|                 bottomSheetBehavior.setHideable(z);
 | |
|             }
 | |
|             if (getWindow() != null) {
 | |
|                 updateListeningForBackCallbacks();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.activity.ComponentDialog, android.app.Dialog
 | |
|     protected void onStart() {
 | |
|         super.onStart();
 | |
|         BottomSheetBehavior<FrameLayout> bottomSheetBehavior = this.behavior;
 | |
|         if (bottomSheetBehavior == null || bottomSheetBehavior.getState() != 5) {
 | |
|             return;
 | |
|         }
 | |
|         this.behavior.setState(4);
 | |
|     }
 | |
| 
 | |
|     @Override // android.app.Dialog, android.view.Window.Callback
 | |
|     public void onAttachedToWindow() {
 | |
|         super.onAttachedToWindow();
 | |
|         Window window = getWindow();
 | |
|         if (window != null) {
 | |
|             boolean z = this.edgeToEdgeEnabled && Color.alpha(window.getNavigationBarColor()) < 255;
 | |
|             FrameLayout frameLayout = this.container;
 | |
|             if (frameLayout != null) {
 | |
|                 frameLayout.setFitsSystemWindows(!z);
 | |
|             }
 | |
|             CoordinatorLayout coordinatorLayout = this.coordinator;
 | |
|             if (coordinatorLayout != null) {
 | |
|                 coordinatorLayout.setFitsSystemWindows(!z);
 | |
|             }
 | |
|             WindowCompat.setDecorFitsSystemWindows(window, !z);
 | |
|             EdgeToEdgeCallback edgeToEdgeCallback = this.edgeToEdgeCallback;
 | |
|             if (edgeToEdgeCallback != null) {
 | |
|                 edgeToEdgeCallback.setWindow(window);
 | |
|             }
 | |
|         }
 | |
|         updateListeningForBackCallbacks();
 | |
|     }
 | |
| 
 | |
|     @Override // android.app.Dialog, android.view.Window.Callback
 | |
|     public void onDetachedFromWindow() {
 | |
|         EdgeToEdgeCallback edgeToEdgeCallback = this.edgeToEdgeCallback;
 | |
|         if (edgeToEdgeCallback != null) {
 | |
|             edgeToEdgeCallback.setWindow(null);
 | |
|         }
 | |
|         MaterialBackOrchestrator materialBackOrchestrator = this.backOrchestrator;
 | |
|         if (materialBackOrchestrator != null) {
 | |
|             materialBackOrchestrator.stopListeningForBackCallbacks();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // android.app.Dialog, android.content.DialogInterface
 | |
|     public void cancel() {
 | |
|         BottomSheetBehavior<FrameLayout> behavior = getBehavior();
 | |
|         if (!this.dismissWithAnimation || behavior.getState() == 5) {
 | |
|             super.cancel();
 | |
|         } else {
 | |
|             behavior.setState(5);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // android.app.Dialog
 | |
|     public void setCanceledOnTouchOutside(boolean z) {
 | |
|         super.setCanceledOnTouchOutside(z);
 | |
|         if (z && !this.cancelable) {
 | |
|             this.cancelable = true;
 | |
|         }
 | |
|         this.canceledOnTouchOutside = z;
 | |
|         this.canceledOnTouchOutsideSet = true;
 | |
|     }
 | |
| 
 | |
|     public BottomSheetBehavior<FrameLayout> getBehavior() {
 | |
|         if (this.behavior == null) {
 | |
|             ensureContainerAndBehavior();
 | |
|         }
 | |
|         return this.behavior;
 | |
|     }
 | |
| 
 | |
|     private FrameLayout ensureContainerAndBehavior() {
 | |
|         if (this.container == null) {
 | |
|             FrameLayout frameLayout = (FrameLayout) View.inflate(getContext(), R.layout.design_bottom_sheet_dialog, null);
 | |
|             this.container = frameLayout;
 | |
|             this.coordinator = (CoordinatorLayout) frameLayout.findViewById(R.id.coordinator);
 | |
|             FrameLayout frameLayout2 = (FrameLayout) this.container.findViewById(R.id.design_bottom_sheet);
 | |
|             this.bottomSheet = frameLayout2;
 | |
|             BottomSheetBehavior<FrameLayout> from = BottomSheetBehavior.from(frameLayout2);
 | |
|             this.behavior = from;
 | |
|             from.addBottomSheetCallback(this.bottomSheetCallback);
 | |
|             this.behavior.setHideable(this.cancelable);
 | |
|             this.backOrchestrator = new MaterialBackOrchestrator(this.behavior, this.bottomSheet);
 | |
|         }
 | |
|         return this.container;
 | |
|     }
 | |
| 
 | |
|     private View wrapInBottomSheet(int i, View view, ViewGroup.LayoutParams layoutParams) {
 | |
|         ensureContainerAndBehavior();
 | |
|         CoordinatorLayout coordinatorLayout = (CoordinatorLayout) this.container.findViewById(R.id.coordinator);
 | |
|         if (i != 0 && view == null) {
 | |
|             view = getLayoutInflater().inflate(i, (ViewGroup) coordinatorLayout, false);
 | |
|         }
 | |
|         if (this.edgeToEdgeEnabled) {
 | |
|             ViewCompat.setOnApplyWindowInsetsListener(this.bottomSheet, new OnApplyWindowInsetsListener() { // from class: com.google.android.material.bottomsheet.BottomSheetDialog.1
 | |
|                 @Override // androidx.core.view.OnApplyWindowInsetsListener
 | |
|                 public WindowInsetsCompat onApplyWindowInsets(View view2, WindowInsetsCompat windowInsetsCompat) {
 | |
|                     if (BottomSheetDialog.this.edgeToEdgeCallback != null) {
 | |
|                         BottomSheetDialog.this.behavior.removeBottomSheetCallback(BottomSheetDialog.this.edgeToEdgeCallback);
 | |
|                     }
 | |
|                     if (windowInsetsCompat != null) {
 | |
|                         BottomSheetDialog bottomSheetDialog = BottomSheetDialog.this;
 | |
|                         bottomSheetDialog.edgeToEdgeCallback = new EdgeToEdgeCallback(bottomSheetDialog.bottomSheet, windowInsetsCompat);
 | |
|                         BottomSheetDialog.this.edgeToEdgeCallback.setWindow(BottomSheetDialog.this.getWindow());
 | |
|                         BottomSheetDialog.this.behavior.addBottomSheetCallback(BottomSheetDialog.this.edgeToEdgeCallback);
 | |
|                     }
 | |
|                     return windowInsetsCompat;
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
|         this.bottomSheet.removeAllViews();
 | |
|         if (layoutParams == null) {
 | |
|             this.bottomSheet.addView(view);
 | |
|         } else {
 | |
|             this.bottomSheet.addView(view, layoutParams);
 | |
|         }
 | |
|         coordinatorLayout.findViewById(R.id.touch_outside).setOnClickListener(new View.OnClickListener() { // from class: com.google.android.material.bottomsheet.BottomSheetDialog.2
 | |
|             @Override // android.view.View.OnClickListener
 | |
|             public void onClick(View view2) {
 | |
|                 if (BottomSheetDialog.this.cancelable && BottomSheetDialog.this.isShowing() && BottomSheetDialog.this.shouldWindowCloseOnTouchOutside()) {
 | |
|                     BottomSheetDialog.this.cancel();
 | |
|                 }
 | |
|             }
 | |
|         });
 | |
|         ViewCompat.setAccessibilityDelegate(this.bottomSheet, new AccessibilityDelegateCompat() { // from class: com.google.android.material.bottomsheet.BottomSheetDialog.3
 | |
|             @Override // androidx.core.view.AccessibilityDelegateCompat
 | |
|             public void onInitializeAccessibilityNodeInfo(View view2, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) {
 | |
|                 super.onInitializeAccessibilityNodeInfo(view2, accessibilityNodeInfoCompat);
 | |
|                 if (BottomSheetDialog.this.cancelable) {
 | |
|                     accessibilityNodeInfoCompat.addAction(1048576);
 | |
|                     accessibilityNodeInfoCompat.setDismissable(true);
 | |
|                 } else {
 | |
|                     accessibilityNodeInfoCompat.setDismissable(false);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             @Override // androidx.core.view.AccessibilityDelegateCompat
 | |
|             public boolean performAccessibilityAction(View view2, int i2, Bundle bundle) {
 | |
|                 if (i2 == 1048576 && BottomSheetDialog.this.cancelable) {
 | |
|                     BottomSheetDialog.this.cancel();
 | |
|                     return true;
 | |
|                 }
 | |
|                 return super.performAccessibilityAction(view2, i2, bundle);
 | |
|             }
 | |
|         });
 | |
|         this.bottomSheet.setOnTouchListener(new View.OnTouchListener() { // from class: com.google.android.material.bottomsheet.BottomSheetDialog.4
 | |
|             @Override // android.view.View.OnTouchListener
 | |
|             public boolean onTouch(View view2, MotionEvent motionEvent) {
 | |
|                 return true;
 | |
|             }
 | |
|         });
 | |
|         return this.container;
 | |
|     }
 | |
| 
 | |
|     private void updateListeningForBackCallbacks() {
 | |
|         MaterialBackOrchestrator materialBackOrchestrator = this.backOrchestrator;
 | |
|         if (materialBackOrchestrator == null) {
 | |
|             return;
 | |
|         }
 | |
|         if (this.cancelable) {
 | |
|             materialBackOrchestrator.startListeningForBackCallbacks();
 | |
|         } else {
 | |
|             materialBackOrchestrator.stopListeningForBackCallbacks();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     boolean shouldWindowCloseOnTouchOutside() {
 | |
|         if (!this.canceledOnTouchOutsideSet) {
 | |
|             TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(new int[]{android.R.attr.windowCloseOnTouchOutside});
 | |
|             this.canceledOnTouchOutside = obtainStyledAttributes.getBoolean(0, true);
 | |
|             obtainStyledAttributes.recycle();
 | |
|             this.canceledOnTouchOutsideSet = true;
 | |
|         }
 | |
|         return this.canceledOnTouchOutside;
 | |
|     }
 | |
| 
 | |
|     private static int getThemeResId(Context context, int i) {
 | |
|         if (i != 0) {
 | |
|             return i;
 | |
|         }
 | |
|         TypedValue typedValue = new TypedValue();
 | |
|         if (context.getTheme().resolveAttribute(R.attr.bottomSheetDialogTheme, typedValue, true)) {
 | |
|             return typedValue.resourceId;
 | |
|         }
 | |
|         return R.style.Theme_Design_Light_BottomSheetDialog;
 | |
|     }
 | |
| 
 | |
|     void removeDefaultCallback() {
 | |
|         this.behavior.removeBottomSheetCallback(this.bottomSheetCallback);
 | |
|     }
 | |
| 
 | |
|     private static class EdgeToEdgeCallback extends BottomSheetBehavior.BottomSheetCallback {
 | |
|         private final WindowInsetsCompat insetsCompat;
 | |
|         private final Boolean lightBottomSheet;
 | |
|         private boolean lightStatusBar;
 | |
|         private Window window;
 | |
| 
 | |
|         private EdgeToEdgeCallback(View view, WindowInsetsCompat windowInsetsCompat) {
 | |
|             ColorStateList backgroundTintList;
 | |
|             this.insetsCompat = windowInsetsCompat;
 | |
|             MaterialShapeDrawable materialShapeDrawable = BottomSheetBehavior.from(view).getMaterialShapeDrawable();
 | |
|             if (materialShapeDrawable != null) {
 | |
|                 backgroundTintList = materialShapeDrawable.getFillColor();
 | |
|             } else {
 | |
|                 backgroundTintList = ViewCompat.getBackgroundTintList(view);
 | |
|             }
 | |
|             if (backgroundTintList != null) {
 | |
|                 this.lightBottomSheet = Boolean.valueOf(MaterialColors.isColorLight(backgroundTintList.getDefaultColor()));
 | |
|                 return;
 | |
|             }
 | |
|             Integer backgroundColor = ViewUtils.getBackgroundColor(view);
 | |
|             if (backgroundColor != null) {
 | |
|                 this.lightBottomSheet = Boolean.valueOf(MaterialColors.isColorLight(backgroundColor.intValue()));
 | |
|             } else {
 | |
|                 this.lightBottomSheet = null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|         public void onStateChanged(View view, int i) {
 | |
|             setPaddingForPosition(view);
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|         public void onSlide(View view, float f) {
 | |
|             setPaddingForPosition(view);
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
 | |
|         void onLayout(View view) {
 | |
|             setPaddingForPosition(view);
 | |
|         }
 | |
| 
 | |
|         void setWindow(Window window) {
 | |
|             if (this.window == window) {
 | |
|                 return;
 | |
|             }
 | |
|             this.window = window;
 | |
|             if (window != null) {
 | |
|                 this.lightStatusBar = WindowCompat.getInsetsController(window, window.getDecorView()).isAppearanceLightStatusBars();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void setPaddingForPosition(View view) {
 | |
|             if (view.getTop() < this.insetsCompat.getSystemWindowInsetTop()) {
 | |
|                 Window window = this.window;
 | |
|                 if (window != null) {
 | |
|                     Boolean bool = this.lightBottomSheet;
 | |
|                     EdgeToEdgeUtils.setLightStatusBar(window, bool == null ? this.lightStatusBar : bool.booleanValue());
 | |
|                 }
 | |
|                 view.setPadding(view.getPaddingLeft(), this.insetsCompat.getSystemWindowInsetTop() - view.getTop(), view.getPaddingRight(), view.getPaddingBottom());
 | |
|                 return;
 | |
|             }
 | |
|             if (view.getTop() != 0) {
 | |
|                 Window window2 = this.window;
 | |
|                 if (window2 != null) {
 | |
|                     EdgeToEdgeUtils.setLightStatusBar(window2, this.lightStatusBar);
 | |
|                 }
 | |
|                 view.setPadding(view.getPaddingLeft(), 0, view.getPaddingRight(), view.getPaddingBottom());
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Deprecated
 | |
|     public static void setLightStatusBar(View view, boolean z) {
 | |
|         if (Build.VERSION.SDK_INT >= 23) {
 | |
|             int systemUiVisibility = view.getSystemUiVisibility();
 | |
|             view.setSystemUiVisibility(z ? systemUiVisibility | 8192 : systemUiVisibility & (-8193));
 | |
|         }
 | |
|     }
 | |
| }
 |