Disable swipe-to-dismiss for not cancelable dialogs.

am: f7964be938

Change-Id: I4a6cad65f91368393272cd8f7d6012d131ec56ff
This commit is contained in:
Michael Kwan
2016-12-05 18:09:07 +00:00
committed by android-build-merger
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) { @Nullable Message cancelCallback) {
this(context); this(context);
mCancelable = cancelable; mCancelable = cancelable;
updateWindowForCancelable();
mCancelMessage = cancelCallback; mCancelMessage = cancelCallback;
} }
@@ -207,6 +208,7 @@ public class Dialog implements DialogInterface, Window.Callback,
@Nullable OnCancelListener cancelListener) { @Nullable OnCancelListener cancelListener) {
this(context); this(context);
mCancelable = cancelable; mCancelable = cancelable;
updateWindowForCancelable();
setOnCancelListener(cancelListener); setOnCancelListener(cancelListener);
} }
@@ -1187,6 +1189,7 @@ public class Dialog implements DialogInterface, Window.Callback,
*/ */
public void setCancelable(boolean flag) { public void setCancelable(boolean flag) {
mCancelable = flag; mCancelable = flag;
updateWindowForCancelable();
} }
/** /**
@@ -1200,6 +1203,7 @@ public class Dialog implements DialogInterface, Window.Callback,
public void setCanceledOnTouchOutside(boolean cancel) { public void setCanceledOnTouchOutside(boolean cancel) {
if (cancel && !mCancelable) { if (cancel && !mCancelable) {
mCancelable = true; mCancelable = true;
updateWindowForCancelable();
} }
mWindow.setCloseOnTouchOutside(cancel); 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 mDestroyed;
private boolean mOverlayWithDecorCaptionEnabled = false; private boolean mOverlayWithDecorCaptionEnabled = false;
private boolean mCloseOnSwipeEnabled = false;
// The current window attributes. // The current window attributes.
private final WindowManager.LayoutParams mWindowAttributes = private final WindowManager.LayoutParams mWindowAttributes =
@@ -2208,4 +2209,21 @@ public abstract class Window {
* @hide * @hide
*/ */
public abstract void reportActivityRelaunched(); 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)); // System.out.println("Features: 0x" + Integer.toHexString(features));
if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) { if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) {
layoutResource = R.layout.screen_swipe_dismiss; layoutResource = R.layout.screen_swipe_dismiss;
setCloseOnSwipeEnabled(true);
} else if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) { } else if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) {
if (mIsFloating) { if (mIsFloating) {
TypedValue res = new TypedValue(); TypedValue res = new TypedValue();
@@ -2566,7 +2567,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
} }
if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) { if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) {
registerSwipeCallbacks(); registerSwipeCallbacks(contentParent);
} }
// Remaining setup -- of background and title -- that only applies // 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)); return (mRightIconView = (ImageView)findViewById(R.id.right_icon));
} }
private void registerSwipeCallbacks() { private void registerSwipeCallbacks(ViewGroup contentParent) {
SwipeDismissLayout swipeDismiss = if (!(contentParent instanceof SwipeDismissLayout)) {
(SwipeDismissLayout) findViewById(R.id.content); Log.w(TAG, "contentParent is not a SwipeDismissLayout: " + contentParent);
return;
}
SwipeDismissLayout swipeDismiss = (SwipeDismissLayout) contentParent;
swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() {
@Override @Override
public void onDismissed(SwipeDismissLayout layout) { 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)} * Helper method for calling the {@link Callback#onPanelClosed(int, Menu)}
* callback. This method will grab whatever extra state is needed for the * 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 float mLastX;
private boolean mDismissable = true;
public SwipeDismissLayout(Context context) { public SwipeDismissLayout(Context context) {
super(context); super(context);
init(context); init(context);
@@ -166,6 +168,10 @@ public class SwipeDismissLayout extends FrameLayout {
@Override @Override
public boolean onInterceptTouchEvent(MotionEvent ev) { public boolean onInterceptTouchEvent(MotionEvent ev) {
if (!mDismissable) {
return super.onInterceptTouchEvent(ev);
}
// offset because the view is translated during swipe // offset because the view is translated during swipe
ev.offsetLocation(mTranslationX, 0); ev.offsetLocation(mTranslationX, 0);
@@ -225,7 +231,7 @@ public class SwipeDismissLayout extends FrameLayout {
@Override @Override
public boolean onTouchEvent(MotionEvent ev) { public boolean onTouchEvent(MotionEvent ev) {
if (mVelocityTracker == null) { if (mVelocityTracker == null || !mDismissable) {
return super.onTouchEvent(ev); return super.onTouchEvent(ev);
} }
// offset because the view is translated during swipe // offset because the view is translated during swipe
@@ -363,4 +369,13 @@ public class SwipeDismissLayout extends FrameLayout {
return checkV && v.canScrollHorizontally((int) -dx); return checkV && v.canScrollHorizontally((int) -dx);
} }
public void setDismissable(boolean dismissable) {
if (!dismissable && mDismissable) {
cancel();
resetMembers();
}
mDismissable = dismissable;
}
} }