Fix shifting problem in location services page

Controller generates the injection location settings
in updateState() which happens in onResume.
That's the primary reason why we observed the shifting issue.

In a good practice, we generate preference in displayPreference(),
and then update the setting state in updateState().

In this cl, we create a base controller class to encapsulate
most implementation, and developer need to inject location
services in child class.

Test: Add work profile, and see correct services list.
Bug: 183169265
Change-Id: I5735ba974da87ad83b56791abd8a8637c2317571
This commit is contained in:
Tsung-Mao Fang
2021-06-09 16:09:00 +08:00
parent 603cd6c44c
commit cbf5ccab0e
4 changed files with 135 additions and 120 deletions

View File

@@ -20,6 +20,8 @@ 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;
@@ -30,7 +32,7 @@ import java.util.Map;
* Retrieve the Location Services used in work profile user.
*/
public class LocationInjectedServicesForWorkPreferenceController extends
LocationInjectedServicesPreferenceController {
LocationInjectedServiceBasePreferenceController {
private static final String TAG = "LocationWorkPrefCtrl";
public LocationInjectedServicesForWorkPreferenceController(Context context, String key) {
@@ -38,10 +40,10 @@ public class LocationInjectedServicesForWorkPreferenceController extends
}
@Override
public void updateState(Preference preference) {
mCategoryLocationServices.removeAll();
protected void injectLocationServices(PreferenceScreen screen) {
final PreferenceCategory categoryLocationServices =
screen.findPreference(getPreferenceKey());
final Map<Integer, List<Preference>> prefs = getLocationServices();
boolean show = false;
for (Map.Entry<Integer, List<Preference>> entry : prefs.entrySet()) {
for (Preference pref : entry.getValue()) {
if (pref instanceof RestrictedAppPreference) {
@@ -49,11 +51,8 @@ public class LocationInjectedServicesForWorkPreferenceController extends
}
}
if (entry.getKey() != UserHandle.myUserId()) {
LocationSettings.addPreferencesSorted(entry.getValue(),
mCategoryLocationServices);
show = true;
LocationSettings.addPreferencesSorted(entry.getValue(), categoryLocationServices);
}
}
mCategoryLocationServices.setVisible(show);
}
}