From f3270e5c1c4d8b774053993499f3b30798687ba5 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Thu, 21 Apr 2022 11:44:10 +0800 Subject: [PATCH] Recalculate view's height when tab is selected Viewpager2 created view based on the first tab height, when tab is selected, viewpager2 should recalculate height. But this solution may not suitable for App list, so we only enable for Location Settings which have different items in personal & work profile. Bug: 224521665 Test: manual Change-Id: Ib19b30cb82b8b4f13f651795906289da53ded4ed --- res/xml/location_services.xml | 11 ++--- res/xml/location_services_workprofile.xml | 11 ++--- .../ProfileSelectFragment.java | 47 +++++++++++++++++-- ...ProfileSelectLocationServicesFragment.java | 5 ++ ...edServicesForWorkPreferenceController.java | 5 +- ...nInjectedServicesPreferenceController.java | 8 +--- .../settings/location/LocationServices.java | 25 +--------- .../location/LocationServicesForWork.java | 23 +-------- 8 files changed, 61 insertions(+), 74 deletions(-) diff --git a/res/xml/location_services.xml b/res/xml/location_services.xml index 2de4e7b2446..f01e0b137f5 100644 --- a/res/xml/location_services.xml +++ b/res/xml/location_services.xml @@ -16,21 +16,20 @@ - - + android:key="location_services" + android:title="@string/location_services_preference_title" + settings:controller="com.android.settings.location.LocationInjectedServicesPreferenceController"> diff --git a/res/xml/location_services_workprofile.xml b/res/xml/location_services_workprofile.xml index 6db208367d9..a130838afec 100644 --- a/res/xml/location_services_workprofile.xml +++ b/res/xml/location_services_workprofile.xml @@ -16,12 +16,7 @@ - - - + android:title="@string/location_services_screen_title" + android:key="location_services_managed_profile" + settings:controller="com.android.settings.location.LocationInjectedServicesForWorkPreferenceController"> diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java index 30b971c0c58..9be2177524f 100644 --- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java +++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java @@ -99,6 +99,8 @@ public abstract class ProfileSelectFragment extends DashboardFragment { private ViewGroup mContentView; + private ViewPager2 mViewPager; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -111,12 +113,21 @@ public abstract class ProfileSelectFragment extends DashboardFragment { final int selectedTab = getTabId(activity, getArguments()); final View tabContainer = mContentView.findViewById(R.id.tab_container); - final ViewPager2 viewPager = tabContainer.findViewById(R.id.view_pager); - viewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this)); + mViewPager = tabContainer.findViewById(R.id.view_pager); + mViewPager.setAdapter(new ProfileSelectFragment.ViewPagerAdapter(this)); final TabLayout tabs = tabContainer.findViewById(R.id.tabs); - new TabLayoutMediator(tabs, viewPager, + new TabLayoutMediator(tabs, mViewPager, (tab, position) -> tab.setText(getPageTitle(position)) ).attach(); + mViewPager.registerOnPageChangeCallback( + new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + updateHeight(position); + } + } + ); tabContainer.setVisibility(View.VISIBLE); final TabLayout.Tab tab = tabs.getTabAt(selectedTab); tab.select(); @@ -133,6 +144,36 @@ public abstract class ProfileSelectFragment extends DashboardFragment { return mContentView; } + protected boolean forceUpdateHeight() { + return false; + } + + private void updateHeight(int position) { + if (!forceUpdateHeight()) { + return; + } + ViewPagerAdapter adapter = (ViewPagerAdapter) mViewPager.getAdapter(); + if (adapter == null || adapter.getItemCount() <= position) { + return; + } + + Fragment fragment = adapter.createFragment(position); + View newPage = fragment.getView(); + if (newPage != null) { + int viewWidth = View.MeasureSpec.makeMeasureSpec(newPage.getWidth(), + View.MeasureSpec.EXACTLY); + int viewHeight = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + newPage.measure(viewWidth, viewHeight); + int currentHeight = mViewPager.getLayoutParams().height; + int newHeight = newPage.getMeasuredHeight(); + if (newHeight != 0 && currentHeight != newHeight) { + ViewGroup.LayoutParams layoutParams = mViewPager.getLayoutParams(); + layoutParams.height = newHeight; + mViewPager.setLayoutParams(layoutParams); + } + } + } + @Override public int getMetricsCategory() { return METRICS_CATEGORY_UNKNOWN; diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java index 5f25f599988..111e4ce7b86 100644 --- a/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java +++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java @@ -50,4 +50,9 @@ public class ProfileSelectLocationServicesFragment extends ProfileSelectFragment protected int getPreferenceScreenResId() { return R.xml.location_services_header; } + + @Override + protected boolean forceUpdateHeight() { + return true; + } } diff --git a/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java b/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java index b7e6cf2a412..a8a13b3ca76 100644 --- a/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java +++ b/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java @@ -20,7 +20,6 @@ import android.content.Context; import android.os.UserHandle; import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.widget.RestrictedAppPreference; @@ -41,8 +40,6 @@ public class LocationInjectedServicesForWorkPreferenceController extends @Override protected void injectLocationServices(PreferenceScreen screen) { - final PreferenceCategory categoryLocationServices = - screen.findPreference(getPreferenceKey()); final Map> prefs = getLocationServices(); for (Map.Entry> entry : prefs.entrySet()) { for (Preference pref : entry.getValue()) { @@ -51,7 +48,7 @@ public class LocationInjectedServicesForWorkPreferenceController extends } } if (entry.getKey() != UserHandle.myUserId()) { - LocationSettings.addPreferencesSorted(entry.getValue(), categoryLocationServices); + LocationSettings.addPreferencesSorted(entry.getValue(), screen); } } } diff --git a/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java b/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java index d623baef56c..356716d3a68 100644 --- a/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java +++ b/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java @@ -19,7 +19,6 @@ import android.content.Context; import android.os.UserHandle; import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.widget.RestrictedAppPreference; @@ -41,8 +40,6 @@ public class LocationInjectedServicesPreferenceController @Override protected void injectLocationServices(PreferenceScreen screen) { - final PreferenceCategory categoryLocationServices = - screen.findPreference(getPreferenceKey()); final Map> prefs = getLocationServices(); for (Map.Entry> entry : prefs.entrySet()) { for (Preference pref : entry.getValue()) { @@ -51,10 +48,7 @@ public class LocationInjectedServicesPreferenceController } } if (entry.getKey() == UserHandle.myUserId()) { - if (categoryLocationServices != null) { - LocationSettings.addPreferencesSorted(entry.getValue(), - categoryLocationServices); - } + LocationSettings.addPreferencesSorted(entry.getValue(), screen); } } } diff --git a/src/com/android/settings/location/LocationServices.java b/src/com/android/settings/location/LocationServices.java index aceb9d56583..52e958cb093 100644 --- a/src/com/android/settings/location/LocationServices.java +++ b/src/com/android/settings/location/LocationServices.java @@ -22,12 +22,8 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; -import java.util.ArrayList; -import java.util.List; - /** * A page that configures the Location Services settings including Wi-Fi scanning, Bluetooth * scanning, and injected location services. @@ -51,11 +47,6 @@ public class LocationServices extends DashboardFragment { return TAG; } - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context); - } - @Override public void onAttach(Context context) { super.onAttach(context); @@ -63,23 +54,9 @@ public class LocationServices extends DashboardFragment { use(LocationInjectedServicesPreferenceController.class).init(this); } - private static List buildPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(); - controllers.add(new WifiScanningPreferenceController(context)); - controllers.add(new BluetoothScanningPreferenceController(context)); - return controllers; - } - /** * For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.location_services) { - - @Override - public List createPreferenceControllers(Context - context) { - return buildPreferenceControllers(context); - } - }; + new BaseSearchIndexProvider(R.xml.location_services); } diff --git a/src/com/android/settings/location/LocationServicesForWork.java b/src/com/android/settings/location/LocationServicesForWork.java index 4b3124eb129..390be101ddf 100644 --- a/src/com/android/settings/location/LocationServicesForWork.java +++ b/src/com/android/settings/location/LocationServicesForWork.java @@ -22,12 +22,8 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; -import java.util.ArrayList; -import java.util.List; - /** * A page that configures the Location Services settings for work profile. */ @@ -50,32 +46,15 @@ public class LocationServicesForWork extends DashboardFragment { return TAG; } - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context); - } - @Override public void onAttach(Context context) { super.onAttach(context); use(LocationInjectedServicesForWorkPreferenceController.class).init(this); } - private static List buildPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(); - return controllers; - } - /** * For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.location_services_workprofile) { - - @Override - public List createPreferenceControllers(Context - context) { - return buildPreferenceControllers(context); - } - }; + new BaseSearchIndexProvider(R.xml.location_services_workprofile); }