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