Merge "Settings: Use new EventInfo.ANY_CALENDAR constant." into mnc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 12551d0..500c0aa 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2251,7 +2251,24 @@
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.notification.NotificationAccessSettings" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
- android:resource="@id/security_settings" />
+ android:resource="@id/notification_settings" />
+ </activity>
+
+ <activity android:name="Settings$ZenAccessSettingsActivity"
+ android:label="@string/manage_zen_access_title"
+ android:taskAffinity="">
+ <intent-filter android:priority="1">
+ <action android:name="android.settings.ZEN_ACCESS_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.notification.ZenAccessSettings" />
+ <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+ android:resource="@id/notification_settings" />
</activity>
<activity android:name="Settings$NotificationSettingsActivity"
diff --git a/res/drawable/ic_info.xml b/res/drawable/ic_info.xml
new file mode 100644
index 0000000..13d00a4
--- /dev/null
+++ b/res/drawable/ic_info.xml
@@ -0,0 +1,24 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.0,17.0l2.0,0.0l0.0,-6.0l-2.0,0.0l0.0,6.0zm1.0,-15.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0zm0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0zM11.0,9.0l2.0,0.0L13.0,7.0l-2.0,0.0l0.0,2.0z"/>
+</vector>
diff --git a/res/layout/app_header.xml b/res/layout/app_header.xml
index d9453f4..ffc6829 100644
--- a/res/layout/app_header.xml
+++ b/res/layout/app_header.xml
@@ -50,7 +50,7 @@
android:minWidth="0dp"
android:contentDescription="@string/notification_app_settings_button"
android:scaleType="center"
- android:src="@drawable/ic_settings_32dp"
+ android:src="@drawable/ic_info"
style="?android:attr/borderlessButtonStyle" />
<View
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9db8e8c..7aee58a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5934,6 +5934,9 @@
<!-- Sound & notification: Notification section header [CHAR LIMIT=30] -->
<string name="notification_section_header">Notification</string>
+ <!-- Sound & notification: Advanced section header [CHAR LIMIT=30] -->
+ <string name="advanced_section_header">Advanced</string>
+
<!-- Sound & notification > Notification section: Title for the pulse notification light option. [CHAR LIMIT=30] -->
<string name="notification_pulse_title">Pulse notification light</string>
@@ -5999,7 +6002,7 @@
<!-- Sound & notification > Other sounds: Value for the emergency tone option with value 2: vibrate. [CHAR LIMIT=30] -->
<string name="emergency_tone_vibrate">Vibrate</string>
- <!-- Sound & notification > Notification section: Title for managing notification listeners option. [CHAR LIMIT=30] -->
+ <!-- Sound & notification > Advanced section: Title for managing notification listeners option. [CHAR LIMIT=30] -->
<string name="manage_notification_access_title">Notification access</string>
<!-- Summary of preference to manage notification listeners, when none are enabled -->
@@ -6028,6 +6031,12 @@
to dismiss these notifications or touch action buttons within them.
</string>
+ <!-- Sound & notification > Advanced section: Title for managing Do Not Disturb access option. [CHAR LIMIT=40] -->
+ <string name="manage_zen_access_title">Do Not Disturb access</string>
+
+ <!-- Sound & notification > Do Not Disturb access > Text to display when the list is empty. [CHAR LIMIT=NONE] -->
+ <string name="zen_access_empty_text">No installed apps have requested Do Not Disturb access</string>
+
<!-- [CHAR LIMIT=NONE] Text when loading app list in notification settings -->
<string name="loading_notification_apps">Loading apps...</string>
@@ -6654,4 +6663,7 @@
<!-- Summary for app with no battery usage [CHAR LIMIT=NONE] -->
<string name="no_battery_summary" translatable="false">No battery use since last full charge</string>
+ <!-- Link to an apps notification settings [CHAR LIMIT=50] -->
+ <string name="app_notification_preferences">App notification preferences</string>
+
</resources>
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index 9aebb39..b7557b2 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -50,4 +50,11 @@
android:order="4"
android:persistent="false" />
+ <!-- App notification preferences -->
+ <Preference
+ android:key="app_settings"
+ android:title="@string/app_notification_preferences"
+ android:order="5"
+ android:persistent="false" />
+
</PreferenceScreen>
diff --git a/res/xml/notification_settings.xml b/res/xml/notification_settings.xml
index 7956a6d..72a189d 100644
--- a/res/xml/notification_settings.xml
+++ b/res/xml/notification_settings.xml
@@ -120,6 +120,12 @@
android:value="com.android.settings.Settings$NotificationAppListActivity" />
</PreferenceScreen>
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:key="advanced"
+ android:title="@string/advanced_section_header" >
+
<!-- Notification access -->
<Preference
android:key="manage_notification_access"
@@ -127,6 +133,13 @@
android:persistent="false"
android:fragment="com.android.settings.notification.NotificationAccessSettings" />
+ <!-- Do Not Disturb access -->
+ <Preference
+ android:key="manage_zen_access"
+ android:title="@string/manage_zen_access_title"
+ android:persistent="false"
+ android:fragment="com.android.settings.notification.ZenAccessSettings" />
+
</PreferenceCategory>
</PreferenceScreen>
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index 81e0a46..5415ccf 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -457,7 +457,7 @@
String password = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
if (!TextUtils.isEmpty(password)) {
// success
- mKeyStore.password(password);
+ mKeyStore.unlock(password);
// return to onResume
return;
}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index b91275a..5a6a2f0 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -91,6 +91,7 @@
public static class NotificationStationActivity extends SettingsActivity { /* empty */ }
public static class UserSettingsActivity extends SettingsActivity { /* empty */ }
public static class NotificationAccessSettingsActivity extends SettingsActivity { /* empty */ }
+ public static class ZenAccessSettingsActivity extends SettingsActivity { /* empty */ }
public static class ConditionProviderSettingsActivity extends SettingsActivity { /* empty */ }
public static class UsbSettingsActivity extends SettingsActivity { /* empty */ }
public static class TrustedCredentialsSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 89dbc99..aa492f3 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -103,6 +103,7 @@
import com.android.settings.notification.NotificationSettings;
import com.android.settings.notification.NotificationStation;
import com.android.settings.notification.OtherSoundSettings;
+import com.android.settings.notification.ZenAccessSettings;
import com.android.settings.notification.ZenModeEventRuleSettings;
import com.android.settings.notification.ZenModeExternalRuleSettings;
import com.android.settings.notification.ZenModePrioritySettings;
@@ -328,6 +329,7 @@
DreamSettings.class.getName(),
UserSettings.class.getName(),
NotificationAccessSettings.class.getName(),
+ ZenAccessSettings.class.getName(),
PrintSettingsFragment.class.getName(),
PrintJobSettingsFragment.class.getName(),
TrustedCredentialsSettings.class.getName(),
diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java
index f8feaf1..5bfd79a 100644
--- a/src/com/android/settings/applications/AppInfoWithHeader.java
+++ b/src/com/android/settings/applications/AppInfoWithHeader.java
@@ -16,13 +16,19 @@
package com.android.settings.applications;
+import android.app.Fragment;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import com.android.settings.AppHeader;
public abstract class AppInfoWithHeader extends AppInfoBase {
+ public static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton";
+
private boolean mCreated;
@Override
@@ -35,6 +41,24 @@
mCreated = true;
if (mPackageInfo == null) return;
AppHeader.createAppHeader(this, mPackageInfo.applicationInfo.loadIcon(mPm),
- mPackageInfo.applicationInfo.loadLabel(mPm), null, 0);
+ mPackageInfo.applicationInfo.loadLabel(mPm), getInfoIntent(this, mPackageName), 0);
+ }
+
+ public static Intent getInfoIntent(Fragment fragment, String packageName) {
+ Bundle args = fragment.getArguments();
+ Intent intent = fragment.getActivity().getIntent();
+ boolean showInfo = true;
+ if (args != null && args.getBoolean(EXTRA_HIDE_INFO_BUTTON, false)) {
+ showInfo = false;
+ }
+ if (intent != null && intent.getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) {
+ showInfo = false;
+ }
+ Intent infoIntent = null;
+ if (showInfo) {
+ infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ infoIntent.setData(Uri.fromParts("package", packageName, null));
+ }
+ return infoIntent;
}
}
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index 6d8f867..01355d9 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -790,6 +790,10 @@
mApplications = new ArrayList<ApplicationInfo>();
for (UserHandle user : mUm.getUserProfiles()) {
try {
+ // If this user is new, it needs a map created.
+ if (mEntriesMap.indexOfKey(user.getIdentifier()) < 0) {
+ mEntriesMap.put(user.getIdentifier(), new HashMap<String, AppEntry>());
+ }
ParceledListSlice<ApplicationInfo> list =
mIpm.getInstalledApplications(
user.isOwner() ? mOwnerRetrieveFlags : mRetrieveFlags,
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index a6fee90..99d0172 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -246,9 +246,11 @@
AppItem app = new AppItem(mAppEntry.info.uid);
app.addUid(mAppEntry.info.uid);
getLoaderManager().restartLoader(LOADER_CHART_DATA,
- ChartDataLoader.buildArgs(NetworkTemplate.buildTemplateMobileWildcard(), app),
+ ChartDataLoader.buildArgs(getTemplate(getContext()), app),
mDataCallbacks);
- new BatteryUpdater().execute();
+ if (mPackageInfo != null) {
+ new BatteryUpdater().execute();
+ }
}
@Override
@@ -616,6 +618,7 @@
// start new activity to manage app permissions
Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName);
+ intent.putExtra(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
@@ -627,6 +630,7 @@
// start new fragment to display extended information
Bundle args = new Bundle();
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mAppEntry.info.packageName);
+ args.putBoolean(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true);
SettingsActivity sa = (SettingsActivity) getActivity();
sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT);
@@ -636,6 +640,7 @@
// start new fragment to display extended information
getActivity().startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ .putExtra(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true)
.putExtra(Settings.EXTRA_APP_PACKAGE, mAppEntry.info.packageName)
.putExtra(Settings.EXTRA_APP_UID, mAppEntry.info.uid));
}
@@ -698,6 +703,16 @@
return true;
}
+ private static NetworkTemplate getTemplate(Context context) {
+ if (DataUsageSummary.hasReadyMobileRadio(context)) {
+ return NetworkTemplate.buildTemplateMobileWildcard();
+ }
+ if (DataUsageSummary.hasWifiRadio(context)) {
+ return NetworkTemplate.buildTemplateWifiWildcard();
+ }
+ return NetworkTemplate.buildTemplateEthernet();
+ }
+
public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) {
return getNotificationSummary(appEntry, context, new NotificationBackend());
}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 415fff1..14ab541 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -428,10 +428,11 @@
Activity activity = getActivity();
switch (mListType) {
case LIST_TYPE_NOTIFICATION:
- activity.startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
+ activity.startActivityAsUser(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.putExtra(Settings.EXTRA_APP_PACKAGE, mCurrentPkgName)
- .putExtra(Settings.EXTRA_APP_UID, mCurrentUid));
+ .putExtra(Settings.EXTRA_APP_UID, mCurrentUid),
+ new UserHandle(UserHandle.getUserId(mCurrentUid)));
break;
case LIST_TYPE_DOMAINS_URLS:
startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label);
diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java
index 3c4fc02..b29b2fe 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -115,7 +115,7 @@
AppHeader.createAppHeader(this,
mApp.mUiTargetApp != null ? mApp.mUiTargetApp.loadIcon(mPm) : new ColorDrawable(0),
- mApp.mUiLabel, null);
+ mApp.mUiLabel, AppInfoWithHeader.getInfoIntent(this, mApp.mPackage));
}
@Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index bac8202..63ca1a4 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -54,6 +54,7 @@
import com.android.settings.Utils;
import com.android.settings.WirelessSettings;
import com.android.settings.applications.AppInfoBase;
+import com.android.settings.applications.AppInfoWithHeader;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.bluetooth.BluetoothSettings;
@@ -464,7 +465,8 @@
appIcon = getActivity().getPackageManager().getDefaultActivityIcon();
}
- AppHeader.createAppHeader(this, appIcon, title, null,
+ AppHeader.createAppHeader(this, appIcon, title,
+ AppInfoWithHeader.getInfoIntent(this, iconPackage),
mDrainType != DrainType.APP ? android.R.color.white : 0);
}
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 28245c8..52c011c 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -29,6 +29,7 @@
import android.os.UserHandle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
import android.preference.SwitchPreference;
import android.provider.Settings;
import android.text.TextUtils;
@@ -42,6 +43,7 @@
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
+import com.android.settings.applications.AppInfoWithHeader;
import com.android.settings.notification.NotificationBackend.AppRow;
import java.util.List;
@@ -55,6 +57,7 @@
private static final String KEY_PRIORITY = "priority";
private static final String KEY_PEEKABLE = "peekable";
private static final String KEY_SENSITIVE = "sensitive";
+ private static final String KEY_APP_SETTINGS = "app_settings";
static final String EXTRA_HAS_SETTINGS_INTENT = "has_settings_intent";
static final String EXTRA_SETTINGS_INTENT = "settings_intent";
@@ -85,7 +88,7 @@
mCreated = true;
if (mAppRow == null) return;
AppHeader.createAppHeader(this, mAppRow.icon, mAppRow.label,
- mAppRow.settingsIntent);
+ AppInfoWithHeader.getInfoIntent(this, mAppRow.pkg));
}
@Override
@@ -189,6 +192,19 @@
return mBackend.setSensitive(pkg, uid, sensitive);
}
});
+
+ if (mAppRow.settingsIntent != null) {
+ findPreference(KEY_APP_SETTINGS).setOnPreferenceClickListener(
+ new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ mContext.startActivity(mAppRow.settingsIntent);
+ return true;
+ }
+ });
+ } else {
+ removePreference(KEY_APP_SETTINGS);
+ }
}
private void updateDependents(boolean banned) {
diff --git a/src/com/android/settings/notification/NotificationSettings.java b/src/com/android/settings/notification/NotificationSettings.java
index cdff32f..00f5497 100644
--- a/src/com/android/settings/notification/NotificationSettings.java
+++ b/src/com/android/settings/notification/NotificationSettings.java
@@ -79,6 +79,7 @@
private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "lock_screen_notifications";
private static final String KEY_NOTIFICATION_ACCESS = "manage_notification_access";
+ private static final String KEY_ZEN_ACCESS = "manage_zen_access";
private static final int SAMPLE_CUTOFF = 2000; // manually cap sample playback at 2 seconds
@@ -101,6 +102,7 @@
private TwoStatePreference mNotificationPulse;
private DropDownPreference mLockscreen;
private Preference mNotificationAccess;
+ private Preference mZenAccess;
private boolean mSecure;
private int mLockscreenSelectedValue;
private ComponentName mSuppressor;
@@ -153,6 +155,8 @@
mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS);
refreshNotificationListeners();
+ mZenAccess = findPreference(KEY_ZEN_ACCESS);
+ refreshZenAccess();
updateRingerMode();
updateEffectsSuppressor();
}
@@ -161,6 +165,7 @@
public void onResume() {
super.onResume();
refreshNotificationListeners();
+ refreshZenAccess();
lookupRingtoneNames();
mSettingsObserver.register(true);
mReceiver.register(true);
@@ -471,23 +476,24 @@
private void refreshNotificationListeners() {
if (mNotificationAccess != null) {
- final int total = NotificationAccessSettings.getListenersCount(mPM);
- if (total == 0) {
- getPreferenceScreen().removePreference(mNotificationAccess);
+ final int n = NotificationAccessSettings.getEnabledListenersCount(mContext);
+ if (n == 0) {
+ mNotificationAccess.setSummary(getResources().getString(
+ R.string.manage_notification_access_summary_zero));
} else {
- final int n = NotificationAccessSettings.getEnabledListenersCount(mContext);
- if (n == 0) {
- mNotificationAccess.setSummary(getResources().getString(
- R.string.manage_notification_access_summary_zero));
- } else {
- mNotificationAccess.setSummary(String.format(getResources().getQuantityString(
- R.plurals.manage_notification_access_summary_nonzero,
- n, n)));
- }
+ mNotificationAccess.setSummary(String.format(getResources().getQuantityString(
+ R.plurals.manage_notification_access_summary_nonzero,
+ n, n)));
}
}
}
+ // === Zen access ===
+
+ private void refreshZenAccess() {
+ // noop for now
+ }
+
// === Callbacks ===
private final class SettingsObserver extends ContentObserver {
diff --git a/src/com/android/settings/notification/ZenAccessSettings.java b/src/com/android/settings/notification/ZenAccessSettings.java
new file mode 100644
index 0000000..a9f02a9
--- /dev/null
+++ b/src/com/android/settings/notification/ZenAccessSettings.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import android.app.ListFragment;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.util.ArraySet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+import java.util.List;
+
+public class ZenAccessSettings extends ListFragment {
+ private static final boolean SHOW_PACKAGE_NAME = false;
+
+ private Context mContext;
+ private PackageManager mPkgMan;
+ private NotificationManager mNoMan;
+ private Adapter mAdapter;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mContext = getActivity();
+ mPkgMan = mContext.getPackageManager();
+ mNoMan = mContext.getSystemService(NotificationManager.class);
+ mAdapter = new Adapter(mContext);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View v = inflater.inflate(R.layout.managed_service_settings, container, false);
+ final TextView empty = (TextView) v.findViewById(android.R.id.empty);
+ empty.setText(R.string.zen_access_empty_text);
+ return v;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ reloadList();
+ }
+
+ private void reloadList() {
+ mAdapter.clear();
+ final ArraySet<String> requesting = mNoMan.getPackagesRequestingNotificationPolicyAccess();
+ if (requesting != null && !requesting.isEmpty()) {
+ final List<ApplicationInfo> apps = mPkgMan.getInstalledApplications(0);
+ if (apps != null) {
+ for (ApplicationInfo app : apps) {
+ if (requesting.contains(app.packageName)) {
+ mAdapter.add(app);
+ }
+ }
+ }
+ }
+ mAdapter.sort(new PackageItemInfo.DisplayNameComparator(mPkgMan));
+ getListView().setAdapter(mAdapter);
+ }
+
+ @Override
+ public void onListItemClick(ListView l, View v, int position, long id) {
+ final ApplicationInfo info = mAdapter.getItem(position);
+ final boolean hasAccess = hasAccess(info.packageName);
+ setAccess(info.packageName, !hasAccess);
+ mAdapter.notifyDataSetChanged();
+ }
+
+ private boolean hasAccess(String pkg) {
+ return mNoMan.isNotificationPolicyAccessGrantedForPackage(pkg);
+ }
+
+ private void setAccess(String pkg, boolean access) {
+ mNoMan.setNotificationPolicyAccessGranted(pkg, access);
+ }
+
+ private static class ViewHolder {
+ ImageView icon;
+ TextView name;
+ CheckBox checkbox;
+ TextView description;
+ }
+
+ private final class Adapter extends ArrayAdapter<ApplicationInfo> {
+ final LayoutInflater mInflater;
+
+ Adapter(Context context) {
+ super(context, 0, 0);
+ mInflater = (LayoutInflater)
+ getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View v;
+ if (convertView == null) {
+ v = newView(parent);
+ } else {
+ v = convertView;
+ }
+ bindView(v, position);
+ return v;
+ }
+
+ public View newView(ViewGroup parent) {
+ View v = mInflater.inflate(R.layout.managed_service_item, parent, false);
+ ViewHolder h = new ViewHolder();
+ h.icon = (ImageView) v.findViewById(R.id.icon);
+ h.name = (TextView) v.findViewById(R.id.name);
+ h.checkbox = (CheckBox) v.findViewById(R.id.checkbox);
+ h.description = (TextView) v.findViewById(R.id.description);
+ v.setTag(h);
+ return v;
+ }
+
+ public void bindView(View view, int position) {
+ ViewHolder vh = (ViewHolder) view.getTag();
+ ApplicationInfo info = getItem(position);
+
+ vh.icon.setImageDrawable(info.loadIcon(mPkgMan));
+ vh.name.setText(info.loadLabel(mPkgMan));
+ if (SHOW_PACKAGE_NAME) {
+ vh.description.setText(info.packageName);
+ vh.description.setVisibility(View.VISIBLE);
+ } else {
+ vh.description.setVisibility(View.GONE);
+ }
+ vh.checkbox.setChecked(hasAccess(info.packageName));
+ }
+
+ }
+
+}
diff --git a/tests/src/com/android/settings/vpn2/CertInstallerHelper.java b/tests/src/com/android/settings/vpn2/CertInstallerHelper.java
index f95893f..fa2638f 100644
--- a/tests/src/com/android/settings/vpn2/CertInstallerHelper.java
+++ b/tests/src/com/android/settings/vpn2/CertInstallerHelper.java
@@ -71,7 +71,7 @@
*/
public CertInstallerHelper() {
mKeyStore.reset();
- mKeyStore.password(CERT_STORE_PASSWORD);
+ mKeyStore.onUserPasswordChanged(CERT_STORE_PASSWORD);
}
private void extractCertificate(String certFile, String password) {