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 <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>

View File

@@ -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;
} }
} }