OSDN Git Service

Add setup UI for minimum delay between an app's notification sounds.
authorDanny Baumann <dannybaumann@web.de>
Wed, 19 Oct 2016 11:39:33 +0000 (13:39 +0200)
committerDanny Baumann <dannybaumann@web.de>
Thu, 27 Oct 2016 12:12:02 +0000 (05:12 -0700)
Change-Id: I70e9cc308b4f7c7681457a0b09dd73e5d1aebb73

res/values/cm_arrays.xml
res/values/cm_strings.xml
res/xml/app_notification_settings.xml
src/com/android/settings/notification/AppNotificationSettings.java
src/com/android/settings/notification/NotificationBackend.java

index 35b2bf7..57375d9 100644 (file)
         <item>@string/security_settings_fingerprint_sensor_location_right</item>
     </string-array>
 
+    <!-- Display settings.  The delay in inactivity before the screen is turned off. These are shown in a list dialog. -->
+    <string-array name="app_notification_sound_timeout_entries" translatable="false">
+        <item>@string/app_notification_sound_timeout_value_none</item>
+        <item>@string/app_notification_sound_timeout_value_10_seconds</item>
+        <item>@string/app_notification_sound_timeout_value_30_seconds</item>
+        <item>@string/app_notification_sound_timeout_value_1_minute</item>
+        <item>@string/app_notification_sound_timeout_value_5_minutes</item>
+        <item>@string/app_notification_sound_timeout_value_15_minutes</item>
+        <item>@string/app_notification_sound_timeout_value_30_minutes</item>
+    </string-array>
+
+    <!-- Do not translate. -->
+    <string-array name="app_notification_sound_timeout_values" translatable="false">
+        <item>0</item>
+        <item>10000</item>
+        <item>30000</item>
+        <item>60000</item>
+        <item>300000</item>
+        <item>900000</item>
+        <item>1800000</item>
+    </string-array>
 </resources>
index a28a772..4ef248c 100644 (file)
     <string name="app_notification_no_ongoing_on_keyguard_title">Disable persistent notification on lock screen</string>
     <string name="app_notification_no_ongoing_on_keyguard_summary">Never show persistent notifications from this app on the lock screen</string>
 
+    <!-- Notification sound timeout -->
+    <string name="app_notification_sound_timeout_title">Minimum time between notification sounds</string>
+    <string name="app_notification_sound_timeout_summary_template">Allow sounds or vibration no more than once every <xliff:g id="duration">%1$s</xliff:g></string>
+    <string name="app_notification_sound_timeout_value_none">No restriction</string>
+    <string name="app_notification_sound_timeout_value_10_seconds">10 seconds</string>
+    <string name="app_notification_sound_timeout_value_30_seconds">30 seconds</string>
+    <string name="app_notification_sound_timeout_value_1_minute">1 minute</string>
+    <string name="app_notification_sound_timeout_value_5_minutes">5 minutes</string>
+    <string name="app_notification_sound_timeout_value_15_minutes">10 minutes</string>
+    <string name="app_notification_sound_timeout_value_30_minutes">30 minutes</string>
+
     <!-- CmRadioInfo -->
     <string name="cm_radio_info_label">Enhanced radio control</string>
 
index f438e2f..11057f3 100644 (file)
             android:dependency="show_on_keyguard"
             android:persistent="false" />
 
+    <ListPreference
+            android:key="sound_timeout"
+            android:title="@string/app_notification_sound_timeout_title"
+            android:entries="@array/app_notification_sound_timeout_entries"
+            android:entryValues="@array/app_notification_sound_timeout_values"
+            android:order="7"
+            android:persistent="false" />
+
     <!-- App notification preferences -->
     <Preference
             android:key="app_settings"
             android:title="@string/app_notification_preferences"
-            android:order="7"
+            android:order="8"
             android:persistent="false" />
 
 </PreferenceScreen>
index 22df064..2e76f92 100644 (file)
@@ -27,6 +27,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.Preference.OnPreferenceClickListener;
@@ -61,6 +62,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
     private static final String KEY_APP_SETTINGS = "app_settings";
     private static final String KEY_SHOW_ON_KEYGUARD = "show_on_keyguard";
     private static final String KEY_NO_ONGOING_ON_KEYGUARD = "no_ongoing_on_keyguard";
