1 /* 2 * Copyright 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.slice.builders.impl; 18 19 import static android.app.slice.Slice.HINT_HORIZONTAL; 20 import static android.app.slice.Slice.HINT_LARGE; 21 import static android.app.slice.Slice.HINT_NO_TINT; 22 import static android.app.slice.Slice.HINT_PARTIAL; 23 import static android.app.slice.Slice.HINT_SEE_MORE; 24 import static android.app.slice.Slice.HINT_TITLE; 25 import static android.app.slice.Slice.SUBTYPE_CONTENT_DESCRIPTION; 26 27 import static androidx.annotation.RestrictTo.Scope.LIBRARY; 28 import static androidx.slice.builders.ListBuilder.ICON_IMAGE; 29 import static androidx.slice.builders.ListBuilder.LARGE_IMAGE; 30 31 import android.app.PendingIntent; 32 import android.net.Uri; 33 34 import androidx.annotation.NonNull; 35 import androidx.annotation.Nullable; 36 import androidx.annotation.RestrictTo; 37 import androidx.core.graphics.drawable.IconCompat; 38 import androidx.slice.Slice; 39 import androidx.slice.builders.SliceAction; 40 41 import java.util.ArrayList; 42 43 /** 44 * @hide 45 */ 46 @RestrictTo(LIBRARY) 47 public class GridRowBuilderListV1Impl extends TemplateBuilderImpl implements GridRowBuilder { 48 49 private SliceAction mPrimaryAction; 50 51 /** 52 */ 53 public GridRowBuilderListV1Impl(@NonNull ListBuilderV1Impl parent) { 54 super(parent.createChildBuilder(), null); 55 } 56 57 /** 58 */ 59 @Override 60 public void apply(Slice.Builder builder) { 61 builder.addHints(HINT_HORIZONTAL); 62 if (mPrimaryAction != null) { 63 Slice.Builder actionBuilder = new Slice.Builder(getBuilder()).addHints(HINT_TITLE); 64 builder.addSubSlice(mPrimaryAction.buildSlice(actionBuilder)); 65 } 66 } 67 68 /** 69 */ 70 @Override 71 public TemplateBuilderImpl createGridRowBuilder() { 72 return new CellBuilder(this); 73 } 74 75 /** 76 */ 77 @Override 78 public TemplateBuilderImpl createGridRowBuilder(Uri uri) { 79 return new CellBuilder(uri); 80 } 81 82 /** 83 */ 84 @Override 85 public void addCell(TemplateBuilderImpl builder) { 86 builder.apply(getBuilder()); 87 } 88 89 90 /** 91 */ 92 @Override 93 public void setSeeMoreCell(@NonNull TemplateBuilderImpl builder) { 94 builder.getBuilder().addHints(HINT_SEE_MORE); 95 builder.apply(getBuilder()); 96 } 97 98 /** 99 */ 100 @Override 101 public void setSeeMoreAction(PendingIntent intent) { 102 getBuilder().addSubSlice( 103 new Slice.Builder(getBuilder()) 104 .addHints(HINT_SEE_MORE) 105 .addAction(intent, new Slice.Builder(getBuilder()).build(), null) 106 .build()); 107 } 108 109 /** 110 */ 111 @Override 112 public void setPrimaryAction(SliceAction action) { 113 mPrimaryAction = action; 114 } 115 116 /** 117 */ 118 @Override 119 public void setContentDescription(CharSequence description) { 120 getBuilder().addText(description, SUBTYPE_CONTENT_DESCRIPTION); 121 } 122 123 /** 124 */ 125 public static final class CellBuilder extends TemplateBuilderImpl implements 126 GridRowBuilder.CellBuilder { 127 128 private PendingIntent mContentIntent; 129 130 /** 131 */ 132 public CellBuilder(@NonNull GridRowBuilderListV1Impl parent) { 133 super(parent.createChildBuilder(), null); 134 } 135 136 /** 137 */ 138 public CellBuilder(@NonNull Uri uri) { 139 super(new Slice.Builder(uri), null); 140 } 141 142 /** 143 */ 144 @NonNull 145 @Override 146 public void addText(@NonNull CharSequence text) { 147 addText(text, false /* isLoading */); 148 } 149 150 /** 151 */ 152 @Override 153 public void addText(@Nullable CharSequence text, boolean isLoading) { 154 @Slice.SliceHint String[] hints = isLoading 155 ? new String[] {HINT_PARTIAL} 156 : new String[0]; 157 getBuilder().addText(text, null, hints); 158 } 159 160 /** 161 */ 162 @NonNull 163 @Override 164 public void addTitleText(@NonNull CharSequence text) { 165 addTitleText(text, false /* isLoading */); 166 } 167 168 /** 169 */ 170 @NonNull 171 @Override 172 public void addTitleText(@Nullable CharSequence text, boolean isLoading) { 173 @Slice.SliceHint String[] hints = isLoading 174 ? new String[] {HINT_PARTIAL, HINT_TITLE} 175 : new String[] {HINT_TITLE}; 176 getBuilder().addText(text, null, hints); 177 } 178 179 /** 180 */ 181 @NonNull 182 @Override 183 public void addImage(@NonNull IconCompat image, int imageMode) { 184 addImage(image, imageMode, false /* isLoading */); 185 } 186 187 /** 188 */ 189 @NonNull 190 @Override 191 public void addImage(@Nullable IconCompat image, int imageMode, boolean isLoading) { 192 ArrayList<String> hints = new ArrayList<>(); 193 if (imageMode != ICON_IMAGE) { 194 hints.add(HINT_NO_TINT); 195 } 196 if (imageMode == LARGE_IMAGE) { 197 hints.add(HINT_LARGE); 198 } 199 if (isLoading) { 200 hints.add(HINT_PARTIAL); 201 } 202 getBuilder().addIcon(image, null, hints); 203 } 204 205 /** 206 */ 207 @NonNull 208 @Override 209 public void setContentIntent(@NonNull PendingIntent intent) { 210 mContentIntent = intent; 211 } 212 213 /** 214 */ 215 @Override 216 public void setContentDescription(CharSequence description) { 217 getBuilder().addText(description, SUBTYPE_CONTENT_DESCRIPTION); 218 } 219 220 /** 221 * @hide 222 */ 223 @RestrictTo(LIBRARY) 224 @Override 225 public void apply(Slice.Builder b) { 226 getBuilder().addHints(HINT_HORIZONTAL); 227 if (mContentIntent != null) { 228 b.addAction(mContentIntent, getBuilder().build(), null); 229 } else { 230 b.addSubSlice(getBuilder().build()); 231 } 232 } 233 } 234 } 235