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

Commit 34b73dfa authored by Craig Mautner's avatar Craig Mautner
Browse files

Cleanup after ActivityView

- Release Surface and VirtualDisplay when shutting down ActivityView.
- Shut down child stacks when relaunching parent activity.

Change-Id: I60314b2b43bd2da5406cf6ec871293b5baca157c
parent 9cfb2e5f
Loading
Loading
Loading
Loading
+38 −21
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Surface;
import android.view.Surface;
import android.view.TextureView;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
import android.view.TextureView.SurfaceTextureListener;
@@ -31,12 +32,15 @@ import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager;


public class ActivityView extends ViewGroup {
public class ActivityView extends ViewGroup {
    private final String TAG = "ActivityView";

    private final TextureView mTextureView;
    private final TextureView mTextureView;
    private IActivityContainer mActivityContainer;
    private IActivityContainer mActivityContainer;
    private Activity mActivity;
    private Activity mActivity;
    private boolean mAttached;
    private boolean mAttached;
    private int mWidth;
    private int mWidth;
    private int mHeight;
    private int mHeight;
    private Surface mSurface;


    public ActivityView(Context context) {
    public ActivityView(Context context) {
        this(context, null);
        this(context, null);
@@ -83,20 +87,18 @@ public class ActivityView extends ViewGroup {


        final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        if (surfaceTexture != null) {
        if (surfaceTexture != null) {
            createActivityView(surfaceTexture);
            attachToSurface(surfaceTexture);
        }
        }
    }
    }


    @Override
    @Override
    protected void onDetachedFromWindow() {
    protected void onDetachedFromWindow() {
        if (mActivityContainer != null) {
        detachFromSurface();
            try {
                mActivityContainer.deleteActivityView();
            } catch (RemoteException e) {
    }
    }
            mActivityContainer = null;

        }
    @Override
        mAttached = false;
    public boolean isAttachedToWindow() {
        return mAttached;
    }
    }


    public void startActivity(Intent intent) {
    public void startActivity(Intent intent) {
@@ -110,22 +112,41 @@ public class ActivityView extends ViewGroup {
    }
    }


    /** Call when both mActivityContainer and mTextureView's SurfaceTexture are not null */
    /** Call when both mActivityContainer and mTextureView's SurfaceTexture are not null */
    private void createActivityView(SurfaceTexture surfaceTexture) {
    private void attachToSurface(SurfaceTexture surfaceTexture) {
        WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
        WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics metrics = new DisplayMetrics();
        DisplayMetrics metrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(metrics);
        wm.getDefaultDisplay().getMetrics(metrics);


        mSurface = new Surface(surfaceTexture);
        try {
        try {
            mActivityContainer.createActivityView(new Surface(surfaceTexture), mWidth, mHeight,
            mActivityContainer.attachToSurface(mSurface, mWidth, mHeight,
                    metrics.densityDpi);
                    metrics.densityDpi);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            mActivityContainer = null;
            mActivityContainer = null;
            mSurface.release();
            mSurface = null;
            mAttached = false;
            throw new IllegalStateException(
            throw new IllegalStateException(
                    "ActivityView: Unable to create ActivityContainer. " + e);
                    "ActivityView: Unable to create ActivityContainer. " + e);
        }
        }
        mAttached = true;
        mAttached = true;
    }
    }


    private void detachFromSurface() {
        if (mActivityContainer != null) {
            try {
                mActivityContainer.detachFromDisplay();
            } catch (RemoteException e) {
            }
            mActivityContainer = null;
        }
        if (mSurface != null) {
            mSurface.release();
            mSurface = null;
        }
        mAttached = false;
    }

    private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
    private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
        @Override
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
@@ -133,30 +154,26 @@ public class ActivityView extends ViewGroup {
            mWidth = width;
            mWidth = width;
            mHeight = height;
            mHeight = height;
            if (mActivityContainer != null) {
            if (mActivityContainer != null) {
                createActivityView(surfaceTexture);
                attachToSurface(surfaceTexture);
            }
            }
        }
        }


        @Override
        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
        public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
                int height) {
                int height) {
            Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height);
        }
        }


        @Override
        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
            try {
            Log.d(TAG, "onSurfaceTextureDestroyed");
                mActivityContainer.deleteActivityView();
            detachFromSurface();
                // TODO: Add binderDied to handle this nullification.
            return true;
                mActivityContainer = null;
            } catch (RemoteException r) {
            }
            mAttached = false;
            return false;
        }
        }


        @Override
        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
        public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

