Skip to content

Commit 86af7f8

Browse files
author
yuemingw
committed
Update cross-profile calendar ui after API change.
Bug: 123351194 Bug: 120765156 Test: manual Change-Id: If057b20dc2c3756d130b4ca68d9263087de1cfdc
1 parent c6026e1 commit 86af7f8

File tree

3 files changed

+68
-152
lines changed

3 files changed

+68
-152
lines changed

app/src/main/java/com/afwsamples/testdpc/policy/CrossProfileCalendarFragment.java

Lines changed: 59 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -18,52 +18,45 @@
1818

1919
import android.annotation.TargetApi;
2020
import android.app.Activity;
21-
import android.app.AlertDialog;
21+
import android.app.AlertDialog.Builder;
2222
import android.app.admin.DevicePolicyManager;
2323
import android.content.ComponentName;
2424
import android.content.Context;
25-
import android.content.DialogInterface;
25+
import android.content.pm.PackageManager;
26+
import android.os.Build;
2627
import android.os.Bundle;
2728
import android.support.v7.preference.Preference;
2829
import android.util.ArraySet;
29-
import android.util.Log;
3030
import android.view.View;
3131
import android.widget.EditText;
3232
import android.widget.Toast;
33-
3433
import com.afwsamples.testdpc.DeviceAdminReceiver;
3534
import com.afwsamples.testdpc.R;
36-
import com.afwsamples.testdpc.common.AppInfoArrayAdapter;
3735
import com.afwsamples.testdpc.common.BaseSearchablePolicyPreferenceFragment;
38-
import com.afwsamples.testdpc.common.ReflectionUtil;
39-
import com.afwsamples.testdpc.common.ReflectionUtil.ReflectionIsTemporaryException;
40-
41-
import java.util.ArrayList;
36+
import com.afwsamples.testdpc.common.preference.DpcPreference;
37+
import com.afwsamples.testdpc.common.preference.DpcSwitchPreference;
38+
import java.util.Arrays;
39+
import java.util.Collections;
4240
import java.util.Set;
4341

