Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e77bb36d authored by John Spurlock's avatar John Spurlock
Browse files

Wire up condition providers to zen mode exit triggers.

Bug:13743109
Change-Id: I4e45d7050d1f9aaa379f46379a3203e61e216a3d
parent 31dc634b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -180,6 +180,7 @@ LOCAL_SRC_FILES += \
	core/java/android/os/IUserManager.aidl \
	core/java/android/os/IVibratorService.aidl \
	core/java/android/service/notification/INotificationListener.aidl \
	core/java/android/service/notification/IConditionListener.aidl \
	core/java/android/service/notification/IConditionProvider.aidl \
	core/java/android/print/ILayoutResultCallback.aidl \
	core/java/android/print/IPrinterDiscoveryObserver.aidl \
+6 −2
Original line number Diff line number Diff line
@@ -18,13 +18,15 @@
package android.app;

import android.app.ITransientNotification;
import android.service.notification.StatusBarNotification;
import android.app.Notification;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.service.notification.Condition;
import android.service.notification.IConditionListener;
import android.service.notification.IConditionProvider;
import android.service.notification.INotificationListener;
import android.service.notification.StatusBarNotification;
import android.service.notification.ZenModeConfig;

/** {@hide} */
@@ -55,5 +57,7 @@ interface INotificationManager

    ZenModeConfig getZenModeConfig();
    boolean setZenModeConfig(in ZenModeConfig config);
    void notifyCondition(in IConditionProvider provider, in Condition condition);
    oneway void notifyConditions(String pkg, in IConditionProvider provider, in Condition[] conditions);
    oneway void requestZenModeConditions(in IConditionListener callback, boolean requested);
    oneway void setZenModeCondition(in Uri conditionId);
}
 No newline at end of file
+37 −9
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.service.notification;

import android.content.Context;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
@@ -29,18 +30,25 @@ import java.util.Objects;
 */
public class Condition implements Parcelable {

    public static final String SCHEME = "condition";

    public static final int STATE_FALSE = 0;
    public static final int STATE_TRUE = 1;
    public static final int STATE_UNKNOWN = 2;
    public static final int STATE_ERROR = 3;

    public static final int FLAG_RELEVANT_NOW = 1 << 0;
    public static final int FLAG_RELEVANT_ALWAYS = 1 << 1;

    public final Uri id;
    public String caption;
    public boolean state;
    public int state;
    public int flags;


