RemoteViewsTest.java revision 5d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6b
17da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos/*
27da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * Copyright (C) 2016 The Android Open Source Project
37da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos *
47da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * Licensed under the Apache License, Version 2.0 (the "License");
57da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * you may not use this file except in compliance with the License.
67da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * You may obtain a copy of the License at
77da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos *
87da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos *      http://www.apache.org/licenses/LICENSE-2.0
97da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos *
107da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * Unless required by applicable law or agreed to in writing, software
117da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * distributed under the License is distributed on an "AS IS" BASIS,
127da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * See the License for the specific language governing permissions and
147da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * limitations under the License
157da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos */
167da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
178376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovpackage android.widget;
187da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
197da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.content.Context;
207da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.graphics.Bitmap;
217da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.graphics.drawable.BitmapDrawable;
227da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.graphics.drawable.Drawable;
235d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyalimport android.os.Parcel;
247da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.support.test.InstrumentationRegistry;
257da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.support.test.filters.SmallTest;
267da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport android.support.test.runner.AndroidJUnit4;
278376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovimport android.view.View;
287da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
297da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport com.android.frameworks.coretests.R;
307da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
318376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovimport org.junit.Before;
328376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovimport org.junit.Rule;
338376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovimport org.junit.Test;
348376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovimport org.junit.rules.ExpectedException;
358376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikovimport org.junit.runner.RunWith;
368376f9eaa0bd41a9c7ce7ada4cb7c2cda28ef64cKirill Grouchnikov
377da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport static org.junit.Assert.assertEquals;
387da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roosimport static org.junit.Assert.assertSame;
395d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyalimport static org.junit.Assert.assertTrue;
407da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
417da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos/**
427da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos * Tests for RemoteViews.
437da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos */
447da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos@RunWith(AndroidJUnit4.class)
457da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos@SmallTest
467da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roospublic class RemoteViewsTest {
477da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
485d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    // This can point to any other package which exists on the device.
495d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    private static final String OTHER_PACKAGE = "com.android.systemui";
505d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
517da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Rule
527da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public final ExpectedException exception = ExpectedException.none();
537da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
547da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    private Context mContext;
557da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    private String mPackage;
567da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    private LinearLayout mContainer;
577da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
587da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Before
597da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void setup() {
607da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        mContext = InstrumentationRegistry.getContext();
614d10db7fdd1dc86684f31ec582872072fb02c350Adrian Roos        mPackage = mContext.getPackageName();
627da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        mContainer = new LinearLayout(mContext);
637da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
647da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
657da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Test
667da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void clone_doesNotCopyBitmap() {
677da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
687da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
697da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
707da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        original.setImageViewBitmap(R.id.image, bitmap);
717da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews clone = original.clone();
727da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        View inflated = clone.apply(mContext, mContainer);
737da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
747da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        Drawable drawable = ((ImageView) inflated.findViewById(R.id.image)).getDrawable();
757da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        assertSame(bitmap, ((BitmapDrawable)drawable).getBitmap());
767da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
777da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
787da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Test
797da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void clone_originalCanStillBeApplied() {
807da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
817da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
827da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews clone = original.clone();
837da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
847da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        clone.apply(mContext, mContainer);
857da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
867da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
877da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Test
887da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void clone_clones() {
897da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
907da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
917da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews clone = original.clone();
927da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        original.setTextViewText(R.id.text, "test");
937da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        View inflated = clone.apply(mContext, mContainer);
947da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
957da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        TextView textView = (TextView) inflated.findViewById(R.id.text);
967da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        assertEquals("", textView.getText());
977da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
987da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
997da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Test
1007da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void clone_child_fails() {
1017da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
1027da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews child = new RemoteViews(mPackage, R.layout.remote_views_test);
1037da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1047da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        original.addView(R.id.layout, child);
1057da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1067da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        exception.expect(IllegalStateException.class);
1077da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews clone = child.clone();
1087da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
1097da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1107da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Test
1117da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void clone_repeatedly() {
1127da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
1137da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1147da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        original.clone();
1157da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        original.clone();
1167da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1177da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        original.apply(mContext, mContainer);
1187da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
1197da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1207da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    @Test
1217da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    public void clone_chained() {
1227da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
1237da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1247da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        RemoteViews clone = original.clone().clone();
1257da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1267da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos        clone.apply(mContext, mContainer);
1277da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos    }
1287da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos
1295d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    @Test
1305d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    public void parcelSize_nestedViews() {
1315d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        RemoteViews original = new RemoteViews(mPackage, R.layout.remote_views_test);
1325d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        // We don't care about the actual layout id.
1335d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        RemoteViews child = new RemoteViews(mPackage, 33);
1345d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        int expectedSize = getParcelSize(original) + getParcelSize(child);
1355d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        original.addView(R.id.layout, child);
1365d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
1375d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        // The application info will get written only once.
1385d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        assertTrue(getParcelSize(original) < expectedSize);
1395d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        assertEquals(getParcelSize(original), getParcelSize(original.clone()));
1405d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
1415d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        original = new RemoteViews(mPackage, R.layout.remote_views_test);
1425d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        child = new RemoteViews(OTHER_PACKAGE, 33);
1435d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        expectedSize = getParcelSize(original) + getParcelSize(child);
1445d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        original.addView(R.id.layout, child);
1455d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
1465d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        // Both the views will get written completely along with an additional view operation
1475d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        assertTrue(getParcelSize(original) > expectedSize);
1485d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        assertEquals(getParcelSize(original), getParcelSize(original.clone()));
1495d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    }
1505d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
1515d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    @Test
1525d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    public void parcelSize_differentOrientation() {
1535d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        RemoteViews landscape = new RemoteViews(mPackage, R.layout.remote_views_test);
1545d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        RemoteViews portrait = new RemoteViews(mPackage, 33);
1555d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
1565d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        // The application info will get written only once.
1575d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        RemoteViews views = new RemoteViews(landscape, portrait);
1585d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        assertTrue(getParcelSize(views) < (getParcelSize(landscape) + getParcelSize(portrait)));
1595d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        assertEquals(getParcelSize(views), getParcelSize(views.clone()));
1605d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    }
1615d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal
1625d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    private int getParcelSize(RemoteViews view) {
1635d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        Parcel parcel = Parcel.obtain();
1645d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        view.writeToParcel(parcel, 0);
1655d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        int size = parcel.dataSize();
1665d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        parcel.recycle();
1675d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal        return size;
1685d8bcdf6a575aa9e6eadb17e90ea21f5e4fc9c6bSunny Goyal    }
1697da889d81d2ff4c1704dc0a64389947fb30de5d8Adrian Roos}
170