+    private static final String KEY_SOUND_TIMEOUT = "sound_timeout";
 
     private static final Intent APP_NOTIFICATION_PREFS_CATEGORY_INTENT
             = new Intent(Intent.ACTION_MAIN)
@@ -75,6 +77,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
     private SwitchPreference mSensitive;
     private SwitchPreference mShowOnKeyguard;
     private SwitchPreference mShowNoOngoingOnKeyguard;
+    private ListPreference mSoundTimeout;
     private AppRow mAppRow;
     private boolean mCreated;
     private boolean mIsSystemPackage;
@@ -143,6 +146,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
         mSensitive = (SwitchPreference) findPreference(KEY_SENSITIVE);
         mShowOnKeyguard = (SwitchPreference) findPreference(KEY_SHOW_ON_KEYGUARD);
         mShowNoOngoingOnKeyguard = (SwitchPreference) findPreference(KEY_NO_ONGOING_ON_KEYGUARD);
+        mSoundTimeout = (ListPreference) findPreference(KEY_SOUND_TIMEOUT);
 
         mAppRow = mBackend.loadAppRow(pm, info.applicationInfo);
 
@@ -156,6 +160,8 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
         mPriority.setChecked(mAppRow.priority);
         mPeekable.setChecked(mAppRow.peekable);
         mSensitive.setChecked(mAppRow.sensitive);
+        mSoundTimeout.setValue(Long.toString(mAppRow.soundTimeout));
+        updateSoundTimeoutSummary(mAppRow.soundTimeout);
 
         mBlock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
             @Override
@@ -196,6 +202,18 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
             }
         });
 
+        mSoundTimeout.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                long value = Long.valueOf((String) newValue);
+                if (!mBackend.setNotificationSoundTimeout(pkg, mUid, value)) {
+                    return false;
+                }
+                updateSoundTimeoutSummary(value);
+                return true;
+            }
+        });
+
         if (mAppRow.settingsIntent != null) {
             findPreference(KEY_APP_SETTINGS).setOnPreferenceClickListener(
                     new OnPreferenceClickListener() {
@@ -260,6 +278,25 @@ public class AppNotificationSettings extends SettingsPreferenceFragment {
         }
     }
 
+    private void updateSoundTimeoutSummary(long value) {
+        if (value == 0) {
+            mSoundTimeout.setSummary(R.string.app_notification_sound_timeout_value_none);
+        } else {
+            final CharSequence[] entries = mSoundTimeout.getEntries();
+            final CharSequence[] values = mSoundTimeout.getEntryValues();
+            CharSequence summary = null;
+            for (int i = 0; i < values.length; i++) {
+                long timeout = Long.parseLong(values[i].toString());
+                if (timeout == value) {
+                    summary = getString(R.string.app_notification_sound_timeout_summary_template,
+                            entries[i]);
+                    break;
+                }
+            }
+            mSoundTimeout.setSummary(summary);
+        }
+    }
+
     private void updateDependents(boolean banned) {
         final boolean lockscreenSecure = new LockPatternUtils(getActivity()).isSecure(
                 UserHandle.myUserId());
index 5467cb3..ae83179 100644 (file)
@@ -47,6 +47,7 @@ public class NotificationBackend {
         row.priority = getHighPriority(row.pkg, row.uid);
         row.peekable = getPeekable(row.pkg, row.uid);
         row.sensitive = getSensitive(row.pkg, row.uid);
+        row.soundTimeout = getNotificationSoundTimeout(row.pkg, row.uid);
         return row;
     }
 
@@ -149,6 +150,25 @@ public class NotificationBackend {
         }
     }
 
+    public long getNotificationSoundTimeout(String pkg, int uid) {
+        try {
+            return sINM.getPackageNotificationSoundTimeout(pkg, uid);
+        } catch (Exception e) {
+            Log.w(TAG, "Error calling NoMan", e);
+            return 0;
+        }
+    }
+
+    public boolean setNotificationSoundTimeout(String pkg, int uid, long timeout) {
+        try {
+            sINM.setPackageNotificationSoundTimeout(pkg, uid, timeout);
+            return true;
+        } catch (Exception e) {
+            Log.w(TAG, "Error calling NoMan", e);
+            return false;
+        }
+    }
+
     static class Row {
         public String section;
     }
@@ -164,6 +184,7 @@ public class NotificationBackend {
         public boolean peekable;
         public boolean sensitive;
         public boolean first;  // first app in section
+        public long soundTimeout;
     }
 
 }