44-
/**
45-
* TODO: Cleanup reflection usages once SDK is updated. b/120765156.
46-
*/
47-
@TargetApi(29)
42+
@TargetApi(Build.VERSION_CODES.Q)
4843
public class CrossProfileCalendarFragment extends BaseSearchablePolicyPreferenceFragment implements
49-
Preference.OnPreferenceClickListener {
44+
Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener {
5045

51-
private static String LOG_TAG = "CrossProfileCalendarFragment";
52-
53-
private static final String CROSS_PROFILE_CALENDAR_ADD_PACKAGE_KEY =
54-
"cross_profile_calendar_add_package";
55-
private static final String CROSS_PROFILE_CALENDAR_DELETE_PACKAGE_KEY =
56-
"cross_profile_calendar_delete_package";
57-
private static final String CROSS_PROFILE_CALENDAR_LIST_PACKAGE_KEY =
58-
"cross_profile_calendar_list_package";
46+
private static final String CROSS_PROFILE_CALENDAR_SET_ALLOWED_PACKAGES_KEY =
47+
"cross_profile_calendar_set_allowed_packages";
48+
private static final String CROSS_PROFILE_CALENDAR_ALLOW_ALL_PACKAGES_KEY =
49+
"cross_profile_calendar_allow_all_packages";
5950

6051
private DevicePolicyManager mDevicePolicyManager;
52+
6153
private ComponentName mAdminComponentName;
54+
private DpcPreference mSetAllowedPackagesPreference;
55+
private DpcSwitchPreference mAllowAllPackagesPreference;
6256

6357
@Override
6458
public void onCreate(Bundle savedInstanceState) {
65-
mDevicePolicyManager = (DevicePolicyManager) getActivity().getSystemService(
66-
Context.DEVICE_POLICY_SERVICE);
59+
mDevicePolicyManager = getActivity().getSystemService(DevicePolicyManager.class);
6760
mAdminComponentName = DeviceAdminReceiver.getComponentName(getActivity());
6861
getActivity().getActionBar().setTitle(R.string.cross_profile_calendar);
6962
super.onCreate(savedInstanceState);
@@ -73,10 +66,15 @@ public void onCreate(Bundle savedInstanceState) {
7366
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
7467
addPreferencesFromResource(R.xml.cross_profile_calendar_preferences);
7568

76-
findPreference(CROSS_PROFILE_CALENDAR_ADD_PACKAGE_KEY).setOnPreferenceClickListener(this);
77-
findPreference(CROSS_PROFILE_CALENDAR_DELETE_PACKAGE_KEY)
78-
.setOnPreferenceClickListener(this);
79-
findPreference(CROSS_PROFILE_CALENDAR_LIST_PACKAGE_KEY).setOnPreferenceClickListener(this);
69+
mSetAllowedPackagesPreference = (DpcPreference) findPreference(
70+
CROSS_PROFILE_CALENDAR_SET_ALLOWED_PACKAGES_KEY);
71+
mSetAllowedPackagesPreference.setOnPreferenceClickListener(this);
72+
73+
mAllowAllPackagesPreference = (DpcSwitchPreference) findPreference(
74+
CROSS_PROFILE_CALENDAR_ALLOW_ALL_PACKAGES_KEY);
75+
mAllowAllPackagesPreference.setOnPreferenceChangeListener(this);
76+
77+
reloadAllowAllPackagesUi();
8078
}
8179

8280
@Override
@@ -88,136 +86,62 @@ public boolean isAvailable(Context context) {
8886
public boolean onPreferenceClick(Preference preference) {
8987
String key = preference.getKey();
9088
switch (key) {
91-
case CROSS_PROFILE_CALENDAR_ADD_PACKAGE_KEY:
92-
showAddPackageDialog();
93-
return true;
94-
case CROSS_PROFILE_CALENDAR_DELETE_PACKAGE_KEY:
95-
showDeletePackageDialog();
96-
return true;
97-
case CROSS_PROFILE_CALENDAR_LIST_PACKAGE_KEY:
98-
showListPackageDialog();
89+
case CROSS_PROFILE_CALENDAR_SET_ALLOWED_PACKAGES_KEY:
90+
showSetPackagesDialog();
9991
return true;
10092
}
10193
return false;
10294
}
10395

104-
/**
105-
* Shows a dialog that asks the user for a package name to be whitelisted.
106-
*/
107-
private void showAddPackageDialog() {
108-
if (getActivity() == null || getActivity().isFinishing()) {
109-
return;
96+
@Override
97+
public boolean onPreferenceChange(Preference preference, Object newValue) {
98+
String key = preference.getKey();
99+
switch (key) {
100+
case CROSS_PROFILE_CALENDAR_ALLOW_ALL_PACKAGES_KEY:
101+
mDevicePolicyManager.setCrossProfileCalendarPackages(
102+
mAdminComponentName, newValue.equals(true) ? null : Collections.emptySet());
103+
reloadAllowAllPackagesUi();
110104
}
105+
return false;
106+
}
111107

112-
final View dialogView = getActivity().getLayoutInflater().inflate(
113-
R.layout.simple_edittext, null);
114-
final EditText addPackageEditText = (EditText) dialogView.findViewById(
115-
R.id.input);
116-
117-
new AlertDialog.Builder(getActivity())
118-
.setTitle(R.string.cross_profile_calendar_add_package)
119-
.setView(dialogView)
120-
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
121-
final String packageName = addPackageEditText.getText().toString();
122-
if (packageName.isEmpty()) {
123-
showToast(R.string.cross_profile_calendar_no_package);
124-
return;
125-
}
126-
try {
127-
ReflectionUtil.invoke(mDevicePolicyManager, "addCrossProfileCalendarPackage",
128-
mAdminComponentName, packageName);
129-
showToast(String.format("Successfully whitelisted package %s for cross profile "
130-
+ "calendar", packageName));
131-
} catch (ReflectionIsTemporaryException e) {
132-
Log.e(LOG_TAG, "Failed to invoke addCrossProfileCalendarPackage", e);
133-
}
134-
})
135-
.setNegativeButton(android.R.string.cancel, null)
136-
.show();
108+
@TargetApi(Build.VERSION_CODES.Q)
109+
private void reloadAllowAllPackagesUi() {
110+
final Set<String> packages =
111+
mDevicePolicyManager.getCrossProfileCalendarPackages(mAdminComponentName);
112+
mAllowAllPackagesPreference.setChecked(packages == null);
113+
mSetAllowedPackagesPreference.setEnabled(!mAllowAllPackagesPreference.isChecked());
137114
}
138115

139116
/**
140-
* Shows a dialog that asks the user for a package name to be removed from the whitelist.
117+
* Shows a dialog that asks the user for a set of package names to be allowed.
141118
*/
142-
private void showDeletePackageDialog() {
119+
private void showSetPackagesDialog() {
143120
if (getActivity() == null || getActivity().isFinishing()) {
144121
return;
145122
}
146123

147124
final View dialogView = getActivity().getLayoutInflater().inflate(
148125
R.layout.simple_edittext, null);
149-
final EditText deletePackageEditText = (EditText) dialogView.findViewById(
126+
final EditText setPackagesEditText = (EditText) dialogView.findViewById(
150127
R.id.input);
151128

152-
new AlertDialog.Builder(getActivity())
153-
.setTitle(R.string.cross_profile_calendar_delete_package)
129+
setPackagesEditText.setText(String.join(",",
130+
mDevicePolicyManager.getCrossProfileCalendarPackages(mAdminComponentName)));
131+
132+
new Builder(getActivity())
133+
.setTitle(R.string.cross_profile_calendar_set_allowed_packages_title)
154134
.setView(dialogView)
155135
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
156-
final String packageName = deletePackageEditText.getText().toString();
157-
if (packageName.isEmpty()) {
158-
showToast(R.string.cross_profile_calendar_no_package);
159-
return;
160-
}
161-
try {
162-
boolean succeed = (Boolean) ReflectionUtil.invoke(mDevicePolicyManager,
163-
"removeCrossProfileCalendarPackage", mAdminComponentName, packageName);
164-
if (succeed) {
165-
showToast(String.format("Successfully removed package %s for cross profile "
166-
+ "calendar", packageName));
167-
} else {
168-
showToast(String.format("Failed to remove package %s for cross profile "
169-
+ "calendar", packageName));
170-
}
171-
} catch (ReflectionIsTemporaryException e) {
172-
Log.e(LOG_TAG, "Failed to invoke removeCrossProfileCalendarPackage", e);
173-
}
136+
final String packageNamesString = setPackagesEditText.getText().toString();
137+
final Set<String> packageNames = packageNamesString.isEmpty()
138+
? Collections.emptySet()
139+
: new ArraySet<>(Arrays.asList(
140+
packageNamesString.replace(" ", "").split(",")));
141+
mDevicePolicyManager.setCrossProfileCalendarPackages(
142+
mAdminComponentName, packageNames);
174143
})
175144
.setNegativeButton(android.R.string.cancel, null)
176145
.show();
177146
}
178-
179-
/**
180-
* Shows a dialog that displays all the packages that have been whitelisted.
181-
*/
182-
private void showListPackageDialog() {
183-
Set<String> packages = new ArraySet<String>();
184-
try {
185-
packages = (Set<String>) ReflectionUtil.invoke(mDevicePolicyManager,
186-
"getCrossProfileCalendarPackages", mAdminComponentName);
187-
} catch (ReflectionIsTemporaryException e) {
188-
Log.e(LOG_TAG, "Failed to invoke getCrossProfileCalendarPackages", e);
189-
}
190-
191-
if (packages.isEmpty()) {
192-
showToast(R.string.cross_profile_calendar_list_package_empty);
193-
} else {
194-
AppInfoArrayAdapter appInfoArrayAdapter = new AppInfoArrayAdapter(getActivity(),
195-
R.id.pkg_name, new ArrayList<String>(packages), true);
196-
new AlertDialog.Builder(getActivity())
197-
.setTitle(getString(R.string.cross_profile_calendar_list_package_title))
198-
.setAdapter(appInfoArrayAdapter, new DialogInterface.OnClickListener() {
199-
@Override
200-
public void onClick(DialogInterface dialog, int position) {
201-
// Do nothing.
202-
}
203-
})
204-
.show();
205-
}
206-
}
207-
208-
private void showToast(int msgId, Object... args) {
209-
showToast(getString(msgId, args), Toast.LENGTH_SHORT);
210-
}
211-
212-
private void showToast(String msg) {
213-
showToast(msg, Toast.LENGTH_SHORT);
214-
}
215-
216-
private void showToast(String msg, int duration) {
217-
Activity activity = getActivity();
218-
if (activity == null || activity.isFinishing()) {
219-
return;
220-
}
221-
Toast.makeText(activity, msg, duration).show();
222-
}
223147
}

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,9 @@
244244

245245
<!-- Strings for Cross Profile Calendar -->
246246
<string name="cross_profile_calendar">Cross-profile calendar</string>
247-
<string name="cross_profile_calendar_add_package">Whitelist a package</string>
248-
<string name="cross_profile_calendar_delete_package">Remove a package from whitelist</string>
249-
<string name="cross_profile_calendar_list_package">View all whitelisted packages</string>
250-
<string name="cross_profile_calendar_list_package_empty">No package in the whitelist</string>
251-
<string name="cross_profile_calendar_list_package_title">Cross-profile calendar whitelist</string>
252-
<string name="cross_profile_calendar_no_package">Please enter a package name</string>
247+
<string name="cross_profile_calendar_set_allowed_packages">Set allowed packages</string>
248+
<string name="cross_profile_calendar_set_allowed_packages_title">Enter packages names, separated by comma</string>
249+
<string name="cross_profile_calendar_allow_all_packages">Allow all packages</string>
253250

254251
<string-array name="apn_auth_type_choices">
255252
<item>Not specified</item>

app/src/main/res/xml/cross_profile_calendar_preferences.xml

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,14 @@
1818
xmlns:testdpc="http://schemas.android.com/apk/res-auto"
1919
android:title="@string/cross_profile_calendar">
2020
<PreferenceCategory android:title="@string/cross_profile_calendar">
21-
<com.afwsamples.testdpc.common.preference.DpcPreference
22-
android:key="cross_profile_calendar_add_package"
23-
android:title="@string/cross_profile_calendar_add_package"
21+
<com.afwsamples.testdpc.common.preference.DpcSwitchPreference
22+
android:key="cross_profile_calendar_allow_all_packages"
23+
android:title="@string/cross_profile_calendar_allow_all_packages"
2424
testdpc:admin="profileOwner"
25-
testdpc:minSdkVersion="Q"/>
26-
<com.afwsamples.testdpc.common.preference.DpcPreference
27-
android:key="cross_profile_calendar_delete_package"
28-
android:title="@string/cross_profile_calendar_delete_package"
29-
testdpc:admin="profileOwner"
30-
testdpc:minSdkVersion="Q"/>
25+
testdpc:minSdkVersion="Q" />
3126
<com.afwsamples.testdpc.common.preference.DpcPreference
32-
android:key="cross_profile_calendar_list_package"
33-
android:title="@string/cross_profile_calendar_list_package"
27+
android:key="cross_profile_calendar_set_allowed_packages"
28+
android:title="@string/cross_profile_calendar_set_allowed_packages"
3429
testdpc:admin="profileOwner"
3530
testdpc:minSdkVersion="Q"/>
3631
</PreferenceCategory>

0 commit comments

Comments
 (0)