1723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang/*
2723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * Copyright (C) 2017 The Android Open Source Project
3723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang *
4723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * you may not use this file except in compliance with the License.
6723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * You may obtain a copy of the License at
7723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang *
8723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang *
10723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * Unless required by applicable law or agreed to in writing, software
11723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * See the License for the specific language governing permissions and
14723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * limitations under the License.
15723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang */
16723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
17723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangpackage android.service.settings.suggestions;
18723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
196abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhangimport android.annotation.IntDef;
20723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangimport android.annotation.SystemApi;
21723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangimport android.app.PendingIntent;
226abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhangimport android.graphics.drawable.Icon;
23723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangimport android.os.Parcel;
24723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangimport android.os.Parcelable;
25723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangimport android.text.TextUtils;
26723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
276abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhangimport java.lang.annotation.Retention;
286abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhangimport java.lang.annotation.RetentionPolicy;
296abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
30723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang/**
31723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * Data object that has information about a device suggestion.
32723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang *
33723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang * @hide
34723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang */
35723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang@SystemApi
36723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhangpublic final class Suggestion implements Parcelable {
37723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
386abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    /**
396abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     * @hide
406abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     */
41ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
426abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang            FLAG_HAS_BUTTON,
438356481ba2d7882173c97a34ab311151c54040f2Doris Ling            FLAG_ICON_TINTABLE,
446abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    })
456abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    @Retention(RetentionPolicy.SOURCE)
466abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    public @interface Flags {
476abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    }
486abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
496abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    /**
506abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     * Flag for suggestion type with a single button
516abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     */
526abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    public static final int FLAG_HAS_BUTTON = 1 << 0;
538356481ba2d7882173c97a34ab311151c54040f2Doris Ling    /**
548356481ba2d7882173c97a34ab311151c54040f2Doris Ling     * @hide
558356481ba2d7882173c97a34ab311151c54040f2Doris Ling     */
568356481ba2d7882173c97a34ab311151c54040f2Doris Ling    public static final int FLAG_ICON_TINTABLE = 1 << 1;
576abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
58723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    private final String mId;
59723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    private final CharSequence mTitle;
60723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    private final CharSequence mSummary;
616abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    private final Icon mIcon;
626abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    @Flags
636abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    private final int mFlags;
64723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    private final PendingIntent mPendingIntent;
65723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
66723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    /**
67723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     * Gets the id for the suggestion object.
68723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     */
69723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public String getId() {
70723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        return mId;
71723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
72723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
73723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    /**
74723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     * Title of the suggestion that is shown to the user.
75723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     */
76723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public CharSequence getTitle() {
77723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        return mTitle;
78723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
79723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
80723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    /**
81723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     * Optional summary describing what this suggestion controls.
82723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     */
83723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public CharSequence getSummary() {
84723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        return mSummary;
85723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
86723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
87723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    /**
886abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     * Optional icon for this suggestion.
896abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     */
906abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    public Icon getIcon() {
916abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        return mIcon;
926abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    }
936abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
946abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    /**
956abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     * Optional flags for this suggestion. This will influence UI when rendering suggestion in
966abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     * different style.
976abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang     */
986abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    @Flags
996abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    public int getFlags() {
1006abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        return mFlags;
1016abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    }
1026abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
1036abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang    /**
104723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     * The Intent to launch when the suggestion is activated.
105723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     */
106723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public PendingIntent getPendingIntent() {
107723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        return mPendingIntent;
108723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
109723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
110723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    private Suggestion(Builder builder) {
111723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mId = builder.mId;
112723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mTitle = builder.mTitle;
113723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mSummary = builder.mSummary;
1146abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        mIcon = builder.mIcon;
1156abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        mFlags = builder.mFlags;
116723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mPendingIntent = builder.mPendingIntent;
117723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
118723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
119723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    private Suggestion(Parcel in) {
120723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mId = in.readString();
121723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mTitle = in.readCharSequence();
122723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mSummary = in.readCharSequence();
1236abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        mIcon = in.readParcelable(Icon.class.getClassLoader());
1246abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        mFlags = in.readInt();
125723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        mPendingIntent = in.readParcelable(PendingIntent.class.getClassLoader());
126723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
127723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
128723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public static final Creator<Suggestion> CREATOR = new Creator<Suggestion>() {
129723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        @Override
130723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Suggestion createFromParcel(Parcel in) {
131723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            return new Suggestion(in);
132723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
133723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
134723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        @Override
135723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Suggestion[] newArray(int size) {
136723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            return new Suggestion[size];
137723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
138723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    };
139723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
140723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    @Override
141723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public int describeContents() {
142723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        return 0;
143723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
144723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
145723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    @Override
146723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public void writeToParcel(Parcel dest, int flags) {
147723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        dest.writeString(mId);
148723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        dest.writeCharSequence(mTitle);
149723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        dest.writeCharSequence(mSummary);
1506abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        dest.writeParcelable(mIcon, flags);
1516abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        dest.writeInt(mFlags);
152723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        dest.writeParcelable(mPendingIntent, flags);
153723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
154723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
155723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    /**
156723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     * Builder class for {@link Suggestion}.
157723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang     */
158723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    public static class Builder {
159723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        private final String mId;
160723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        private CharSequence mTitle;
161723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        private CharSequence mSummary;
1626abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        private Icon mIcon;
1636abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        @Flags
1646abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        private int mFlags;
165723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        private PendingIntent mPendingIntent;
166723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
167723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Builder(String id) {
168723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            if (TextUtils.isEmpty(id)) {
169723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang                throw new IllegalArgumentException("Suggestion id cannot be empty");
170723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            }
171723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            mId = id;
172723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
173723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
174723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        /**
175723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         * Sets suggestion title
176723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         */
177723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Builder setTitle(CharSequence title) {
178723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            mTitle = title;
179723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            return this;
180723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
181723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
182723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        /**
183723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         * Sets suggestion summary
184723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         */
185723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Builder setSummary(CharSequence summary) {
186723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            mSummary = summary;
187723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            return this;
188723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
189723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
190723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        /**
1916abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang         * Sets icon for the suggestion.
1926abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang         */
1936abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        public Builder setIcon(Icon icon) {
1946abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang            mIcon = icon;
1956abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang            return this;
1966abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        }
1976abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
1986abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        /**
1996abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang         * Sets a UI type for this suggestion. This will influence UI when rendering suggestion in
2006abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang         * different style.
2016abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang         */
2026abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        public Builder setFlags(@Flags int flags) {
2036abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang            mFlags = flags;
2046abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang            return this;
2056abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        }
2066abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang
2076abced38e5947c6218ba1a0edcf0d8aa3184a43eFan Zhang        /**
208723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         * Sets suggestion intent
209723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         */
210723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Builder setPendingIntent(PendingIntent pendingIntent) {
211723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            mPendingIntent = pendingIntent;
212723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            return this;
213723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
214723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang
215723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        /**
216723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         * Builds an immutable {@link Suggestion} object.
217723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang         */
218723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        public Suggestion build() {
219723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang            return new Suggestion(this /* builder */);
220723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang        }
221723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang    }
222723bf37ab2e4b535a6061c02df03fcec57006e37Fan Zhang}
223