//            Log.d(TAG, "onSurfaceTextureUpdated");
        }
        }


    }
    }
+2 −3
Original line number Original line Diff line number Diff line
@@ -24,9 +24,8 @@ import android.view.Surface;
/** @hide */
/** @hide */
interface IActivityContainer {
interface IActivityContainer {
    void attachToDisplay(int displayId);
    void attachToDisplay(int displayId);
    int getDisplayId();
    void attachToSurface(in Surface surface, int width, int height, int density);
    void detachFromDisplay();
    void detachFromDisplay();
    int startActivity(in Intent intent);
    int startActivity(in Intent intent);
    void createActivityView(in Surface surface, int width, int height, int density);
    int getDisplayId();
    void deleteActivityView();
}
}
+12 −3
Original line number Original line Diff line number Diff line
@@ -322,7 +322,7 @@ final class ActivityStack {
        }
        }
    }
    }


    private int numActivities() {
    int numActivities() {
        int count = 0;
        int count = 0;
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            count += mTaskHistory.get(taskNdx).mActivities.size();
            count += mTaskHistory.get(taskNdx).mActivities.size();
@@ -2675,6 +2675,7 @@ final class ActivityStack {
    }
    }


    private void removeActivityFromHistoryLocked(ActivityRecord r) {
    private void removeActivityFromHistoryLocked(ActivityRecord r) {
        mStackSupervisor.removeChildActivityContainers(r);
        finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
        finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
        r.makeFinishing();
        r.makeFinishing();
        if (DEBUG_ADD_REMOVE) {
        if (DEBUG_ADD_REMOVE) {
@@ -3318,6 +3319,8 @@ final class ActivityStack {


        r.startFreezingScreenLocked(r.app, 0);
        r.startFreezingScreenLocked(r.app, 0);


        mStackSupervisor.removeChildActivityContainers(r);

        try {
        try {
            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG,
            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG,
                    (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ")
                    (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ")
@@ -3357,7 +3360,13 @@ final class ActivityStack {
                }
                }
            }
            }
        }
        }
        return true;
        final ActivityRecord r = ActivityRecord.forToken(token);
        if (r == null) {
            return false;
        }
        if (r.finishing) Slog.e(TAG, "willActivityBeVisibleLocked: Returning false,"
                + " would have returned true for r=" + r);
        return !r.finishing;
    }
    }


    void closeSystemDialogsLocked() {
    void closeSystemDialogsLocked() {
+87 −45
Original line number Original line Diff line number Diff line
@@ -417,11 +417,13 @@ public final class ActivityStackSupervisor implements DisplayListener {
            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
                final ActivityStack stack = stacks.get(stackNdx);
                final ActivityStack stack = stacks.get(stackNdx);
                if (!isFrontStack(stack)) {
                if (!isFrontStack(stack) || stack.numActivities() == 0) {
                    continue;
                    continue;
                }
                }
                final ActivityRecord resumedActivity = stack.mResumedActivity;
                final ActivityRecord resumedActivity = stack.mResumedActivity;
                if (resumedActivity == null || !resumedActivity.idle) {
                if (resumedActivity == null || !resumedActivity.idle) {
                    if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack="
                             + stack.mStackId + " " + resumedActivity + " not idle");
                    return false;
                    return false;
                }
                }
            }
            }
@@ -2130,6 +2132,28 @@ public final class ActivityStackSupervisor implements DisplayListener {
        return createActivityContainer(parentActivity, getNextStackId(), callback);
        return createActivityContainer(parentActivity, getNextStackId(), callback);
    }
    }


    void removeChildActivityContainers(ActivityRecord parentActivity) {
        for (int ndx = mActivityContainers.size() - 1; ndx >= 0; --ndx) {
            final ActivityContainer container = mActivityContainers.valueAt(ndx).get();
            if (container == null) {
                mActivityContainers.removeAt(ndx);
                continue;
            }
            if (container.mParentActivity != parentActivity) {
                continue;
            }

            ActivityStack stack = container.mStack;
            ActivityRecord top = stack.topRunningNonDelayedActivityLocked(null);
            if (top != null) {
                // TODO: Make sure the next activity doesn't start up when top is destroyed.
                stack.destroyActivityLocked(top, true, true, "stack removal");
            }
            mActivityContainers.removeAt(ndx);
            container.detachLocked();
        }
    }

    private int createStackOnDisplay(ActivityRecord parentActivity, int stackId, int displayId) {
    private int createStackOnDisplay(ActivityRecord parentActivity, int stackId, int displayId) {
        ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
        ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
        if (activityDisplay == null) {
        if (activityDisplay == null) {
@@ -2683,8 +2707,10 @@ public final class ActivityStackSupervisor implements DisplayListener {
    }
    }


    final void scheduleResumeTopActivities() {
    final void scheduleResumeTopActivities() {
        if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) {
            mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
            mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
        }
        }
    }


    void removeSleepTimeouts() {
    void removeSleepTimeouts() {
        mSleepTimeout = false;
        mSleepTimeout = false;
@@ -2731,7 +2757,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            if (activityDisplay != null) {
            if (activityDisplay != null) {
                ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
                ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
                    activityDisplay.detachActivitiesLocked(stacks.get(stackNdx));
                    stacks.get(stackNdx).mActivityContainer.detachLocked();
                }
                }
                mActivityDisplays.remove(displayId);
                mActivityDisplays.remove(displayId);
            }
            }
@@ -2872,6 +2898,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
        final IActivityContainerCallback mCallback;
        final IActivityContainerCallback mCallback;
        final ActivityStack mStack;
        final ActivityStack mStack;
        final ActivityRecord mParentActivity;
        final ActivityRecord mParentActivity;
        final String mIdString;


        /** Display this ActivityStack is currently on. Null if not attached to a Display. */
        /** Display this ActivityStack is currently on. Null if not attached to a Display. */
        ActivityDisplay mActivityDisplay;
        ActivityDisplay mActivityDisplay;
@@ -2883,10 +2910,14 @@ public final class ActivityStackSupervisor implements DisplayListener {
                mStack = new ActivityStack(this);
                mStack = new ActivityStack(this);
                mParentActivity = parentActivity;
                mParentActivity = parentActivity;
                mCallback = callback;
                mCallback = callback;
                mIdString = "ActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}";
                if (DEBUG_STACK) Slog.d(TAG, "Creating " + this);
            }
            }
        }
        }


        void attachToDisplayLocked(ActivityDisplay activityDisplay) {
        void attachToDisplayLocked(ActivityDisplay activityDisplay) {
            if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this
                    + " to display=" + activityDisplay);
            mActivityDisplay = activityDisplay;
            mActivityDisplay = activityDisplay;
            mStack.mDisplayId = activityDisplay.mDisplayId;
            mStack.mDisplayId = activityDisplay.mDisplayId;
            mStack.mStacks = activityDisplay.mStacks;
            mStack.mStacks = activityDisplay.mStacks;
@@ -2914,7 +2945,9 @@ public final class ActivityStackSupervisor implements DisplayListener {
            return -1;
            return -1;
        }
        }


        void detachLocked() {
        private void detachLocked() {
            if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display="
                    + mActivityDisplay + " Callers=" + Debug.getCallers(2));
            if (mActivityDisplay != null) {
            if (mActivityDisplay != null) {
                mActivityDisplay.detachActivitiesLocked(mStack);
                mActivityDisplay.detachActivitiesLocked(mStack);
                mActivityDisplay = null;
                mActivityDisplay = null;
@@ -2951,45 +2984,15 @@ public final class ActivityStackSupervisor implements DisplayListener {
        }
        }


        @Override
        @Override
        public void createActivityView(Surface surface, int width, int height, int density) {
        public void attachToSurface(Surface surface, int width, int height, int density) {
            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
            VirtualDisplay virtualDisplay;
            long ident = Binder.clearCallingIdentity();
            try {
                virtualDisplay = dm.createVirtualDisplay(mService.mContext,
                        VIRTUAL_DISPLAY_BASE_NAME, width, height, density, surface,
                        DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
                        DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }

            final Display display = virtualDisplay.getDisplay();
            final int displayId = display.getDisplayId();

            mWindowManager.handleDisplayAdded(displayId);

            synchronized (mService) {
            synchronized (mService) {
                ActivityDisplay activityDisplay = new ActivityDisplay(display);
                ActivityDisplay activityDisplay =
                mActivityDisplays.put(displayId, activityDisplay);
                        new ActivityDisplay(surface, width, height, density);
                mActivityDisplays.put(activityDisplay.mDisplayId, activityDisplay);
                attachToDisplayLocked(activityDisplay);
                attachToDisplayLocked(activityDisplay);
                activityDisplay.mVirtualDisplay = virtualDisplay;
            }
        }

        @Override
        public void deleteActivityView() {
            synchronized (mService) {
                if (!isAttached()) {
                    return;
                }
                VirtualDisplay virtualDisplay = mActivityDisplay.mVirtualDisplay;
                if (virtualDisplay != null) {
                    virtualDisplay.release();
                    mActivityDisplay.mVirtualDisplay = null;
                }
                detachLocked();
            }
            }
            if (DEBUG_STACK) Slog.d(TAG, "attachToSurface: " + this + " to display="
                    + mActivityDisplay);
        }
        }


        ActivityStackSupervisor getOuter() {
        ActivityStackSupervisor getOuter() {
@@ -3007,15 +3010,21 @@ public final class ActivityStackSupervisor implements DisplayListener {
                outBounds.set(0, 0);
                outBounds.set(0, 0);
            }
            }
        }
        }

        @Override
        public String toString() {
            return mIdString + (mActivityDisplay == null ? "N" : "A");
        }
    }
    }


    /** Exactly one of these classes per Display in the system. Capable of holding zero or more
    /** Exactly one of these classes per Display in the system. Capable of holding zero or more
     * attached {@link ActivityStack}s */
     * attached {@link ActivityStack}s */
    final class ActivityDisplay {
    final class ActivityDisplay {
        /** Actual Display this object tracks. */
        /** Actual Display this object tracks. */
        final int mDisplayId;
        int mDisplayId;
        final Display mDisplay;
        Display mDisplay;
        final DisplayInfo mDisplayInfo = new DisplayInfo();
        DisplayInfo mDisplayInfo = new DisplayInfo();
        Surface mSurface;


        /** All of the stacks on this display. Order matters, topmost stack is in front of all other
        /** All of the stacks on this display. Order matters, topmost stack is in front of all other
         * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
         * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
@@ -3026,10 +3035,32 @@ public final class ActivityStackSupervisor implements DisplayListener {
        VirtualDisplay mVirtualDisplay;
        VirtualDisplay mVirtualDisplay;


        ActivityDisplay(int displayId) {
        ActivityDisplay(int displayId) {
            this(mDisplayManager.getDisplay(displayId));
            init(mDisplayManager.getDisplay(displayId));
        }
        }


        ActivityDisplay(Display display) {
        ActivityDisplay(Display display) {
            init(display);
        }

        ActivityDisplay(Surface surface, int width, int height, int density) {
            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
            long ident = Binder.clearCallingIdentity();
            try {
                mVirtualDisplay = dm.createVirtualDisplay(mService.mContext,
                        VIRTUAL_DISPLAY_BASE_NAME, width, height, density, surface,
                        DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
                        DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }

            init(mVirtualDisplay.getDisplay());
            mSurface = surface;

            mWindowManager.handleDisplayAdded(mDisplayId);
        }

        private void init(Display display) {
            mDisplay = display;
            mDisplay = display;
            mDisplayId = display.getDisplayId();
            mDisplayId = display.getDisplayId();
            mDisplay.getDisplayInfo(mDisplayInfo);
            mDisplay.getDisplayInfo(mDisplayInfo);
@@ -3042,9 +3073,14 @@ public final class ActivityStackSupervisor implements DisplayListener {
        }
        }


        void detachActivitiesLocked(ActivityStack stack) {
        void detachActivitiesLocked(ActivityStack stack) {
            if (DEBUG_STACK) Slog.v(TAG, "attachActivities: detaching " + stack
            if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack
                    + " from displayId=" + mDisplayId);
                    + " from displayId=" + mDisplayId);
            mStacks.remove(stack);
            mStacks.remove(stack);
            if (mStacks.isEmpty() && mVirtualDisplay != null) {
                mVirtualDisplay.release();
                mVirtualDisplay = null;
            }
            mSurface.release();
        }
        }


        void getBounds(Point bounds) {
        void getBounds(Point bounds) {
@@ -3052,5 +3088,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
            bounds.x = mDisplayInfo.appWidth;
            bounds.x = mDisplayInfo.appWidth;
            bounds.y = mDisplayInfo.appHeight;
            bounds.y = mDisplayInfo.appHeight;
        }
        }

        @Override
        public String toString() {
            return "ActivityDisplay={" + mDisplayId + (mVirtualDisplay == null ? "" : "V")
                    + " numStacks=" + mStacks.size() + "}";
        }
    }
    }
}
}
+4 −8
Original line number Original line Diff line number Diff line
@@ -18,8 +18,6 @@ package com.android.server.wm;


import static android.view.WindowManager.LayoutParams.*;
import static android.view.WindowManager.LayoutParams.*;


import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;

import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;


import android.app.AppOpsManager;
import android.app.AppOpsManager;
@@ -3622,7 +3620,7 @@ public class WindowManagerService extends IWindowManager.Stub
            if (freezeThisOneIfNeeded != null) {
            if (freezeThisOneIfNeeded != null) {
                AppWindowToken atoken = findAppWindowToken(freezeThisOneIfNeeded);
                AppWindowToken atoken = findAppWindowToken(freezeThisOneIfNeeded);
                if (atoken != null) {
                if (atoken != null) {
                    startAppFreezingScreenLocked(atoken, ActivityInfo.CONFIG_ORIENTATION);
                    startAppFreezingScreenLocked(atoken);
                }
                }
            }
            }
            config = computeNewConfigurationLocked();
            config = computeNewConfigurationLocked();
@@ -4395,8 +4393,7 @@ public class WindowManagerService extends IWindowManager.Stub
        }
        }
    }
    }


    public void startAppFreezingScreenLocked(AppWindowToken wtoken,
    private void startAppFreezingScreenLocked(AppWindowToken wtoken) {
            int configChanges) {
        if (DEBUG_ORIENTATION) {
        if (DEBUG_ORIENTATION) {
            RuntimeException e = null;
            RuntimeException e = null;
            if (!HIDE_STACK_CRAWLS) {
            if (!HIDE_STACK_CRAWLS) {
@@ -4445,7 +4442,7 @@ public class WindowManagerService extends IWindowManager.Stub
                return;
                return;
            }
            }
            final long origId = Binder.clearCallingIdentity();
            final long origId = Binder.clearCallingIdentity();
            startAppFreezingScreenLocked(wtoken, configChanges);
            startAppFreezingScreenLocked(wtoken);
            Binder.restoreCallingIdentity(origId);
            Binder.restoreCallingIdentity(origId);
        }
        }
    }
    }
@@ -8313,8 +8310,7 @@ public class WindowManagerService extends IWindowManager.Stub
        // it frozen/off until this window draws at its new
        // it frozen/off until this window draws at its new
        // orientation.
        // orientation.
        if (!okToDisplay()) {
        if (!okToDisplay()) {
            if (DEBUG_ORIENTATION) Slog.v(TAG,
            if (DEBUG_ORIENTATION) Slog.v(TAG, "Changing surface while display frozen: " + w);
                    "Changing surface while display frozen: " + w);
            w.mOrientationChanging = true;
            w.mOrientationChanging = true;
            w.mLastFreezeDuration = 0;
            w.mLastFreezeDuration = 0;
            mInnerFields.mOrientationChangeComplete = false;
            mInnerFields.mOrientationChangeComplete = false;