1 /**
2  * Copyright (c) 2014, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.service.notification;
18 
19 import android.annotation.SystemApi;
20 import android.content.Context;
21 import android.net.Uri;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 
25 import java.util.Objects;
26 
27 /**
28  * Condition information from condition providers.
29  *
30  * @hide
31  */
32 @SystemApi
33 public class Condition implements Parcelable {
34 
35     public static final String SCHEME = "condition";
36 
37     public static final int STATE_FALSE = 0;
38     public static final int STATE_TRUE = 1;
39     public static final int STATE_UNKNOWN = 2;
40     public static final int STATE_ERROR = 3;
41 
42     public static final int FLAG_RELEVANT_NOW = 1 << 0;
43     public static final int FLAG_RELEVANT_ALWAYS = 1 << 1;
44 
45     public final Uri id;
46     public final String summary;
47     public final String line1;
48     public final String line2;
49     public final int icon;
50     public final int state;
51     public final int flags;
52 
Condition(Uri id, String summary, String line1, String line2, int icon, int state, int flags)53     public Condition(Uri id, String summary, String line1, String line2, int icon,
54             int state, int flags) {
55         if (id == null) throw new IllegalArgumentException("id is required");
56         if (summary == null) throw new IllegalArgumentException("summary is required");
57         if (line1 == null) throw new IllegalArgumentException("line1 is required");
58         if (line2 == null) throw new IllegalArgumentException("line2 is required");
59         if (!isValidState(state)) throw new IllegalArgumentException("state is invalid: " + state);
60         this.id = id;
61         this.summary = summary;
62         this.line1 = line1;
63         this.line2 = line2;
64         this.icon = icon;
65         this.state = state;
66         this.flags = flags;
67     }
68 
Condition(Parcel source)69     private Condition(Parcel source) {
70         this((Uri)source.readParcelable(Condition.class.getClassLoader()),
71                 source.readString(),
72                 source.readString(),
73                 source.readString(),
74                 source.readInt(),
75                 source.readInt(),
76                 source.readInt());
77     }
78 
isValidState(int state)79     private static boolean isValidState(int state) {
80         return state >= STATE_FALSE && state <= STATE_ERROR;
81     }
82 
83     @Override
writeToParcel(Parcel dest, int flags)84     public void writeToParcel(Parcel dest, int flags) {
85         dest.writeParcelable(id, 0);
86         dest.writeString(summary);
87         dest.writeString(line1);
88         dest.writeString(line2);
89         dest.writeInt(icon);
90         dest.writeInt(state);
91         dest.writeInt(this.flags);
92     }
93 
94     @Override
toString()95     public String toString() {
96         return new StringBuilder(Condition.class.getSimpleName()).append('[')
97             .append("id=").append(id)
98             .append(",summary=").append(summary)
99             .append(",line1=").append(line1)
100             .append(",line2=").append(line2)
101             .append(",icon=").append(icon)
102             .append(",state=").append(stateToString(state))
103             .append(",flags=").append(flags)
104             .append(']').toString();
105     }
106 
stateToString(int state)107     public static String stateToString(int state) {
108         if (state == STATE_FALSE) return "STATE_FALSE";
109         if (state == STATE_TRUE) return "STATE_TRUE";
110         if (state == STATE_UNKNOWN) return "STATE_UNKNOWN";
111         if (state == STATE_ERROR) return "STATE_ERROR";
112         throw new IllegalArgumentException("state is invalid: " + state);
113     }
114 
relevanceToString(int flags)115     public static String relevanceToString(int flags) {
116         final boolean now = (flags & FLAG_RELEVANT_NOW) != 0;
117         final boolean always = (flags & FLAG_RELEVANT_ALWAYS) != 0;
118         if (!now && !always) return "NONE";
119         if (now && always) return "NOW, ALWAYS";
120         return now ? "NOW" : "ALWAYS";
121     }
122 
123     @Override
equals(Object o)124     public boolean equals(Object o) {
125         if (!(o instanceof Condition)) return false;
126         if (o == this) return true;
127         final Condition other = (Condition) o;
128         return Objects.equals(other.id, id)
129                 && Objects.equals(other.summary, summary)
130                 && Objects.equals(other.line1, line1)
131                 && Objects.equals(other.line2, line2)
132                 && other.icon == icon
133                 && other.state == state
134                 && other.flags == flags;
135     }
136 
137     @Override
hashCode()138     public int hashCode() {
139         return Objects.hash(id, summary, line1, line2, icon, state, flags);
140     }
141 
142     @Override
describeContents()143     public int describeContents() {
144         return 0;
145     }
146 
copy()147     public Condition copy() {
148         final Parcel parcel = Parcel.obtain();
149         try {
150             writeToParcel(parcel, 0);
151             parcel.setDataPosition(0);
152             return new Condition(parcel);
153         } finally {
154             parcel.recycle();
155         }
156     }
157 
newId(Context context)158     public static Uri.Builder newId(Context context) {
159         return new Uri.Builder().scheme(SCHEME).authority(context.getPackageName());
160     }
161 
isValidId(Uri id, String pkg)162     public static boolean isValidId(Uri id, String pkg) {
163         return id != null && SCHEME.equals(id.getScheme()) && pkg.equals(id.getAuthority());
164     }
165 
166     public static final Parcelable.Creator<Condition> CREATOR
167             = new Parcelable.Creator<Condition>() {
168         @Override
169         public Condition createFromParcel(Parcel source) {
170             return new Condition(source);
171         }
172 
173         @Override
174         public Condition[] newArray(int size) {
175             return new Condition[size];
176         }
177     };
178 }
179