OSDN Git Service

Renamed NonClientDecorView to DecorCaptionView
authorWale Ogunwale <ogunwale@google.com>
Wed, 18 Nov 2015 19:44:10 +0000 (11:44 -0800)
committerWale Ogunwale <ogunwale@google.com>
Wed, 18 Nov 2015 19:44:10 +0000 (11:44 -0800)
DecorCaptionView better describes what it does now which is to
display the caption area and control buttons within it.

Change-Id: I6b641d6b117bb8f03656bff93702fc093160851d

core/java/com/android/internal/policy/DecorView.java
core/java/com/android/internal/widget/DecorCaptionView.java [moved from core/java/com/android/internal/widget/NonClientDecorView.java with 82% similarity]
core/res/res/drawable/decor_caption_title.xml [moved from core/res/res/drawable/non_client_decor_title.xml with 84% similarity]
core/res/res/drawable/decor_caption_title_focused.xml [moved from core/res/res/drawable/non_client_decor_title_focused.xml with 100% similarity]
core/res/res/drawable/decor_caption_title_unfocused.xml [moved from core/res/res/drawable/non_client_decor_title_unfocused.xml with 100% similarity]
core/res/res/layout/decor_caption_dark.xml [moved from core/res/res/layout/non_client_decor_dark.xml with 90% similarity]
core/res/res/layout/decor_caption_light.xml [moved from core/res/res/layout/non_client_decor_light.xml with 90% similarity]
core/res/res/values/symbols.xml

index 4b88dc9..4c221fc 100644 (file)
@@ -25,8 +25,8 @@ import com.android.internal.view.menu.MenuDialogHelper;
 import com.android.internal.view.menu.MenuPopupHelper;
 import com.android.internal.widget.ActionBarContextView;
 import com.android.internal.widget.BackgroundFallback;
+import com.android.internal.widget.DecorCaptionView;
 import com.android.internal.widget.FloatingToolbar;
-import com.android.internal.widget.NonClientDecorView;
 
 import android.animation.Animator;
 import android.animation.ObjectAnimator;
@@ -113,8 +113,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
 
     private final Rect mFrameOffsets = new Rect();
 
-    // True if a non client area decor exists.
-    private boolean mHasNonClientDecor = false;
+    private boolean mHasCaption = false;
 
     private boolean mChanging;
 
@@ -173,18 +172,18 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     private Rect mTempRect;
     private Rect mOutsets = new Rect();
 
-    // This is the non client decor view for the window, containing the caption and window control
+    // This is the caption view for the window, containing the caption and window control
     // buttons. The visibility of this decor depends on the workspace and the window type.
     // If the window type does not require such a view, this member might be null.
-    NonClientDecorView mNonClientDecorView;
+    DecorCaptionView mDecorCaptionView;
 
-    // The non client decor needs to adapt to the used workspace. Since querying and changing the
-    // workspace is expensive, this is the workspace value the window is currently set up for.
-    int mWorkspaceId;
+    // Stack window is currently in. Since querying and changing the stack is expensive,
+    // this is the stack value the window is currently set up for.
+    int mStackId;
 
     private boolean mWindowResizeCallbacksAdded = false;
 
-    public BackdropFrameRenderer mBackdropFrameRenderer = null;
+    BackdropFrameRenderer mBackdropFrameRenderer = null;
     private Drawable mResizingBackgroundDrawable;
     private Drawable mCaptionBackgroundDrawable;
 
@@ -203,7 +202,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         setWindow(window);
     }
 
