1 /*
2  * Copyright (C) 2022 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.app.smartspace.uitemplatedata;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SystemApi;
22 import android.app.smartspace.SmartspaceTarget;
23 import android.os.Parcel;
24 
25 import java.util.List;
26 import java.util.Objects;
27 
28 /**
29  * Holds all the relevant data needed to render a Smartspace card with the sub-image Ui Template.
30  *
31  * This template will add a sub-image card within the default-template card:
32  * <ul>
33  *     <li> sub-image text1 </li>   <ul>
34  *     <li> sub-image text2 </li>        image (can be a GIF)
35  *     ...                          </ul>
36  * </ul>
37  *
38  * @hide
39  */
40 @SystemApi
41 public final class SubImageTemplateData extends BaseTemplateData {
42 
43     /** Texts are shown next to the image as a vertical list */
44     @NonNull
45     private final List<Text> mSubImageTexts;
46 
47     /** If multiple images are passed in, they will be rendered as GIF. */
48     @NonNull
49     private final List<Icon> mSubImages;
50 
51     /** Tap action for the sub-image secondary card. */
52     @Nullable
53     private final TapAction mSubImageAction;
54 
SubImageTemplateData(@onNull Parcel in)55     SubImageTemplateData(@NonNull Parcel in) {
56         super(in);
57         mSubImageTexts = in.createTypedArrayList(Text.CREATOR);
58         mSubImages = in.createTypedArrayList(Icon.CREATOR);
59         mSubImageAction = in.readTypedObject(TapAction.CREATOR);
60     }
61 
SubImageTemplateData(@martspaceTarget.UiTemplateType int templateType, @Nullable SubItemInfo primaryItem, @Nullable SubItemInfo subtitleItem, @Nullable SubItemInfo subtitleSupplementalItem, @Nullable SubItemInfo supplementalLineItem, @Nullable SubItemInfo supplementalAlarmItem, int layoutWeight, @NonNull List<Text> subImageTexts, @NonNull List<Icon> subImages, @Nullable TapAction subImageAction)62     private SubImageTemplateData(@SmartspaceTarget.UiTemplateType int templateType,
63             @Nullable SubItemInfo primaryItem,
64             @Nullable SubItemInfo subtitleItem,
65             @Nullable SubItemInfo subtitleSupplementalItem,
66             @Nullable SubItemInfo supplementalLineItem,
67             @Nullable SubItemInfo supplementalAlarmItem,
68             int layoutWeight,
69             @NonNull List<Text> subImageTexts,
70             @NonNull List<Icon> subImages,
71             @Nullable TapAction subImageAction) {
72         super(templateType, primaryItem, subtitleItem, subtitleSupplementalItem,
73                 supplementalLineItem, supplementalAlarmItem, layoutWeight);
74 
75         mSubImageTexts = subImageTexts;
76         mSubImages = subImages;
77         mSubImageAction = subImageAction;
78     }
79 
80     /** Returns the list of sub-image card's texts. Can be empty if not being set. */
81     @NonNull
getSubImageTexts()82     public List<Text> getSubImageTexts() {
83         return mSubImageTexts;
84     }
85 
86     /**
87      * Returns the list of sub-image card's image. It's a single-element list if it's a static
88      * image, or a multi-elements list if it's a GIF.
89      */
90     @NonNull
getSubImages()91     public List<Icon> getSubImages() {
92         return mSubImages;
93     }
94 
95     /** Returns the sub-image card's tap action. */
96     @Nullable
getSubImageAction()97     public TapAction getSubImageAction() {
98         return mSubImageAction;
99     }
100 
101     /**
102      * @see Parcelable.Creator
103      */
104     @NonNull
105     public static final Creator<SubImageTemplateData> CREATOR =
106             new Creator<SubImageTemplateData>() {
107                 @Override
108                 public SubImageTemplateData createFromParcel(Parcel in) {
109                     return new SubImageTemplateData(in);
110                 }
111 
112                 @Override
113                 public SubImageTemplateData[] newArray(int size) {
114                     return new SubImageTemplateData[size];
115                 }
116             };
117 
118     @Override
describeContents()119     public int describeContents() {
120         return 0;
121     }
122 
123     @Override
writeToParcel(@onNull Parcel out, int flags)124     public void writeToParcel(@NonNull Parcel out, int flags) {
125         super.writeToParcel(out, flags);
126         out.writeTypedList(mSubImageTexts);
127         out.writeTypedList(mSubImages);
128         out.writeTypedObject(mSubImageAction, flags);
129     }
130 
131     @Override
equals(Object o)132     public boolean equals(Object o) {
133         if (this == o) return true;
134         if (!(o instanceof SubImageTemplateData)) return false;
135         if (!super.equals(o)) return false;
136         SubImageTemplateData that = (SubImageTemplateData) o;
137         return Objects.equals(mSubImageTexts, that.mSubImageTexts)
138                 && Objects.equals(mSubImages, that.mSubImages) && Objects.equals(
139                 mSubImageAction, that.mSubImageAction);
140     }
141 
142     @Override
hashCode()143     public int hashCode() {
144         return Objects.hash(super.hashCode(), mSubImageTexts, mSubImages, mSubImageAction);
145     }
146 
147     @Override
toString()148     public String toString() {
149         return super.toString() + " + SmartspaceSubImageUiTemplateData{"
150                 + "mSubImageTexts=" + mSubImageTexts
151                 + ", mSubImages=" + mSubImages
152                 + ", mSubImageAction=" + mSubImageAction
153                 + '}';
154     }
155 
156     /**
157      * A builder for {@link SubImageTemplateData} object.
158      *
159      * @hide
160      */
161     @SystemApi
162     public static final class Builder extends BaseTemplateData.Builder {
163 
164         private final List<Text> mSubImageTexts;
165         private final List<Icon> mSubImages;
166         private TapAction mSubImageAction;
167 
168         /**
169          * A builder for {@link SubImageTemplateData}.
170          */
Builder(@onNull List<Text> subImageTexts, @NonNull List<Icon> subImages)171         public Builder(@NonNull List<Text> subImageTexts,
172                 @NonNull List<Icon> subImages) {
173             super(SmartspaceTarget.UI_TEMPLATE_SUB_IMAGE);
174             mSubImageTexts = Objects.requireNonNull(subImageTexts);
175             mSubImages = Objects.requireNonNull(subImages);
176         }
177 
178         /**
179          * Sets the card tap action.
180          */
181         @NonNull
setSubImageAction(@onNull TapAction subImageAction)182         public Builder setSubImageAction(@NonNull TapAction subImageAction) {
183             mSubImageAction = subImageAction;
184             return this;
185         }
186 
187         /**
188          * Builds a new SmartspaceSubImageUiTemplateData instance.
189          */
190         @NonNull
build()191         public SubImageTemplateData build() {
192             return new SubImageTemplateData(getTemplateType(), getPrimaryItem(),
193                     getSubtitleItem(), getSubtitleSupplemtnalItem(),
194                     getSupplementalLineItem(), getSupplementalAlarmItem(), getLayoutWeight(),
195                     mSubImageTexts,
196                     mSubImages,
197                     mSubImageAction);
198         }
199     }
200 }
201