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