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

Commit b6c2624c authored by Robert Carr's avatar Robert Carr
Browse files

Add window setDecorView API.

Add a Window API for setting a view which will be placed in
the decoration area (next to the window control buttons).

Change-Id: Ie106cbea653ff95fdba987a2a43506d394600612
parent 1e4313df
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -37441,6 +37441,8 @@ package android.view {
    method public abstract void setContentView(int);
    method public abstract void setContentView(int);
    method public abstract void setContentView(android.view.View);
    method public abstract void setContentView(android.view.View);
    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public abstract void setDecorView(android.view.View);
    method public abstract void setDecorView(int);
    method protected void setDefaultWindowFormat(int);
    method protected void setDefaultWindowFormat(int);
    method public void setDimAmount(float);
    method public void setDimAmount(float);
    method public void setElevation(float);
    method public void setElevation(float);
+2 −0
Original line number Original line Diff line number Diff line
@@ -39738,6 +39738,8 @@ package android.view {
    method public abstract void setContentView(int);
    method public abstract void setContentView(int);
    method public abstract void setContentView(android.view.View);
    method public abstract void setContentView(android.view.View);
    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public abstract void setDecorView(android.view.View);
    method public abstract void setDecorView(int);
    method protected void setDefaultWindowFormat(int);
    method protected void setDefaultWindowFormat(int);
    method public void setDimAmount(float);
    method public void setDimAmount(float);
    method public void setDisableWallpaperTouchEvents(boolean);
    method public void setDisableWallpaperTouchEvents(boolean);
+21 −0
Original line number Original line Diff line number Diff line
@@ -1155,6 +1155,27 @@ public abstract class Window {
     */
     */
    public abstract void setContentView(View view);
    public abstract void setContentView(View view);


    /**
     * Install a view in the decoration (title) area, to be shown when
     * the window is in multi-window mode. This view will be placed
     * next to the window controls.
     *
     * The view may be restored to defaults by passing null.
     *
     * @param view The desired view to display in window decorations.
     */
    public abstract void setDecorView(View view);

    /**
     * Convenience for
     * {@link #setDecorView(View)}
     * to set the custom window decoration from a layout resource. The layout will be inflated
     * adding all top level views to the decoration
     *
     * @param layoutResID Resource ID to be inflated.
     */
    public abstract void setDecorView(@LayoutRes int layoutResID);

    /**
    /**
     * Set the screen content to an explicit view.  This view is placed
     * Set the screen content to an explicit view.  This view is placed
     * directly into the screen's view hierarchy.  It can itself be a complex
     * directly into the screen's view hierarchy.  It can itself be a complex
+25 −0
Original line number Original line Diff line number Diff line
@@ -123,6 +123,7 @@ import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ImageView;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.ProgressBar;
@@ -468,6 +469,30 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
        }
        }
    }
    }


    @Override
    public void setDecorView(int layoutResID) {
        View v = mLayoutInflater.inflate(layoutResID, null);
        setDecorView(v);
    }

    @Override
    public void setDecorView(View view) {
        if (mContentParent == null) {
            installDecor();
        }

        LinearLayout clientDecorPlaceholder =
                (LinearLayout) findViewById(R.id.client_decor_placeholder);

        if (clientDecorPlaceholder != null) {
            clientDecorPlaceholder.removeAllViews();

            if (view != null) {
                clientDecorPlaceholder.addView(view);
            }
        }
    }

    @Override
    @Override
    public void addContentView(View view, ViewGroup.LayoutParams params) {
    public void addContentView(View view, ViewGroup.LayoutParams params) {
        if (mContentParent == null) {
        if (mContentParent == null) {
+16 −30
Original line number Original line Diff line number Diff line
@@ -428,8 +428,7 @@ public class NonClientDecorView extends LinearLayout


        // The render nodes for the multi threaded renderer.
        // The render nodes for the multi threaded renderer.
        private ThreadedRenderer mRenderer;
        private ThreadedRenderer mRenderer;
        private RenderNode mFrameNode;
        private RenderNode mFrameAndBackdropNode;
        private RenderNode mBackdropNode;


        private final Rect mOldTargetRect = new Rect();
        private final Rect mOldTargetRect = new Rect();
        private final Rect mNewTargetRect = new Rect();
        private final Rect mNewTargetRect = new Rect();
@@ -450,13 +449,11 @@ public class NonClientDecorView extends LinearLayout
            setName("ResizeFrame");
            setName("ResizeFrame");
            mRenderer = renderer;
            mRenderer = renderer;


            // Create the render nodes for our frame and backdrop which can be resized independently
            // Create a render node for the content and frame backdrop
            // from the content.
            // which can be resized independently from the content.
            mFrameNode = RenderNode.create("FrameNode", null);
            mFrameAndBackdropNode = RenderNode.create("FrameAndBackdropNode", null);
            mBackdropNode = RenderNode.create("BackdropNode", null);


            mRenderer.addRenderNode(mFrameNode, false);
            mRenderer.addRenderNode(mFrameAndBackdropNode, true);
            mRenderer.addRenderNode(mBackdropNode, true);


            // Set the initial bounds and draw once so that we do not get a broken frame.
            // Set the initial bounds and draw once so that we do not get a broken frame.
            mTargetRect.set(initialBounds);
            mTargetRect.set(initialBounds);
@@ -504,10 +501,9 @@ public class NonClientDecorView extends LinearLayout
                    // Invalidate the current content bounds.
                    // Invalidate the current content bounds.
                    mRenderer.setContentDrawBounds(0, 0, 0, 0);
                    mRenderer.setContentDrawBounds(0, 0, 0, 0);


                    // Remove the render nodes again
                    // Remove the render node again
                    // (see comment above - better to do that only once).
                    // (see comment above - better to do that only once).
                    mRenderer.removeRenderNode(mFrameNode);
                    mRenderer.removeRenderNode(mFrameAndBackdropNode);
                    mRenderer.removeRenderNode(mBackdropNode);


                    mRenderer = null;
                    mRenderer = null;


@@ -575,7 +571,7 @@ public class NonClientDecorView extends LinearLayout


                mRenderer.setContentDrawBounds(
                mRenderer.setContentDrawBounds(
                        mLastXOffset,
                        mLastXOffset,
                        mLastYOffset + mLastCaptionHeight,
                        mLastYOffset,
                        mLastXOffset + mLastContentWidth,
                        mLastXOffset + mLastContentWidth,
                        mLastYOffset + mLastCaptionHeight + mLastContentHeight);
                        mLastYOffset + mLastCaptionHeight + mLastContentHeight);
                // If this was the first call and changeWindowSizeLocked got already called prior
                // If this was the first call and changeWindowSizeLocked got already called prior
@@ -623,30 +619,20 @@ public class NonClientDecorView extends LinearLayout
            final int width = newBounds.width();
            final int width = newBounds.width();
            final int height = newBounds.height();
            final int height = newBounds.height();


            // Produce the draw calls.
            mFrameAndBackdropNode.setLeftTopRightBottom(left, top, left + width, top + height);
            // TODO(skuhne): Create a separate caption view which draws this. If the shadow should

            // be resized while the window resizes, this hierarchy needs to have the elevation.
            // Draw the caption and content backdrops in to our render node.
            // That said - it is probably no good idea to draw the shadow every time since it costs
            DisplayListCanvas canvas = mFrameAndBackdropNode.start(width, height);
            // a considerable time which we should rather spend for resizing the content and it does
            // barely show while the entire screen is moving.
            mFrameNode.setLeftTopRightBottom(left, top, left + width, top + mLastCaptionHeight);
            DisplayListCanvas canvas = mFrameNode.start(width, height);
            mCaptionBackgroundDrawable.setBounds(0, 0, left + width, top + mLastCaptionHeight);
            mCaptionBackgroundDrawable.setBounds(0, 0, left + width, top + mLastCaptionHeight);
            mCaptionBackgroundDrawable.draw(canvas);
            mCaptionBackgroundDrawable.draw(canvas);
            mFrameNode.end(canvas);

            mBackdropNode.setLeftTopRightBottom(left, top + mLastCaptionHeight, left + width,
                    top + height);


            // The backdrop: clear everything with the background. Clipping is done elsewhere.
            // The backdrop: clear everything with the background. Clipping is done elsewhere.
            canvas = mBackdropNode.start(width, height - mLastCaptionHeight);
            mResizingBackgroundDrawable.setBounds(0, mLastCaptionHeight, left + width, top + height);
            mResizingBackgroundDrawable.setBounds(0, 0, left + width, top + height);
            mResizingBackgroundDrawable.draw(canvas);
            mResizingBackgroundDrawable.draw(canvas);
            mBackdropNode.end(canvas);
            mFrameAndBackdropNode.end(canvas);


            // We need to render both rendered nodes explicitly.
            // We need to render the node explicitly
            mRenderer.drawRenderNode(mFrameNode);
            mRenderer.drawRenderNode(mFrameAndBackdropNode);
            mRenderer.drawRenderNode(mBackdropNode);


            reportDrawIfNeeded();
            reportDrawIfNeeded();
        }
        }
Loading