Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed841cbd authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Make View#isTemporarilyDetached() less confusing

In Android N, View#isTemporarilyDetached() returns true if it is called
when the same View instance is handling View#onFinishTemporaryDetach().

Returning true there is, however, sometimes confusing, especially
scenarios like the following case:

    @Override
    public void onFinishTemporaryDetach() {
        doSomeRestoringWorks();
    }

    private void doSomeRestoringWorks() {
        doSomething();
    }

    private doSomething() {
        if (isTemporarilyDetached()) {
            // As of N, we hit here if this is called as a result of
            // View#onFinishTemporaryDetach().
        } else {
            // but is the logic here is more likely to be appropriate
            // when handling View#onFinishTemporaryDetach()?
        }
    }

What this CL aims to do is to let View#isTemporarilyDetached() return
false when it is called while handling View#onFinishTemporaryDetach(),
because it should make View#onFinishTemporaryDetach() more useful.

Regarding the app compatibility, View#isTemporarilyDetached() was added
in API 24 hence the impact on this change is still limited.

Bug: 30791718
Change-Id: If384da9f9e6ff849598896901626fd021bae5cda
parent 0b26adbb
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -830,7 +830,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     */
    protected static boolean sPreserveMarginParamsInLayoutParamConversion;
    /**
     * This view does not want keystrokes. Use with TAKES_FOCUS_MASK when
     * calling setFlags.
@@ -9852,6 +9851,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    }
    /**
     * Tells whether the {@link View} is in the state between {@link #onStartTemporaryDetach()}
     * and {@link #onFinishTemporaryDetach()}.
     *
     * <p>This method always returns {@code true} when called directly or indirectly from
     * {@link #onStartTemporaryDetach()}. The return value when called directly or indirectly from
     * {@link #onFinishTemporaryDetach()}, however, depends on the OS version.
     * <ul>
     *     <li>{@code true} on {@link android.os.Build.VERSION_CODES#N API 24}</li>
     *     <li>{@code false} on {@link android.os.Build.VERSION_CODES#N_MR1 API 25}} and later</li>
     * </ul>
     * </p>
     *
     * @return {@code true} when the View is in the state between {@link #onStartTemporaryDetach()}
     * and {@link #onFinishTemporaryDetach()}.
     */
@@ -9886,8 +9897,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     */
    @CallSuper
    public void dispatchFinishTemporaryDetach() {
        onFinishTemporaryDetach();
        mPrivateFlags3 &= ~PFLAG3_TEMPORARY_DETACH;
        onFinishTemporaryDetach();
        if (hasWindowFocus() && hasFocus()) {
            InputMethodManager.getInstance().focusIn(this);
        }