    public Condition(Uri id, String caption, boolean state, int flags) {
    public Condition(Uri id, String caption, int state, int flags) {
        if (id == null) throw new IllegalArgumentException("id is required");
        if (caption == null) throw new IllegalArgumentException("caption is required");
        if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state);
        this.id = id;
        this.caption = caption;
        this.state = state;
@@ -48,17 +56,21 @@ public class Condition implements Parcelable {
    }

    private Condition(Parcel source) {
        id = Uri.CREATOR.createFromParcel(source);
        caption = source.readString();
        state = source.readInt() == 1;
        flags = source.readInt();
        this((Uri)source.readParcelable(Condition.class.getClassLoader()),
                source.readString(),
                source.readInt(),
                source.readInt());
    }

    private static boolean isValidState(int state) {
        return state >= STATE_FALSE && state <= STATE_ERROR;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(id, 0);
        dest.writeString(caption);
        dest.writeInt(state ? 1 : 0);
        dest.writeInt(state);
        dest.writeInt(flags);
    }

@@ -67,11 +79,19 @@ public class Condition implements Parcelable {
        return new StringBuilder(Condition.class.getSimpleName()).append('[')
            .append("id=").append(id)
            .append(",caption=").append(caption)
            .append(",state=").append(state)
            .append(",state=").append(stateToString(state))
            .append(",flags=").append(flags)
            .append(']').toString();
    }

    public static String stateToString(int state) {
        if (state == STATE_FALSE) return "STATE_FALSE";
        if (state == STATE_TRUE) return "STATE_TRUE";
        if (state == STATE_UNKNOWN) return "STATE_UNKNOWN";
        if (state == STATE_ERROR) return "STATE_ERROR";
        throw new IllegalArgumentException("state is invalid: " + state);
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Condition)) return false;
@@ -104,6 +124,14 @@ public class Condition implements Parcelable {
        }
    }

    public static Uri.Builder newId(Context context) {
        return new Uri.Builder().scheme(SCHEME).authority(context.getPackageName());
    }

    public static boolean isValidId(Uri id, String pkg) {
        return id != null && id.getScheme().equals(SCHEME) && id.getAuthority().equals(pkg);
    }

    public static final Parcelable.Creator<Condition> CREATOR
            = new Parcelable.Creator<Condition>() {
        @Override
+18 −23
Original line number Diff line number Diff line
@@ -56,11 +56,10 @@ public abstract class ConditionProviderService extends Service {
    public static final String SERVICE_INTERFACE
            = "android.service.notification.ConditionProviderService";


    abstract public Condition[] queryConditions(int relevance);
    abstract public Condition[] getConditions(Uri[] conditionIds);
    abstract public boolean subscribe(Uri conditionId);
    abstract public boolean unsubscribe(Uri conditionId);
    abstract public void onConnected();
    abstract public void onRequestConditions(int relevance);
    abstract public void onSubscribe(Uri conditionId);
    abstract public void onUnsubscribe(Uri conditionId);

    private final INotificationManager getNotificationInterface() {
        if (mNoMan == null) {
@@ -70,10 +69,10 @@ public abstract class ConditionProviderService extends Service {
        return mNoMan;
    }

    public final void notifyCondition(Condition condition) {
    public final void notifyConditions(Condition[] conditions) {
        if (!isBound()) return;
        try {
            getNotificationInterface().notifyCondition(mProvider, condition);
            getNotificationInterface().notifyConditions(getPackageName(), mProvider, conditions);
        } catch (android.os.RemoteException ex) {
            Log.v(TAG, "Unable to contact notification manager", ex);
        }
@@ -99,42 +98,38 @@ public abstract class ConditionProviderService extends Service {
        private final ConditionProviderService mService = ConditionProviderService.this;

        @Override
        public Condition[] queryConditions(int relevance) {
        public void onConnected() {
            try {
                return mService.queryConditions(relevance);
                mService.onConnected();
            } catch (Throwable t) {
                Log.w(TAG, "Error running queryConditions", t);
                return null;
                Log.w(TAG, "Error running onConnected", t);
            }
        }

        @Override
        public Condition[] getConditions(Uri[] conditionIds) {
        public void onRequestConditions(int relevance) {
            try {
                return mService.getConditions(conditionIds);
                mService.onRequestConditions(relevance);
            } catch (Throwable t) {
                Log.w(TAG, "Error running getConditions", t);
                return null;
                Log.w(TAG, "Error running onRequestConditions", t);
            }
        }

        @Override
        public boolean subscribe(Uri conditionId) {
        public void onSubscribe(Uri conditionId) {
            try {
                return mService.subscribe(conditionId);
                mService.onSubscribe(conditionId);
            } catch (Throwable t) {
                Log.w(TAG, "Error running subscribe", t);
                return false;
                Log.w(TAG, "Error running onSubscribe", t);
            }
        }

        @Override
        public boolean unsubscribe(Uri conditionId) {
        public void onUnsubscribe(Uri conditionId) {
            try {
                return mService.unsubscribe(conditionId);
                mService.onUnsubscribe(conditionId);
            } catch (Throwable t) {
                Log.w(TAG, "Error running unsubscribe", t);
                return false;
                Log.w(TAG, "Error running onUnsubscribe", t);
            }
        }
    }
+25 −0
Original line number Diff line number Diff line
/**
 * Copyright (c) 2014, 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.service.notification;

import android.net.Uri;
import android.service.notification.Condition;

/** @hide */
oneway interface IConditionListener {
    void onConditionsReceived(in Condition[] conditions);
}
 No newline at end of file
Loading