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

Commit f97f5f70 authored by Edgar Wang's avatar Edgar Wang
Browse files

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
parent 90aabce9
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;
    }
}