1a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk/*
2a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * Copyright 2018 The Android Open Source Project
3a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk *
4a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * Licensed under the Apache License, Version 2.0 (the "License");
5a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * you may not use this file except in compliance with the License.
6a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * You may obtain a copy of the License at
7a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk *
8a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
9a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk *
10a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * Unless required by applicable law or agreed to in writing, software
11a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * distributed under the License is distributed on an "AS IS" BASIS,
12a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * See the License for the specific language governing permissions and
14a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * limitations under the License.
15a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk */
16a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
1785ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikaspackage androidx.slice.builders.impl;
18a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
1987a9bf551f300ae379245a3edcb836f628439237Mady Mellorimport static android.app.slice.Slice.HINT_ACTIONS;
20a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport static android.app.slice.Slice.HINT_LARGE;
21a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport static android.app.slice.Slice.HINT_LIST_ITEM;
22a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport static android.app.slice.Slice.HINT_NO_TINT;
23ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellorimport static android.app.slice.Slice.HINT_PARTIAL;
24e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellorimport static android.app.slice.Slice.HINT_SEE_MORE;
25af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellorimport static android.app.slice.Slice.HINT_SHORTCUT;
266946d762c0926b683f176edbb4a97a118acadc61Mady Mellorimport static android.app.slice.Slice.HINT_SUMMARY;
27a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport static android.app.slice.Slice.HINT_TITLE;
28a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport static android.app.slice.Slice.SUBTYPE_COLOR;
298d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellorimport static android.app.slice.Slice.SUBTYPE_CONTENT_DESCRIPTION;
303bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellorimport static android.app.slice.Slice.SUBTYPE_MAX;
313bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellorimport static android.app.slice.Slice.SUBTYPE_RANGE;
323bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellorimport static android.app.slice.Slice.SUBTYPE_VALUE;
33a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport static android.app.slice.SliceItem.FORMAT_TEXT;
34af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor
358d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellorimport static androidx.annotation.RestrictTo.Scope.LIBRARY;
36588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellorimport static androidx.slice.builders.ListBuilder.ICON_IMAGE;
37e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.builders.ListBuilder.INFINITY;
38588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellorimport static androidx.slice.builders.ListBuilder.LARGE_IMAGE;
390707dbe9fa3225cc921a2305a611272f0dee1ca8Mady Mellorimport static androidx.slice.core.SliceHints.HINT_KEYWORDS;
40e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.core.SliceHints.HINT_LAST_UPDATED;
41e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.core.SliceHints.HINT_TTL;
42e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.core.SliceHints.SUBTYPE_MILLIS;
433bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellorimport static androidx.slice.core.SliceHints.SUBTYPE_MIN;
44a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
45a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport android.app.PendingIntent;
46a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkimport android.net.Uri;
47a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
488d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellorimport androidx.annotation.ColorInt;
498d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellorimport androidx.annotation.NonNull;
508d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellorimport androidx.annotation.RestrictTo;
513ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monkimport androidx.core.graphics.drawable.IconCompat;
5285ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikasimport androidx.slice.Slice;
5385ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikasimport androidx.slice.SliceItem;
5485ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikasimport androidx.slice.SliceSpec;
5585ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikasimport androidx.slice.builders.SliceAction;
56a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
57f0da2e67517c774cb034bd73830a3dfc8818afccMady Mellorimport java.util.ArrayList;
58f0da2e67517c774cb034bd73830a3dfc8818afccMady Mellorimport java.util.List;
59f0da2e67517c774cb034bd73830a3dfc8818afccMady Mellor
60a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk/**
61a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk * @hide
62a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk */
63a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk@RestrictTo(LIBRARY)
64a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monkpublic class ListBuilderV1Impl extends TemplateBuilderImpl implements ListBuilder {
65a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
66af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor    private List<Slice> mSliceActions;
6787a9bf551f300ae379245a3edcb836f628439237Mady Mellor    private Slice mSliceHeader;
6887a9bf551f300ae379245a3edcb836f628439237Mady Mellor
69a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
70a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
71a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public ListBuilderV1Impl(Slice.Builder b, SliceSpec spec) {
72a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        super(b, spec);
73a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
74a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
75a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
76a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
77a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
78a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public void apply(Slice.Builder builder) {
79378ff19cef9998493bc715c58d923150cfd3d816Mady Mellor        builder.addLong(System.currentTimeMillis(), SUBTYPE_MILLIS, HINT_LAST_UPDATED);
8087a9bf551f300ae379245a3edcb836f628439237Mady Mellor        if (mSliceHeader != null) {
8187a9bf551f300ae379245a3edcb836f628439237Mady Mellor            builder.addSubSlice(mSliceHeader);
8287a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
8387a9bf551f300ae379245a3edcb836f628439237Mady Mellor        if (mSliceActions != null) {
84af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            Slice.Builder sb = new Slice.Builder(builder);
85af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            for (int i = 0; i < mSliceActions.size(); i++) {
86af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                sb.addSubSlice(mSliceActions.get(i));
87af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            }
88af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            builder.addSubSlice(sb.addHints(HINT_ACTIONS).build());
8987a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
90a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
91a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
92a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
93a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     * Add a row to list builder.
94a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
95a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @NonNull
96a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
97a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public void addRow(@NonNull TemplateBuilderImpl builder) {
98378ff19cef9998493bc715c58d923150cfd3d816Mady Mellor        builder.getBuilder().addHints(HINT_LIST_ITEM);
99a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        getBuilder().addSubSlice(builder.build());
100a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
101a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
102a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
103a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
104a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @NonNull
105a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
106f0da2e67517c774cb034bd73830a3dfc8818afccMady Mellor    public void addGridRow(@NonNull TemplateBuilderImpl builder) {
107378ff19cef9998493bc715c58d923150cfd3d816Mady Mellor        builder.getBuilder().addHints(HINT_LIST_ITEM);
108a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        getBuilder().addSubSlice(builder.build());
109a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
110a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
111a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
112a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
113a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
11487a9bf551f300ae379245a3edcb836f628439237Mady Mellor    public void setHeader(@NonNull TemplateBuilderImpl builder) {
11587a9bf551f300ae379245a3edcb836f628439237Mady Mellor        mSliceHeader = builder.build();
11687a9bf551f300ae379245a3edcb836f628439237Mady Mellor    }
11787a9bf551f300ae379245a3edcb836f628439237Mady Mellor
11887a9bf551f300ae379245a3edcb836f628439237Mady Mellor    /**
11987a9bf551f300ae379245a3edcb836f628439237Mady Mellor     */
12087a9bf551f300ae379245a3edcb836f628439237Mady Mellor    @Override
121af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor    public void addAction(@NonNull SliceAction action) {
122af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        if (mSliceActions == null) {
123af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mSliceActions = new ArrayList<>();
124af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        }
125af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        Slice.Builder b = new Slice.Builder(getBuilder()).addHints(HINT_ACTIONS);
126af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        mSliceActions.add(action.buildSlice(b));
127a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
128a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
129853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    @Override
130853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    public void addInputRange(TemplateBuilderImpl builder) {
131853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        getBuilder().addSubSlice(builder.build(), SUBTYPE_RANGE);
132853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    }
133853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
134853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    @Override
135853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    public void addRange(TemplateBuilderImpl builder) {
136853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        getBuilder().addSubSlice(builder.build(), SUBTYPE_RANGE);
137853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    }
138853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
139853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    /**
140e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor     */
141e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor    @Override
142eefde12330498ed74472389b5c4dbda4239e61c8Mady Mellor    public void setSeeMoreRow(TemplateBuilderImpl builder) {
143e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor        builder.getBuilder().addHints(HINT_SEE_MORE);
144e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor        getBuilder().addSubSlice(builder.build());
145e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor    }
146e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor
147e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor    /**
148e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor     */
149e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor    @Override
150eefde12330498ed74472389b5c4dbda4239e61c8Mady Mellor    public void setSeeMoreAction(PendingIntent intent) {
151e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor        getBuilder().addSubSlice(
152e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor                new Slice.Builder(getBuilder())
153e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor                        .addHints(HINT_SEE_MORE)
15453380fecd1a1537e913578d1e53aa516d3f6e58eMady Mellor                        .addAction(intent, new Slice.Builder(getBuilder())
15553380fecd1a1537e913578d1e53aa516d3f6e58eMady Mellor                                .addHints(HINT_SEE_MORE).build(), null)
156e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor                        .build());
157e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor    }
158e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor
159e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor
160e3b00e2b2346e4da67d083b3475ffc9302d72898Mady Mellor    /**
161853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh     * Builder to construct an input row.
162853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh     */
163853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    public static class RangeBuilderImpl extends TemplateBuilderImpl implements RangeBuilder {
1643bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        private int mMin = 0;
165853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        private int mMax = 100;
166853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        private int mValue = 0;
167853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        private CharSequence mTitle;
168ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        private CharSequence mSubtitle;
1698d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        private CharSequence mContentDescr;
170ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        private SliceAction mPrimaryAction;
171853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
172853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public RangeBuilderImpl(Slice.Builder sb) {
173853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            super(sb, null);
174853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
175853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
176853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
1773bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        public void setMin(int min) {
1783bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor            mMin = min;
1793bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        }
1803bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor
1813bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        @Override
182853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public void setMax(int max) {
183853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            mMax = max;
184853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
185853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
186853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
187853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public void setValue(int value) {
188853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            mValue = value;
189853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
190853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
191853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
192853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public void setTitle(@NonNull CharSequence title) {
193853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            mTitle = title;
194853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
195853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
196853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
197ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        public void setSubtitle(@NonNull CharSequence title) {
198ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor            mSubtitle = title;
199ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        }
200ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor
201ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        @Override
202ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        public void setPrimaryAction(@NonNull SliceAction action) {
203ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor            mPrimaryAction = action;
204ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        }
205ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor
206ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        @Override
2078d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        public void setContentDescription(@NonNull CharSequence description) {
2088d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            mContentDescr = description;
2098d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        }
2108d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor
2118d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        @Override
212853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public void apply(Slice.Builder builder) {
213853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            if (mTitle != null) {
214853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh                builder.addText(mTitle, null, HINT_TITLE);
215853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            }
216ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor            if (mSubtitle != null) {
217ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor                builder.addText(mSubtitle, null);
218ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor            }
2198d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            if (mContentDescr != null) {
2208d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor                builder.addText(mContentDescr, SUBTYPE_CONTENT_DESCRIPTION);
2218d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            }
222ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor            if (mPrimaryAction != null) {
223ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor                Slice.Builder sb = new Slice.Builder(
224ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor                        getBuilder()).addHints(HINT_TITLE, HINT_SHORTCUT);
225ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor                builder.addSubSlice(mPrimaryAction.buildSlice(sb), null /* subtype */);
226ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor            }
227853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            builder.addHints(HINT_LIST_ITEM)
2283bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor                    .addInt(mMin, SUBTYPE_MIN)
229853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh                    .addInt(mMax, SUBTYPE_MAX)
230853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh                    .addInt(mValue, SUBTYPE_VALUE);
231853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
232853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    }
233853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
234853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    /**
235853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh     * Builder to construct an input range row.
236853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh     */
237853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    public static class InputRangeBuilderImpl
238853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            extends RangeBuilderImpl implements InputRangeBuilder {
239853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        private PendingIntent mAction;
2403ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monk        private IconCompat mThumb;
241853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
242853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public InputRangeBuilderImpl(Slice.Builder sb) {
243853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            super(sb);
244853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
245853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
246853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
247ec2359f11170a2742cd1650900de320aa22eab58Mady Mellor        public void setInputAction(@NonNull PendingIntent action) {
248853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            mAction = action;
249853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
250853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
251853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
2523ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monk        public void setThumb(@NonNull IconCompat thumb) {
253853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            mThumb = thumb;
254853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
255853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
256853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        @Override
257853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        public void apply(Slice.Builder builder) {
258853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            if (mAction == null) {
259853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh                throw new IllegalStateException("Input ranges must have an associated action.");
260853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            }
261853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            Slice.Builder sb = new Slice.Builder(builder);
262853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            super.apply(sb);
263853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            if (mThumb != null) {
264853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh                sb.addIcon(mThumb, null);
265853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            }
266853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh            builder.addAction(mAction, sb.build(), SUBTYPE_RANGE).addHints(HINT_LIST_ITEM);
267853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        }
268853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    }
269853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
270a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
271a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
272a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @NonNull
273a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
274ca3bf191270c01ba28dda3be273f49254be409fcAmin Shaikh    public void setColor(@ColorInt int color) {
275a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        getBuilder().addInt(color, SUBTYPE_COLOR);
276a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
277a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
278a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
279a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
280a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
281ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor    public void setKeywords(@NonNull List<String> keywords) {
282ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor        Slice.Builder sb = new Slice.Builder(getBuilder());
283ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor        for (int i = 0; i < keywords.size(); i++) {
284ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor            sb.addText(keywords.get(i), null);
285ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor        }
2860707dbe9fa3225cc921a2305a611272f0dee1ca8Mady Mellor        getBuilder().addSubSlice(sb.addHints(HINT_KEYWORDS).build());
287ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor    }
288ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor
289ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor    /**
290ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor     */
291ebdd84b863747bae349407af37f8822c5c589d95Mady Mellor    @Override
292e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    public void setTtl(long ttl) {
293e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long expiry = ttl == INFINITY ? INFINITY : System.currentTimeMillis() + ttl;
294e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        getBuilder().addTimestamp(expiry, SUBTYPE_MILLIS, HINT_TTL);
295e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    }
296e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
297e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    /**
298e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor     */
299e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    @Override
300a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public TemplateBuilderImpl createRowBuilder() {
301a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        return new RowBuilderImpl(this);
302a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
303a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
304a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
305a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
306a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
307a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public TemplateBuilderImpl createRowBuilder(Uri uri) {
308a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        return new RowBuilderImpl(uri);
309a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
310a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
311853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
312853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    @Override
313853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    public TemplateBuilderImpl createInputRangeBuilder() {
314853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        return new InputRangeBuilderImpl(createChildBuilder());
315853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    }
316853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
317853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    @Override
318853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    public TemplateBuilderImpl createRangeBuilder() {
319853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh        return new RangeBuilderImpl(createChildBuilder());
320853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh    }
321853c11f11cd3d1378eac2c37d1e8c258420644a8Amin Shaikh
322a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
323a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
324a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    @Override
325a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public TemplateBuilderImpl createGridBuilder() {
326f0da2e67517c774cb034bd73830a3dfc8818afccMady Mellor        return new GridRowBuilderListV1Impl(this);
327a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
328a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
329a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    /**
330a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk     */
33187a9bf551f300ae379245a3edcb836f628439237Mady Mellor    @Override
33287a9bf551f300ae379245a3edcb836f628439237Mady Mellor    public TemplateBuilderImpl createHeaderBuilder() {
33387a9bf551f300ae379245a3edcb836f628439237Mady Mellor        return new HeaderBuilderImpl(this);
33487a9bf551f300ae379245a3edcb836f628439237Mady Mellor    }
33587a9bf551f300ae379245a3edcb836f628439237Mady Mellor
33687a9bf551f300ae379245a3edcb836f628439237Mady Mellor    @Override
33787a9bf551f300ae379245a3edcb836f628439237Mady Mellor    public TemplateBuilderImpl createHeaderBuilder(Uri uri) {
33887a9bf551f300ae379245a3edcb836f628439237Mady Mellor        return new HeaderBuilderImpl(uri);
33987a9bf551f300ae379245a3edcb836f628439237Mady Mellor    }
34087a9bf551f300ae379245a3edcb836f628439237Mady Mellor
34187a9bf551f300ae379245a3edcb836f628439237Mady Mellor    /**
34287a9bf551f300ae379245a3edcb836f628439237Mady Mellor     */
343a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    public static class RowBuilderImpl extends TemplateBuilderImpl
344a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            implements ListBuilder.RowBuilder {
345a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
346af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        private SliceAction mPrimaryAction;
347a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        private SliceItem mTitleItem;
348a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        private SliceItem mSubtitleItem;
349af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        private Slice mStartItem;
350af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        private ArrayList<Slice> mEndItems = new ArrayList<>();
3518d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        private CharSequence mContentDescr;
352a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
353a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
354a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
355a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public RowBuilderImpl(@NonNull ListBuilderV1Impl parent) {
356a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            super(parent.createChildBuilder(), null);
357a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
358a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
359a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
360a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
361a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public RowBuilderImpl(@NonNull Uri uri) {
362a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            super(new Slice.Builder(uri), null);
363a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
364a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
365a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
366a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
367a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public RowBuilderImpl(Slice.Builder builder) {
368a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            super(builder, null);
369a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
370a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
371a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
372a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
373a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
374a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
375a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public void setTitleItem(long timeStamp) {
376af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mStartItem = new Slice.Builder(getBuilder())
377af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                    .addTimestamp(timeStamp, null).addHints(HINT_TITLE).build();
378a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
379a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
380a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
381a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
382a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
383a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
3843ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monk        public void setTitleItem(IconCompat icon, int imageMode) {
385588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            setTitleItem(icon, imageMode, false /* isLoading */);
386ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        }
387ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor
388ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        /**
389ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor         */
390588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor        @NonNull
391ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        @Override
3923ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monk        public void setTitleItem(IconCompat icon, int imageMode, boolean isLoading) {
393588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            ArrayList<String> hints = new ArrayList<>();
394588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            if (imageMode != ICON_IMAGE) {
395588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                hints.add(HINT_NO_TINT);
396588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            }
397588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            if (imageMode == LARGE_IMAGE) {
398588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                hints.add(HINT_LARGE);
399588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            }
400588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            if (isLoading) {
401588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                hints.add(HINT_PARTIAL);
402588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            }
403588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            Slice.Builder sb = new Slice.Builder(getBuilder())
404588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                    .addIcon(icon, null /* subType */, hints);
405ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            if (isLoading) {
406af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                sb.addHints(HINT_PARTIAL);
407ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            }
408af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mStartItem = sb.addHints(HINT_TITLE).build();
409a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
410a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
411a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
412a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
413a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
414a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
415af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        public void setTitleItem(@NonNull SliceAction action) {
416af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            setTitleItem(action, false /* isLoading */);
417ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        }
418ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor
419ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        /**
420ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor         */
421ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        @Override
422af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        public void setTitleItem(SliceAction action, boolean isLoading) {
423af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            Slice.Builder sb = new Slice.Builder(getBuilder()).addHints(HINT_TITLE);
424ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            if (isLoading) {
425af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                sb.addHints(HINT_PARTIAL);
426ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            }
427af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mStartItem = action.buildSlice(sb);
428a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
429a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
430a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
431a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
432a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
433a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
434af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        public void setPrimaryAction(@NonNull SliceAction action) {
435af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mPrimaryAction = action;
436a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
437a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
438a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
439a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
440a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
441a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
442a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public void setTitle(CharSequence title) {
443ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            setTitle(title, false /* isLoading */);
444ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        }
445ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor
446ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        /**
447ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor         */
448ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        @Override
449ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        public void setTitle(CharSequence title, boolean isLoading) {
450ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            mTitleItem = new SliceItem(title, FORMAT_TEXT, null, new String[] {HINT_TITLE});
451ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            if (isLoading) {
452ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor                mTitleItem.addHint(HINT_PARTIAL);
453ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            }
454a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
455a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
456a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
457a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
458a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
459a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
460a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public void setSubtitle(CharSequence subtitle) {
461ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            setSubtitle(subtitle, false /* isLoading */);
462ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        }
463ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor
464ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        /**
465ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor         */
466ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        @Override
467ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        public void setSubtitle(CharSequence subtitle, boolean isLoading) {
468a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            mSubtitleItem = new SliceItem(subtitle, FORMAT_TEXT, null, new String[0]);
469ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            if (isLoading) {
470ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor                mSubtitleItem.addHint(HINT_PARTIAL);
471ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            }
472a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
473a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
474a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
475a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
476a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
477a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
478a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public void addEndItem(long timeStamp) {
479af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mEndItems.add(new Slice.Builder(getBuilder()).addTimestamp(timeStamp,
480af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                    null, new String[0]).build());
481a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
482a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
483a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
484a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
485a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
486a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
4873ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monk        public void addEndItem(IconCompat icon, int imageMode) {
488588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            addEndItem(icon, imageMode, false /* isLoading */);
489ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        }
490ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor
491ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        /**
492ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor         */
493588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor        @NonNull
494ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        @Override
4953ec422a2e2a46b51d4cc6926fcaa35caacbdf98dJason Monk        public void addEndItem(IconCompat icon, int imageMode, boolean isLoading) {
496588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            ArrayList<String> hints = new ArrayList<>();
497588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            if (imageMode != ICON_IMAGE) {
498588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                hints.add(HINT_NO_TINT);
499588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            }
500588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            if (imageMode == LARGE_IMAGE) {
501588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                hints.add(HINT_LARGE);
502588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            }
503588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            if (isLoading) {
504588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                hints.add(HINT_PARTIAL);
505588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            }
506588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor            Slice.Builder sb = new Slice.Builder(getBuilder())
507588bcc115f4fbbfab66c2c7da304c42f3b2783b8Mady Mellor                    .addIcon(icon, null /* subType */, hints);
508ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            if (isLoading) {
509af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                sb.addHints(HINT_PARTIAL);
510ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            }
511af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mEndItems.add(sb.build());
512a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
513a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
514a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
515a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
516a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @NonNull
517a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
518af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        public void addEndItem(@NonNull SliceAction action) {
519af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            addEndItem(action, false /* isLoading */);
520ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        }
521ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor
522ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        /**
523ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor         */
524ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor        @Override
525af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        public void addEndItem(@NonNull SliceAction action, boolean isLoading) {
526af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            Slice.Builder sb = new Slice.Builder(getBuilder());
527ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            if (isLoading) {
528af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                sb.addHints(HINT_PARTIAL);
529ba4198f4bc37284c5a6e8ce993f3652d3e3c88e6Mady Mellor            }
530af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mEndItems.add(action.buildSlice(sb));
531a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
532a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk
5338d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        @Override
5348d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        public void setContentDescription(CharSequence description) {
5358d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            mContentDescr = description;
5368d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        }
5378d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor
538a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        /**
539a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk         */
540a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        @Override
541a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        public void apply(Slice.Builder b) {
542a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            if (mStartItem != null) {
543af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                b.addSubSlice(mStartItem);
544a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            }
545a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            if (mTitleItem != null) {
546a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk                b.addItem(mTitleItem);
547a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            }
548a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            if (mSubtitleItem != null) {
549a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk                b.addItem(mSubtitleItem);
550a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            }
551a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            for (int i = 0; i < mEndItems.size(); i++) {
552af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                Slice item = mEndItems.get(i);
553af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                b.addSubSlice(item);
554a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            }
5558d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            if (mContentDescr != null) {
5568d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor                b.addText(mContentDescr, SUBTYPE_CONTENT_DESCRIPTION);
5578d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            }
558af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            if (mPrimaryAction != null) {
559af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                Slice.Builder sb = new Slice.Builder(
560af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                        getBuilder()).addHints(HINT_TITLE, HINT_SHORTCUT);
561af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                b.addSubSlice(mPrimaryAction.buildSlice(sb), null);
562a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk            }
56387a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
56487a9bf551f300ae379245a3edcb836f628439237Mady Mellor    }
56587a9bf551f300ae379245a3edcb836f628439237Mady Mellor
56687a9bf551f300ae379245a3edcb836f628439237Mady Mellor    /**
56787a9bf551f300ae379245a3edcb836f628439237Mady Mellor     */
56887a9bf551f300ae379245a3edcb836f628439237Mady Mellor    public static class HeaderBuilderImpl extends TemplateBuilderImpl
56987a9bf551f300ae379245a3edcb836f628439237Mady Mellor            implements ListBuilder.HeaderBuilder {
57087a9bf551f300ae379245a3edcb836f628439237Mady Mellor
57109ec20c424ec3e546b10424a401c2343c2df205aMady Mellor        private SliceItem mTitleItem;
57209ec20c424ec3e546b10424a401c2343c2df205aMady Mellor        private SliceItem mSubtitleItem;
57309ec20c424ec3e546b10424a401c2343c2df205aMady Mellor        private SliceItem mSummaryItem;
574af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        private SliceAction mPrimaryAction;
5758d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        private CharSequence mContentDescr;
57687a9bf551f300ae379245a3edcb836f628439237Mady Mellor
57787a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
57887a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
57987a9bf551f300ae379245a3edcb836f628439237Mady Mellor        public HeaderBuilderImpl(@NonNull ListBuilderV1Impl parent) {
58087a9bf551f300ae379245a3edcb836f628439237Mady Mellor            super(parent.createChildBuilder(), null);
58187a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
58287a9bf551f300ae379245a3edcb836f628439237Mady Mellor
58387a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
58487a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
58587a9bf551f300ae379245a3edcb836f628439237Mady Mellor        public HeaderBuilderImpl(@NonNull Uri uri) {
58687a9bf551f300ae379245a3edcb836f628439237Mady Mellor            super(new Slice.Builder(uri), null);
58787a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
58887a9bf551f300ae379245a3edcb836f628439237Mady Mellor
58987a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
59087a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
59187a9bf551f300ae379245a3edcb836f628439237Mady Mellor        @Override
59287a9bf551f300ae379245a3edcb836f628439237Mady Mellor        public void apply(Slice.Builder b) {
59309ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            if (mTitleItem != null) {
59409ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                b.addItem(mTitleItem);
59587a9bf551f300ae379245a3edcb836f628439237Mady Mellor            }
59609ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            if (mSubtitleItem != null) {
59709ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                b.addItem(mSubtitleItem);
59887a9bf551f300ae379245a3edcb836f628439237Mady Mellor            }
59909ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            if (mSummaryItem != null) {
60009ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                b.addItem(mSummaryItem);
60187a9bf551f300ae379245a3edcb836f628439237Mady Mellor            }
6028d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            if (mContentDescr != null) {
6038d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor                b.addText(mContentDescr, SUBTYPE_CONTENT_DESCRIPTION);
6048d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            }
605af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            if (mPrimaryAction != null) {
606af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                Slice.Builder sb = new Slice.Builder(
607af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                        getBuilder()).addHints(HINT_TITLE, HINT_SHORTCUT);
608af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor                b.addSubSlice(mPrimaryAction.buildSlice(sb), null /* subtype */);
60987a9bf551f300ae379245a3edcb836f628439237Mady Mellor            }
61087a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
61187a9bf551f300ae379245a3edcb836f628439237Mady Mellor
61287a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
61387a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
61487a9bf551f300ae379245a3edcb836f628439237Mady Mellor        @Override
61509ec20c424ec3e546b10424a401c2343c2df205aMady Mellor        public void setTitle(CharSequence title, boolean isLoading) {
61609ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            mTitleItem = new SliceItem(title, FORMAT_TEXT, null, new String[] {HINT_TITLE});
61709ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            if (isLoading) {
61809ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                mTitleItem.addHint(HINT_PARTIAL);
61909ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            }
62087a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
62187a9bf551f300ae379245a3edcb836f628439237Mady Mellor
62287a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
62387a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
62487a9bf551f300ae379245a3edcb836f628439237Mady Mellor        @Override
62509ec20c424ec3e546b10424a401c2343c2df205aMady Mellor        public void setSubtitle(CharSequence subtitle, boolean isLoading) {
62609ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            mSubtitleItem = new SliceItem(subtitle, FORMAT_TEXT, null, new String[0]);
62709ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            if (isLoading) {
62809ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                mSubtitleItem.addHint(HINT_PARTIAL);
62909ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            }
63087a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
63187a9bf551f300ae379245a3edcb836f628439237Mady Mellor
63287a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
63387a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
63487a9bf551f300ae379245a3edcb836f628439237Mady Mellor        @Override
635d156eab29cd6c14308a32d7c116e16e904509a7aMady Mellor        public void setSummary(CharSequence summarySubtitle, boolean isLoading) {
63609ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            mSummaryItem = new SliceItem(summarySubtitle, FORMAT_TEXT, null,
63709ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                    new String[] {HINT_SUMMARY});
63809ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            if (isLoading) {
63909ec20c424ec3e546b10424a401c2343c2df205aMady Mellor                mSummaryItem.addHint(HINT_PARTIAL);
64009ec20c424ec3e546b10424a401c2343c2df205aMady Mellor            }
64187a9bf551f300ae379245a3edcb836f628439237Mady Mellor        }
64287a9bf551f300ae379245a3edcb836f628439237Mady Mellor
64387a9bf551f300ae379245a3edcb836f628439237Mady Mellor        /**
64487a9bf551f300ae379245a3edcb836f628439237Mady Mellor         */
64587a9bf551f300ae379245a3edcb836f628439237Mady Mellor        @Override
646af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor        public void setPrimaryAction(SliceAction action) {
647af76b3bd62a6b218bb44917b1dddfa1ee4803149Mady Mellor            mPrimaryAction = action;
648a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk        }
6498d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor
6508d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        /**
6518d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor         */
6528d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        @Override
6538d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        public void setContentDescription(CharSequence description) {
6548d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor            mContentDescr = description;
6558d66e2cb94d97f4559eab97d0c1f348e5ed8b50aMady Mellor        }
656a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk    }
657a09cb677db982c92d3172fa79a6a4585fc29da14Jason Monk}
658