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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user