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

Commit 0e94b515 authored by Adam Powell's avatar Adam Powell
Browse files

Add subtitles for action bars and context modes.

Fix an issue where context mode content was cleared before animating out.

Change-Id: Ie7a065e65bc18e3da32de07543d0f71d2a2d648c
parent bd800f40
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -19620,6 +19620,43 @@
<parameter name="title" type="java.lang.CharSequence">
</parameter>
</method>
<method name="setStandardNavigationMode"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="setSubtitle"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="subtitle" type="java.lang.CharSequence">
</parameter>
</method>
<method name="setTitle"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="title" type="java.lang.CharSequence">
</parameter>
</method>
<method name="startContextMode"
 return="void"
 abstract="true"
+26 −2
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ public abstract class ActionBar {
     * good for extended descriptions of activity state.
     *
     * @param title The action bar's title. null is treated as an empty string.
     * @param subtitle The action bar's subtitle. null is treated as an empty string.
     * @param subtitle The action bar's subtitle. null will remove the subtitle entirely.
     */
    public abstract void setStandardNavigationMode(CharSequence title, CharSequence subtitle);

@@ -111,12 +111,36 @@ public abstract class ActionBar {
     * Set the action bar into standard navigation mode, supplying a title and subtitle.
     * 
     * Standard navigation mode is default. The title is automatically set to the
     * name of your Activity.
     * name of your Activity on startup if an action bar is present.
     *
     * @param title The action bar's title. null is treated as an empty string.
     */
    public abstract void setStandardNavigationMode(CharSequence title);

    /**
     * Set the action bar into standard navigation mode, using the currently set title
     * and/or subtitle.
     *
     * Standard navigation mode is default. The title is automatically set to the name of
     * your Activity on startup if an action bar is present.
     */
    public abstract void setStandardNavigationMode();

    /**
     * Set the action bar's title. This will only be displayed in standard navigation mode.
     *
     * @param title Title to set
     */
    public abstract void setTitle(CharSequence title);

    /**
     * Set the action bar's subtitle. This will only be displayed in standard navigation mode.
     * Set to null to disable the subtitle entirely.
     *
     * @param subtitle Subtitle to set
     */
    public abstract void setSubtitle(CharSequence subtitle);

    /**
     * Set display options. This changes all display option bits at once. To change
     * a limited subset of display options, see {@link #setDisplayOptions(int, int)}.
+34 −10
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.android.internal.widget.ActionBarView;

import android.app.ActionBar;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -53,6 +54,16 @@ public class ActionBarImpl extends ActionBar {
    
    private int mContextDisplayMode;

    final Handler mHandler = new Handler();
    final Runnable mCloseContext = new Runnable() {
        public void run() {
            mUpperContextView.closeMode();
            if (mLowerContextView != null) {
                mLowerContextView.removeAllViews();
            }
        }
    };

    public ActionBarImpl(View decor) {
        mActionView = (ActionBarView) decor.findViewById(com.android.internal.R.id.action_bar);
        mUpperContextView = (ActionBarContextView) decor.findViewById(
@@ -82,6 +93,11 @@ public class ActionBarImpl extends ActionBar {
        mActionView.setDropdownAdapter(adapter);
    }

    public void setStandardNavigationMode() {
        mActionView.setNavigationMode(NAVIGATION_MODE_STANDARD);
        mActionView.setCallback(null);
    }

    public void setStandardNavigationMode(CharSequence title) {
        setStandardNavigationMode(title, null);
    }
@@ -93,6 +109,14 @@ public class ActionBarImpl extends ActionBar {
        mActionView.setCallback(null);
    }

    public void setTitle(CharSequence title) {
        mActionView.setTitle(title);
    }

    public void setSubtitle(CharSequence subtitle) {
        mActionView.setSubtitle(subtitle);
    }

    public void setDisplayOptions(int options) {
        mActionView.setDisplayOptions(options);
    }
@@ -170,11 +194,11 @@ public class ActionBarImpl extends ActionBar {
        @Override
        public void finish() {
            mCallback.onDestroyContextMode(this);
            mUpperContextView.closeMode();
            if (mLowerContextView != null) {
                mLowerContextView.removeAllViews();
            }
            mAnimatorView.setDisplayedChild(NORMAL_VIEW);

            // Clear out the context mode views after the animation finishes
            mHandler.postDelayed(mCloseContext, mAnimatorView.getOutAnimation().getDuration());

            if (mLowerContextView != null && mLowerContextView.getVisibility() != View.GONE) {
                // TODO Animate this
                mLowerContextView.setVisibility(View.GONE);
+40 −29
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
@@ -47,7 +48,9 @@ public class ActionBarContextView extends ViewGroup {
    
    private ImageButton mCloseButton;
    private View mCustomView;
    private LinearLayout mTitleLayout;
    private TextView mTitleView;
    private TextView mSubtitleView;
    private Drawable mCloseDrawable;
    
    public ActionBarContextView(Context context) {
@@ -80,9 +83,9 @@ public class ActionBarContextView extends ViewGroup {
            removeView(mCustomView);
        }
        mCustomView = view;
        if (mTitleView != null) {
            removeView(mTitleView);
            mTitleView = null;
        if (mTitleLayout != null) {
            removeView(mTitleLayout);
            mTitleLayout = null;
        }
        if (view != null) {
            addView(view);
@@ -92,26 +95,34 @@ public class ActionBarContextView extends ViewGroup {

    public void setTitle(CharSequence title) {
        mTitle = title;
        if (mTitleView == null) {
        initTitle();
    }

    public void setSubtitle(CharSequence subtitle) {
        mSubtitle = subtitle;
        initTitle();
    }

    private void initTitle() {
        if (mTitleLayout == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            mTitleView = (TextView) inflater.inflate(R.layout.action_bar_title_item, null);
            mTitleView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));
            if (title != null) {
                mTitleView.setText(title);
            mTitleLayout = (LinearLayout) inflater.inflate(R.layout.action_bar_title_item, null);
            mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title);
            mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle);
            if (mTitle != null) {
                mTitleView.setText(mTitle);
            }
            addView(mTitleView);
        } else {
            mTitleView.setText(title);
            if (mTitleView.getParent() == null) {
                addView(mTitleView);
            if (mSubtitle != null) {
                mSubtitleView.setText(mSubtitle);
            }
            addView(mTitleLayout);
        } else {
            mTitleView.setText(mTitle);
            mSubtitleView.setText(mSubtitle);
            if (mTitleLayout.getParent() == null) {
                addView(mTitleLayout);
            }
        }
    
    public void setSubtitle(CharSequence subtitle) {
        mSubtitle = subtitle;
        // TODO add subtitle support
    }

    public void initForMode(final ActionBar.ContextMode mode) {
@@ -185,15 +196,15 @@ public class ActionBarContextView extends ViewGroup {
                    childSpecHeight, itemMargin);
        }

        if (mTitleView != null && mCustomView == null) {
            availableWidth = measureChildView(mTitleView, availableWidth,
        if (mTitleLayout != null && mCustomView == null) {
            availableWidth = measureChildView(mTitleLayout, availableWidth,
                    childSpecHeight, itemMargin);
        }

        final int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = getChildAt(i);
            if (child == mCloseButton || child == mTitleView || child == mCustomView) {
            if (child == mCloseButton || child == mTitleLayout || child == mCustomView) {
                continue;
            }
            
@@ -219,8 +230,8 @@ public class ActionBarContextView extends ViewGroup {
            x += positionChild(mCloseButton, x, y, contentHeight);
        }
        
        if (mTitleView != null && mCustomView == null) {
            x += positionChild(mTitleView, x, y, contentHeight) + itemMargin;
        if (mTitleLayout != null && mCustomView == null) {
            x += positionChild(mTitleLayout, x, y, contentHeight) + itemMargin;
        }
        
        if (mCustomView != null) {
@@ -232,7 +243,7 @@ public class ActionBarContextView extends ViewGroup {
        final int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = getChildAt(i);
            if (child == mCloseButton || child == mTitleView || child == mCustomView) {
            if (child == mCloseButton || child == mTitleLayout || child == mCustomView) {
                continue;
            }

+18 −10
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
@@ -80,6 +81,7 @@ public class ActionBarView extends ViewGroup {

    private ImageView mIconView;
    private ImageView mLogoView;
    private LinearLayout mTitleLayout;
    private TextView mTitleView;
    private TextView mSubtitleView;
    private Spinner mSpinner;
@@ -250,9 +252,11 @@ public class ActionBarView extends ViewGroup {
        if (mode != oldMode) {
            switch (oldMode) {
            case ActionBar.NAVIGATION_MODE_STANDARD:
                if (mTitleView != null) {
                    removeView(mTitleView);
                if (mTitleLayout != null) {
                    removeView(mTitleLayout);
                    mTitleLayout = null;
                    mTitleView = null;
                    mSubtitleView = null;
                }
                break;
            case ActionBar.NAVIGATION_MODE_DROPDOWN_LIST:
@@ -361,13 +365,17 @@ public class ActionBarView extends ViewGroup {
    
    private void initTitle() {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        mTitleView = (TextView) inflater.inflate(R.layout.action_bar_title_item, null);
        mTitleView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));
        mTitleLayout = (LinearLayout) inflater.inflate(R.layout.action_bar_title_item, null);
        mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title);
        mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle);
        if (mTitle != null) {
            mTitleView.setText(mTitle);
        }
        addView(mTitleView);
        if (mSubtitle != null) {
            mSubtitleView.setText(mSubtitle);
            mSubtitleView.setVisibility(VISIBLE);
        }
        addView(mTitleLayout);
    }

    @Override
@@ -404,8 +412,8 @@ public class ActionBarView extends ViewGroup {
        
        switch (mNavigationMode) {
        case ActionBar.NAVIGATION_MODE_STANDARD:
            if (mTitleView != null) {
                measureChildView(mTitleView, availableWidth, childSpecHeight, mSpacing);
            if (mTitleLayout != null) {
                measureChildView(mTitleLayout, availableWidth, childSpecHeight, mSpacing);
            }
            break;
        case ActionBar.NAVIGATION_MODE_DROPDOWN_LIST:
@@ -452,8 +460,8 @@ public class ActionBarView extends ViewGroup {
        
        switch (mNavigationMode) {
        case ActionBar.NAVIGATION_MODE_STANDARD:
            if (mTitleView != null) {
                x += positionChild(mTitleView, x, y, contentHeight) + mSpacing;
            if (mTitleLayout != null) {
                x += positionChild(mTitleLayout, x, y, contentHeight) + mSpacing;
            }
            break;
        case ActionBar.NAVIGATION_MODE_DROPDOWN_LIST:
Loading