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:
Edgar Wang
2021-10-19 02:09:26 +08:00
parent 90aabce9b4
commit f97f5f7005
2 changed files with 29 additions and 82 deletions

View File

@@ -20,7 +20,6 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/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:orientation="vertical"
android:layout_width="match_parent"
@@ -64,30 +63,15 @@
android:visibility="gone">
<com.google.android.material.tabs.TabLayout
android:background="@android:color/transparent"
android:id="@+id/tabs"
android:layout_width="match_parent"
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"/>
style="@style/SettingsLibTabsStyle"/>
<androidx.viewpager.widget.ViewPager
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
</androidx.viewpager2.widget.ViewPager2>
</LinearLayout>
</LinearLayout>

View File

@@ -23,12 +23,9 @@ import static android.content.Intent.EXTRA_USER_ID;
import android.annotation.IntDef;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -37,9 +34,9 @@ import android.widget.LinearLayout;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentStatePagerAdapter;
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.SettingsActivity;
@@ -47,10 +44,10 @@ import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Locale;
/**
* Base fragment class for profile settings.
@@ -111,14 +108,15 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
if (titleResId > 0) {
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 ViewPager viewPager = tabContainer.findViewById(R.id.view_pager);
final ViewPager2 viewPager = tabContainer.findViewById(R.id.view_pager);
viewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this));
final TabLayout tabs = tabContainer.findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
setupTabTextColor(tabs);
new TabLayoutMediator(tabs, viewPager,
(tab, position) -> tab.setText(getPageTitle(position))
).attach();
tabContainer.setVisibility(View.VISIBLE);
final TabLayout.Tab tab = tabs.getTabAt(selectedTab);
tab.select();
@@ -135,30 +133,6 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
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
public int getMetricsCategory() {
return METRICS_CATEGORY_UNKNOWN;
@@ -210,47 +184,36 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
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 Context mContext;
ViewPagerAdapter(ProfileSelectFragment fragment) {
super(fragment.getChildFragmentManager());
mContext = fragment.getContext();
super(fragment);
mChildFragments = fragment.getFragments();
}
@Override
public Fragment getItem(int position) {
return mChildFragments[convertPosition(position)];
public Fragment createFragment(int position) {
return mChildFragments[position];
}
@Override
public int getCount() {
public int getItemCount() {
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;
}
}