-    public void setBackgroundFallback(int resId) {
+    void setBackgroundFallback(int resId) {
         mBackgroundFallback.setDrawable(resId != 0 ? getContext().getDrawable(resId) : null);
         setWillNotDraw(getBackground() == null && !mBackgroundFallback.hasFallback());
     }
@@ -363,10 +362,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     @Override
     public boolean onInterceptTouchEvent(MotionEvent event) {
         int action = event.getAction();
-        if (mHasNonClientDecor && isShowingCaption()) {
-            // Don't dispatch ACTION_DOWN to the non client decor if the window is
-            // resizable and the event was (starting) outside the window.
-            // Window resizing events should be handled by WindowManager.
+        if (mHasCaption && isShowingCaption()) {
+            // Don't dispatch ACTION_DOWN to the captionr if the window is resizable and the event
+            // was (starting) outside the window. Window resizing events should be handled by
+            // WindowManager.
             // TODO: Investigate how to handle the outside touch in window manager
             //       without generating these events.
             //       Currently we receive these because we need to enlarge the window's
@@ -798,11 +797,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         }
     }
 
-    public void startChanging() {
+    void startChanging() {
         mChanging = true;
     }
 
-    public void finishChanging() {
+    void finishChanging() {
         mChanging = false;
         drawableChanged();
     }
@@ -1155,7 +1154,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         invalidate();
 
         int opacity = PixelFormat.OPAQUE;
-        if (windowHasShadow()) {
+        if (ActivityManager.StackId.hasWindowShadow(mStackId)) {
             // If the window has a shadow, it must be translucent.
             opacity = PixelFormat.TRANSLUCENT;
         } else{
@@ -1514,38 +1513,19 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     }
 
     /**
-     * Informs the decor if a non client decor is attached and visible.
+     * Informs the decor if the caption is attached and visible.
      * @param attachedAndVisible true when the decor is visible.
-     * Note that this will even be called if there is no non client decor.
+     * Note that this will even be called if there is no caption.
      **/
-    void enableNonClientDecor(boolean attachedAndVisible) {
-        if (mHasNonClientDecor != attachedAndVisible) {
-            mHasNonClientDecor = attachedAndVisible;
+    void enableCaption(boolean attachedAndVisible) {
+        if (mHasCaption != attachedAndVisible) {
+            mHasCaption = attachedAndVisible;
             if (getForeground() != null) {
                 drawableChanged();
             }
         }
     }
 
-    /**
-     * Returns true if the window has a non client decor.
-     * @return If there is a non client decor - even if it is not visible.
-     **/
-    private boolean windowHasNonClientDecor() {
-        return mHasNonClientDecor;
-    }
-
-    /**
-     * Returns true if the Window is free floating and has a shadow (although at some times
-     * it might not be displaying it, e.g. during a resize). Note that non overlapping windows
-     * do not have a shadow since it could not be seen anyways (a small screen / tablet
-     * "tiles" the windows side by side but does not overlap them).
-     * @return Returns true when the window has a shadow created by the non client decor.
-     **/
-    private boolean windowHasShadow() {
-        return windowHasNonClientDecor() && ActivityManager.StackId.hasWindowShadow(mWorkspaceId);
-    }
-
     void setWindow(PhoneWindow phoneWindow) {
         mWindow = phoneWindow;
         Context context = getContext();
@@ -1556,40 +1536,40 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     }
 
     void onConfigurationChanged() {
-        int workspaceId = getWorkspaceId();
-        if (mNonClientDecorView != null) {
-            if (mWorkspaceId != workspaceId) {
-                mWorkspaceId = workspaceId;
+        int workspaceId = getStackId();
+        if (mDecorCaptionView != null) {
+            if (mStackId != workspaceId) {
+                mStackId = workspaceId;
                 // We might have to change the kind of surface before we do anything else.
-                mNonClientDecorView.onConfigurationChanged(
-                        ActivityManager.StackId.hasWindowDecor(mWorkspaceId));
-                enableNonClientDecor(ActivityManager.StackId.hasWindowDecor(workspaceId));
+                mDecorCaptionView.onConfigurationChanged(
+                        ActivityManager.StackId.hasWindowDecor(mStackId));
+                enableCaption(ActivityManager.StackId.hasWindowDecor(workspaceId));
             }
         }
         initializeElevation();
     }
 
     View onResourcesLoaded(LayoutInflater inflater, int layoutResource) {
-        mWorkspaceId = getWorkspaceId();
+        mStackId = getStackId();
 
         mResizingBackgroundDrawable = getResizingBackgroundDrawable(
                 mWindow.mBackgroundResource, mWindow.mBackgroundFallbackResource);
         mCaptionBackgroundDrawable =
-                getContext().getDrawable(R.drawable.non_client_decor_title_focused);
+                getContext().getDrawable(R.drawable.decor_caption_title_focused);
 
         if (mBackdropFrameRenderer != null) {
             mBackdropFrameRenderer.onResourcesLoaded(
                     this, mResizingBackgroundDrawable, mCaptionBackgroundDrawable);
         }
 
-        mNonClientDecorView = createNonClientDecorView(inflater);
+        mDecorCaptionView = createDecorCaptionView(inflater);
         final View root = inflater.inflate(layoutResource, null);
-        if (mNonClientDecorView != null) {
-            if (mNonClientDecorView.getParent() == null) {
-                addView(mNonClientDecorView,
+        if (mDecorCaptionView != null) {
+            if (mDecorCaptionView.getParent() == null) {
+                addView(mDecorCaptionView,
                         new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
             }
-            mNonClientDecorView.addView(root,
+            mDecorCaptionView.addView(root,
                     new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
         } else {
             addView(root, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
@@ -1599,47 +1579,46 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         return root;
     }
 
-    // Free floating overlapping windows require a non client decor with a caption and shadow..
-    private NonClientDecorView createNonClientDecorView(LayoutInflater inflater) {
-        NonClientDecorView nonClientDecorView = null;
-        for (int i = getChildCount() - 1; i >= 0 && nonClientDecorView == null; i--) {
+    // Free floating overlapping windows require a caption.
+    private DecorCaptionView createDecorCaptionView(LayoutInflater inflater) {
+        DecorCaptionView DecorCaptionView = null;
+        for (int i = getChildCount() - 1; i >= 0 && DecorCaptionView == null; i--) {
             View view = getChildAt(i);
-            if (view instanceof NonClientDecorView) {
+            if (view instanceof DecorCaptionView) {
                 // The decor was most likely saved from a relaunch - so reuse it.
-                nonClientDecorView = (NonClientDecorView) view;
+                DecorCaptionView = (DecorCaptionView) view;
                 removeViewAt(i);
             }
         }
         final WindowManager.LayoutParams attrs = mWindow.getAttributes();
         final boolean isApplication = attrs.type == TYPE_BASE_APPLICATION ||
                 attrs.type == TYPE_APPLICATION;
-        // Only a non floating application window on one of the allowed workspaces can get a non
-        // client decor.
+        // Only a non floating application window on one of the allowed workspaces can get a caption
         if (!mWindow.isFloating() && isApplication
-                && ActivityManager.StackId.hasWindowDecor(mWorkspaceId)) {
+                && ActivityManager.StackId.hasWindowDecor(mStackId)) {
             // Dependent on the brightness of the used title we either use the
             // dark or the light button frame.
-            if (nonClientDecorView == null) {
+            if (DecorCaptionView == null) {
                 Context context = getContext();
                 TypedValue value = new TypedValue();
                 context.getTheme().resolveAttribute(R.attr.colorPrimary, value, true);
                 inflater = inflater.from(context);
                 if (Color.luminance(value.data) < 0.5) {
-                    nonClientDecorView = (NonClientDecorView) inflater.inflate(
-                            R.layout.non_client_decor_dark, null);
+                    DecorCaptionView = (DecorCaptionView) inflater.inflate(
+                            R.layout.decor_caption_dark, null);
                 } else {
-                    nonClientDecorView = (NonClientDecorView) inflater.inflate(
-                            R.layout.non_client_decor_light, null);
+                    DecorCaptionView = (DecorCaptionView) inflater.inflate(
+                            R.layout.decor_caption_light, null);
                 }
             }
-            nonClientDecorView.setPhoneWindow(mWindow, true /*showDecor*/);
+            DecorCaptionView.setPhoneWindow(mWindow, true /*showDecor*/);
         } else {
-            nonClientDecorView = null;
+            DecorCaptionView = null;
         }
 
-        // Tell the decor if it has a visible non client decor.
-        enableNonClientDecor(nonClientDecorView != null);
-        return nonClientDecorView;
+        // Tell the decor if it has a visible caption.
+        enableCaption(DecorCaptionView != null);
+        return DecorCaptionView;
     }
 
     /**
@@ -1670,12 +1649,12 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     }
 
     /**
-     * Returns the Id of the workspace which contains this window.
-     * Note that if no workspace can be determined - which usually means that it was not
-     * created for an activity - the fullscreen workspace ID will be returned.
-     * @return Returns the workspace stack id which contains this window.
+     * Returns the Id of the stack which contains this window.
+     * Note that if no stack can be determined - which usually means that it was not
+     * created for an activity - the fullscreen stack ID will be returned.
+     * @return Returns the stack id which contains this window.
      **/
-    private int getWorkspaceId() {
+    private int getStackId() {
         int workspaceId = INVALID_STACK_ID;
         final Window.WindowControllerCallback callback = mWindow.getWindowControllerCallback();
         if (callback != null) {
@@ -1692,12 +1671,12 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     }
 
     void clearContentView() {
-        if (mNonClientDecorView != null) {
-            if (mNonClientDecorView.getChildCount() > 1) {
-                mNonClientDecorView.removeViewAt(1);
+        if (mDecorCaptionView != null) {
+            if (mDecorCaptionView.getChildCount() > 1) {
+                mDecorCaptionView.removeViewAt(1);
             }
         } else {
-            // This window doesn't have non client decor, so we need to just remove the
+            // This window doesn't have caption, so we need to just remove the
             // children of the decor view.
             removeAllViews();
         }
@@ -1782,7 +1761,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
         final boolean wasAdjustedForStack = mElevationAdjustedForStack;
         // Do not use a shadow when we are in resizing mode (mBackdropFrameRenderer not null)
         // since the shadow is bound to the content size and not the target size.
-        if (ActivityManager.StackId.hasWindowShadow(mWorkspaceId)
+        if (ActivityManager.StackId.hasWindowShadow(mStackId)
                 && mBackdropFrameRenderer == null) {
             elevation = hasWindowFocus() ?
                     DECOR_SHADOW_FOCUSED_HEIGHT_IN_DIP : DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP;
@@ -1806,11 +1785,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     }
 
     boolean isShowingCaption() {
-        return mNonClientDecorView != null && mNonClientDecorView.isShowingDecor();
+        return mDecorCaptionView != null && mDecorCaptionView.isCaptionShowing();
     }
 
     int getCaptionHeight() {
-        return isShowingCaption() ? mNonClientDecorView.getDecorCaptionHeight() : 0;
+        return isShowingCaption() ? mDecorCaptionView.getCaptionHeight() : 0;
     }
 
     /**
@@ -33,9 +33,8 @@ import com.android.internal.R;
 import com.android.internal.policy.PhoneWindow;
 
 /**
- * This class represents the special screen elements to control a window on free form
- * environment. All these screen elements are added in the "non client area" which is the area of
- * the window which is handled by the OS and not the application.
+ * This class represents the special screen elements to control a window on freeform
+ * environment.
  * As such this class handles the following things:
  * <ul>
  * <li>The caption, containing the system buttons like maximize, close and such as well as
@@ -46,18 +45,16 @@ import com.android.internal.policy.PhoneWindow;
  * Note: At this time the application can change various attributes of the DecorView which
  * will break things (in settle/unexpected ways):
  * <ul>
- * <li>setElevation</li>
  * <li>setOutlineProvider</li>
  * <li>setSurfaceFormat</li>
  * <li>..</li>
  * </ul>
- * This will be mitigated once b/22527834 will be addressed.
  */
-public class NonClientDecorView extends LinearLayout
+public class DecorCaptionView extends LinearLayout
         implements View.OnClickListener, View.OnTouchListener {
-    private final static String TAG = "NonClientDecorView";
+    private final static String TAG = "DecorCaptionView";
     private PhoneWindow mOwner = null;
-    private boolean mShowDecor = false;
+    private boolean mShow = false;
 
     // True if the window is being dragged.
     private boolean mDragging = false;
@@ -65,21 +62,21 @@ public class NonClientDecorView extends LinearLayout
     // True when the left mouse button got released while dragging.
     private boolean mLeftMouseButtonReleased;
 
-    public NonClientDecorView(Context context) {
+    public DecorCaptionView(Context context) {
         super(context);
     }
 
-    public NonClientDecorView(Context context, AttributeSet attrs) {
+    public DecorCaptionView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public NonClientDecorView(Context context, AttributeSet attrs, int defStyle) {
+    public DecorCaptionView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
     }
 
-    public void setPhoneWindow(PhoneWindow owner, boolean showDecor) {
+    public void setPhoneWindow(PhoneWindow owner, boolean show) {
         mOwner = owner;
-        mShowDecor = showDecor;
+        mShow = show;
         updateCaptionVisibility();
         // By changing the outline provider to BOUNDS, the window can remove its
         // background without removing the shadow.
@@ -96,8 +93,8 @@ public class NonClientDecorView extends LinearLayout
         // input device we are listening to.
         switch (e.getActionMasked()) {
             case MotionEvent.ACTION_DOWN:
-                if (!mShowDecor) {
-                    // When there is no decor we should not react to anything.
+                if (!mShow) {
+                    // When there is no caption we should not react to anything.
                     return false;
                 }
                 // A drag action is started if we aren't dragging already and the starting event is
@@ -136,11 +133,11 @@ public class NonClientDecorView extends LinearLayout
     }
 
     /**
-     * The phone window configuration has changed and the decor needs to be updated.
-     * @param showDecor True if the decor should be shown.
+     * The phone window configuration has changed and the caption needs to be updated.
+     * @param show True if the caption should be shown.
      */
-    public void onConfigurationChanged(boolean showDecor) {
-        mShowDecor = showDecor;
+    public void onConfigurationChanged(boolean show) {
+        mShow = show;
         updateCaptionVisibility();
     }
 
@@ -157,7 +154,7 @@ public class NonClientDecorView extends LinearLayout
     public void addView(View child, int index, ViewGroup.LayoutParams params) {
         // Make sure that we never get more then one client area in our view.
         if (index >= 2 || getChildCount() >= 2) {
-            throw new IllegalStateException("NonClientDecorView can only handle 1 client view");
+            throw new IllegalStateException("DecorCaptionView can only handle 1 client view");
         }
         super.addView(child, index, params);
     }
@@ -176,8 +173,8 @@ public class NonClientDecorView extends LinearLayout
      * Updates the visibility of the caption.
      **/
     private void updateCaptionVisibility() {
-        // Don't show the decor if the window has e.g. entered full screen.
-        boolean invisible = isFillingScreen() || !mShowDecor;
+        // Don't show the caption if the window has e.g. entered full screen.
+        boolean invisible = isFillingScreen() || !mShow;
         View caption = getChildAt(0);
         caption.setVisibility(invisible ? GONE : VISIBLE);
         caption.setOnTouchListener(this);
@@ -197,11 +194,11 @@ public class NonClientDecorView extends LinearLayout
         }
     }
 
-    public boolean isShowingDecor() {
-        return mShowDecor;
+    public boolean isCaptionShowing() {
+        return mShow;
     }
 
-    public int getDecorCaptionHeight() {
+    public int getCaptionHeight() {
         final View caption = getChildAt(0);
         return (caption != null) ? caption.getHeight() : 0;
     }
@@ -16,6 +16,6 @@
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_window_focused="true"
-          android:drawable="@drawable/non_client_decor_title_focused" />
-    <item android:drawable="@drawable/non_client_decor_title_unfocused" />
+          android:drawable="@drawable/decor_caption_title_focused" />
+    <item android:drawable="@drawable/decor_caption_title_unfocused" />
 </selector>
similarity index 90%
rename from core/res/res/layout/non_client_decor_dark.xml
rename to core/res/res/layout/decor_caption_dark.xml
index 40b8960..86d68af 100644 (file)
@@ -17,7 +17,7 @@
 */
 -->
 
-<com.android.internal.widget.NonClientDecorView xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.internal.widget.DecorCaptionView xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -26,7 +26,7 @@
         android:layout_width="match_parent"
         android:layout_gravity="end"
         android:layout_height="wrap_content"
-        android:background="@drawable/non_client_decor_title"
+        android:background="@drawable/decor_caption_title"
         android:focusable="false"
         android:descendantFocusability="blocksDescendants" >
         <LinearLayout
@@ -53,4 +53,4 @@
             android:contentDescription="@string/close_button_text"
             android:background="@drawable/decor_close_button_dark" />
     </LinearLayout>
-</com.android.internal.widget.NonClientDecorView>
+</com.android.internal.widget.DecorCaptionView>
similarity index 90%
rename from core/res/res/layout/non_client_decor_light.xml
rename to core/res/res/layout/decor_caption_light.xml
index c75d526..ee03545 100644 (file)
@@ -17,7 +17,7 @@
 */
 -->
 
-<com.android.internal.widget.NonClientDecorView xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.internal.widget.DecorCaptionView xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -26,7 +26,7 @@
         android:layout_width="match_parent"
         android:layout_gravity="end"
         android:layout_height="wrap_content"
-        android:background="@drawable/non_client_decor_title"
+        android:background="@drawable/decor_caption_title"
         android:focusable="false"
         android:descendantFocusability="blocksDescendants" >
         <LinearLayout
@@ -53,4 +53,4 @@
             android:contentDescription="@string/close_button_text"
             android:background="@drawable/decor_close_button_light" />
     </LinearLayout>
-</com.android.internal.widget.NonClientDecorView>
+</com.android.internal.widget.DecorCaptionView>
index 6820c25..4a06d76 100644 (file)
   <java-symbol type="id" name="maximize_window" />
   <java-symbol type="id" name="close_window" />
   <java-symbol type="id" name="client_decor_placeholder" />
-  <java-symbol type="layout" name="non_client_decor_light" />
-  <java-symbol type="layout" name="non_client_decor_dark" />
-  <java-symbol type="drawable" name="non_client_decor_title_focused" />
+  <java-symbol type="layout" name="decor_caption_light" />
+  <java-symbol type="layout" name="decor_caption_dark" />
+  <java-symbol type="drawable" name="decor_caption_title_focused" />
 
   <!-- From TelephonyProvider -->
   <java-symbol type="xml" name="apns" />