Third party DND provider APIs.
Bug: 22977552
Change-Id: I8c1bac317e9aa5d9565afe3f0c4e2be8fc34e6a9
diff --git a/core/java/android/app/AutomaticZenRule.aidl b/core/java/android/app/AutomaticZenRule.aidl
new file mode 100644
index 0000000..feb21d6
--- /dev/null
+++ b/core/java/android/app/AutomaticZenRule.aidl
@@ -0,0 +1,19 @@
+/**
+ * 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 android.app;
+
+parcelable AutomaticZenRule;
\ No newline at end of file
diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java
new file mode 100644
index 0000000..fea5624
--- /dev/null
+++ b/core/java/android/app/AutomaticZenRule.java
@@ -0,0 +1,190 @@
+/**
+ * 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 android.app;
+
+import android.content.ComponentName;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Rule instance information for zen mode.
+ */
+public class AutomaticZenRule implements Parcelable {
+
+ private boolean enabled = false;
+ private String name;
+ private int interruptionFilter;
+ private Uri conditionId;
+ private ComponentName owner;
+
+ /**
+ * Creates an automatic zen rule.
+ *
+ * @param name The name of the rule.
+ * @param owner The Condition Provider service that owns this rule.
+ * @param conditionId A representation of the state that should cause the Condition Provider
+ * service to apply the interruption filter.
+ * @param interruptionFilter The interruption filter defines which notifications are allowed to
+ * interrupt the user (e.g. via sound & vibration) while this rule
+ * is active.
+ * @param enabled Whether the rule is enabled.
+ */
+ public AutomaticZenRule(String name, ComponentName owner, Uri conditionId,
+ int interruptionFilter, boolean enabled) {
+ this.name = name;
+ this.owner = owner;
+ this.conditionId = conditionId;
+ this.interruptionFilter = interruptionFilter;
+ this.enabled = enabled;
+ }
+
+ public AutomaticZenRule(Parcel source) {
+ enabled = source.readInt() == 1;
+ if (source.readInt() == 1) {
+ name = source.readString();
+ }
+ interruptionFilter = source.readInt();
+ conditionId = source.readParcelable(null);
+ owner = source.readParcelable(null);
+ }
+
+ /**
+ * Returns the {@link ComponentName} of the condition provider service that owns this rule.
+ */
+ public ComponentName getOwner() {
+ return owner;
+ }
+
+ /**
+ * Returns the representation of the state that causes this rule to become active.
+ */
+ public Uri getConditionId() {
+ return conditionId;
+ }
+
+ /**
+ * Returns the interruption filter that is applied when this rule is active.
+ */
+ public int getInterruptionFilter() {
+ return interruptionFilter;
+ }
+
+ /**
+ * Returns the name of this rule.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Returns whether this rule is enabled.
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * Sets the representation of the state that causes this rule to become active.
+ */
+ public void setConditionId(Uri conditionId) {
+ this.conditionId = conditionId;
+ }
+
+ /**
+ * Sets the interruption filter that is applied when this rule is active.
+ * @param interruptionFilter One of the INTERRUPTION_FILTER_ constants in NotificationManager.
+ */
+ public void setInterruptionFilter(int interruptionFilter) {
+ this.interruptionFilter = interruptionFilter;
+ }
+
+ /**
+ * Sets the name of this rule.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Enables this rule.
+ */
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(enabled ? 1 : 0);
+ if (name != null) {
+ dest.writeInt(1);
+ dest.writeString(name);
+ } else {
+ dest.writeInt(0);
+ }
+ dest.writeInt(interruptionFilter);
+ dest.writeParcelable(conditionId, 0);
+ dest.writeParcelable(owner, 0);
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder(AutomaticZenRule.class.getSimpleName()).append('[')
+ .append("enabled=").append(enabled)
+ .append(",name=").append(name)
+ .append(",interruptionFilter=").append(interruptionFilter)
+ .append(",conditionId=").append(conditionId)
+ .append(",owner=").append(owner)
+ .append(']').toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof AutomaticZenRule)) return false;
+ if (o == this) return true;
+ final AutomaticZenRule other = (AutomaticZenRule) o;
+ return other.enabled == enabled
+ && Objects.equals(other.name, name)
+ && other.interruptionFilter == interruptionFilter
+ && Objects.equals(other.conditionId, conditionId)
+ && Objects.equals(other.owner, owner);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(enabled, name, interruptionFilter, conditionId, owner);
+ }
+
+ public static final Parcelable.Creator<AutomaticZenRule> CREATOR
+ = new Parcelable.Creator<AutomaticZenRule>() {
+ @Override
+ public AutomaticZenRule createFromParcel(Parcel source) {
+ return new AutomaticZenRule(source);
+ }
+ @Override
+ public AutomaticZenRule[] newArray(int size) {
+ return new AutomaticZenRule[size];
+ }
+ };
+}
\ No newline at end of file
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index f78fb47..920fbe9 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -30,6 +30,7 @@
import android.service.notification.IConditionProvider;
import android.service.notification.INotificationListener;
import android.service.notification.StatusBarNotification;
+import android.app.AutomaticZenRule;
import android.service.notification.ZenModeConfig;
/** {@hide} */
@@ -92,6 +93,11 @@
String[] getPackagesRequestingNotificationPolicyAccess();
boolean isNotificationPolicyAccessGrantedForPackage(String pkg);
void setNotificationPolicyAccessGranted(String pkg, boolean granted);
+ AutomaticZenRule getAutomaticZenRule(String name);
+ List<AutomaticZenRule> getAutomaticZenRules();
+ boolean addOrUpdateAutomaticZenRule(in AutomaticZenRule automaticZenRule);
+ boolean renameAutomaticZenRule(String oldName, String newName);
+ boolean removeAutomaticZenRule(String name);
byte[] getBackupPayload(int user);
void applyRestore(in byte[] payload, int user);
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 605c006..cbf198b 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -420,6 +420,106 @@
}
/**
+ * Returns AutomaticZenRules owned by the caller.
+ *
+ * <p>
+ * Only available if policy access is granted to this package.
+ * See {@link #isNotificationPolicyAccessGranted}.
+ */
+ public List<AutomaticZenRule> getAutomaticZenRules() {
+ INotificationManager service = getService();
+ try {
+ return service.getAutomaticZenRules();
+ } catch (RemoteException e) {
+ }
+ return null;
+ }
+
+ /**
+ * Returns the AutomaticZenRule with the given name, if it exists and the caller has access.
+ *
+ * <p>
+ * Only available if policy access is granted to this package.
+ * See {@link #isNotificationPolicyAccessGranted}.
+ *
+ * <p>
+ * Returns null if there are no zen rules that match the given name, or if the calling package
+ * doesn't own the matching rule. See {@link AutomaticZenRule#getOwner}.
+ */
+ public AutomaticZenRule getAutomaticZenRule(String name) {
+ INotificationManager service = getService();
+ try {
+ return service.getAutomaticZenRule(name);
+ } catch (RemoteException e) {
+ }
+ return null;
+ }
+
+ /**
+ * Creates or updates the given zen rule.
+ *
+ * <p>
+ * Only available if policy access is granted to this package.
+ * See {@link #isNotificationPolicyAccessGranted}.
+ *
+ * <p>
+ * Callers can only update rules that they own. See {@link AutomaticZenRule#getOwner}.
+ * @param automaticZenRule the rule to create or update.
+ * @return Whether the rule was successfully created or updated.
+ */
+ public boolean addOrUpdateAutomaticZenRule(AutomaticZenRule automaticZenRule) {
+ INotificationManager service = getService();
+ try {
+ return service.addOrUpdateAutomaticZenRule(automaticZenRule);
+ } catch (RemoteException e) {
+ }
+ return false;
+ }
+
+ /**
+ * Renames a zen rule.
+ *
+ * <p>
+ * Only available if policy access is granted to this package.
+ * See {@link #isNotificationPolicyAccessGranted}.
+ *
+ * <p>
+ * Callers can only update rules that they own. See {@link AutomaticZenRule#getOwner}.
+ * @param oldName The name of the rule to update.
+ * @param newName The new name for the rule.
+ * @return Whether the rule was successfully updated.
+ */
+ public boolean renameAutomaticZenRule(String oldName, String newName) {
+ INotificationManager service = getService();
+ try {
+ return service.renameAutomaticZenRule(oldName, newName);
+ } catch (RemoteException e) {
+ }
+ return false;
+ }
+
+ /**
+ * Deletes the automatic zen rule with the given name.
+ *
+ * <p>
+ * Only available if policy access is granted to this package.
+ * See {@link #isNotificationPolicyAccessGranted}.
+ *
+ * <p>
+ * Callers can only delete rules that they own. See {@link AutomaticZenRule#getOwner}.
+ * @param name the name of the rule to delete.
+ * @return Whether the rule was successfully deleted.
+ */
+ public boolean removeAutomaticZenRule(String name) {
+ INotificationManager service = getService();
+ try {
+ return service.removeAutomaticZenRule(name);
+ } catch (RemoteException e) {
+ }
+ return false;
+ }
+
+ /**
* Checks the ability to read/modify notification policy for the calling package.
*
* <p>
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 6310570..4de903e 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -755,6 +755,10 @@
return rt;
}
+ public static ComponentName getScheduleConditionProvider() {
+ return new ComponentName(SYSTEM_AUTHORITY, "ScheduleConditionProvider");
+ }
+
public static class ScheduleInfo {
public int[] days;
public int startHour;
@@ -827,6 +831,10 @@
return rt;
}
+ public static ComponentName getEventConditionProvider() {
+ return new ComponentName(SYSTEM_AUTHORITY, "EventConditionProvider");
+ }
+
public static class EventInfo {
public static final int REPLY_ANY_EXCEPT_NO = 0;
public static final int REPLY_YES_OR_MAYBE = 1;