1e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor/*
2e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * Copyright 2018 The Android Open Source Project
3e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor *
4e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * Licensed under the Apache License, Version 2.0 (the "License");
5e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * you may not use this file except in compliance with the License.
6e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * You may obtain a copy of the License at
7e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor *
8e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor *      http://www.apache.org/licenses/LICENSE-2.0
9e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor *
10e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * Unless required by applicable law or agreed to in writing, software
11e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * distributed under the License is distributed on an "AS IS" BASIS,
12e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * See the License for the specific language governing permissions and
14e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * limitations under the License.
15e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor */
16e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
17e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorpackage androidx.slice;
18e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
19e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static android.app.slice.Slice.HINT_TITLE;
20e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
21e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.SliceMetadata.LOADED_ALL;
22e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.SliceMetadata.LOADED_NONE;
23e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static androidx.slice.SliceMetadata.LOADED_PARTIAL;
24ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport static androidx.slice.builders.ListBuilder.ICON_IMAGE;
250707dbe9fa3225cc921a2305a611272f0dee1ca8Mady Mellorimport static androidx.slice.core.SliceHints.HINT_KEYWORDS;
26cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellorimport static androidx.slice.core.SliceHints.INFINITY;
27e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
28e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static junit.framework.Assert.assertEquals;
29e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static junit.framework.Assert.assertTrue;
30e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
31e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static org.junit.Assert.assertArrayEquals;
32e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport static org.junit.Assert.assertNull;
33e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
34ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport android.app.PendingIntent;
35e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport android.content.Context;
36ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport android.content.Intent;
37ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport android.graphics.Bitmap;
38ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport android.graphics.Canvas;
39e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport android.net.Uri;
40e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport android.support.test.InstrumentationRegistry;
41e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport android.support.test.filters.SmallTest;
42e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport android.support.test.runner.AndroidJUnit4;
43e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
44decaa736515b8c773842750af79b034964a6ca62Mady Mellorimport androidx.core.graphics.drawable.IconCompat;
45ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.core.util.Pair;
46ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.builders.GridRowBuilder;
47ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.builders.ListBuilder;
48ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.builders.SliceAction;
49ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.core.SliceActionImpl;
50e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport androidx.slice.core.SliceHints;
51ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.render.SliceRenderActivity;
52ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.widget.EventInfo;
53ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport androidx.slice.widget.SliceLiveData;
54e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
55ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport org.junit.Before;
56e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport org.junit.Test;
57e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport org.junit.runner.RunWith;
58e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
59ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellorimport java.util.ArrayList;
60e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport java.util.List;
61e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorimport java.util.concurrent.TimeUnit;
62e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
63e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor/**
64e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor * Tests for {@link SliceMetadata}.
65e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor */
66e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor@RunWith(AndroidJUnit4.class)
67e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor@SmallTest
68e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellorpublic class SliceMetadataTest {
69e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
70e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    private final Context mContext = InstrumentationRegistry.getContext();
71e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
72ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Before
73ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void setup() {
74ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
75ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
76ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
77ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
78ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetSliceActionsNull() {
79ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
80ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
81ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
82ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("Text"));
83ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
84ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata sliceMetadata = SliceMetadata.from(mContext, lb.build());
85ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertNull(sliceMetadata.getSliceActions());
86ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
87ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
88ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
89ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetSliceActions() {
90ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
91ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
92ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
93ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
9438db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
95ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
96ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction action1 = new SliceAction(pi, icon, "action1");
97ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction action2 = new SliceAction(pi, icon, "action2");
98ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction action3 = new SliceAction(pi, icon, "action3");
99ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
100ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
101ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("Text"))
102ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addAction(action1)
103ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addAction(action2)
104ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addAction(action3);
105ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
106ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ArrayList<SliceAction> expectedActions = new ArrayList<>();
107ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        expectedActions.add(action1);
108ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        expectedActions.add(action2);
109ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        expectedActions.add(action3);
110ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
111ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata sliceMetadata = SliceMetadata.from(mContext, lb.build());
112ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        List<SliceItem> actions = sliceMetadata.getSliceActions();
113ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
114ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        for (int i = 0; i < expectedActions.size(); i++) {
115ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor            assertEquivalent(expectedActions.get(i), new SliceActionImpl(actions.get(i)));
116ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        }
117ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
118ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
119ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
120ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetPrimaryActionForGrid() {
121ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
122ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
123ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
124ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
12538db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
126ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
127ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction primaryAction = new SliceAction(pi, icon, "action");
128ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
129ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
130ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        GridRowBuilder grb = new GridRowBuilder(lb);
131ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.setPrimaryAction(primaryAction);
132ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
133ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
134ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
135ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addGridRow(grb);
136ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
137ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice gridSlice = lb.build();
138ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata gridInfo = SliceMetadata.from(mContext, gridSlice);
139ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquivalent(primaryAction, gridInfo.getPrimaryAction());
140ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
141ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
142ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
143ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetPrimaryActionForRow() {
144ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
145ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
146ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
147ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
14838db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
149ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
150ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction primaryAction = new SliceAction(pi, icon, "action");
151ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction endAction = new SliceAction(pi, "toogle action", false);
152ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
153ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
154ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder.RowBuilder rb = new ListBuilder.RowBuilder(lb)
155ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("a title")
156ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(endAction)
157ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setPrimaryAction(primaryAction);
158ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(rb);
159ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
160ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
161ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
162ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquivalent(primaryAction, rowInfo.getPrimaryAction());
163ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
164ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
165ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
166ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetPrimaryActionForHeader() {
167ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
168ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
169ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
170ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
17138db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
172ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
173ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction primaryAction = new SliceAction(pi, icon, "action");
174ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction sliceAction = new SliceAction(pi, "another action", true);
175ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
176ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
177ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addAction(sliceAction);
178ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder.HeaderBuilder hb = new ListBuilder.HeaderBuilder(lb);
179ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        hb.setTitle("header title");
180ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        hb.setPrimaryAction(primaryAction);
181ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.setHeader(hb);
182ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
183ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice headerSlice = lb.build();
184ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata headerInfo = SliceMetadata.from(mContext, headerSlice);
185ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquivalent(primaryAction, headerInfo.getPrimaryAction());
186ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
187ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
188ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
189ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetPrimaryActionNull() {
190ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
191ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
192ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
193ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
19438db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
195ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
196ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction endAction1 = new SliceAction(pi, icon, "action");
197ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction endAction2 = new SliceAction(pi, "toogle action", false);
198ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
199ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
200ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder.RowBuilder rb = new ListBuilder.RowBuilder(lb)
201ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("a title")
202ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(endAction1)
203ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(endAction2);
204ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(rb);
205ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
206ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
207ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
208ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertNull(rowInfo.getPrimaryAction());
209ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
210ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
211ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
212ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetHeaderTypeGrid() {
213ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
214ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
215ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
216ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        GridRowBuilder grb = new GridRowBuilder(lb);
217ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
218ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
219ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
220ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addGridRow(grb);
221ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
222ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice gridSlice = lb.build();
223ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata gridInfo = SliceMetadata.from(mContext, gridSlice);
224ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(EventInfo.ROW_TYPE_GRID, gridInfo.getHeaderType());
225ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
226ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
227ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
228ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetHeaderTypeRow() {
229ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
230ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
231ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
232ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("a title"));
233ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
234ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
235ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
236ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(EventInfo.ROW_TYPE_LIST, rowInfo.getHeaderType());
237ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
238ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
239ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
240ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetHeaderTypeToggle() {
241ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
242ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
243ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
244ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction toggleAction = new SliceAction(pi, "toggle", false /* isChecked */);
245ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
246ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb)
247ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
248ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(toggleAction));
249ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
250ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice toggleSlice = lb.build();
251ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata toggleInfo = SliceMetadata.from(mContext, toggleSlice);
252ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(EventInfo.ROW_TYPE_TOGGLE, toggleInfo.getHeaderType());
253ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
254ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
255ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
256ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetHeaderTypeSlider() {
257ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
258ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
259ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
260ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
261ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addInputRange(new ListBuilder.InputRangeBuilder(lb)
262ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
263ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setValue(5)
264ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setMax(10)
2659313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setInputAction(pi));
266ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
267ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice sliderSlice = lb.build();
268ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata sliderInfo = SliceMetadata.from(mContext, sliderSlice);
269ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(EventInfo.ROW_TYPE_SLIDER, sliderInfo.getHeaderType());
270ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
271ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
272ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
273ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetHeaderTypeProgress() {
274ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
275ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
276ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
277ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRange(new ListBuilder.RangeBuilder(lb)
278ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
279ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setValue(5)
280ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setMax(10));
281ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
282ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice sliderSlice = lb.build();
283ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata progressInfo = SliceMetadata.from(mContext, sliderSlice);
284ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(EventInfo.ROW_TYPE_PROGRESS, progressInfo.getHeaderType());
285ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
286ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
287ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
288ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetHeaderTypeHeader() {
289ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
290ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
291ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
292ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder.HeaderBuilder hb = new ListBuilder.HeaderBuilder(lb);
293ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        hb.setTitle("header title");
294ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.setHeader(hb);
295ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
296ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice headerSlice = lb.build();
297ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata headerInfo = SliceMetadata.from(mContext, headerSlice);
298ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(EventInfo.ROW_TYPE_LIST, headerInfo.getHeaderType());
299ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
300ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
301ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
302ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testHasLargeModeFullGrid() {
303ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        // If a grid is "full" with two text and an image there is a different small / large state.
304ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
305ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
306ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
30738db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
308ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
309ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
310ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        GridRowBuilder grb = new GridRowBuilder(lb);
311ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb)
312ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addText("some text")
313ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addText("more text")
31438db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk                .addImage(icon, ICON_IMAGE));
315ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb)
316ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addText("some text")
317ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addText("more text")
31838db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk                .addImage(icon, ICON_IMAGE));
319ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb)
320ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addText("some text")
321ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addText("more text")
32238db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk                .addImage(icon, ICON_IMAGE));
323ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addGridRow(grb);
324ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
325ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice gridSlice = lb.build();
326ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata gridInfo = SliceMetadata.from(mContext, gridSlice);
327ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertTrue(gridInfo.hasLargeMode());
328ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
329ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
330ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
331ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testHasLargeModeGrid() {
332ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        // If a grid is not "full" either no image or an image and one text item, small / large
333ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        // is the same.
334ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
335ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
336ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
337ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        GridRowBuilder grb = new GridRowBuilder(lb);
338ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
339ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
340ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        grb.addCell(new GridRowBuilder.CellBuilder(grb).addText("some text"));
341ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addGridRow(grb);
342ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
343ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice gridSlice = lb.build();
344ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata gridInfo = SliceMetadata.from(mContext, gridSlice);
345ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertTrue(!gridInfo.hasLargeMode());
346ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
347ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
348ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
349ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetLargeModeMultipleRows() {
350ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
351ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
352ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
353ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("a title"));
354ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("another row another title"));
355ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
356ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
357ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
358ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertTrue(rowInfo.hasLargeMode());
359ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
360ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
361ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
362ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetLargeModeSingleRow() {
363ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
364ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
365ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
366ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("a title"));
367ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
368ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
369ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
370ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertTrue(!rowInfo.hasLargeMode());
371ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
372ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
373ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
374ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetTogglesNone() {
375ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
376ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
377ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
378ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("a title"));
379ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
380ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
381ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
382ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertTrue(rowInfo.getToggles().isEmpty());
383ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
384ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
385ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
386ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetTogglesSingle() {
387ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
388ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
389ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
390ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction toggleAction = new SliceAction(pi, "toggle", false /* isChecked */);
391ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
392ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb)
393ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
394ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(toggleAction));
395ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
396ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice toggleSlice = lb.build();
397ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata toggleInfo = SliceMetadata.from(mContext, toggleSlice);
398ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        List<androidx.slice.core.SliceAction> actualToggles = toggleInfo.getToggles();
399ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(1, actualToggles.size());
400ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquivalent(toggleAction, actualToggles.get(0));
401ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
402ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
403ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
404ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetTogglesMultiple() {
405ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
406ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
407ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
408ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        new Canvas(b).drawColor(0xffff0000);
40938db00ef5d4b5a9d0d171f1bb15a5df567d448f6Jason Monk        IconCompat icon = IconCompat.createWithBitmap(b);
410ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
411ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction toggleAction = new SliceAction(pi, icon, "toggle", false /* isChecked */);
412ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceAction toggleAction2 = new SliceAction(pi, icon, "toggle2", true /* isChecked */);
413ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
414ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
415ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb)
416ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
417ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(toggleAction)
418ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .addEndItem(toggleAction2));
419ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
420ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice toggleSlice = lb.build();
421ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata toggleInfo = SliceMetadata.from(mContext, toggleSlice);
422ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        List<androidx.slice.core.SliceAction> actualToggles = toggleInfo.getToggles();
423ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
424ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        List<SliceAction> expectedToggles = new ArrayList<>();
425ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        expectedToggles.add(toggleAction);
426ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        expectedToggles.add(toggleAction2);
427ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
428ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        for (int i = 0; i < expectedToggles.size(); i++) {
429ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor            assertEquivalent(expectedToggles.get(i), actualToggles.get(i));
430ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        }
431ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
432ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
433ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
434ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetRangeNull() {
435ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
436ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
437ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
438ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRow(new ListBuilder.RowBuilder(lb).setTitle("a title"));
439ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
440ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice rowSlice = lb.build();
441ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
442ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertNull(rowInfo.getRange());
443ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
444ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
445ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
446ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetRangeForSlider() {
447ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
448ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        PendingIntent pi = getIntent("");
449ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
450ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
451ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addInputRange(new ListBuilder.InputRangeBuilder(lb)
452ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
4533bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor                .setValue(7)
4543bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor                .setMin(5)
455ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setMax(10)
4563bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor                .setInputAction(pi));
457ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
458ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice sliderSlice = lb.build();
459ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata sliderInfo = SliceMetadata.from(mContext, sliderSlice);
4603bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor
461ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Pair<Integer, Integer> values = sliderInfo.getRange();
462ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(5, (int) values.first);
463ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(10, (int) values.second);
4643bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor
4653bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        int currentValue = sliderInfo.getRangeValue();
4663bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        assertEquals(7, currentValue);
467ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
468ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
469ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    @Test
4709313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor    public void testGetInputRangeAction() {
4719313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        Uri uri = Uri.parse("content://pkg/slice");
4729313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        PendingIntent expectedIntent = getIntent("rangeintent");
4739313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor
4749313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
4759313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        new Canvas(b).drawColor(0xffff0000);
4769313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        IconCompat icon = IconCompat.createWithBitmap(b);
4779313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        SliceAction primaryAction = new SliceAction(getIntent(""), icon, "action");
4789313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor
4799313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
4809313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        lb.addInputRange(new ListBuilder.InputRangeBuilder(lb)
4819313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setTitle("another title")
4829313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setValue(7)
4839313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setMin(5)
4849313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setMax(10)
4859313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setPrimaryAction(primaryAction)
4869313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .setInputAction(expectedIntent));
4879313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        Slice sliderSlice = lb.build();
4889313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor
4899313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        SliceMetadata sliderInfo = SliceMetadata.from(mContext, sliderSlice);
4909313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        assertEquals(expectedIntent, sliderInfo.getInputRangeAction());
4919313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor        assertEquivalent(primaryAction, sliderInfo.getPrimaryAction());
4929313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor    }
4939313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor
4949313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor    @Test
495ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    public void testGetRangeForProgress() {
496ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
497ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
498ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
499ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        lb.addRange(new ListBuilder.RangeBuilder(lb)
500ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setTitle("another title")
501ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setValue(5)
502ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor                .setMax(10));
503ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
504ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Slice sliderSlice = lb.build();
505ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata progressInfo = SliceMetadata.from(mContext, sliderSlice);
506ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Pair<Integer, Integer> values = progressInfo.getRange();
5073bc2c820c8cbab1cf67dbd836697f780265f0e7aMady Mellor        assertEquals(0, (int) values.first);
508ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(10, (int) values.second);
509ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
510ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
511e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    @Test
512e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    public void testKeywords() {
513e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
514e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice keywordSlice = new Slice.Builder(uri)
5150707dbe9fa3225cc921a2305a611272f0dee1ca8Mady Mellor                .addHints(HINT_KEYWORDS)
516e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("keyword1", null)
517e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("keyword2", null)
518e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("keyword3", null).build();
519e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice slice = new Slice.Builder(uri)
520e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null, HINT_TITLE)
521e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some other text", null)
522e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addSubSlice(keywordSlice)
523e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .build();
524e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
525ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata SliceMetadata1 = SliceMetadata.from(mContext, slice);
526ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        List<String> sliceKeywords = SliceMetadata1.getSliceKeywords();
527e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        String[] expectedList = new String[] {"keyword1", "keyword2", "keyword3"};
528e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertArrayEquals(expectedList, sliceKeywords.toArray());
529e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
530e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        // Make sure it doesn't find keywords that aren't there
531e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice slice2 = new Slice.Builder(uri)
532e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null, HINT_TITLE)
533e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some other text", null).build();
534e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
535ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata SliceMetadata2 = SliceMetadata.from(mContext, slice2);
536ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        List<String> slice2Keywords = SliceMetadata2.getSliceKeywords();
537e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertNull(slice2Keywords);
538e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
539e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        // Make sure empty list if specified to have no keywords
5400707dbe9fa3225cc921a2305a611272f0dee1ca8Mady Mellor        Slice noKeywordSlice = new Slice.Builder(uri).addHints(HINT_KEYWORDS).build();
541e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice slice3 = new Slice.Builder(uri)
542e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null, HINT_TITLE)
543e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addSubSlice(noKeywordSlice)
544e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .build();
545e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
546e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        SliceMetadata sliceMetadata3 = SliceMetadata.from(mContext, slice3);
547e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        List<String> slice3Keywords = sliceMetadata3.getSliceKeywords();
548e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertTrue(slice3Keywords.isEmpty());
549e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    }
550e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
551e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    @Test
552e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    public void testGetLoadingState() {
553e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
554cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor        Slice s1 = new ListBuilder(mContext, uri, INFINITY).build();
555ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata SliceMetadata1 = SliceMetadata.from(mContext, s1);
556ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        int actualState1 = SliceMetadata1.getLoadingState();
557e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(LOADED_NONE, actualState1);
558e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
559cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor        ListBuilder lb = new ListBuilder(mContext, uri, INFINITY);
560cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor        Slice s2 = lb.addRow(new ListBuilder.RowBuilder(lb)
561cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor                .setTitle(null, true /* isLoading */))
562cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor                .build();
563ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata SliceMetadata2 = SliceMetadata.from(mContext, s2);
564ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        int actualState2 = SliceMetadata2.getLoadingState();
565e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(LOADED_PARTIAL, actualState2);
566e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
567cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor        ListBuilder lb2 = new ListBuilder(mContext, uri, INFINITY);
568cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor        Slice s3 = lb2.addRow(new ListBuilder.RowBuilder(lb2)
569cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor                .setTitle("Title", false /* isLoading */))
570cc08a035e673a2bb24c2dd3dc26508794d46e4cdMady Mellor                .build();
571ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        SliceMetadata SliceMetadata3 = SliceMetadata.from(mContext, s3);
572ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        int actualState3 = SliceMetadata3.getLoadingState();
573e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(LOADED_ALL, actualState3);
574e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    }
575e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
576e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    @Test
577e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    public void testGetExpiry() {
578e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
579e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long timestamp = System.currentTimeMillis();
580e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long ttl = TimeUnit.DAYS.toMillis(1);
581e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice ttlSlice = new Slice.Builder(uri)
582e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null)
5839313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(timestamp, null)
5849313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(timestamp, null, SliceHints.HINT_LAST_UPDATED)
5859313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(ttl, null, SliceHints.HINT_TTL)
586e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .build();
587e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
588e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        SliceMetadata si1 = SliceMetadata.from(mContext, ttlSlice);
589e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long retrievedTtl = si1.getExpiry();
590e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(ttl, retrievedTtl);
591e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
592e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice noTtlSlice = new Slice.Builder(uri)
593e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null)
5949313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(timestamp, null).build();
595e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        SliceMetadata si2 = SliceMetadata.from(mContext, noTtlSlice);
596e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long retrievedTtl2 = si2.getExpiry();
597e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(0, retrievedTtl2);
598e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    }
599e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
600e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    @Test
601e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    public void testGetLastUpdated() {
602e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Uri uri = Uri.parse("content://pkg/slice");
603e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long timestamp = System.currentTimeMillis();
604e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long ttl = TimeUnit.DAYS.toMillis(1);
605e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice ttlSlice = new Slice.Builder(uri)
606e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null)
6079313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(timestamp - 20, null)
6089313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(timestamp, null, SliceHints.HINT_LAST_UPDATED)
6099313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(ttl, null, SliceHints.HINT_TTL)
610e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .build();
611e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
612e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        SliceMetadata si1 = SliceMetadata.from(mContext, ttlSlice);
613e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long retrievedLastUpdated = si1.getLastUpdatedTime();
614e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(timestamp, retrievedLastUpdated);
615e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
616e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        Slice noTtlSlice = new Slice.Builder(uri)
617e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor                .addText("Some text", null)
6189313d3f2232b02bd3fdbdbb8486e83273fb1c7cbMady Mellor                .addLong(timestamp, null).build();
619e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor
620e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        SliceMetadata si2 = SliceMetadata.from(mContext, noTtlSlice);
621e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        long retrievedLastUpdated2 = si2.getLastUpdatedTime();
622e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor        assertEquals(0, retrievedLastUpdated2);
623e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor    }
624ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
625ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor    @Test
626ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor    public void testIsPermissionSlice() {
627ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor        Uri uri = Uri.parse("content://pkg/slice");
628ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor        Slice permissionSlice =
6299399b1430f150241bd4ddbd89b78f3c352420f09Jason Monk                SliceProvider.createPermissionSlice(mContext, uri, mContext.getPackageName());
630ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor
631ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor        SliceMetadata metadata = SliceMetadata.from(mContext, permissionSlice);
632ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor        assertEquals(true, metadata.isPermissionSlice());
633ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor    }
634ac7a30acc7b945a83e70f94375a172acc16e2e7dMady Mellor
635ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    private PendingIntent getIntent(String action) {
636ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        Intent intent = new Intent(action);
637ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        intent.setClassName(mContext.getPackageName(), SliceRenderActivity.class.getName());
638ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        return PendingIntent.getActivity(mContext, 0, intent, 0);
639ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
640ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor
641ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    private void assertEquivalent(androidx.slice.core.SliceAction desired,
642ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor            androidx.slice.core.SliceAction actual) {
643ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.getTitle(), actual.getTitle());
644ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.getContentDescription(), actual.getContentDescription());
645ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.isToggle(), actual.isToggle());
646ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.isDefaultToggle(), actual.isDefaultToggle());
647ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.isChecked(), actual.isChecked());
648ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.getPriority(), actual.getPriority());
649ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.getIcon() == null, actual.getIcon() == null);
650ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor        assertEquals(desired.getImageMode(), actual.getImageMode());
651ca12087a732c2e40be512a8d9d25e0aec8bf92d8Mady Mellor    }
652e7f1c6cf75ce36c633075445bd676572a9fe0f47Mady Mellor}
653