├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── news │ │ └── androidtv │ │ └── launchonboot │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── news │ │ │ └── androidtv │ │ │ └── launchonboot │ │ │ ├── BootReceiver.java │ │ │ ├── DreamListenerService.java │ │ │ ├── MainActivity.java │ │ │ ├── OnboardingActivity.java │ │ │ ├── OnboardingFragment.java │ │ │ └── SettingsManagerConstants.java │ └── res │ │ ├── drawable-nodpi │ │ ├── anim_a_001.png │ │ ├── anim_a_002.png │ │ ├── anim_a_003.png │ │ ├── anim_a_004.png │ │ ├── anim_a_005.png │ │ ├── anim_a_006.png │ │ ├── anim_a_007.png │ │ ├── anim_a_008.png │ │ ├── anim_a_009.png │ │ ├── anim_a_010.png │ │ ├── anim_a_011.png │ │ ├── anim_a_012.png │ │ ├── anim_a_013.png │ │ ├── anim_a_014.png │ │ ├── anim_a_015.png │ │ ├── anim_a_016.png │ │ ├── anim_b_012.png │ │ ├── anim_b_013.png │ │ ├── anim_b_014.png │ │ ├── anim_b_015.png │ │ ├── anim_b_016.png │ │ ├── anim_b_017.png │ │ ├── anim_c_001.png │ │ ├── anim_c_002.png │ │ ├── anim_c_003.png │ │ ├── anim_c_004.png │ │ ├── anim_c_005.png │ │ ├── anim_c_006.png │ │ ├── anim_c_007.png │ │ ├── anim_c_008.png │ │ ├── anim_c_009.png │ │ ├── anim_c_010.png │ │ ├── anim_c_011.png │ │ ├── anim_c_012.png │ │ ├── anim_c_013.png │ │ ├── anim_c_014.png │ │ ├── anim_d_001.png │ │ ├── anim_d_002.png │ │ ├── anim_d_003.png │ │ ├── anim_d_004.png │ │ ├── anim_d_005.png │ │ ├── anim_d_006.png │ │ ├── anim_d_007.png │ │ ├── anim_d_008.png │ │ ├── anim_d_009.png │ │ ├── anim_d_010.png │ │ ├── anim_d_011.png │ │ ├── anim_d_012.png │ │ ├── anim_d_013.png │ │ ├── anim_d_014.png │ │ ├── anim_d_015.png │ │ ├── anim_d_016.png │ │ ├── anim_d_017.png │ │ └── anim_d_018.png │ │ ├── drawable │ │ ├── banner.png │ │ ├── tv_animation_a.xml │ │ ├── tv_animation_b.xml │ │ ├── tv_animation_c.xml │ │ └── tv_animation_d.xml │ │ ├── layout-television │ │ └── activity_main.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ └── onboarding.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-television-v21 │ │ └── bools.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── bools.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── news │ └── androidtv │ └── launchonboot │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── promo ├── animations.psd ├── animations2.psd ├── banner.png ├── banner.psd ├── banner2.png ├── banner2.psd ├── banner3.png ├── banner3.psd ├── device-2016-10-24-191303.png ├── device-2016-10-24-192435.png ├── feature_graphic.png ├── feature_graphic.psd ├── icon.png ├── icon.psd ├── icon2.png ├── icon2.psd ├── icon3.png ├── icon3.psd └── switch-anim.psd └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | .idea/workspace.xml 38 | 39 | # Keystore files 40 | *.jks 41 | .idea/ 42 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 1.7 38 | 39 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Interactive Television (ITV) Lab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Quick Links 2 | 3 | 4 | [Get it on F-Droid](https://f-droid.org/packages/news.androidtv.launchonboot/) 7 | [Get it on Google Play](https://play.google.com/store/apps/details?id=news.androidtv.launchonboot) 10 | 11 | # Launch-On-Boot 12 | _Launches a TV app when the device boots_ 13 | 14 | On Google TV, there was a way to launch a specific app when the device booted. By default the device would display the TV stream, making the OS feel more like an overlay on top of your television than something completely isolated. 15 | 16 | Android TV will simply just display the launcher on a reboot, a small distraction for users expecting to see TV and annoying for individuals using Android TV as a dumb kiosk displaying a single video or stream. 17 | 18 | This app allows the user to select a specific app to open when the device boots. It's just that simple. Any leanback-enabled app can be opened. Alternatively, the default TV app can be opened, returning you to the channel you just saw. 19 | 20 | Want to make your Android TV act more like a dumb TV? Want to launch Sling TV immediately. You should download this small utility app. 21 | 22 | ## Screenshots 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "24.0.2" 6 | defaultConfig { 7 | applicationId "news.androidtv.launchonboot" 8 | minSdkVersion 21 9 | targetSdkVersion 25 10 | versionCode 12 11 | versionName "1.1.3" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion" 28 | compile "com.android.support:leanback-v17:$rootProject.ext.supportLibraryVersion" 29 | 30 | compile 'com.github.fleker:settingsmanager:1.3.5' 31 | testCompile 'junit:junit:4.12' 32 | } 33 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Nick\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/news/androidtv/launchonboot/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("news.androidtv.launchonboot", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 11 | 14 | 15 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 37 | 38 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /app/src/main/java/news/androidtv/launchonboot/BootReceiver.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | import android.content.ActivityNotFoundException; 4 | import android.content.BroadcastReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.media.tv.TvContract; 8 | import android.os.Build; 9 | import android.util.Log; 10 | import android.widget.Toast; 11 | 12 | import com.felkertech.settingsmanager.SettingsManager; 13 | 14 | /** 15 | * Created by Nick on 10/23/2016. 16 | */ 17 | 18 | public class BootReceiver extends BroadcastReceiver { 19 | private static final String TAG = BootReceiver.class.getSimpleName(); 20 | private static final boolean DEBUG = true; 21 | 22 | private boolean mScreenOnListener = false; 23 | private Context mContext; 24 | 25 | @Override 26 | public void onReceive(Context context, Intent intent) { 27 | mContext = context; 28 | if (intent.getAction() != null && 29 | intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 30 | startForegroundService(); 31 | } 32 | processEvent(context, intent); 33 | } 34 | 35 | public static void processEvent(Context context, Intent intent) { 36 | if (DEBUG) { 37 | Log.d(TAG, "Received intent"); 38 | Log.d(TAG, intent.toString()); 39 | } 40 | /* if (!mScreenOnListener) { 41 | context.registerReceiver(this, new IntentFilter(Intent.ACTION_SCREEN_ON)); 42 | mScreenOnListener = true; 43 | }*/ 44 | 45 | SettingsManager settingsManager = new SettingsManager(context); 46 | if (!settingsManager.getBoolean(SettingsManagerConstants.BOOT_APP_ENABLED)) { 47 | return; 48 | } 49 | if (intent.getAction() != null && 50 | intent.getAction().equals(Intent.ACTION_USER_PRESENT) && 51 | !settingsManager.getBoolean(SettingsManagerConstants.ON_WAKEUP)) { 52 | return; 53 | } 54 | if (intent.getAction() != null && 55 | intent.getAction().equals(Intent.ACTION_SCREEN_ON) && 56 | !settingsManager.getBoolean(SettingsManagerConstants.ON_WAKEUP)) { 57 | return; 58 | } 59 | if (intent.getAction() != null && 60 | intent.getAction().equals(Intent.ACTION_DREAMING_STOPPED) && 61 | !settingsManager.getBoolean(SettingsManagerConstants.ON_WAKEUP)) { 62 | return; 63 | } 64 | if (settingsManager.getBoolean(SettingsManagerConstants.LAUNCH_LIVE_CHANNELS) && 65 | context.getResources().getBoolean(R.bool.TIF_SUPPORT) && 66 | Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 67 | Intent i = new Intent(Intent.ACTION_VIEW, TvContract.Channels.CONTENT_URI); 68 | i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 69 | context.startActivity(i); 70 | } else if (!settingsManager.getString(SettingsManagerConstants.LAUNCH_ACTIVITY).isEmpty()) { 71 | Intent i; 72 | if (context.getResources().getBoolean(R.bool.IS_TV)) { 73 | i = context.getPackageManager().getLeanbackLaunchIntentForPackage( 74 | settingsManager.getString(SettingsManagerConstants.LAUNCH_ACTIVITY)); 75 | } else { 76 | i = context.getPackageManager().getLaunchIntentForPackage( 77 | settingsManager.getString(SettingsManagerConstants.LAUNCH_ACTIVITY)); 78 | } 79 | 80 | if (i == null) { 81 | Toast.makeText(context, R.string.null_intent, Toast.LENGTH_SHORT).show(); 82 | return; 83 | } 84 | i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 85 | try { 86 | context.startActivity(i); 87 | } catch (ActivityNotFoundException e) { 88 | Toast.makeText(context, R.string.null_intent, Toast.LENGTH_SHORT).show(); 89 | } 90 | } 91 | } 92 | 93 | private void startForegroundService() { 94 | Intent i = new Intent(mContext, DreamListenerService.class); 95 | mContext.startService(i); 96 | } 97 | } -------------------------------------------------------------------------------- /app/src/main/java/news/androidtv/launchonboot/DreamListenerService.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | import android.app.Notification; 4 | import android.app.PendingIntent; 5 | import android.app.Service; 6 | import android.content.BroadcastReceiver; 7 | import android.content.Context; 8 | import android.content.Intent; 9 | import android.content.IntentFilter; 10 | import android.graphics.BitmapFactory; 11 | import android.graphics.drawable.BitmapDrawable; 12 | import android.os.IBinder; 13 | import android.support.annotation.Nullable; 14 | import android.util.Log; 15 | 16 | /** 17 | * Created by Nick on 5/11/2017. 18 | * 19 | * A foreground service that listens for Screensaver events and responds. 20 | */ 21 | public class DreamListenerService extends Service { 22 | private static final String TAG = DreamListenerService.class.getSimpleName(); 23 | 24 | private static final int ONGOING_NOTIFICATION_ID = 1; 25 | 26 | private BroadcastReceiver dreamHandler = new BroadcastReceiver() { 27 | @Override 28 | public void onReceive(Context context, Intent intent) { 29 | // Redirect intent. 30 | Log.d(TAG, "Received service event: " + intent.getAction()); 31 | BootReceiver.processEvent(context, intent); 32 | } 33 | }; 34 | 35 | @Nullable 36 | @Override 37 | public IBinder onBind(Intent intent) { 38 | return null; 39 | } 40 | 41 | @Override 42 | public void onCreate() { 43 | super.onCreate(); 44 | // Create a foreground service. 45 | Intent notificationIntent = new Intent(this, MainActivity.class); 46 | PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 47 | 48 | Notification notification = new Notification.Builder(this) 49 | .setContentTitle(getText(R.string.app_name)) 50 | .setContentText(getText(R.string.notification_text)) 51 | .setSmallIcon(R.mipmap.ic_launcher) 52 | .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.banner)) 53 | .setContentIntent(pendingIntent) 54 | .setCategory(Notification.CATEGORY_RECOMMENDATION) 55 | .setPriority(Notification.PRIORITY_MIN) 56 | .build(); 57 | 58 | startForeground(ONGOING_NOTIFICATION_ID, notification); 59 | Log.d(TAG, "Deploy notification"); 60 | 61 | // Register listeners. 62 | IntentFilter filter = new IntentFilter(Intent.ACTION_DREAMING_STOPPED); 63 | registerReceiver(dreamHandler, filter); 64 | } 65 | 66 | @Override 67 | public void onDestroy() { 68 | super.onDestroy(); 69 | // Unregister listener. 70 | unregisterReceiver(dreamHandler); 71 | } 72 | 73 | @Override 74 | public int onStartCommand(Intent intent, int flags, int startId) { 75 | return START_STICKY; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/news/androidtv/launchonboot/MainActivity.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | import android.content.DialogInterface; 4 | import android.content.Intent; 5 | import android.content.IntentFilter; 6 | import android.content.pm.ResolveInfo; 7 | import android.support.v7.app.AlertDialog; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.os.Bundle; 10 | import android.util.Log; 11 | import android.view.ContextThemeWrapper; 12 | import android.view.View; 13 | import android.widget.Button; 14 | import android.widget.CompoundButton; 15 | import android.widget.Switch; 16 | import android.widget.TextView; 17 | 18 | import com.felkertech.settingsmanager.SettingsManager; 19 | 20 | import java.util.List; 21 | 22 | import static android.view.View.GONE; 23 | import static news.androidtv.launchonboot.SettingsManagerConstants.ONBOARDING; 24 | 25 | public class MainActivity extends AppCompatActivity { 26 | private static final String TAG = MainActivity.class.getSimpleName(); 27 | private static final boolean DEBUG = true; 28 | 29 | private SettingsManager mSettingsManager; 30 | private Switch mSwitchEnabled; 31 | private Switch mSwitchLiveChannels; 32 | private Switch mSwitchWakeup; 33 | private Button mButtonSelectApp; 34 | private TextView mPackageName; 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | setContentView(R.layout.activity_main); 40 | mSettingsManager = new SettingsManager(this); 41 | if (!mSettingsManager.getBoolean(ONBOARDING)) { 42 | startActivity(new Intent(this, OnboardingActivity.class)); 43 | } 44 | } 45 | 46 | @Override 47 | protected void onResume() { 48 | super.onResume(); 49 | mSwitchLiveChannels = ((Switch) findViewById(R.id.switch_live_channels)); 50 | mSwitchEnabled = ((Switch) findViewById(R.id.switch_enable)); 51 | mSwitchWakeup = ((Switch) findViewById(R.id.switch_wakeup)); 52 | mButtonSelectApp = (Button) findViewById(R.id.button_select_app); 53 | mPackageName = ((TextView) findViewById(R.id.text_package_name)); 54 | 55 | mSwitchEnabled.setChecked( 56 | mSettingsManager.getBoolean(SettingsManagerConstants.BOOT_APP_ENABLED)); 57 | mSwitchLiveChannels.setChecked( 58 | mSettingsManager.getBoolean(SettingsManagerConstants.LAUNCH_LIVE_CHANNELS)); 59 | mSwitchWakeup.setChecked( 60 | mSettingsManager.getBoolean(SettingsManagerConstants.ON_WAKEUP)); 61 | mPackageName 62 | .setText(mSettingsManager.getString(SettingsManagerConstants.LAUNCH_ACTIVITY)); 63 | updateSelectionView(); 64 | 65 | mSwitchEnabled.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 66 | @Override 67 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 68 | mSettingsManager.setBoolean( 69 | SettingsManagerConstants.BOOT_APP_ENABLED, isChecked); 70 | updateSelectionView(); 71 | } 72 | }); 73 | mSwitchLiveChannels.setOnCheckedChangeListener 74 | (new CompoundButton.OnCheckedChangeListener() { 75 | @Override 76 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 77 | mSettingsManager.setBoolean( 78 | SettingsManagerConstants.LAUNCH_LIVE_CHANNELS, isChecked); 79 | updateSelectionView(); 80 | } 81 | }); 82 | mSwitchWakeup.setOnCheckedChangeListener 83 | (new CompoundButton.OnCheckedChangeListener() { 84 | @Override 85 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 86 | mSettingsManager.setBoolean( 87 | SettingsManagerConstants.ON_WAKEUP, isChecked); 88 | updateSelectionView(); 89 | if (isChecked) { 90 | startForegroundService(); 91 | } 92 | } 93 | }); 94 | 95 | if (!getResources().getBoolean(R.bool.DEBUG_FLAG_TEST_BUTTON)) { 96 | findViewById(R.id.button_test).setVisibility(GONE); 97 | } 98 | findViewById(R.id.button_test).setOnClickListener(new View.OnClickListener() { 99 | @Override 100 | public void onClick(View v) { 101 | Intent i = new Intent(MainActivity.this, BootReceiver.class); 102 | sendBroadcast(i); 103 | } 104 | }); 105 | 106 | mButtonSelectApp.setOnClickListener(new View.OnClickListener() { 107 | @Override 108 | public void onClick(View v) { 109 | new AlertDialog.Builder(new ContextThemeWrapper(MainActivity.this, android.R.style.Theme_Material_Light_Dialog)) 110 | .setTitle("Select an app") 111 | .setItems(getAppNames(getLauncherApps()), new DialogInterface.OnClickListener() { 112 | @Override 113 | public void onClick(DialogInterface dialog, int which) { 114 | String packageName = getPackageName(getLauncherApps().get(which)); 115 | mSettingsManager.setString(SettingsManagerConstants.LAUNCH_ACTIVITY, 116 | packageName); 117 | mPackageName.setText(packageName); 118 | } 119 | }) 120 | .show(); 121 | } 122 | }); 123 | mButtonSelectApp.setOnFocusChangeListener(new View.OnFocusChangeListener() { 124 | @Override 125 | public void onFocusChange(View v, boolean hasFocus) { 126 | v.setBackgroundColor(hasFocus ? getResources().getColor(R.color.colorAccent) : 127 | getResources().getColor(R.color.colorPrimaryDark)); 128 | } 129 | }); 130 | findViewById(R.id.button_test).setOnFocusChangeListener(new View.OnFocusChangeListener() { 131 | @Override 132 | public void onFocusChange(View v, boolean hasFocus) { 133 | v.setBackgroundColor(hasFocus ? getResources().getColor(R.color.colorAccent) : 134 | getResources().getColor(R.color.colorPrimaryDark)); 135 | } 136 | }); 137 | 138 | if (DEBUG) { 139 | Log.d(TAG, getLauncherApps().toString()); 140 | getAppNames(getLauncherApps()); 141 | } 142 | registerReceiver(new BootReceiver(), new IntentFilter(Intent.ACTION_SCREEN_ON)); 143 | 144 | if (mSettingsManager.getBoolean(SettingsManagerConstants.ON_WAKEUP)) { 145 | startForegroundService(); 146 | } 147 | } 148 | 149 | public List getLauncherApps() { 150 | final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 151 | // Change which category is used based on form factor. 152 | if (getResources().getBoolean(R.bool.IS_TV)) { 153 | mainIntent.addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER); 154 | } else { 155 | mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 156 | } 157 | return getPackageManager().queryIntentActivities(mainIntent, 0); 158 | } 159 | 160 | public String[] getAppNames(List leanbackApps) { 161 | String[] appNames = new String[leanbackApps.size()]; 162 | for (int i = 0; i < leanbackApps.size(); i++) { 163 | ResolveInfo info = leanbackApps.get(i); 164 | appNames[i] = info.loadLabel(this.getPackageManager()).toString(); 165 | Log.d(TAG, info.loadLabel(this.getPackageManager()).toString()); 166 | Log.d(TAG, info.activityInfo.toString()); 167 | Log.d(TAG, info.activityInfo.name); 168 | } 169 | return appNames; 170 | } 171 | 172 | public String getPackageName(ResolveInfo resolveInfo) { 173 | return resolveInfo.activityInfo.packageName; 174 | } 175 | 176 | private void updateSelectionView() { 177 | if (mSwitchEnabled.isChecked()) { 178 | mSwitchLiveChannels.setEnabled(true); 179 | findViewById(R.id.button_test).setEnabled(true); 180 | if (mSwitchLiveChannels.isChecked()) { 181 | mButtonSelectApp.setVisibility(GONE); 182 | mPackageName.setVisibility(GONE); 183 | } else { 184 | mButtonSelectApp.setVisibility(View.VISIBLE); 185 | mPackageName.setVisibility(View.VISIBLE); 186 | } 187 | } else { 188 | mButtonSelectApp.setVisibility(GONE); 189 | mPackageName.setVisibility(GONE); 190 | mSwitchLiveChannels.setEnabled(false); 191 | findViewById(R.id.button_test).setEnabled(false); 192 | } 193 | } 194 | 195 | private void startForegroundService() { 196 | // Ideally only starts once :thinking-emoji: 197 | Intent i = new Intent(MainActivity.this, DreamListenerService.class); 198 | startService(i); 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /app/src/main/java/news/androidtv/launchonboot/OnboardingActivity.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | import com.felkertech.settingsmanager.SettingsManager; 7 | 8 | /** 9 | * Created by Nick on 4/22/2017. 10 | */ 11 | 12 | public class OnboardingActivity extends Activity { 13 | /** 14 | * Called when the activity is first created. 15 | */ 16 | @Override 17 | public void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.onboarding); 20 | // Update the shared preferences 21 | new SettingsManager(this).setBoolean(SettingsManagerConstants.ONBOARDING, true); 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/news/androidtv/launchonboot/OnboardingFragment.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | import android.animation.Animator; 4 | import android.animation.AnimatorListenerAdapter; 5 | import android.animation.AnimatorSet; 6 | import android.animation.ObjectAnimator; 7 | import android.app.ActionBar; 8 | import android.content.SharedPreferences; 9 | import android.graphics.drawable.AnimationDrawable; 10 | import android.os.Bundle; 11 | import android.preference.PreferenceManager; 12 | import android.support.annotation.Nullable; 13 | import android.view.LayoutInflater; 14 | import android.view.View; 15 | import android.view.ViewGroup; 16 | import android.widget.ImageView; 17 | 18 | import com.felkertech.settingsmanager.SettingsManager; 19 | 20 | import java.util.ArrayList; 21 | 22 | /** 23 | * Created by Nick on 4/22/2017. 24 | */ 25 | 26 | public class OnboardingFragment extends android.support.v17.leanback.app.OnboardingFragment { 27 | private static final int[] pageTitles = { 28 | R.string.onboarding_title_welcome, 29 | R.string.onboarding_title_what, 30 | R.string.onboarding_title_tv, 31 | R.string.onboarding_title_try 32 | }; 33 | private static final int[] pageDescriptions = { 34 | R.string.onboarding_description_welcome, 35 | R.string.onboarding_description_what, 36 | R.string.onboarding_description_tv, 37 | R.string.onboarding_description_try 38 | }; 39 | private final int[] pageImages = { 40 | R.drawable.tv_animation_d, 41 | R.drawable.tv_animation_a, 42 | R.drawable.tv_animation_b, 43 | R.drawable.tv_animation_c 44 | }; 45 | private static final long ANIMATION_DURATION = 500; 46 | private Animator mContentAnimator; 47 | private ImageView mContentView; 48 | 49 | @Nullable 50 | @Override 51 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 52 | // Set the logo to display a splash animation 53 | setLogoResourceId(R.drawable.banner); 54 | return super.onCreateView(inflater, container, savedInstanceState); 55 | } 56 | 57 | @Override 58 | protected void onFinishFragment() { 59 | super.onFinishFragment(); 60 | // Our onboarding is done 61 | // Let's go back to the MainActivity 62 | getActivity().finish(); 63 | } 64 | 65 | @Override 66 | protected int getPageCount() { 67 | return pageTitles.length; 68 | } 69 | 70 | @Override 71 | protected String getPageTitle(int pageIndex) { 72 | return getString(pageTitles[pageIndex]); 73 | } 74 | 75 | @Override 76 | protected String getPageDescription(int pageIndex) { 77 | return getString(pageDescriptions[pageIndex]); 78 | } 79 | 80 | @Nullable 81 | @Override 82 | protected View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container) { 83 | View bgView = new View(getActivity()); 84 | bgView.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); 85 | return bgView; 86 | } 87 | 88 | @Nullable 89 | @Override 90 | protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) { 91 | mContentView = new ImageView(getActivity()); 92 | mContentView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 93 | mContentView.setPadding(0, 32, 0, 32); 94 | return mContentView; 95 | } 96 | 97 | @Nullable 98 | @Override 99 | protected View onCreateForegroundView(LayoutInflater inflater, ViewGroup container) { 100 | return null; 101 | } 102 | 103 | @Override 104 | protected void onPageChanged(final int newPage, int previousPage) { 105 | if (mContentAnimator != null) { 106 | mContentAnimator.end(); 107 | } 108 | ArrayList animators = new ArrayList<>(); 109 | Animator fadeOut = createFadeOutAnimator(mContentView); 110 | 111 | fadeOut.addListener(new AnimatorListenerAdapter() { 112 | @Override 113 | public void onAnimationEnd(Animator animation) { 114 | mContentView.setImageDrawable(getResources().getDrawable(pageImages[newPage])); 115 | ((AnimationDrawable) mContentView.getDrawable()).start(); 116 | } 117 | }); 118 | animators.add(fadeOut); 119 | animators.add(createFadeInAnimator(mContentView)); 120 | AnimatorSet set = new AnimatorSet(); 121 | set.playSequentially(animators); 122 | set.start(); 123 | mContentAnimator = set; 124 | } 125 | @Override 126 | protected Animator onCreateEnterAnimation() { 127 | mContentView.setImageDrawable(getResources().getDrawable(pageImages[0])); 128 | ((AnimationDrawable) mContentView.getDrawable()).start(); 129 | mContentAnimator = createFadeInAnimator(mContentView); 130 | return mContentAnimator; 131 | } 132 | private Animator createFadeInAnimator(View view) { 133 | return ObjectAnimator.ofFloat(view, View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION); 134 | } 135 | 136 | private Animator createFadeOutAnimator(View view) { 137 | return ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /app/src/main/java/news/androidtv/launchonboot/SettingsManagerConstants.java: -------------------------------------------------------------------------------- 1 | package news.androidtv.launchonboot; 2 | 3 | /** 4 | * Created by Nick on 10/23/2016. 5 | */ 6 | 7 | public class SettingsManagerConstants { 8 | public static final String BOOT_APP_ENABLED = "BOOT_APP_ENABLED"; 9 | public static final String LAUNCH_LIVE_CHANNELS = "LAUNCH_LIVE_CHANNELS"; 10 | public static final String LAUNCH_ACTIVITY = "LAUNCH_ACTIVITY"; 11 | public static final String ON_WAKEUP = "ON_WAKEUP"; 12 | public static final String ONBOARDING = "ONBOARDING"; 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_001.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_002.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_003.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_004.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_005.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_006.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_007.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_008.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_009.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_010.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_011.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_012.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_013.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_014.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_015.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_a_016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_a_016.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_b_012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_b_012.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_b_013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_b_013.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_b_014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_b_014.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_b_015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_b_015.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_b_016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_b_016.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_b_017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_b_017.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_001.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_002.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_003.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_004.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_005.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_006.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_007.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_008.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_009.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_010.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_011.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_012.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_013.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_c_014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_c_014.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_001.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_002.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_003.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_004.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_005.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_006.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_007.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_008.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_009.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_010.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_011.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_012.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_013.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_014.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_015.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_016.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_017.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/anim_d_018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable-nodpi/anim_d_018.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITVlab/Launch-On-Boot/be139ec5bd07fa227a8547eec73df5326a85c687/app/src/main/res/drawable/banner.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/tv_animation_a.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tv_animation_b.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tv_animation_c.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tv_animation_d.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout-television/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 23 | 32 | 33 | 34 | 43 | 47 | 54 | 60 | 68 | 74 | 82 |