Loading res/layout/preference_list_fragment.xml +3 −19 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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> Loading src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java +26 −63 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading Loading @@ -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(); Loading @@ -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; Loading Loading @@ -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; } } Loading
res/layout/preference_list_fragment.xml +3 −19 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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> Loading
src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java +26 −63 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading Loading @@ -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(); Loading @@ -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; Loading Loading @@ -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; } }