Bug 1366703 - Part 2: Implement tab menu strip visual refresh for Photon. r=walkingice

In about:home page, we would like to switch tab indicator color between normal and private mode.

MozReview-Commit-ID: FBhuPBaVvM3

--HG--
extra : rebase_source : 2d754db9bc45cf77f7f69f05aded883d991a9259
This commit is contained in:
jwu 2017-07-07 17:34:32 +08:00
Родитель 1d05f29242
Коммит bb9758cc2a
4 изменённых файлов: 84 добавлений и 16 удалений

Просмотреть файл

@ -132,6 +132,7 @@
<declare-styleable name="TabMenuStrip">
<attr name="strip" format="reference"/>
<attr name="stripColor" format="color" />
<attr name="tabsMarginLeft" format="dimension" />
<attr name="activeTextColor" format="color" />
<attr name="inactiveTextColor" format="color" />

Просмотреть файл

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:gecko="http://schemas.android.com/apk/res-auto">
<item android:color="@color/photon_highlight_private"
gecko:state_private="true"/>
<item android:color="@color/photon_highlight"/>
</selector>

Просмотреть файл

@ -13,13 +13,15 @@
android:layout_height="match_parent"
android:background="@android:color/white">
<org.mozilla.gecko.home.TabMenuStrip android:layout_width="match_parent"
android:layout_height="@dimen/tabs_strip_height"
android:background="@color/about_page_header_grey"
android:layout_gravity="top"
gecko:strip="@drawable/home_tab_menu_strip"
gecko:activeTextColor="@color/placeholder_grey"
gecko:inactiveTextColor="@color/tab_text_color"
gecko:tabsMarginLeft="@dimen/tab_strip_content_start" />
<org.mozilla.gecko.home.TabMenuStrip
android:layout_width="match_parent"
android:layout_height="@dimen/tabs_strip_height"
android:layout_gravity="top"
android:background="@color/about_page_header_grey"
gecko:activeTextColor="@color/placeholder_grey"
gecko:inactiveTextColor="@color/tab_text_color"
gecko:strip="@drawable/home_tab_menu_strip"
gecko:stripColor="@color/tab_menu_strip_color"
gecko:tabsMarginLeft="@dimen/tab_strip_content_start"/>
</org.mozilla.gecko.home.HomePager>

Просмотреть файл

@ -5,12 +5,18 @@
package org.mozilla.gecko.home;
import android.graphics.Color;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.ViewCompat;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.content.res.ColorStateList;
import org.mozilla.gecko.R;
import org.mozilla.gecko.Tab;
import org.mozilla.gecko.Tabs;
import org.mozilla.gecko.widget.themed.ThemedLinearLayout;
import android.content.Context;
import android.content.res.TypedArray;
@ -27,8 +33,8 @@ import android.widget.TextView;
* {@code TabMenuStripLayout} is the view that draws the {@code HomePager}
* tabs that are displayed in {@code TabMenuStrip}.
*/
class TabMenuStripLayout extends LinearLayout
implements View.OnFocusChangeListener {
class TabMenuStripLayout extends ThemedLinearLayout
implements View.OnFocusChangeListener, Tabs.OnTabsChangedListener {
private TabMenuStrip.OnTitleClickListener onTitleClickListener;
private Drawable strip;
@ -43,30 +49,52 @@ class TabMenuStripLayout extends LinearLayout
// This variable is used to predict the direction of scroll.
private float prevProgress;
private int tabContentStart;
private boolean titlebarFill;
private int activeTextColor;
private ColorStateList inactiveTextColor;
private final int tabContentStart;
private final boolean titlebarFill;
private final int activeTextColor;
private final ColorStateList inactiveTextColor;
private final ColorStateList stripColor;
TabMenuStripLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabMenuStrip);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabMenuStrip);
final int stripResId = a.getResourceId(R.styleable.TabMenuStrip_strip, -1);
titlebarFill = a.getBoolean(R.styleable.TabMenuStrip_titlebarFill, false);
tabContentStart = a.getDimensionPixelSize(R.styleable.TabMenuStrip_tabsMarginLeft, 0);
activeTextColor = a.getColor(R.styleable.TabMenuStrip_activeTextColor, R.color.text_and_tabs_tray_grey);
activeTextColor = a.getColor(R.styleable.TabMenuStrip_activeTextColor,
ResourcesCompat.getColor(getResources(), R.color.text_and_tabs_tray_grey, null));
inactiveTextColor = a.getColorStateList(R.styleable.TabMenuStrip_inactiveTextColor);
stripColor = a.getColorStateList(R.styleable.TabMenuStrip_stripColor);
a.recycle();
if (stripResId != -1) {
strip = getResources().getDrawable(stripResId);
if (stripColor != null) {
final int backgroundTintColor = stripColor.getColorForState(getDrawableState(), Color.TRANSPARENT);
DrawableCompat.setTint(strip, backgroundTintColor);
}
}
setWillNotDraw(false);
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
Tabs.registerOnTabsChangedListener(this);
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
Tabs.unregisterOnTabsChangedListener(this);
}
void onAddPagerView(String title) {
final TextView button = (TextView) LayoutInflater.from(getContext()).inflate(R.layout.tab_menu_strip, this, false);
button.setText(title.toUpperCase());
@ -251,6 +279,29 @@ class TabMenuStripLayout extends LinearLayout
this.onTitleClickListener = onTitleClickListener;
}
@Override
public void onTabChanged(Tab tab, Tabs.TabEvents msg, String data) {
if (tab == null) {
return;
}
if (msg == Tabs.TabEvents.SELECTED) {
setPrivateMode(tab.isPrivate());
}
}
@Override
public void setPrivateMode(boolean isPrivate) {
final boolean modeChanged = (isPrivateMode() != isPrivate);
super.setPrivateMode(isPrivate);
if (modeChanged && stripColor != null) {
final int backgroundTintColor = stripColor.getColorForState(getDrawableState(), Color.TRANSPARENT);
DrawableCompat.setTint(strip, backgroundTintColor);
}
}
private class ViewClickListener implements OnClickListener {
private final int mIndex;