Add UI to Settings > Location for Managed Profile Location Control
This CL adds Managed Profile Location Access control in the form of a switch preference. Bug:22541939 Change-Id: I1a2140c54e7386cda83ef0305f0840e4f8f9a6d1
This commit is contained in:
@@ -2806,8 +2806,6 @@
|
|||||||
|
|
||||||
<!-- Security & location settings screen, section header for settings relating to location -->
|
<!-- Security & location settings screen, section header for settings relating to location -->
|
||||||
<string name="location_title">My Location</string>
|
<string name="location_title">My Location</string>
|
||||||
<!-- Title for managed profile preference category [CHAR_LIMIT=25] -->
|
|
||||||
<string name="managed_profile_location_category">Work profile</string>
|
|
||||||
<!-- [CHAR LIMIT=30] Title for managed profile location switch -->
|
<!-- [CHAR LIMIT=30] Title for managed profile location switch -->
|
||||||
<string name="managed_profile_location_switch_title">Location for work profile</string>
|
<string name="managed_profile_location_switch_title">Location for work profile</string>
|
||||||
<!-- [CHAR LIMIT=30] Text to show on managed profile location switch if MDM has locked down location access for managed profile-->
|
<!-- [CHAR LIMIT=30] Text to show on managed profile location switch if MDM has locked down location access for managed profile-->
|
||||||
|
@@ -27,19 +27,13 @@
|
|||||||
android:summary="@string/location_mode_location_off_title" />
|
android:summary="@string/location_mode_location_off_title" />
|
||||||
|
|
||||||
<!-- This preference category gets removed if there is no managed profile -->
|
<!-- This preference category gets removed if there is no managed profile -->
|
||||||
<PreferenceCategory
|
<SwitchPreference
|
||||||
android:key="managed_profile_location_category"
|
android:key="managed_profile_location_switch"
|
||||||
android:title="@string/managed_profile_location_category">
|
android:title="@string/managed_profile_location_switch_title"
|
||||||
|
android:summary="@string/managed_profile_location_switch_lockdown"
|
||||||
<Preference
|
android:persistent="false"
|
||||||
android:key="managed_profile_location_switch"
|
android:enabled="false"
|
||||||
android:title="@string/managed_profile_location_switch_title"
|
android:selectable="true" />
|
||||||
android:summary="@string/managed_profile_location_switch_lockdown"
|
|
||||||
android:persistent="false"
|
|
||||||
android:enabled="false"
|
|
||||||
android:selectable="false" />
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:key="recent_location_requests"
|
android:key="recent_location_requests"
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
package com.android.settings.location;
|
package com.android.settings.location;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
@@ -30,6 +32,7 @@ import android.support.v7.preference.Preference;
|
|||||||
import android.support.v7.preference.PreferenceCategory;
|
import android.support.v7.preference.PreferenceCategory;
|
||||||
import android.support.v7.preference.PreferenceGroup;
|
import android.support.v7.preference.PreferenceGroup;
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
|
import android.support.v14.preference.SwitchPreference;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
@@ -81,16 +84,10 @@ public class LocationSettings extends LocationSettingsBase
|
|||||||
private static final String TAG = "LocationSettings";
|
private static final String TAG = "LocationSettings";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Key for managed profile location preference category. Category is shown only
|
* Key for managed profile location switch preference. Shown only
|
||||||
* if there is a managed profile
|
* if there is a managed profile.
|
||||||
*/
|
*/
|
||||||
private static final String KEY_MANAGED_PROFILE_CATEGORY = "managed_profile_location_category";
|
private static final String KEY_MANAGED_PROFILE_SWITCH = "managed_profile_location_switch";
|
||||||
/**
|
|
||||||
* Key for managed profile location preference. Note it used to be a switch pref and we had to
|
|
||||||
* keep the key as strings had been submitted for string freeze before the decision to
|
|
||||||
* demote this to a simple preference was made. TODO: Candidate for refactoring.
|
|
||||||
*/
|
|
||||||
private static final String KEY_MANAGED_PROFILE_PREFERENCE = "managed_profile_location_switch";
|
|
||||||
/** Key for preference screen "Mode" */
|
/** Key for preference screen "Mode" */
|
||||||
private static final String KEY_LOCATION_MODE = "location_mode";
|
private static final String KEY_LOCATION_MODE = "location_mode";
|
||||||
/** Key for preference category "Recent location requests" */
|
/** Key for preference category "Recent location requests" */
|
||||||
@@ -104,7 +101,7 @@ public class LocationSettings extends LocationSettingsBase
|
|||||||
private Switch mSwitch;
|
private Switch mSwitch;
|
||||||
private boolean mValidListener = false;
|
private boolean mValidListener = false;
|
||||||
private UserHandle mManagedProfile;
|
private UserHandle mManagedProfile;
|
||||||
private Preference mManagedProfilePreference;
|
private SwitchPreference mManagedProfileSwitch;
|
||||||
private Preference mLocationMode;
|
private Preference mLocationMode;
|
||||||
private PreferenceCategory mCategoryRecentLocationRequests;
|
private PreferenceCategory mCategoryRecentLocationRequests;
|
||||||
/** Receives UPDATE_INTENT */
|
/** Receives UPDATE_INTENT */
|
||||||
@@ -250,20 +247,39 @@ public class LocationSettings extends LocationSettingsBase
|
|||||||
mManagedProfile = Utils.getManagedProfile(mUm);
|
mManagedProfile = Utils.getManagedProfile(mUm);
|
||||||
if (mManagedProfile == null) {
|
if (mManagedProfile == null) {
|
||||||
// There is no managed profile
|
// There is no managed profile
|
||||||
root.removePreference(root.findPreference(KEY_MANAGED_PROFILE_CATEGORY));
|
root.removePreference(root.findPreference(KEY_MANAGED_PROFILE_SWITCH));
|
||||||
mManagedProfilePreference = null;
|
mManagedProfileSwitch = null;
|
||||||
} else {
|
} else {
|
||||||
mManagedProfilePreference = root.findPreference(KEY_MANAGED_PROFILE_PREFERENCE);
|
mManagedProfileSwitch = (SwitchPreference)root
|
||||||
mManagedProfilePreference.setOnPreferenceClickListener(null);
|
.findPreference(KEY_MANAGED_PROFILE_SWITCH);
|
||||||
|
mManagedProfileSwitch.setOnPreferenceClickListener(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeManagedProfileLocationAccessStatus(boolean enabled, int summaryResId) {
|
private void changeManagedProfileLocationAccessStatus(boolean mainSwitchOn) {
|
||||||
if (mManagedProfilePreference == null) {
|
if (mManagedProfileSwitch == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mManagedProfilePreference.setEnabled(enabled);
|
boolean enabled = mainSwitchOn;
|
||||||
mManagedProfilePreference.setSummary(summaryResId);
|
int summaryResId = R.string.switch_off_text;
|
||||||
|
if (mUm.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, mManagedProfile)
|
||||||
|
&& getAdminRestrictingManagedProfile() != null) {
|
||||||
|
summaryResId = R.string.managed_profile_location_switch_lockdown;
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mManagedProfileSwitch.setEnabled(enabled);
|
||||||
|
mManagedProfileSwitch.setOnPreferenceClickListener(null);
|
||||||
|
if (!enabled) {
|
||||||
|
mManagedProfileSwitch.setChecked(false);
|
||||||
|
} else {
|
||||||
|
final boolean isRestricted = isManagedProfileRestrictedByBase();
|
||||||
|
mManagedProfileSwitch.setChecked(!isRestricted);
|
||||||
|
summaryResId = (isRestricted ?
|
||||||
|
R.string.switch_off_text : R.string.switch_on_text);
|
||||||
|
mManagedProfileSwitch.setOnPreferenceClickListener(mManagedProfileSwitchClickListener);
|
||||||
|
}
|
||||||
|
mManagedProfileSwitch.setSummary(summaryResId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -374,18 +390,7 @@ public class LocationSettings extends LocationSettingsBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mManagedProfilePreference != null) {
|
changeManagedProfileLocationAccessStatus(enabled);
|
||||||
if (mUm.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, mManagedProfile)) {
|
|
||||||
changeManagedProfileLocationAccessStatus(false,
|
|
||||||
R.string.managed_profile_location_switch_lockdown);
|
|
||||||
} else {
|
|
||||||
if (enabled) {
|
|
||||||
changeManagedProfileLocationAccessStatus(true, R.string.switch_on_text);
|
|
||||||
} else {
|
|
||||||
changeManagedProfileLocationAccessStatus(false, R.string.switch_off_text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// As a safety measure, also reloads on location mode change to ensure the settings are
|
// As a safety measure, also reloads on location mode change to ensure the settings are
|
||||||
// up-to-date even if an affected app doesn't send the setting changed broadcast.
|
// up-to-date even if an affected app doesn't send the setting changed broadcast.
|
||||||
@@ -404,6 +409,47 @@ public class LocationSettings extends LocationSettingsBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ComponentName getAdminRestrictingManagedProfile() {
|
||||||
|
if (mManagedProfile == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
DevicePolicyManager dpm = (DevicePolicyManager)getActivity().getSystemService(
|
||||||
|
Context.DEVICE_POLICY_SERVICE);
|
||||||
|
if (dpm == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<ComponentName> admins = dpm.getActiveAdminsAsUser(mManagedProfile.getIdentifier());
|
||||||
|
for (int i = 0; i < admins.size(); ++i) {
|
||||||
|
final ComponentName admin = admins.get(i);
|
||||||
|
Bundle restrictions = dpm.getUserRestrictions(admin, mManagedProfile.getIdentifier());
|
||||||
|
if (restrictions != null && restrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION,
|
||||||
|
false)) {
|
||||||
|
return admin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isManagedProfileRestrictedByBase() {
|
||||||
|
if (mManagedProfile == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return mUm.hasBaseUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, mManagedProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Preference.OnPreferenceClickListener mManagedProfileSwitchClickListener =
|
||||||
|
new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
final boolean switchState = mManagedProfileSwitch.isChecked();
|
||||||
|
mUm.setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION,
|
||||||
|
!switchState, mManagedProfile);
|
||||||
|
mManagedProfileSwitch.setSummary(switchState ?
|
||||||
|
R.string.switch_on_text : R.string.switch_off_text);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private class PackageEntryClickedListener
|
private class PackageEntryClickedListener
|
||||||
implements Preference.OnPreferenceClickListener {
|
implements Preference.OnPreferenceClickListener {
|
||||||
private String mPackage;
|
private String mPackage;
|
||||||
|
Reference in New Issue
Block a user