Commit 9e57f5e5 authored by Peter Kotwicz's avatar Peter Kotwicz Committed by Chromium LUCI CQ

[Refactor] Migrate "Clear Browsing Data" dialog to viewpager2

The motivation for this change is FragmentPagerAdapter being deprecated.

BUG=1162839

Binary-size: viewpager2 already in internal Chrome build
Change-Id: If223fdea7ec5003681d4183ad764314b18c83d64
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2605476
Commit-Queue: Peter Kotwicz <pkotwicz@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842829}
parent b24bc132
......@@ -515,6 +515,7 @@ android_library("chrome_java") {
"//third_party/android_deps:androidx_mediarouter_mediarouter_java",
"//third_party/android_deps:androidx_preference_preference_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//third_party/android_deps:androidx_viewpager2_viewpager2_java",
"//third_party/android_deps:androidx_viewpager_viewpager_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//third_party/android_deps:com_google_code_findbugs_jsr305_java",
......@@ -1252,6 +1253,7 @@ android_library("chrome_test_java") {
"//third_party/android_deps:androidx_preference_preference_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//third_party/android_deps:androidx_test_runner_java",
"//third_party/android_deps:androidx_viewpager2_viewpager2_java",
"//third_party/android_deps:androidx_viewpager_viewpager_java",
"//third_party/android_deps:com_google_code_findbugs_jsr305_java",
"//third_party/android_deps:espresso_java",
......
......@@ -12,16 +12,13 @@
android:layout_height="match_parent"
android:orientation="vertical">
<!-- RTL is handled manually in ClearBrowsingDataTabsFragment because
it is not working correctly with a ViewPager -->
<com.google.android.material.tabs.TabLayout
android:id="@+id/clear_browsing_data_tabs"
android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TabLayoutStyle" />
<androidx.viewpager.widget.ViewPager
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/clear_browsing_data_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
......
......@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.browsing_data;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
......@@ -13,18 +12,15 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import androidx.core.text.TextUtilsCompat;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
// TODO(bjoyce): Need to convert viewpager after fragmentpageradatper.
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
// TODO(bjoyce): Need to convert tablayout to androidx after viewpager
// and fragmentpageradatper are converted.
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
......@@ -32,8 +28,6 @@ import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.SettingsActivity;
import java.util.Locale;
/**
* Fragment with a {@link TabLayout} containing a basic and an advanced version of the CBD dialog.
*/
......@@ -59,21 +53,6 @@ public class ClearBrowsingDataTabsFragment extends Fragment {
RecordUserAction.record("ClearBrowsingData_DialogCreated");
}
/*
* RTL is broken for ViewPager: https://code.google.com/p/android/issues/detail?id=56831
* This class works around this issue by inserting the tabs in inverse order if RTL is active.
* The TabLayout needs to be set to LTR for this to work.
* TODO(dullweber): Extract the RTL code into a wrapper class if other places in Chromium need
* it as well.
*/
private static int adjustIndexForDirectionality(int index) {
if (TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault())
== ViewCompat.LAYOUT_DIRECTION_RTL) {
return CBD_TAB_COUNT - 1 - index;
}
return index;
}
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
......@@ -81,15 +60,16 @@ public class ClearBrowsingDataTabsFragment extends Fragment {
View view = inflater.inflate(R.layout.clear_browsing_data_tabs, container, false);
// Get the ViewPager and set its PagerAdapter so that it can display items.
ViewPager viewPager = view.findViewById(R.id.clear_browsing_data_viewpager);
viewPager.setAdapter(
new ClearBrowsingDataPagerAdapter(mFetcher, getFragmentManager(), getActivity()));
ViewPager2 viewPager = view.findViewById(R.id.clear_browsing_data_viewpager);
viewPager.setAdapter(new ClearBrowsingDataPagerAdapter(
mFetcher, getFragmentManager(), (FragmentActivity) getActivity()));
// Give the TabLayout the ViewPager.
TabLayout tabLayout = view.findViewById(R.id.clear_browsing_data_tabs);
tabLayout.setupWithViewPager(viewPager);
int tabIndex = adjustIndexForDirectionality(
BrowsingDataBridge.getInstance().getLastSelectedClearBrowsingDataTab());
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
tab.setText(getTabTitle(position));
}).attach();
int tabIndex = BrowsingDataBridge.getInstance().getLastSelectedClearBrowsingDataTab();
TabLayout.Tab tab = tabLayout.getTabAt(tabIndex);
if (tab != null) {
tab.select();
......@@ -103,6 +83,17 @@ public class ClearBrowsingDataTabsFragment extends Fragment {
return view;
}
private String getTabTitle(int position) {
switch (position) {
case 0:
return getActivity().getString(R.string.clear_browsing_data_basic_tab_title);
case 1:
return getActivity().getString(R.string.prefs_section_advanced);
default:
throw new RuntimeException("invalid position: " + position);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
......@@ -111,25 +102,22 @@ public class ClearBrowsingDataTabsFragment extends Fragment {
outState.putParcelable(ClearBrowsingDataFragment.CLEAR_BROWSING_DATA_FETCHER, mFetcher);
}
private static class ClearBrowsingDataPagerAdapter extends FragmentPagerAdapter {
private static class ClearBrowsingDataPagerAdapter extends FragmentStateAdapter {
private final ClearBrowsingDataFetcher mFetcher;
private final Context mContext;
ClearBrowsingDataPagerAdapter(
ClearBrowsingDataFetcher fetcher, FragmentManager fm, Context context) {
super(fm);
ClearBrowsingDataFetcher fetcher, FragmentManager fm, FragmentActivity activity) {
super(activity);
mFetcher = fetcher;
mContext = context;
}
@Override
public int getCount() {
public int getItemCount() {
return CBD_TAB_COUNT;
}
@Override
public Fragment getItem(int position) {
position = adjustIndexForDirectionality(position);
public Fragment createFragment(int position) {
ClearBrowsingDataFragment fragment;
switch (position) {
case 0:
......@@ -144,25 +132,12 @@ public class ClearBrowsingDataTabsFragment extends Fragment {
fragment.setClearBrowsingDataFetcher(mFetcher);
return fragment;
}
@Override
public CharSequence getPageTitle(int position) {
position = adjustIndexForDirectionality(position);
switch (position) {
case 0:
return mContext.getString(R.string.clear_browsing_data_basic_tab_title);
case 1:
return mContext.getString(R.string.prefs_section_advanced);
default:
throw new RuntimeException("invalid position: " + position);
}
}
}
private static class TabSelectListener implements TabLayout.OnTabSelectedListener {
@Override
public void onTabSelected(TabLayout.Tab tab) {
int tabIndex = adjustIndexForDirectionality(tab.getPosition());
int tabIndex = tab.getPosition();
BrowsingDataBridge.getInstance().setLastSelectedClearBrowsingDataTab(tabIndex);
if (tabIndex == ClearBrowsingDataTab.BASIC) {
RecordUserAction.record("ClearBrowsingData_SwitchTo_BasicTab");
......
......@@ -25,10 +25,12 @@ import androidx.fragment.app.Fragment;
import androidx.preference.CheckBoxPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.filters.LargeTest;
import androidx.test.filters.MediumTest;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import org.hamcrest.Matchers;
import org.junit.Assert;
......@@ -165,17 +167,18 @@ public class ClearBrowsingDataFragmentTest {
verify(mBrowsingDataBridgeMock).getLastClearBrowsingDataTab(any());
TestThreadUtils.runOnUiThreadBlocking(() -> {
ViewPager viewPager = (ViewPager) preferences.getView().findViewById(
ViewPager2 viewPager = (ViewPager2) preferences.getView().findViewById(
R.id.clear_browsing_data_viewpager);
PagerAdapter adapter = viewPager.getAdapter();
Assert.assertEquals(2, adapter.getCount());
RecyclerView.Adapter adapter = viewPager.getAdapter();
Assert.assertEquals(2, adapter.getItemCount());
Assert.assertEquals(1, viewPager.getCurrentItem());
TabLayout tabLayout = preferences.getView().findViewById(R.id.clear_browsing_data_tabs);
Assert.assertEquals(InstrumentationRegistry.getTargetContext().getString(
R.string.clear_browsing_data_basic_tab_title),
adapter.getPageTitle(0));
tabLayout.getTabAt(0).getText());
Assert.assertEquals(InstrumentationRegistry.getTargetContext().getString(
R.string.prefs_section_advanced),
adapter.getPageTitle(1));
tabLayout.getTabAt(1).getText());
viewPager.setCurrentItem(0);
});
// Verify the tab preference is saved.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment