Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab22c723 authored by Edgar Wang's avatar Edgar Wang Committed by Android (Google) Code Review
Browse files

Merge "Update workprofile TabLayout for Material Next style" into tm-dev

parents 54a9fd4e f97f5f70
Loading
Loading
Loading
Loading
+3 −19
Original line number Diff line number Diff line
@@ -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>
+26 −63
Original line number Diff line number Diff line
@@ -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;
    }
}