From d8f32e3b858c585df33244cf88b50ac7731a257b Mon Sep 17 00:00:00 2001 From: Wei Sun Date: Sun, 31 Dec 2023 11:12:24 +0800 Subject: [PATCH] Upgrade the compileSdkVersion and buildToolsVersion. - The current compileSdkVersion is 34 and buildToolsVersion is "34.0.0". - Due to non-compliance of IMA SDK with Android 14, we need to temporarily disable ads insertion on Android 14. https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading - Replace the dependencies of Android's Support Library with the Android Jetpack Library. - Upgrade AGP version to 8.2.0. - Remove the androidTest cases that should be re-implemented in the library module. --- app/build.gradle | 28 +- app/src/main/AndroidManifest.xml | 26 +- .../sampletvinput/player/DemoPlayer.java | 4 +- .../player/FakeTrickplayRunnable.java | 4 +- .../sampletvinput/rich/FirstStepFragment.java | 39 +-- .../rich/RichAppLinkDetailsFragment.java | 24 +- .../rich/RichAppLinkSidePanelActivity.java | 6 +- .../sampletvinput/rich/RichSetupFragment.java | 10 +- .../rich/RichTvInputService.java | 6 +- .../rich/RichTvInputSetupActivity.java | 3 +- build.gradle | 2 +- gradle.properties | 8 + gradle/wrapper/gradle-wrapper.properties | 4 +- library/build.gradle | 86 +++--- library/src/androidTest/AndroidManifest.xml | 6 +- .../test/ChannelSetupFragmentTest.java | 176 ------------- .../test/EpgSyncWithAdsJobServiceTest.java | 247 ------------------ .../companionlibrary/test/MockTvPlayer.java | 4 +- .../test/PeriodicEpgSyncJobServiceTest.java | 140 ---------- .../companionlibrary/test/TestActivity.java | 3 +- .../companionlibrary/test/TestJobService.java | 4 +- .../test/TestTvInputService.java | 6 +- library/src/main/AndroidManifest.xml | 18 +- .../tv/companionlibrary/AdController.java | 66 +++-- .../companionlibrary/BaseTvInputService.java | 13 +- .../ads/EpgSyncWithAdsJobService.java | 4 +- .../companionlibrary/model/Advertisement.java | 2 +- .../model/InternalProviderData.java | 3 +- .../tv/companionlibrary/model/ModelUtils.java | 4 +- .../tv/companionlibrary/model/Program.java | 8 +- .../model/RecordedProgram.java | 4 +- .../setup/ChannelSetupFragment.java | 6 +- .../setup/ChannelSetupStepFragment.java | 14 +- .../ChannelSetupStepSupportFragment.java | 14 +- .../setup/ChannelSetupStylist.java | 3 +- .../sync/EpgSyncJobService.java | 10 +- .../companionlibrary/xmltv/XmlTvParser.java | 4 +- .../model/AdvertisementTest.java | 3 +- .../companionlibrary/model/ChannelTest.java | 7 +- .../model/InternalProviderDataTest.java | 3 +- .../companionlibrary/model/ProgramTest.java | 7 +- .../model/RecordedProgramTest.java | 7 +- .../setup/ChannelSetupStepFragmentTest.java | 7 +- .../sync/SyncStatusBroadcastReceiverTest.java | 3 +- .../xmltv/XmlTvAdvertisementTest.java | 2 +- .../xmltv/XmlTvParserTest.java | 7 +- 46 files changed, 301 insertions(+), 754 deletions(-) create mode 100644 gradle.properties delete mode 100644 library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/ChannelSetupFragmentTest.java delete mode 100644 library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/EpgSyncWithAdsJobServiceTest.java delete mode 100644 library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/PeriodicEpgSyncJobServiceTest.java diff --git a/app/build.gradle b/app/build.gradle index 4651b798..d11827c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 27 - buildToolsVersion "27.0.3" + namespace "com.example.android.sampletvinput" + compileSdkVersion 34 + buildToolsVersion "34.0.0" defaultConfig { applicationId "com.example.android.sampletvinput" - minSdkVersion 21 - targetSdkVersion 27 + minSdkVersion 26 + targetSdkVersion 34 versionCode 3 versionName "1.2" } @@ -18,16 +19,23 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } -} + packagingOptions { + resources { + excludes += [ + 'error_prone/Annotations.gwt.xml', + 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml', + 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml', + 'jsr305_annotations/Jsr305_annotations.gwt.xml' + ] + } + } -ext { - appCompatVersion = '27.1.1' } dependencies { implementation project(':library') - implementation "com.android.support:recyclerview-v7:$appCompatVersion" - implementation "com.android.support:leanback-v17:$appCompatVersion" - implementation "com.android.support:appcompat-v7:$appCompatVersion" + implementation "androidx.recyclerview:recyclerview:1.3.0" + implementation "androidx.leanback:leanback:1.0.0" + implementation "androidx.appcompat:appcompat:1.6.1" implementation 'com.google.android.exoplayer:exoplayer:r1.5.14' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 89986606..14283d58 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,11 +14,7 @@ limitations under the License. --> - - - + @@ -50,8 +46,9 @@ android:allowBackup="false" android:icon="@drawable/android_48dp" android:label="@string/app_name" - android:theme="@style/Theme.Leanback"> - + android:theme="@style/Theme.Leanback" + android:banner="@drawable/your_company"> + @@ -61,7 +58,8 @@ + android:theme="@style/TifSetup" + android:exported="true"> @@ -71,7 +69,8 @@ the app-link connected to this activity. --> + android:theme="@style/Theme.Transparent" + android:exported="true"> @@ -81,7 +80,8 @@ the app-link connected to this activity. --> + android:theme="@style/Theme.Panel" + android:exported="true"> @@ -95,7 +95,8 @@ + android:permission="android.permission.BIND_TV_INPUT" + android:exported="true"> @@ -114,7 +115,8 @@ android:exported="true" /> - + diff --git a/app/src/main/java/com/example/android/sampletvinput/player/DemoPlayer.java b/app/src/main/java/com/example/android/sampletvinput/player/DemoPlayer.java index cf5a30b4..91c796e5 100644 --- a/app/src/main/java/com/example/android/sampletvinput/player/DemoPlayer.java +++ b/app/src/main/java/com/example/android/sampletvinput/player/DemoPlayer.java @@ -22,8 +22,10 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; -import android.support.annotation.RequiresApi; import android.view.Surface; + +import androidx.annotation.RequiresApi; + import com.google.android.exoplayer.CodecCounters; import com.google.android.exoplayer.DummyTrackRenderer; import com.google.android.exoplayer.ExoPlaybackException; diff --git a/app/src/main/java/com/example/android/sampletvinput/player/FakeTrickplayRunnable.java b/app/src/main/java/com/example/android/sampletvinput/player/FakeTrickplayRunnable.java index b485fc99..123ead5d 100644 --- a/app/src/main/java/com/example/android/sampletvinput/player/FakeTrickplayRunnable.java +++ b/app/src/main/java/com/example/android/sampletvinput/player/FakeTrickplayRunnable.java @@ -20,8 +20,10 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; -import android.support.annotation.RequiresApi; import android.util.Log; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.TvPlayer; @RequiresApi(api = Build.VERSION_CODES.M) diff --git a/app/src/main/java/com/example/android/sampletvinput/rich/FirstStepFragment.java b/app/src/main/java/com/example/android/sampletvinput/rich/FirstStepFragment.java index ed70baf3..78dd9d12 100644 --- a/app/src/main/java/com/example/android/sampletvinput/rich/FirstStepFragment.java +++ b/app/src/main/java/com/example/android/sampletvinput/rich/FirstStepFragment.java @@ -17,11 +17,14 @@ import android.app.Activity; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v17.leanback.app.GuidedStepFragment; -import android.support.v17.leanback.widget.GuidanceStylist.Guidance; -import android.support.v17.leanback.widget.GuidedAction; + +import androidx.annotation.NonNull; +import androidx.leanback.app.GuidedStepFragment; +import androidx.leanback.widget.GuidanceStylist; +import androidx.leanback.widget.GuidedAction; + import com.example.android.sampletvinput.R; import java.util.List; @@ -30,27 +33,29 @@ public class FirstStepFragment extends GuidedStepFragment { @Override @NonNull - public Guidance onCreateGuidance(@NonNull Bundle savedInstanceState) { + public GuidanceStylist.Guidance onCreateGuidance(@NonNull Bundle savedInstanceState) { String title = getString(R.string.rich_input_label); String description = getString(R.string.rich_setup_first_step_description); Drawable icon = getActivity().getDrawable(R.drawable.android_48dp); - return new Guidance(title, description, null, icon); + return new GuidanceStylist.Guidance(title, description, null, icon); } @Override public void onCreateActions(@NonNull List actions, Bundle savedInstanceState) { - actions.add( - new GuidedAction.Builder(getContext()) - .id(GuidedAction.ACTION_ID_NEXT) - .title(R.string.rich_setup_add_channel) - .hasNext(true) - .build()); - actions.add( - new GuidedAction.Builder(getContext()) - .id(GuidedAction.ACTION_ID_CANCEL) - .title(R.string.rich_setup_cancel) - .build()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + actions.add( + new GuidedAction.Builder(getContext()) + .id(GuidedAction.ACTION_ID_NEXT) + .title(R.string.rich_setup_add_channel) + .hasNext(true) + .build()); + actions.add( + new GuidedAction.Builder(getContext()) + .id(GuidedAction.ACTION_ID_CANCEL) + .title(R.string.rich_setup_cancel) + .build()); + } //TODO add about screen } diff --git a/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkDetailsFragment.java b/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkDetailsFragment.java index 16b1c6bb..c97495af 100644 --- a/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkDetailsFragment.java +++ b/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkDetailsFragment.java @@ -20,17 +20,19 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; -import android.support.v17.leanback.app.DetailsFragment; -import android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter; -import android.support.v17.leanback.widget.Action; -import android.support.v17.leanback.widget.ArrayObjectAdapter; -import android.support.v17.leanback.widget.ClassPresenterSelector; -import android.support.v17.leanback.widget.DetailsOverviewRow; -import android.support.v17.leanback.widget.DetailsOverviewRowPresenter; -import android.support.v17.leanback.widget.ListRow; -import android.support.v17.leanback.widget.ListRowPresenter; -import android.support.v17.leanback.widget.OnActionClickedListener; -import android.support.v4.content.ContextCompat; + +import androidx.core.content.ContextCompat; +import androidx.leanback.app.DetailsFragment; +import androidx.leanback.widget.AbstractDetailsDescriptionPresenter; +import androidx.leanback.widget.Action; +import androidx.leanback.widget.ArrayObjectAdapter; +import androidx.leanback.widget.ClassPresenterSelector; +import androidx.leanback.widget.DetailsOverviewRow; +import androidx.leanback.widget.DetailsOverviewRowPresenter; +import androidx.leanback.widget.ListRow; +import androidx.leanback.widget.ListRowPresenter; +import androidx.leanback.widget.OnActionClickedListener; + import com.example.android.sampletvinput.R; /** diff --git a/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkSidePanelActivity.java b/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkSidePanelActivity.java index e4d8bc52..e0d3f397 100644 --- a/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkSidePanelActivity.java +++ b/app/src/main/java/com/example/android/sampletvinput/rich/RichAppLinkSidePanelActivity.java @@ -18,13 +18,15 @@ import android.app.Activity; import android.os.Bundle; -import android.support.v17.leanback.widget.VerticalGridView; -import android.support.v7.widget.RecyclerView; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.TextView; + +import androidx.leanback.widget.VerticalGridView; +import androidx.recyclerview.widget.RecyclerView; + import com.example.android.sampletvinput.R; import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.ModelUtils; diff --git a/app/src/main/java/com/example/android/sampletvinput/rich/RichSetupFragment.java b/app/src/main/java/com/example/android/sampletvinput/rich/RichSetupFragment.java index 4c14bf86..37627eb4 100644 --- a/app/src/main/java/com/example/android/sampletvinput/rich/RichSetupFragment.java +++ b/app/src/main/java/com/example/android/sampletvinput/rich/RichSetupFragment.java @@ -18,8 +18,10 @@ import android.graphics.drawable.Drawable; import android.media.tv.TvInputInfo; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v17.leanback.widget.GuidanceStylist.Guidance; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.GuidanceStylist; + import com.example.android.sampletvinput.R; import com.example.android.sampletvinput.SampleJobService; import com.google.android.media.tv.companionlibrary.setup.ChannelSetupStepFragment; @@ -44,11 +46,11 @@ public Class getEpgSyncJobServiceClass() { } @Override - public Guidance onCreateGuidance(@NonNull Bundle savedInstanceState) { + public GuidanceStylist.Guidance onCreateGuidance(@NonNull Bundle savedInstanceState) { String title = getString(R.string.rich_input_label); String description = getString(R.string.tif_channel_setup_description); Drawable icon = getActivity().getDrawable(R.drawable.android_48dp); - return new Guidance(title, description, null, icon); + return new GuidanceStylist.Guidance(title, description, null, icon); } public String getInputId() { diff --git a/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputService.java b/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputService.java index af9b1bfa..6469ba65 100644 --- a/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputService.java +++ b/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputService.java @@ -27,14 +27,16 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; -import android.support.annotation.Nullable; -import android.support.annotation.RequiresApi; import android.util.Log; import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.view.accessibility.CaptioningManager; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + import com.example.android.sampletvinput.R; import com.example.android.sampletvinput.SampleJobService; import com.example.android.sampletvinput.player.DemoPlayer; diff --git a/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputSetupActivity.java b/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputSetupActivity.java index 41a45b15..683423b3 100644 --- a/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputSetupActivity.java +++ b/app/src/main/java/com/example/android/sampletvinput/rich/RichTvInputSetupActivity.java @@ -18,7 +18,8 @@ import android.app.Activity; import android.os.Bundle; -import android.support.v17.leanback.app.GuidedStepFragment; + +import androidx.leanback.app.GuidedStepFragment; /** The setup activity for demonstrating {@link RichTvInputService}. */ public class RichTvInputSetupActivity extends Activity { diff --git a/build.gradle b/build.gradle index 390aecc9..da5238bd 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.0' + classpath 'com.android.tools.build:gradle:8.2.0' } } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..db275d56 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,8 @@ +android.suppressUnsupportedCompileSdk=34 +android.useAndroidX=true +org.gradle.daemon=true +org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.parallel=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 512621e4..24e80d17 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Mar 28 17:53:17 PDT 2018 +#Sun Dec 31 09:04:42 CST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip diff --git a/library/build.gradle b/library/build.gradle index bbb16536..ecd1cec4 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,18 +1,14 @@ -plugins { - id "com.jfrog.bintray" version "1.7" -} - apply plugin: 'com.android.library' apply plugin: 'maven-publish' android { - compileSdkVersion 27 + namespace "com.google.android.media.tv.companionlibrary" + compileSdkVersion 34 + buildToolsVersion "34.0.0" defaultConfig { - minSdkVersion 21 - targetSdkVersion 27 - versionCode 1 - versionName "1.0" + minSdkVersion 26 + targetSdkVersion 34 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -20,40 +16,52 @@ android { minifyEnabled false } } - packagingOptions { - exclude 'error_prone/Annotations.gwt.xml' - exclude 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml' - exclude 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml' - exclude 'jsr305_annotations/Jsr305_annotations.gwt.xml' + resources { + excludes += [ + 'error_prone/Annotations.gwt.xml', + 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml', + 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml', + 'jsr305_annotations/Jsr305_annotations.gwt.xml' + ] + } } + + testNamespace 'com.google.android.media.tv.companionlibrary.test' } configurations { doclava } -ext { - appCompatVersion = '27.1.1' - playServicesVersion = '12.0.0' - supportTestVersion = '1.0.1' -} - dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "com.android.support:appcompat-v7:$appCompatVersion" - implementation "com.android.support:leanback-v17:$appCompatVersion" - implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.2.1' - implementation "com.google.android.gms:play-services-ads:$playServicesVersion" - - testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.8.9' - testImplementation "org.robolectric:robolectric:3.8" - - androidTestImplementation "com.android.support:support-annotations:$appCompatVersion" - androidTestImplementation "com.android.support.test:runner:$supportTestVersion" - androidTestImplementation "com.android.support.test:rules:$supportTestVersion" - androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "androidx.leanback:leanback:1.0.0" + implementation "com.google.ads.interactivemedia.v3:interactivemedia:3.29.0" + implementation "com.google.android.gms:play-services-ads:22.6.0" + implementation "junit:junit:4.13.2" + + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-core:3.12.4' + testImplementation "org.robolectric:robolectric:4.10.3" + + implementation "androidx.annotation:annotation:1.7.0" + + androidTestImplementation 'androidx.test:core:1.5.0' + androidTestImplementation 'androidx.test:runner:1.5.2' + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.ext:truth:1.5.0' + androidTestImplementation 'com.google.truth:truth:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1' + androidTestImplementation 'androidx.test.espresso:espresso-intents:3.5.1' + androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.5.1' + androidTestImplementation 'androidx.test.espresso:espresso-web:3.5.1' + androidTestImplementation 'androidx.test.espresso.idling:idling-concurrent:3.5.1' + androidTestImplementation 'androidx.test.espresso:espresso-idling-resource:3.5.1' + doclava 'com.google.doclava:doclava:1.0.6' } @@ -67,12 +75,13 @@ dependencies { */ def packageVersion = '0.4.1' -task sourceJar(type: Jar) { - classifier = 'sources' +tasks.register('sourceJar', Jar) { + archiveClassifier.set("sources") from android.sourceSets.main.java.srcDirs } -task javadoc(type: Javadoc, dependsOn: project.configurations.doclava) { +tasks.register('javadoc', Javadoc) { + dependsOn project.configurations.doclava failOnError = false title = null source = android.sourceSets.main.java.srcDirs @@ -81,8 +90,9 @@ task javadoc(type: Javadoc, dependsOn: project.configurations.doclava) { classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) } -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' +tasks.register('javadocJar', Jar) { + dependsOn javadoc + archiveClassifier.set("javadoc") from javadoc.destinationDir } diff --git a/library/src/androidTest/AndroidManifest.xml b/library/src/androidTest/AndroidManifest.xml index f419d143..32fa103b 100644 --- a/library/src/androidTest/AndroidManifest.xml +++ b/library/src/androidTest/AndroidManifest.xml @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. --> - + @@ -29,7 +28,8 @@ + android:permission="android.permission.BIND_TV_INPUT" + android:exported="true"> diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/ChannelSetupFragmentTest.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/ChannelSetupFragmentTest.java deleted file mode 100644 index 64d737d4..00000000 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/ChannelSetupFragmentTest.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2016 The Android Open Source Project. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.media.tv.companionlibrary.test; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.media.tv.TvContract; -import android.os.Bundle; -import android.support.test.InstrumentationRegistry; -import android.support.v4.content.LocalBroadcastManager; -import android.test.ActivityInstrumentationTestCase2; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import com.google.android.media.tv.companionlibrary.setup.ChannelSetupFragment; -import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import junit.framework.Assert; - -public class ChannelSetupFragmentTest extends ActivityInstrumentationTestCase2 { - private static final String TAG = ChannelSetupFragmentTest.class.getSimpleName(); - - private ChannelSetupFragment mChannelSetupFragment; - private CountDownLatch mCountDownLatch; - - private final BroadcastReceiver mSyncStatusChangedReceiver = new BroadcastReceiver() { - private boolean mFinished; - @Override - public void onReceive(Context context, final Intent intent) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (mFinished) { - return; - } - String syncStatusChangedInputId = intent.getStringExtra( - EpgSyncJobService.BUNDLE_KEY_INPUT_ID); - Assert.assertNotNull(syncStatusChangedInputId); - Assert.assertNotNull("CountDownLatch is null, reset the test", mCountDownLatch); - String syncStatus = intent.getStringExtra(EpgSyncJobService.SYNC_STATUS); - Log.d(TAG, "Received sync status " + syncStatus + " for input id " - + syncStatusChangedInputId); - if (syncStatusChangedInputId.equals(TestTvInputService.INPUT_ID)) { - if (syncStatus.equals(EpgSyncJobService.SYNC_STARTED)) { - mCountDownLatch.countDown(); - } else if (syncStatus.equals(EpgSyncJobService.SYNC_SCANNED)) { - mCountDownLatch.countDown(); - Assert.assertTrue("Scan property CHANNELS_SCANNED doesn't exist.", - intent.hasExtra(EpgSyncJobService.BUNDLE_KEY_CHANNELS_SCANNED)); - Assert.assertTrue("Scan property CHANNEL_COUNT doesn't exist.", - intent.hasExtra(EpgSyncJobService.BUNDLE_KEY_CHANNEL_COUNT)); - } else if (syncStatus.equals(EpgSyncJobService.SYNC_FINISHED)) { - mFinished = true; - mCountDownLatch.countDown(); - } else if (syncStatus.equals(EpgSyncJobService.SYNC_ERROR)) { - Assert.fail("Sync error occurred: " + intent.getIntExtra( - EpgSyncJobService.BUNDLE_KEY_ERROR_REASON, 0)); - } - } - } - }); - } - }; - - public ChannelSetupFragmentTest() { - super(TestActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - injectInstrumentation(InstrumentationRegistry.getInstrumentation()); - getActivity(); - mChannelSetupFragment = new ChannelSetupFragmentImpl(); - getActivity().getFragmentManager().beginTransaction() - .add(com.google.android.media.tv.companionlibrary.test.R.id.viewgroup, - mChannelSetupFragment, "Setup") - .commitAllowingStateLoss(); - LocalBroadcastManager.getInstance(getActivity()).registerReceiver( - mSyncStatusChangedReceiver, - new IntentFilter(EpgSyncJobService.ACTION_SYNC_STATUS_CHANGED)); - TestJobService.mContext = getActivity(); - } - - @Override - public void tearDown() throws Exception { - super.tearDown(); - // Delete content - getActivity().getContentResolver().delete(TvContract.buildChannelsUriForInput( - TestTvInputService.INPUT_ID), null, null); - LocalBroadcastManager.getInstance(getActivity()) - .unregisterReceiver(mSyncStatusChangedReceiver); - } - - public void testSync() throws InterruptedException { - mCountDownLatch = new CountDownLatch(4); - mCountDownLatch.await(); - try { - // Add some delay so that we are able to see the UI change - CountDownLatch delayLatch = new CountDownLatch(1); - Assert.assertFalse(delayLatch.await(5, TimeUnit.SECONDS)); - } catch (InterruptedException e) { - Assert.fail(e.getMessage()); - } - } - - public static class ChannelSetupFragmentImpl extends ChannelSetupFragment { - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View fragmentView = super.onCreateView(inflater, container, savedInstanceState); - setTitle("Channel Setup UI Test"); - setBackgroundColor(getResources().getColor(android.R.color.holo_red_dark)); - setDescription("Hello world"); - setBadge(getResources().getDrawable( - com.google.android.media.tv.companionlibrary.test.R.drawable.usb_antenna)); - setButtonText("Start scanning"); - setChannelListVisibility(true); - return fragmentView; - } - - @Override - public void onScanStarted() { - setButtonText("Stop!"); - EpgSyncJobService.cancelAllSyncRequests(getActivity()); - EpgSyncJobService.requestImmediateSync(getActivity(), - TestTvInputService.INPUT_ID, new ComponentName(getContext(), - TestJobService.class)); - } - - @Override - public String getInputId() { - return TestTvInputService.INPUT_ID; - } - - @Override - public void onScanFinished() { - setButtonText("Done!"); - } - - @Override - public void onScannedChannel(CharSequence displayName, CharSequence displayNumber) { - super.onScannedChannel(displayName, displayNumber); - Assert.assertNotNull(displayName); - Assert.assertNotNull(displayNumber); - } - - @Override - public void onScanStepCompleted(int completedStep, int totalSteps) { - super.onScanStepCompleted(completedStep, totalSteps); - super.onScanStepCompleted(completedStep, totalSteps); - Assert.assertTrue("Channels scanned cannot be less than or equal to 0.", - completedStep > 0); - Assert.assertEquals(2, totalSteps); - setDescription(completedStep + " channels scanned."); - } - } -} diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/EpgSyncWithAdsJobServiceTest.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/EpgSyncWithAdsJobServiceTest.java deleted file mode 100644 index 99177ff0..00000000 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/EpgSyncWithAdsJobServiceTest.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright 2016 The Android Open Source Project. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.media.tv.companionlibrary.test; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.media.tv.TvContract; -import android.net.Uri; -import android.support.annotation.UiThread; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import android.support.v4.content.LocalBroadcastManager; -import android.test.ActivityInstrumentationTestCase2; -import android.util.Log; -import android.util.LongSparseArray; -import com.google.android.media.tv.companionlibrary.model.Channel; -import com.google.android.media.tv.companionlibrary.model.ModelUtils; -import com.google.android.media.tv.companionlibrary.model.Program; -import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService; -import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService.EpgSyncException; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import junit.framework.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Tests the synchronization of the EpgSyncTask with the EPG, making sure repeated programs are - * generated correctly for the entire syncing period. - */ -@RunWith(AndroidJUnit4.class) -public class EpgSyncWithAdsJobServiceTest extends ActivityInstrumentationTestCase2 { - private static final String TAG = EpgSyncWithAdsJobServiceTest.class.getSimpleName(); - - private List mProgramList; - private List mChannelList; - private TestJobService mSampleJobService; - private LongSparseArray mChannelMap; - private long mStartMs; - private long mEndMs; - private CountDownLatch mSyncStatusLatch; - - private final BroadcastReceiver mSyncStatusChangedReceiver = - new BroadcastReceiver() { - @Override - public void onReceive(Context context, final Intent intent) { - getActivity() - .runOnUiThread( - new Runnable() { - @Override - public void run() { - receiveOnUiThread(intent); - } - }); - } - - @UiThread - private void receiveOnUiThread(Intent intent) { - String syncStatusChangedInputId = - intent.getStringExtra(EpgSyncJobService.BUNDLE_KEY_INPUT_ID); - String syncStatus = intent.getStringExtra(EpgSyncJobService.SYNC_STATUS); - if (syncStatus.equals(EpgSyncJobService.SYNC_ERROR)) { - Assert.fail( - "Sync error occurred: " - + intent.getIntExtra( - EpgSyncJobService.BUNDLE_KEY_ERROR_REASON, 0)); - } - if (syncStatusChangedInputId != null) { - if (syncStatus.equals(EpgSyncJobService.SYNC_STARTED)) { - mSyncStatusLatch.countDown(); - } else if (syncStatus.equals(EpgSyncJobService.SYNC_FINISHED)) { - mSyncStatusLatch.countDown(); - } - } else { - Assert.fail("syncStatusChangedInputId is null."); - } - } - }; - - public EpgSyncWithAdsJobServiceTest() { - super(TestActivity.class); - } - - @Before - public void setUp() throws Exception { - super.setUp(); - injectInstrumentation(InstrumentationRegistry.getInstrumentation()); - getActivity(); - // Delete all channels - getActivity() - .getContentResolver() - .delete( - TvContract.buildChannelsUriForInput(TestTvInputService.INPUT_ID), - null, - null); - - mSampleJobService = new TestJobService(); - mSampleJobService.mContext = getActivity(); - mChannelList = mSampleJobService.getChannels(); - ModelUtils.updateChannels(getActivity(), TestTvInputService.INPUT_ID, mChannelList, null); - mChannelMap = - ModelUtils.buildChannelMap( - getActivity().getContentResolver(), TestTvInputService.INPUT_ID); - assertNotNull(mChannelMap); - assertEquals(2, mChannelMap.size()); - - // Round start time to the current hour - mStartMs = System.currentTimeMillis() - System.currentTimeMillis() % (1000 * 60 * 60); - mEndMs = mStartMs + 1000 * 60 * 60 * 24 * 7 * 2; // Two week long sync period - assertTrue(mStartMs < mEndMs); - - Uri channelUri = TvContract.buildChannelUri(mChannelMap.keyAt(0)); - Channel firstChannel = mChannelList.get(0); - assertEquals("Test Channel", firstChannel.getDisplayName()); - assertNotNull(firstChannel.getInternalProviderData()); - assertTrue(firstChannel.getInternalProviderData().isRepeatable()); - - mProgramList = - mSampleJobService.getProgramsForChannel(channelUri, firstChannel, mStartMs, mEndMs); - } - - @Override - public void tearDown() throws Exception { - super.tearDown(); - LocalBroadcastManager.getInstance(getActivity()) - .unregisterReceiver(mSyncStatusChangedReceiver); - - // Delete these programs - getActivity() - .getContentResolver() - .delete( - TvContract.buildChannelsUriForInput(TestTvInputService.INPUT_ID), - null, - null); - } - - @Test - public void testOriginalChannelsProgramSync() throws EpgSyncException { - // Tests that programs and channels were correctly obtained from the EpgSyncJobService - Uri channelUri = TvContract.buildChannelUri(mChannelMap.keyAt(0)); - Channel firstChannel = mChannelList.get(0); - assertEquals("Test Channel", firstChannel.getDisplayName()); - assertNotNull(firstChannel.getInternalProviderData()); - assertTrue(firstChannel.getInternalProviderData().isRepeatable()); - - mProgramList = - mSampleJobService.getOriginalProgramsForChannel( - channelUri, firstChannel, mStartMs, mEndMs); - assertEquals(1, mProgramList.size()); - - channelUri = TvContract.buildChannelUri(mChannelMap.keyAt(1)); - Channel secondChannel = mChannelList.get(1); - assertEquals("XML Test Channel", secondChannel.getDisplayName()); - assertNotNull(secondChannel.getInternalProviderData()); - assertTrue(secondChannel.getInternalProviderData().isRepeatable()); - - mProgramList = - mSampleJobService.getOriginalProgramsForChannel( - channelUri, secondChannel, mStartMs, mEndMs); - assertEquals(5, mProgramList.size()); - } - - @Test - public void testRepeatProgramDuration() { - // If repeat-programs is on, schedule the programs sequentially in a loop. To make every - // device play the same program in a given channel and time, we assumes the loop started - // from the epoch time. - long totalDurationMs = 0; - for (Program program : mProgramList) { - totalDurationMs += (program.getEndTimeUtcMillis() - program.getStartTimeUtcMillis()); - assertTrue(program.getEndTimeUtcMillis() >= program.getStartTimeUtcMillis()); - } - long programStartTimeMs = mStartMs - mStartMs % totalDurationMs; - assertNotSame(0, totalDurationMs); - assertTrue(programStartTimeMs > 0); - assertTrue(programStartTimeMs <= mStartMs); - } - - @Test - public void testRequestSync() throws InterruptedException { - // Tests that a sync can be requested and complete - LocalBroadcastManager.getInstance(getActivity()) - .registerReceiver( - mSyncStatusChangedReceiver, - new IntentFilter(EpgSyncJobService.ACTION_SYNC_STATUS_CHANGED)); - mSyncStatusLatch = new CountDownLatch(2); - EpgSyncJobService.cancelAllSyncRequests(getActivity()); - EpgSyncJobService.requestImmediateSync( - getActivity(), - TestTvInputService.INPUT_ID, - 1000 * 60 * 60, // 1 hour sync period - new ComponentName(getActivity(), TestJobService.class)); - mSyncStatusLatch.await(); - - // Sync is completed - List channelList = ModelUtils.getChannels(getActivity().getContentResolver()); - Log.d("TvContractUtils", channelList.toString()); - assertEquals(2, channelList.size()); - List programList = - ModelUtils.getPrograms( - getActivity().getContentResolver(), - TvContract.buildChannelUri(channelList.get(0).getId())); - assertEquals(5, programList.size()); - } - - @Test - public void testJobService() { - // Tests whether methods to get channels and programs are successful and valid - List channelList = mSampleJobService.getChannels(); - assertEquals(2, channelList.size()); - ModelUtils.updateChannels(getActivity(), TestTvInputService.INPUT_ID, channelList, null); - LongSparseArray channelMap = - ModelUtils.buildChannelMap( - getActivity().getContentResolver(), TestTvInputService.INPUT_ID); - assertNotNull(channelMap); - assertEquals(channelMap.size(), channelList.size()); - } - - @Test - public void testEpgSyncTask_GetPrograms() throws EpgSyncException { - // For repeating channels, test that the program list will continually repeat for the - // desired length of time - Uri channelUri = TvContract.buildChannelUri(mChannelMap.keyAt(0)); - Channel firstChannel = mChannelList.get(0); - mProgramList = - mSampleJobService.getProgramsForChannel(channelUri, firstChannel, mStartMs, mEndMs); - - assertEquals(336 * 60 / 15, mProgramList.size()); - } -} diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/MockTvPlayer.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/MockTvPlayer.java index c02009cf..db294322 100644 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/MockTvPlayer.java +++ b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/MockTvPlayer.java @@ -19,8 +19,10 @@ import android.media.MediaPlayer; import android.media.PlaybackParams; import android.os.Build; -import android.support.annotation.RequiresApi; import android.view.Surface; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.TvPlayer; import java.io.IOException; import junit.framework.Assert; diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/PeriodicEpgSyncJobServiceTest.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/PeriodicEpgSyncJobServiceTest.java deleted file mode 100644 index b39e71c4..00000000 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/PeriodicEpgSyncJobServiceTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2016 The Android Open Source Project. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.media.tv.companionlibrary.test; - -import android.Manifest; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.media.tv.TvContract; -import android.support.test.InstrumentationRegistry; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v4.content.PermissionChecker; -import android.test.ActivityInstrumentationTestCase2; -import android.util.Log; -import android.util.LongSparseArray; -import com.google.android.media.tv.companionlibrary.model.Channel; -import com.google.android.media.tv.companionlibrary.model.ModelUtils; -import com.google.android.media.tv.companionlibrary.model.Program; -import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import junit.framework.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Tests the periodic syncing functionality of the EpgSyncJobService to ensure the reliability of - * the JobScheduler. - */ -public class PeriodicEpgSyncJobServiceTest extends ActivityInstrumentationTestCase2 { - private final static String TAG = PeriodicEpgSyncJobServiceTest.class.getSimpleName(); - - private final static int NUMBER_OF_SYNCS = 2; - private final static int SYNC_PERIOD = 1000 * 60 * 15; // JobInfo min interval is 15m - private final static int SYNC_DURATION = 1000 * 60 * 60; - - private CountDownLatch mSyncStatusLatch; - private final BroadcastReceiver mSyncStatusChangedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, final Intent intent) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - String syncStatusChangedInputId = intent.getStringExtra( - EpgSyncJobService.BUNDLE_KEY_INPUT_ID); - if (syncStatusChangedInputId != null) { - String syncStatus = intent.getStringExtra(EpgSyncJobService.SYNC_STATUS); - Log.d(TAG, "Sync status changed: " + syncStatus); - if (syncStatus.equals(EpgSyncJobService.SYNC_STARTED)) { - mSyncStatusLatch.countDown(); - } - } else { - Assert.fail("syncStatusChangedInputId is null."); - } - } - }); - } - }; - private String mInputId = - "com.google.android.media.tv.companionlibrary.test/.TestTvInputService"; - private List mProgramList; - private List mChannelList; - private TestJobService mSampleJobService; - private LongSparseArray mChannelMap; - - public PeriodicEpgSyncJobServiceTest() { - super(TestActivity.class); - } - - @Before - public void setUp() throws Exception { - super.setUp(); - injectInstrumentation(InstrumentationRegistry.getInstrumentation()); - getActivity(); - // Delete all channels - getActivity().getContentResolver().delete(TvContract.buildChannelsUriForInput(mInputId), - null, null); - - mSampleJobService = new TestJobService(); - mSampleJobService.mContext = getActivity(); - mChannelList = mSampleJobService.getChannels(); - ModelUtils.updateChannels(getActivity(), mInputId, mChannelList, null); - mChannelMap = ModelUtils.buildChannelMap(getActivity().getContentResolver(), mInputId); - assertEquals(2, mChannelMap.size()); - } - - @Override - public void tearDown() throws Exception { - super.tearDown(); - LocalBroadcastManager.getInstance(getActivity()) - .unregisterReceiver(mSyncStatusChangedReceiver); - - // Delete these programs - getActivity().getContentResolver().delete(TvContract.buildChannelsUriForInput(mInputId), - null, null); - } - - @Test - public void testPeriodicSync() throws InterruptedException { - // Do many syncs in a small period of time and make sure they all start - // Tests that a sync can be requested - LocalBroadcastManager.getInstance(getActivity()).registerReceiver( - mSyncStatusChangedReceiver, - new IntentFilter(EpgSyncJobService.ACTION_SYNC_STATUS_CHANGED)); - // The CountDownLatch decrements every time sync starts - mSyncStatusLatch = new CountDownLatch(NUMBER_OF_SYNCS); - EpgSyncJobService.cancelAllSyncRequests(getActivity()); - - // Make sure that we can set up a sync that can persist after boot - assertEquals(getActivity().checkSelfPermission(Manifest.permission.RECEIVE_BOOT_COMPLETED), - PermissionChecker.PERMISSION_GRANTED); - EpgSyncJobService.setUpPeriodicSync(getActivity(), mInputId, - new ComponentName(getActivity(), TestJobService.class), - SYNC_PERIOD, SYNC_DURATION); // 15m is the lowest period - // Wait for every sync to start, with some leeway. - long timeoutSeconds = SYNC_PERIOD * (NUMBER_OF_SYNCS + 1); - boolean syncStatusLatchComplete = mSyncStatusLatch.await(timeoutSeconds, - TimeUnit.MILLISECONDS); - if (!syncStatusLatchComplete) { - Assert.fail("Syncing did not complete. The remaining count is " + - mSyncStatusLatch.getCount() + " after " + timeoutSeconds + " seconds."); - } - } -} diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestActivity.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestActivity.java index fd5af6aa..1a9f3fb0 100644 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestActivity.java +++ b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestActivity.java @@ -16,7 +16,8 @@ package com.google.android.media.tv.companionlibrary.test; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; + +import androidx.fragment.app.FragmentActivity; /** * Dummy activity that acts as the setup activity for {@link TestTvInputService} diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestJobService.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestJobService.java index 58940ca4..835c1b20 100644 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestJobService.java +++ b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestJobService.java @@ -17,7 +17,9 @@ import android.content.Context; import android.net.Uri; -import android.support.annotation.VisibleForTesting; + +import androidx.annotation.VisibleForTesting; + import com.google.android.media.tv.companionlibrary.ads.EpgSyncWithAdsJobService; import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.InternalProviderData; diff --git a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestTvInputService.java b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestTvInputService.java index f97303ce..650eeef7 100644 --- a/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestTvInputService.java +++ b/library/src/androidTest/java/com/google/android/media/tv/companionlibrary/test/TestTvInputService.java @@ -21,9 +21,11 @@ import android.media.tv.TvInputService; import android.net.Uri; import android.os.Build; -import android.support.annotation.Nullable; -import android.support.annotation.RequiresApi; import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.BaseTvInputService; import com.google.android.media.tv.companionlibrary.TvPlayer; import com.google.android.media.tv.companionlibrary.model.Channel; diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 78856f72..f7a1d167 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -14,6 +14,20 @@ * limitations under the License. --> - + xmlns:tools="http://schemas.android.com/tools" + tools:ignore="MissingLeanbackLauncher"> + + + + + + + + diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/AdController.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/AdController.java index c896655b..d2870d2e 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/AdController.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/AdController.java @@ -17,18 +17,22 @@ package com.google.android.media.tv.companionlibrary; import android.content.Context; -import android.support.annotation.NonNull; import android.util.Log; import android.view.ViewGroup; import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + import com.google.ads.interactivemedia.v3.api.AdDisplayContainer; import com.google.ads.interactivemedia.v3.api.AdErrorEvent; import com.google.ads.interactivemedia.v3.api.AdEvent; +import com.google.ads.interactivemedia.v3.api.AdPodInfo; import com.google.ads.interactivemedia.v3.api.AdsLoader; import com.google.ads.interactivemedia.v3.api.AdsManager; import com.google.ads.interactivemedia.v3.api.AdsManagerLoadedEvent; import com.google.ads.interactivemedia.v3.api.AdsRequest; import com.google.ads.interactivemedia.v3.api.ImaSdkFactory; +import com.google.ads.interactivemedia.v3.api.player.AdMediaInfo; import com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer; import com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate; import java.util.ArrayList; @@ -97,7 +101,9 @@ public interface AdControllerCallback { public AdController(Context context) { // Create an AdsLoader. mSdkFactory = ImaSdkFactory.getInstance(); - mAdsLoader = mSdkFactory.createAdsLoader(context); + mAdDisplayContainer = mSdkFactory.createAdDisplayContainer(); + mAdsLoader = mSdkFactory.createAdsLoader(context, mSdkFactory.createImaSdkSettings(), + mAdDisplayContainer); mAdsLoader.addAdErrorListener(this); mAdsLoader.addAdsLoadedListener(this); @@ -113,14 +119,12 @@ public void requestAds( @NonNull String adRequestUrl, @NonNull AdControllerCallback adControllerCallback) { mAdControllerCallback = adControllerCallback; - mAdDisplayContainer = mSdkFactory.createAdDisplayContainer(); mAdDisplayContainer.setPlayer(new VideoAdPlayerImpl()); mAdDisplayContainer.setAdContainer(mStubViewGroup); // Create the ads request. AdsRequest request = mSdkFactory.createAdsRequest(); request.setAdTagUrl(adRequestUrl); - request.setAdDisplayContainer(mAdDisplayContainer); // Request the ad. After the ad is loaded, onAdsManagerLoaded() will be called. mAdsLoader.requestAds(request); @@ -185,7 +189,7 @@ public void onAdEvent(AdEvent adEvent) { } private class VideoAdPlayerImpl extends TvPlayer.Callback implements VideoAdPlayer { - String mAdVideoUrl; + AdMediaInfo mAdMediaInfo; TvPlayer mTvPlayer; List mAdCallbacks; @@ -194,40 +198,45 @@ private class VideoAdPlayerImpl extends TvPlayer.Callback implements VideoAdPlay } @Override - public void loadAd(String adVideoUrl) { - mAdVideoUrl = adVideoUrl; + public void addCallback(VideoAdPlayer.VideoAdPlayerCallback videoAdPlayerCallback) { + mAdCallbacks.add(videoAdPlayerCallback); } @Override - public void playAd() { - mTvPlayer = mAdControllerCallback.onAdReadyToPlay(mAdVideoUrl); - mTvPlayer.registerCallback(this); - mTvPlayer.play(); + public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) { + mAdMediaInfo = adMediaInfo; } @Override - public void stopAd() { - // Do nothing. + public void pauseAd(AdMediaInfo adMediaInfo) { + if (mTvPlayer != null) { + mTvPlayer.pause(); + } } @Override - public void pauseAd() { - // Do nothing. + public void playAd(AdMediaInfo adMediaInfo) { + mTvPlayer = mAdControllerCallback.onAdReadyToPlay(mAdMediaInfo.getUrl()); + mTvPlayer.registerCallback(this); + mTvPlayer.play(); } @Override - public void resumeAd() { - // Do nothing. + public void release() { + if (mTvPlayer != null) { + mTvPlayer.unregisterCallback(this); + mTvPlayer = null; + } } @Override - public void addCallback(VideoAdPlayer.VideoAdPlayerCallback videoAdPlayerCallback) { - mAdCallbacks.add(videoAdPlayerCallback); + public void removeCallback(VideoAdPlayer.VideoAdPlayerCallback videoAdPlayerCallback) { + mAdCallbacks.remove(videoAdPlayerCallback); } @Override - public void removeCallback(VideoAdPlayer.VideoAdPlayerCallback videoAdPlayerCallback) { - mAdCallbacks.remove(videoAdPlayerCallback); + public void stopAd(AdMediaInfo adMediaInfo) { + // Do nothing. } @Override @@ -241,36 +250,41 @@ public VideoProgressUpdate getAdProgress() { @Override public void onStarted() { for (VideoAdPlayerCallback callback : mAdCallbacks) { - callback.onPlay(); + callback.onPlay(mAdMediaInfo); } } @Override public void onCompleted() { for (VideoAdPlayerCallback callback : mAdCallbacks) { - callback.onEnded(); + callback.onEnded(mAdMediaInfo); } } @Override public void onError(Exception error) { for (VideoAdPlayerCallback callback : mAdCallbacks) { - callback.onError(); + callback.onError(mAdMediaInfo); } } @Override public void onPaused() { for (VideoAdPlayerCallback callback : mAdCallbacks) { - callback.onPause(); + callback.onPause(mAdMediaInfo); } } @Override public void onResumed() { for (VideoAdPlayerCallback callback : mAdCallbacks) { - callback.onResume(); + callback.onResume(mAdMediaInfo); } } + + @Override + public int getVolume() { + return 0; + } } } diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/BaseTvInputService.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/BaseTvInputService.java index ee6834ab..dd9bb020 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/BaseTvInputService.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/BaseTvInputService.java @@ -36,10 +36,12 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; -import android.support.annotation.RequiresApi; import android.util.Log; import android.util.LongSparseArray; import android.view.Surface; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.model.Advertisement; import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.ModelUtils; @@ -113,7 +115,8 @@ public void onChange(boolean selfChange) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(TvInputManager.ACTION_BLOCKED_RATINGS_CHANGED); intentFilter.addAction(TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED); - registerReceiver(mParentalControlsBroadcastReceiver, intentFilter); + registerReceiver(mParentalControlsBroadcastReceiver, intentFilter, + Context.RECEIVER_EXPORTED); } private void updateChannelMap() { @@ -665,7 +668,11 @@ private void playCurrentChannel() { && System.currentTimeMillis() - mostRecentOnTuneAdWatchedTime > mMinimumOnTuneAdInterval) { // There is at most one advertisement in the channel. - playAd = mHandler.obtainMessage(MSG_PLAY_AD, ads.get(0)); + // TODO: temporarily disable ads insertion on Android 14 for now. + // https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + playAd = mHandler.obtainMessage(MSG_PLAY_AD, ads.get(0)); + } } } onPlayChannel(mCurrentChannel); diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/ads/EpgSyncWithAdsJobService.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/ads/EpgSyncWithAdsJobService.java index 2414fa1e..8fb4f223 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/ads/EpgSyncWithAdsJobService.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/ads/EpgSyncWithAdsJobService.java @@ -17,7 +17,9 @@ package com.google.android.media.tv.companionlibrary.ads; import android.net.Uri; -import android.support.annotation.VisibleForTesting; + +import androidx.annotation.VisibleForTesting; + import com.google.android.media.tv.companionlibrary.model.Advertisement; import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.InternalProviderData; diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Advertisement.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Advertisement.java index aa16d390..c50cd8ef 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Advertisement.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Advertisement.java @@ -16,7 +16,7 @@ package com.google.android.media.tv.companionlibrary.model; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; /** A class to store advertisement information. */ public class Advertisement implements Comparable { diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/InternalProviderData.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/InternalProviderData.java index 76958bda..5a8170fa 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/InternalProviderData.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/InternalProviderData.java @@ -16,7 +16,8 @@ package com.google.android.media.tv.companionlibrary.model; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; + import com.google.android.media.tv.companionlibrary.utils.TvContractUtils; import java.util.ArrayList; import java.util.Iterator; diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/ModelUtils.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/ModelUtils.java index f42e73d2..dc2466ee 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/ModelUtils.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/ModelUtils.java @@ -24,10 +24,12 @@ import android.media.tv.TvContract.Channels; import android.net.Uri; import android.os.AsyncTask; -import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.Log; import android.util.LongSparseArray; + +import androidx.annotation.NonNull; + import com.google.android.media.tv.companionlibrary.utils.TvContractUtils.InsertLogosTask; import java.util.ArrayList; import java.util.Arrays; diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Program.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Program.java index cae75ce2..51aeeb9d 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Program.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/Program.java @@ -21,8 +21,10 @@ import android.media.tv.TvContentRating; import android.media.tv.TvContract; import android.os.Build; -import android.support.annotation.NonNull; import android.text.TextUtils; + +import androidx.annotation.NonNull; + import com.google.android.media.tv.companionlibrary.utils.CollectionUtils; import com.google.android.media.tv.companionlibrary.utils.TvContractUtils; import java.util.Arrays; @@ -403,14 +405,14 @@ public ContentValues toContentValues() { if (mBroadcastGenres != null && mBroadcastGenres.length > 0) { values.put( TvContract.Programs.COLUMN_BROADCAST_GENRE, - TvContract.Programs.Genres.encode(mBroadcastGenres)); + TvContract.Programs.Genres.encode(mBroadcastGenres[0])); } else { values.putNull(TvContract.Programs.COLUMN_BROADCAST_GENRE); } if (mCanonicalGenres != null && mCanonicalGenres.length > 0) { values.put( TvContract.Programs.COLUMN_CANONICAL_GENRE, - TvContract.Programs.Genres.encode(mCanonicalGenres)); + TvContract.Programs.Genres.encode(mCanonicalGenres[0])); } else { values.putNull(TvContract.Programs.COLUMN_CANONICAL_GENRE); } diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/RecordedProgram.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/RecordedProgram.java index 3d57cf11..16d4fb6d 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/model/RecordedProgram.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/model/RecordedProgram.java @@ -435,14 +435,14 @@ public ContentValues toContentValues() { if (mBroadcastGenres != null && mBroadcastGenres.length > 0) { values.put( TvContract.RecordedPrograms.COLUMN_BROADCAST_GENRE, - TvContract.Programs.Genres.encode(mBroadcastGenres)); + TvContract.Programs.Genres.encode(mBroadcastGenres[0])); } else { values.putNull(TvContract.RecordedPrograms.COLUMN_BROADCAST_GENRE); } if (mCanonicalGenres != null && mCanonicalGenres.length > 0) { values.put( TvContract.RecordedPrograms.COLUMN_CANONICAL_GENRE, - TvContract.Programs.Genres.encode(mCanonicalGenres)); + TvContract.Programs.Genres.encode(mCanonicalGenres[0])); } else { values.putNull(TvContract.RecordedPrograms.COLUMN_CANONICAL_GENRE); } diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupFragment.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupFragment.java index c4a167af..751c8cf9 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupFragment.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupFragment.java @@ -24,8 +24,6 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.ColorInt; -import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; @@ -36,6 +34,10 @@ import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService; import com.google.android.media.tv.companionlibrary.sync.SyncStatusBroadcastReceiver; diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragment.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragment.java index ebb3d0bf..3648e07e 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragment.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragment.java @@ -22,14 +22,16 @@ import android.content.SharedPreferences; import android.media.tv.TvInputInfo; import android.os.Bundle; -import android.support.v17.leanback.app.GuidedStepFragment; -import android.support.v17.leanback.widget.GuidanceStylist.Guidance; -import android.support.v17.leanback.widget.GuidedAction; -import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.util.Pair; import android.widget.ProgressBar; import android.widget.Toast; + +import androidx.leanback.app.GuidedStepFragment; +import androidx.leanback.widget.GuidanceStylist; +import androidx.leanback.widget.GuidedAction; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService; import com.google.android.media.tv.companionlibrary.sync.SyncStatusBroadcastReceiver; import com.google.android.media.tv.companionlibrary.sync.SyncStatusBroadcastReceiver.SyncListener; @@ -68,10 +70,10 @@ public ChannelSetupStylist onCreateGuidanceStylist() { } @Override - public Guidance onCreateGuidance(Bundle savedInstanceState) { + public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { String title = getString(R.string.tif_channel_setup_title); String description = getString(R.string.tif_channel_setup_description); - return new Guidance(title, description, null, null); + return new GuidanceStylist.Guidance(title, description, null, null); } @Override diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepSupportFragment.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepSupportFragment.java index f94efd87..256b5162 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepSupportFragment.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepSupportFragment.java @@ -22,14 +22,16 @@ import android.content.SharedPreferences; import android.media.tv.TvInputInfo; import android.os.Bundle; -import android.support.v17.leanback.app.GuidedStepSupportFragment; -import android.support.v17.leanback.widget.GuidanceStylist.Guidance; -import android.support.v17.leanback.widget.GuidedAction; -import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.util.Pair; import android.widget.ProgressBar; import android.widget.Toast; + +import androidx.leanback.app.GuidedStepSupportFragment; +import androidx.leanback.widget.GuidanceStylist; +import androidx.leanback.widget.GuidedAction; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService; import com.google.android.media.tv.companionlibrary.sync.SyncStatusBroadcastReceiver; import com.google.android.media.tv.companionlibrary.sync.SyncStatusBroadcastReceiver.SyncListener; @@ -68,10 +70,10 @@ public ChannelSetupStylist onCreateGuidanceStylist() { } @Override - public Guidance onCreateGuidance(Bundle savedInstanceState) { + public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { String title = getString(R.string.tif_channel_setup_title); String description = getString(R.string.tif_channel_setup_description); - return new Guidance(title, description, null, null); + return new GuidanceStylist.Guidance(title, description, null, null); } @Override diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStylist.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStylist.java index 5a9286e9..5c320d45 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStylist.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStylist.java @@ -15,7 +15,6 @@ */ package com.google.android.media.tv.companionlibrary.setup; -import android.support.v17.leanback.widget.GuidanceStylist; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -23,6 +22,8 @@ import android.widget.ProgressBar; // Gradle puts all resources in the base package, so companionlibrary.R must be imported. +import androidx.leanback.widget.GuidanceStylist; + import com.google.android.media.tv.companionlibrary.R; /** diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/sync/EpgSyncJobService.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/sync/EpgSyncJobService.java index a5d62278..0f5c85e9 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/sync/EpgSyncJobService.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/sync/EpgSyncJobService.java @@ -34,21 +34,25 @@ import android.os.Build; import android.os.PersistableBundle; import android.os.RemoteException; -import android.support.annotation.VisibleForTesting; -import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.util.LongSparseArray; import android.util.SparseArray; + +import androidx.annotation.VisibleForTesting; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.ModelUtils; import com.google.android.media.tv.companionlibrary.model.ModelUtils.OnChannelDeletedCallback; import com.google.android.media.tv.companionlibrary.model.Program; import com.google.android.media.tv.companionlibrary.utils.Constants; + +import org.junit.Assert; + import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import junit.framework.Assert; /** * Service to handle callbacks from JobScheduler. This service will be called by the system to diff --git a/library/src/main/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParser.java b/library/src/main/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParser.java index ed026d65..eefc185f 100644 --- a/library/src/main/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParser.java +++ b/library/src/main/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParser.java @@ -18,10 +18,12 @@ import android.graphics.Color; import android.media.tv.TvContentRating; -import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.Log; import android.util.Xml; + +import androidx.annotation.NonNull; + import com.google.android.media.tv.companionlibrary.model.Advertisement; import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.InternalProviderData; diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/AdvertisementTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/AdvertisementTest.java index 9d39a1e0..4e4c49e3 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/AdvertisementTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/AdvertisementTest.java @@ -33,8 +33,7 @@ * {@link Advertisement} instance and parsed by {@link InternalProviderData}. */ @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21, - manifest = "src/main/AndroidManifest.xml") +@Config(sdk = 34, manifest = "src/main/AndroidManifest.xml") public class AdvertisementTest { private static final long START_TIME_MS = 0; private static final long STOP_TIME_MS = 1; diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ChannelTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ChannelTest.java index 4db1735f..efaa3e16 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ChannelTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ChannelTest.java @@ -23,7 +23,9 @@ import android.database.MatrixCursor; import android.media.tv.TvContract; import android.os.Build; -import android.support.annotation.RequiresApi; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.BuildConfig; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,8 +38,7 @@ * values from them */ @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 23, - manifest = "src/main/AndroidManifest.xml") +@Config(sdk = 34, manifest = "src/main/AndroidManifest.xml") @RequiresApi(api = Build.VERSION_CODES.M) public class ChannelTest { private static final String KEY_SPLASHSCREEN = "splashscreen"; diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/InternalProviderDataTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/InternalProviderDataTest.java index 1993c578..61e95444 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/InternalProviderDataTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/InternalProviderDataTest.java @@ -37,8 +37,7 @@ */ @RunWith(RobolectricTestRunner.class) @Config( - constants = BuildConfig.class, - sdk = 23, + sdk = 34, manifest = "src/main/AndroidManifest.xml" ) diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ProgramTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ProgramTest.java index 51b95811..2e31c868 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ProgramTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/ProgramTest.java @@ -24,7 +24,9 @@ import android.media.tv.TvContentRating; import android.media.tv.TvContract; import android.os.Build; -import android.support.annotation.RequiresApi; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.BuildConfig; import com.google.android.media.tv.companionlibrary.utils.TvContractUtils; import java.util.Arrays; @@ -39,8 +41,7 @@ * values from them */ @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 23, - manifest = "src/main/AndroidManifest.xml") +@Config(sdk = 34, manifest = "src/main/AndroidManifest.xml") public class ProgramTest { @Test public void testEmptyProgram() { diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/RecordedProgramTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/RecordedProgramTest.java index 0d735c57..b631099c 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/model/RecordedProgramTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/model/RecordedProgramTest.java @@ -24,7 +24,9 @@ import android.media.tv.TvContentRating; import android.media.tv.TvContract; import android.os.Build; -import android.support.annotation.RequiresApi; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.BuildConfig; import java.util.Arrays; import org.junit.Test; @@ -33,8 +35,7 @@ import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 23, - manifest = "src/main/AndroidManifest.xml") +@Config(sdk = 34, manifest = "src/main/AndroidManifest.xml") public class RecordedProgramTest { private static final String TEST_INPUT_ID = "com.example.android.sampletvinput/.Test"; diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragmentTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragmentTest.java index f4cedeef..84967e6e 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragmentTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/setup/ChannelSetupStepFragmentTest.java @@ -19,9 +19,11 @@ import android.app.Activity; import android.net.Uri; -import android.support.v17.leanback.widget.GuidedAction; import android.util.Pair; import android.widget.ProgressBar; + +import androidx.leanback.widget.GuidedAction; + import com.google.android.media.tv.companionlibrary.BuildConfig; import com.google.android.media.tv.companionlibrary.model.Channel; import com.google.android.media.tv.companionlibrary.model.Program; @@ -45,8 +47,7 @@ */ @RunWith(RobolectricTestRunner.class) @Config( - constants = BuildConfig.class, - sdk = 23, + sdk = 34, manifest = "../../../../../src/test/java/com/google/android/media/tv/companionlibrary/setup/AndroidManifest.xml" ) public class ChannelSetupStepFragmentTest { diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/sync/SyncStatusBroadcastReceiverTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/sync/SyncStatusBroadcastReceiverTest.java index f302e4f9..e6e40cd6 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/sync/SyncStatusBroadcastReceiverTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/sync/SyncStatusBroadcastReceiverTest.java @@ -31,8 +31,7 @@ */ @RunWith(RobolectricTestRunner.class) @Config( - constants = BuildConfig.class, - sdk = 23, + sdk = 34, manifest = "src/main/AndroidManifest.xml" ) diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvAdvertisementTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvAdvertisementTest.java index dc50ee93..893d4be0 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvAdvertisementTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvAdvertisementTest.java @@ -34,7 +34,7 @@ import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21, manifest = "src/main/AndroidManifest.xml") +@Config(sdk = 34, manifest = "src/main/AndroidManifest.xml") public class XmlTvAdvertisementTest { @Test public void testAdvertisementParsing() throws XmlTvParser.XmlTvParseException, ParseException { diff --git a/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParserTest.java b/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParserTest.java index 5800a93b..f23e7ecb 100644 --- a/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParserTest.java +++ b/library/src/test/java/com/google/android/media/tv/companionlibrary/xmltv/XmlTvParserTest.java @@ -18,7 +18,9 @@ import android.media.tv.TvContract; import android.os.Build; -import android.support.annotation.RequiresApi; + +import androidx.annotation.RequiresApi; + import com.google.android.media.tv.companionlibrary.BuildConfig; import com.google.android.media.tv.companionlibrary.model.InternalProviderData; import com.google.android.media.tv.companionlibrary.utils.TvContractUtils; @@ -33,8 +35,7 @@ /** Tests for {@link XmlTvParser}. */ @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 23, - manifest = "src/main/AndroidManifest.xml") +@Config(sdk = 34, manifest = "src/main/AndroidManifest.xml") @RequiresApi(api = Build.VERSION_CODES.M) public class XmlTvParserTest extends TestCase { @Test