Disable swipe-to-dismiss for not cancelable dialogs.

Bug: 33249829
Change-Id: Ib3d2c9982ece22d1b080b821eaf306f6b686d099
This commit is contained in:
Michael Kwan
2016-11-30 16:44:33 -08:00
parent 5b64f51a1c
commit f7964be938
4 changed files with 60 additions and 5 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;
}
}