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
diff --git a/res/xml/location_services.xml b/res/xml/location_services.xml
index 2de4e7b..f01e0b1 100644
--- a/res/xml/location_services.xml
+++ b/res/xml/location_services.xml
@@ -16,21 +16,20 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:title="@string/location_services_preference_title">
-
- <PreferenceCategory
- android:key="location_services"
- android:layout="@layout/preference_category_no_label"
- settings:controller="com.android.settings.location.LocationInjectedServicesPreferenceController"/>
+ android:key="location_services"
+ android:title="@string/location_services_preference_title"
+ settings:controller="com.android.settings.location.LocationInjectedServicesPreferenceController">
<Preference
android:fragment="com.android.settings.location.WifiScanningFragment"
+ android:order="1000"
android:key="location_services_wifi_scanning"
android:title="@string/location_scanning_wifi_always_scanning_title"
settings:controller="com.android.settings.location.LocationServicesWifiScanningPreferenceController"/>
<Preference
android:fragment="com.android.settings.location.BluetoothScanningFragment"
+ android:order="1001"
android:key="location_services_bluetooth_scanning"
android:title="@string/location_scanning_bluetooth_always_scanning_title"
settings:controller="com.android.settings.location.LocationServicesBluetoothScanningPreferenceController"/>
diff --git a/res/xml/location_services_workprofile.xml b/res/xml/location_services_workprofile.xml
index 6db2083..a130838 100644
--- a/res/xml/location_services_workprofile.xml
+++ b/res/xml/location_services_workprofile.xml
@@ -16,12 +16,7 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:title="@string/location_services_screen_title">
-
- <PreferenceCategory
- android:title="@string/managed_profile_location_services"
- android:layout="@layout/preference_category_no_label"
- android:key="location_services_managed_profile"
- settings:controller="com.android.settings.location.LocationInjectedServicesForWorkPreferenceController"/>
-
+ android:title="@string/location_services_screen_title"
+ android:key="location_services_managed_profile"
+ settings:controller="com.android.settings.location.LocationInjectedServicesForWorkPreferenceController">
</PreferenceScreen>
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
index 30b971c..9be2177 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
@@ -99,6 +99,8 @@
private ViewGroup mContentView;
+ private ViewPager2 mViewPager;
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -111,12 +113,21 @@
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 @@
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 5f25f59..111e4ce 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationServicesFragment.java
@@ -50,4 +50,9 @@
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 b7e6cf2..a8a13b3 100644
--- a/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java
+++ b/src/com/android/settings/location/LocationInjectedServicesForWorkPreferenceController.java
@@ -20,7 +20,6 @@
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 @@
@Override
protected void injectLocationServices(PreferenceScreen screen) {
- final PreferenceCategory categoryLocationServices =
- screen.findPreference(getPreferenceKey());
final Map<Integer, List<Preference>> prefs = getLocationServices();
for (Map.Entry<Integer, List<Preference>> entry : prefs.entrySet()) {
for (Preference pref : entry.getValue()) {
@@ -51,7 +48,7 @@
}
}
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 d623bae..356716d 100644
--- a/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java
+++ b/src/com/android/settings/location/LocationInjectedServicesPreferenceController.java
@@ -19,7 +19,6 @@
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 @@
@Override
protected void injectLocationServices(PreferenceScreen screen) {
- final PreferenceCategory categoryLocationServices =
- screen.findPreference(getPreferenceKey());
final Map<Integer, List<Preference>> prefs = getLocationServices();
for (Map.Entry<Integer, List<Preference>> entry : prefs.entrySet()) {
for (Preference pref : entry.getValue()) {
@@ -51,10 +48,7 @@
}
}
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 aceb9d5..52e958c 100644
--- a/src/com/android/settings/location/LocationServices.java
+++ b/src/com/android/settings/location/LocationServices.java
@@ -22,12 +22,8 @@
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.
@@ -52,34 +48,15 @@
}
@Override
- protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context);
- }
-
- @Override
public void onAttach(Context context) {
super.onAttach(context);
use(LocationInjectedServicesPreferenceController.class).init(this);
}
- private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
- final List<AbstractPreferenceController> 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<AbstractPreferenceController> 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 4b3124e..390be10 100644
--- a/src/com/android/settings/location/LocationServicesForWork.java
+++ b/src/com/android/settings/location/LocationServicesForWork.java
@@ -22,12 +22,8 @@
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.
*/
@@ -51,31 +47,14 @@
}
@Override
- protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context);
- }
-
- @Override
public void onAttach(Context context) {
super.onAttach(context);
use(LocationInjectedServicesForWorkPreferenceController.class).init(this);
}
- private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
- final List<AbstractPreferenceController> 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<AbstractPreferenceController> createPreferenceControllers(Context
- context) {
- return buildPreferenceControllers(context);
- }
- };
+ new BaseSearchIndexProvider(R.xml.location_services_workprofile);
}