Disable swipe-to-dismiss for not cancelable dialogs.
Bug: 33249829 Change-Id: Ib3d2c9982ece22d1b080b821eaf306f6b686d099
This commit is contained in:
@@ -200,6 +200,7 @@ public class Dialog implements DialogInterface, Window.Callback,
|
||||
@Nullable Message cancelCallback) {
|
||||
this(context);
|
||||
mCancelable = cancelable;
|
||||
updateWindowForCancelable();
|
||||
mCancelMessage = cancelCallback;
|
||||
}
|
||||
|
||||
@@ -207,6 +208,7 @@ public class Dialog implements DialogInterface, Window.Callback,
|
||||
@Nullable OnCancelListener cancelListener) {
|
||||
this(context);
|
||||
mCancelable = cancelable;
|
||||
updateWindowForCancelable();
|
||||
setOnCancelListener(cancelListener);
|
||||
}
|
||||
|
||||
@@ -1187,6 +1189,7 @@ public class Dialog implements DialogInterface, Window.Callback,
|
||||
*/
|
||||
public void setCancelable(boolean flag) {
|
||||
mCancelable = flag;
|
||||
updateWindowForCancelable();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1200,6 +1203,7 @@ public class Dialog implements DialogInterface, Window.Callback,
|
||||
public void setCanceledOnTouchOutside(boolean cancel) {
|
||||
if (cancel && !mCancelable) {
|
||||
mCancelable = true;
|
||||
updateWindowForCancelable();
|
||||
}
|
||||
|
||||
mWindow.setCloseOnTouchOutside(cancel);
|
||||
@@ -1351,4 +1355,8 @@ public class Dialog implements DialogInterface, Window.Callback,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateWindowForCancelable() {
|
||||
mWindow.setCloseOnSwipeEnabled(mCancelable);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -302,6 +302,7 @@ public abstract class Window {
|
||||
private boolean mDestroyed;
|
||||
|
||||
private boolean mOverlayWithDecorCaptionEnabled = false;
|
||||
private boolean mCloseOnSwipeEnabled = false;
|
||||
|
||||
// The current window attributes.
|
||||
private final WindowManager.LayoutParams mWindowAttributes =
|
||||
@@ -2208,4 +2209,21 @@ public abstract class Window {
|
||||
* @hide
|
||||
*/
|
||||
public abstract void reportActivityRelaunched();
|
||||
|
||||
/**
|
||||
* Called to set flag to check if the close on swipe is enabled. This will only function if
|
||||
* FEATURE_SWIPE_TO_DISMISS has been set.
|
||||
* @hide
|
||||
*/
|
||||
public void setCloseOnSwipeEnabled(boolean closeOnSwipeEnabled) {
|
||||
mCloseOnSwipeEnabled = closeOnSwipeEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@code true} if the close on swipe is enabled.
|
||||
* @hide
|
||||
*/
|
||||
public boolean isCloseOnSwipeEnabled() {
|
||||
return mCloseOnSwipeEnabled;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2495,6 +2495,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
// System.out.println("Features: 0x" + Integer.toHexString(features));
|
||||
if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) {
|
||||
layoutResource = R.layout.screen_swipe_dismiss;
|
||||
setCloseOnSwipeEnabled(true);
|
||||
} else if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) {
|
||||
if (mIsFloating) {
|
||||
TypedValue res = new TypedValue();
|
||||
@@ -2566,7 +2567,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
}
|
||||
|
||||
if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) {
|
||||
registerSwipeCallbacks();
|
||||
registerSwipeCallbacks(contentParent);
|
||||
}
|
||||
|
||||
// Remaining setup -- of background and title -- that only applies
|
||||
@@ -2980,9 +2981,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
return (mRightIconView = (ImageView)findViewById(R.id.right_icon));
|
||||
}
|
||||
|
||||
private void registerSwipeCallbacks() {
|
||||
SwipeDismissLayout swipeDismiss =
|
||||
(SwipeDismissLayout) findViewById(R.id.content);
|
||||
private void registerSwipeCallbacks(ViewGroup contentParent) {
|
||||
if (!(contentParent instanceof SwipeDismissLayout)) {
|
||||
Log.w(TAG, "contentParent is not a SwipeDismissLayout: " + contentParent);
|
||||
return;
|
||||
}
|
||||
SwipeDismissLayout swipeDismiss = (SwipeDismissLayout) contentParent;
|
||||
swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() {
|
||||
@Override
|
||||
public void onDismissed(SwipeDismissLayout layout) {
|
||||
@@ -3021,6 +3025,16 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
||||
});
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@Override
|
||||
public void setCloseOnSwipeEnabled(boolean closeOnSwipeEnabled) {
|
||||
if (hasFeature(Window.FEATURE_SWIPE_TO_DISMISS) // swipe-to-dismiss feature is requested
|
||||
&& mContentParent instanceof SwipeDismissLayout) { // check casting mContentParent
|
||||
((SwipeDismissLayout) mContentParent).setDismissable(closeOnSwipeEnabled);
|
||||
}
|
||||
super.setCloseOnSwipeEnabled(closeOnSwipeEnabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method for calling the {@link Callback#onPanelClosed(int, Menu)}
|
||||
* callback. This method will grab whatever extra state is needed for the
|
||||
|
||||
@@ -110,6 +110,8 @@ public class SwipeDismissLayout extends FrameLayout {
|
||||
|
||||
private float mLastX;
|
||||
|
||||
private boolean mDismissable = true;
|
||||
|
||||
public SwipeDismissLayout(Context context) {
|
||||
super(context);
|
||||
init(context);
|
||||
@@ -166,6 +168,10 @@ public class SwipeDismissLayout extends FrameLayout {
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
if (!mDismissable) {
|
||||
return super.onInterceptTouchEvent(ev);
|
||||
}
|
||||
|
||||
// offset because the view is translated during swipe
|
||||
ev.offsetLocation(mTranslationX, 0);
|
||||
|
||||
@@ -225,7 +231,7 @@ public class SwipeDismissLayout extends FrameLayout {
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev) {
|
||||
if (mVelocityTracker == null) {
|
||||
if (mVelocityTracker == null || !mDismissable) {
|
||||
return super.onTouchEvent(ev);
|
||||
}
|
||||
// offset because the view is translated during swipe
|
||||
@@ -363,4 +369,13 @@ public class SwipeDismissLayout extends FrameLayout {
|
||||
|
||||
return checkV && v.canScrollHorizontally((int) -dx);
|
||||
}
|
||||
|
||||
public void setDismissable(boolean dismissable) {
|
||||
if (!dismissable && mDismissable) {
|
||||
cancel();
|
||||
resetMembers();
|
||||
}
|
||||
|
||||
mDismissable = dismissable;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user