1/*
2 * Copyright (C) 2017 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
17package android.service.settings.suggestions;
18
19import android.annotation.IntDef;
20import android.annotation.SystemApi;
21import android.app.PendingIntent;
22import android.graphics.drawable.Icon;
23import android.os.Parcel;
24import android.os.Parcelable;
25import android.text.TextUtils;
26
27import java.lang.annotation.Retention;
28import java.lang.annotation.RetentionPolicy;
29
30/**
31 * Data object that has information about a device suggestion.
32 *
33 * @hide
34 */
35@SystemApi
36public final class Suggestion implements Parcelable {
37
38    /**
39     * @hide
40     */
41    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
42            FLAG_HAS_BUTTON,
43            FLAG_ICON_TINTABLE,
44    })
45    @Retention(RetentionPolicy.SOURCE)
46    public @interface Flags {
47    }
48
49    /**
50     * Flag for suggestion type with a single button
51     */
52    public static final int FLAG_HAS_BUTTON = 1 << 0;
53    /**
54     * @hide
55     */
56    public static final int FLAG_ICON_TINTABLE = 1 << 1;
57
58    private final String mId;
59    private final CharSequence mTitle;
60    private final CharSequence mSummary;
61    private final Icon mIcon;
62    @Flags
63    private final int mFlags;
64    private final PendingIntent mPendingIntent;
65
66    /**
67     * Gets the id for the suggestion object.
68     */
69    public String getId() {
70        return mId;
71    }
72
73    /**
74     * Title of the suggestion that is shown to the user.
75     */
76    public CharSequence getTitle() {
77        return mTitle;
78    }
79
80    /**
81     * Optional summary describing what this suggestion controls.
82     */
83    public CharSequence getSummary() {
84        return mSummary;
85    }
86
87    /**
88     * Optional icon for this suggestion.
89     */
90    public Icon getIcon() {
91        return mIcon;
92    }
93
94    /**
95     * Optional flags for this suggestion. This will influence UI when rendering suggestion in
96     * different style.
97     */
98    @Flags
99    public int getFlags() {
100        return mFlags;
101    }
102
103    /**
104     * The Intent to launch when the suggestion is activated.
105     */
106    public PendingIntent getPendingIntent() {
107        return mPendingIntent;
108    }
109
110    private Suggestion(Builder builder) {
111        mId = builder.mId;
112        mTitle = builder.mTitle;
113        mSummary = builder.mSummary;
114        mIcon = builder.mIcon;
115        mFlags = builder.mFlags;
116        mPendingIntent = builder.mPendingIntent;
117    }
118
119    private Suggestion(Parcel in) {
120        mId = in.readString();
121        mTitle = in.readCharSequence();
122        mSummary = in.readCharSequence();
123        mIcon = in.readParcelable(Icon.class.getClassLoader());
124        mFlags = in.readInt();
125        mPendingIntent = in.readParcelable(PendingIntent.class.getClassLoader());
126    }
127
128    public static final Creator<Suggestion> CREATOR = new Creator<Suggestion>() {
129        @Override
130        public Suggestion createFromParcel(Parcel in) {
131            return new Suggestion(in);
132        }
133
134        @Override
135        public Suggestion[] newArray(int size) {
136            return new Suggestion[size];
137        }
138    };
139
140    @Override
141    public int describeContents() {
142        return 0;
143    }
144
145    @Override
146    public void writeToParcel(Parcel dest, int flags) {
147        dest.writeString(mId);
148        dest.writeCharSequence(mTitle);
149        dest.writeCharSequence(mSummary);
150        dest.writeParcelable(mIcon, flags);
151        dest.writeInt(mFlags);
152        dest.writeParcelable(mPendingIntent, flags);
153    }
154
155    /**
156     * Builder class for {@link Suggestion}.
157     */
158    public static class Builder {
159        private final String mId;
160        private CharSequence mTitle;
161        private CharSequence mSummary;
162        private Icon mIcon;
163        @Flags
164        private int mFlags;
165        private PendingIntent mPendingIntent;
166
167        public Builder(String id) {
168            if (TextUtils.isEmpty(id)) {
169                throw new IllegalArgumentException("Suggestion id cannot be empty");
170            }
171            mId = id;
172        }
173
174        /**
175         * Sets suggestion title
176         */
177        public Builder setTitle(CharSequence title) {
178            mTitle = title;
179            return this;
180        }
181
182        /**
183         * Sets suggestion summary
184         */
185        public Builder setSummary(CharSequence summary) {
186            mSummary = summary;
187            return this;
188        }
189
190        /**
191         * Sets icon for the suggestion.
192         */
193        public Builder setIcon(Icon icon) {
194            mIcon = icon;
195            return this;
196        }
197
198        /**
199         * Sets a UI type for this suggestion. This will influence UI when rendering suggestion in
200         * different style.
201         */
202        public Builder setFlags(@Flags int flags) {
203            mFlags = flags;
204            return this;
205        }
206
207        /**
208         * Sets suggestion intent
209         */
210        public Builder setPendingIntent(PendingIntent pendingIntent) {
211            mPendingIntent = pendingIntent;
212            return this;
213        }
214
215        /**
216         * Builds an immutable {@link Suggestion} object.
217         */
218        public Suggestion build() {
219            return new Suggestion(this /* builder */);
220        }
221    }
222}
223