Update workprofile TabLayout for Material Next style
1. Upgrade ViewPager to ViewPager2 which provided better support. 2. Apply new TabLayout style Bug: 193249384 Bug: 195655281 Bug: 193249173 Bug: 179738624 Test: manual Change-Id: I905ee82f315316c2bf4b73bf5581423878e2c3e7
This commit is contained in:
@@ -20,7 +20,6 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:id="@+id/container_material"
|
android:id="@+id/container_material"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -64,30 +63,15 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<com.google.android.material.tabs.TabLayout
|
<com.google.android.material.tabs.TabLayout
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:id="@+id/tabs"
|
android:id="@+id/tabs"
|
||||||
android:layout_width="match_parent"
|
style="@style/SettingsLibTabsStyle"/>
|
||||||
android:layout_height="48dp"
|
|
||||||
android:layout_marginStart="24dp"
|
|
||||||
android:layout_marginEnd="24dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:layoutDirection="ltr"
|
|
||||||
app:tabMaxWidth="0dp"
|
|
||||||
app:tabGravity="fill"
|
|
||||||
app:tabMode="fixed"
|
|
||||||
app:tabIndicator="@drawable/tabs_indicator_background"
|
|
||||||
app:tabIndicatorColor="?androidprv:attr/colorAccentPrimaryVariant"
|
|
||||||
app:tabSelectedTextColor="@*android:color/accent_device_default"
|
|
||||||
app:tabTextAppearance="@style/TextAppearance.Tab"
|
|
||||||
app:tabTextColor="?android:attr/textColorSecondary"/>
|
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
<androidx.viewpager2.widget.ViewPager2
|
||||||
android:id="@+id/view_pager"
|
android:id="@+id/view_pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
</androidx.viewpager.widget.ViewPager>
|
</androidx.viewpager2.widget.ViewPager2>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@@ -23,12 +23,9 @@ import static android.content.Intent.EXTRA_USER_ID;
|
|||||||
import android.annotation.IntDef;
|
import android.annotation.IntDef;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -37,9 +34,9 @@ import android.widget.LinearLayout;
|
|||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.viewpager.widget.ViewPager;
|
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||||
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
@@ -47,10 +44,10 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base fragment class for profile settings.
|
* Base fragment class for profile settings.
|
||||||
@@ -111,14 +108,15 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
|
|||||||
if (titleResId > 0) {
|
if (titleResId > 0) {
|
||||||
activity.setTitle(titleResId);
|
activity.setTitle(titleResId);
|
||||||
}
|
}
|
||||||
final int selectedTab = convertPosition(getTabId(activity, getArguments()));
|
final int selectedTab = getTabId(activity, getArguments());
|
||||||
|
|
||||||
final View tabContainer = mContentView.findViewById(R.id.tab_container);
|
final View tabContainer = mContentView.findViewById(R.id.tab_container);
|
||||||
final ViewPager viewPager = tabContainer.findViewById(R.id.view_pager);
|
final ViewPager2 viewPager = tabContainer.findViewById(R.id.view_pager);
|
||||||
viewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this));
|
viewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this));
|
||||||
final TabLayout tabs = tabContainer.findViewById(R.id.tabs);
|
final TabLayout tabs = tabContainer.findViewById(R.id.tabs);
|
||||||
tabs.setupWithViewPager(viewPager);
|
new TabLayoutMediator(tabs, viewPager,
|
||||||
setupTabTextColor(tabs);
|
(tab, position) -> tab.setText(getPageTitle(position))
|
||||||
|
).attach();
|
||||||
tabContainer.setVisibility(View.VISIBLE);
|
tabContainer.setVisibility(View.VISIBLE);
|
||||||
final TabLayout.Tab tab = tabs.getTabAt(selectedTab);
|
final TabLayout.Tab tab = tabs.getTabAt(selectedTab);
|
||||||
tab.select();
|
tab.select();
|
||||||
@@ -135,30 +133,6 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
|
|||||||
return mContentView;
|
return mContentView;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TabLayout uses ColorStateList of 2 states, selected state and empty state.
|
|
||||||
* It's expected to use textColorSecondary default state color as empty state tabTextColor.
|
|
||||||
*
|
|
||||||
* However, TabLayout uses textColorSecondary by a not expected state.
|
|
||||||
* This method sets tabTextColor with the color of expected textColorSecondary state.
|
|
||||||
*/
|
|
||||||
private void setupTabTextColor(TabLayout tabLayout) {
|
|
||||||
final ColorStateList defaultColorStateList = tabLayout.getTabTextColors();
|
|
||||||
final ColorStateList resultColorStateList = new ColorStateList(
|
|
||||||
new int[][]{
|
|
||||||
new int[]{android.R.attr.state_selected},
|
|
||||||
new int[]{}
|
|
||||||
},
|
|
||||||
new int[] {
|
|
||||||
defaultColorStateList.getColorForState(new int[]{android.R.attr.state_selected},
|
|
||||||
Utils.getColorAttrDefaultColor(getContext(),
|
|
||||||
com.android.internal.R.attr.colorAccentPrimaryVariant)),
|
|
||||||
Utils.getColorAttrDefaultColor(getContext(), android.R.attr.textColorSecondary)
|
|
||||||
}
|
|
||||||
);
|
|
||||||
tabLayout.setTabTextColors(resultColorStateList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
return METRICS_CATEGORY_UNKNOWN;
|
return METRICS_CATEGORY_UNKNOWN;
|
||||||
@@ -210,47 +184,36 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
|
|||||||
return PERSONAL_TAB;
|
return PERSONAL_TAB;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ViewPagerAdapter extends FragmentStatePagerAdapter {
|
private CharSequence getPageTitle(int position) {
|
||||||
|
final DevicePolicyManager devicePolicyManager =
|
||||||
|
getContext().getSystemService(DevicePolicyManager.class);
|
||||||
|
|
||||||
|
if (position == WORK_TAB) {
|
||||||
|
return devicePolicyManager.getString(WORK_CATEGORY_HEADER,
|
||||||
|
() -> getContext().getString(R.string.category_work));
|
||||||
|
}
|
||||||
|
|
||||||
|
return devicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
|
||||||
|
() -> getContext().getString(R.string.category_personal));
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ViewPagerAdapter extends FragmentStateAdapter {
|
||||||
|
|
||||||
private final Fragment[] mChildFragments;
|
private final Fragment[] mChildFragments;
|
||||||
private final Context mContext;
|
|
||||||
|
|
||||||
ViewPagerAdapter(ProfileSelectFragment fragment) {
|
ViewPagerAdapter(ProfileSelectFragment fragment) {
|
||||||
super(fragment.getChildFragmentManager());
|
super(fragment);
|
||||||
mContext = fragment.getContext();
|
|
||||||
mChildFragments = fragment.getFragments();
|
mChildFragments = fragment.getFragments();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Fragment getItem(int position) {
|
public Fragment createFragment(int position) {
|
||||||
return mChildFragments[convertPosition(position)];
|
return mChildFragments[position];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getItemCount() {
|
||||||
return mChildFragments.length;
|
return mChildFragments.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public CharSequence getPageTitle(int position) {
|
|
||||||
DevicePolicyManager devicePolicyManager =
|
|
||||||
mContext.getSystemService(DevicePolicyManager.class);
|
|
||||||
|
|
||||||
if (convertPosition(position) == WORK_TAB) {
|
|
||||||
return devicePolicyManager.getString(WORK_CATEGORY_HEADER,
|
|
||||||
() -> mContext.getString(R.string.category_work));
|
|
||||||
}
|
|
||||||
|
|
||||||
return devicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
|
|
||||||
() -> mContext.getString(R.string.category_personal));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int convertPosition(int index) {
|
|
||||||
if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
|
|
||||||
== View.LAYOUT_DIRECTION_RTL) {
|
|
||||||
return 1 - index;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user