1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License. 6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at 7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software 11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and 14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License. 15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.util; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.ResolveInfo; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.ServiceInfo; 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputInfo; 2207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport android.os.Build; 2348dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.support.v4.os.BuildCompat; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.lang.reflect.Constructor; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * A class that includes convenience methods for testing. 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class TestUtils { 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static TvInputInfo createTvInputInfo(ResolveInfo service, String id, String parentId, 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko int type, boolean isHardwareInput) throws Exception { 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Create a mock TvInputInfo by using private constructor 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // TODO: Find better way to mock TvInputInfo. 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Note that mockito doesn't support mock/spy on final object. 36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return createTvInputInfoForLmp(service, id, parentId, type); 3848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } else if (BuildCompat.isAtLeastN()) { 3948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho new RuntimeException("TOOD(dvr): implement"); // http://b/26903987 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return createTvInputInfoForMnc(service, id, parentId, type, isHardwareInput); 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static TvInputInfo createTvInputInfoForLmp(ResolveInfo service, String id, 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko String parentId, int type) throws Exception { 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Constructor<TvInputInfo> constructor = TvInputInfo.class.getDeclaredConstructor(new Class[]{ 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ResolveInfo.class, String.class, String.class, int.class}); 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko constructor.setAccessible(true); 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return constructor.newInstance(service, id, parentId, type); 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static TvInputInfo createTvInputInfoForMnc(ResolveInfo service, String id, 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko String parentId, int type, boolean isHardwareInput) throws Exception { 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Constructor<TvInputInfo> constructor = TvInputInfo.class.getDeclaredConstructor(new Class[]{ 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ResolveInfo.class, String.class, String.class, int.class, boolean.class}); 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko constructor.setAccessible(true); 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return constructor.newInstance(service, id, parentId, type, isHardwareInput); 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 6048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private static TvInputInfo createTvInputInfoForNpreview(ResolveInfo service, String id, 6148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho String parentId, int type) throws Exception { 6248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho Constructor<TvInputInfo> constructor = TvInputInfo.class.getDeclaredConstructor( 6348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho new Class[]{ResolveInfo.class, String.class, String.class, int.class}); 6448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho constructor.setAccessible(true); 6548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho return constructor.newInstance(service, id, parentId, type); 6648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 6748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static ResolveInfo createResolveInfo(String packageName, String name) { 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ResolveInfo resolveInfo = new ResolveInfo(); 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko resolveInfo.serviceInfo = new ServiceInfo(); 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko resolveInfo.serviceInfo.packageName = packageName; 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko resolveInfo.serviceInfo.name = name; 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return resolveInfo; 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 76