Skip to content

Commit 15ac8df

Browse files
authored
Merge pull request #225 from pflammertsma/leanback-media3-update
Modernize legacy Leanback sample: Upgrade Gradle/SDK and migrate to Media3
2 parents 4bc473b + 909f873 commit 15ac8df

28 files changed

Lines changed: 304 additions & 287 deletions

Leanback/README.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,27 @@ Need more information about getting started with Android TV? Check the [official
7878

7979
## Screenshots
8080

81-
[![Screenshot](screenshots/atv-leanback-all.png)](https://raw.githubusercontent.com/googlesamples/androidtv-Leanback/master/screenshots/atv-leanback-all.png)
81+
| Browse Fragment | Row Fragment | Details Fragment |
82+
|:---:|:---:|:---:|
83+
| ![Browse Fragment](screenshots/browse.png) | ![Row Fragment](screenshots/row.png) | ![Details Fragment](screenshots/details.png) |
84+
85+
| Row Fragment in Details | Vertical Grid Fragment | Card Views |
86+
|:---:|:---:|:---:|
87+
| ![Row Fragment in Details](screenshots/details_row.png) | ![Vertical Grid Fragment](screenshots/vertical_grid.png) | ![Card Views](screenshots/row.png) |
88+
89+
| Search Fragment | Guided Step Fragment | Error Fragment |
90+
|:---:|:---:|:---:|
91+
| ![Search Fragment](screenshots/search.png) | ![Guided Step Fragment](screenshots/guided_step.png) | ![Error Fragment](screenshots/error.png) |
92+
93+
| Onboarding Fragment | Settings Fragment | |
94+
|:---:|:---:|:---:|
95+
| ![Onboarding Fragment](screenshots/onboarding.png) | ![Settings Fragment](screenshots/settings.png) | |
96+
97+
### Generating Screenshots
98+
To automatically navigate through the sample application and regenerate all 10 screenshot assets from a connected Android TV emulator or device, execute the included script:
99+
```sh
100+
./screenshots/capture_screenshots.sh [-s <serial>]
101+
```
82102

83103
## Support
84104

Leanback/app/build.gradle

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,53 @@
1-
apply plugin: 'com.android.application'
1+
plugins {
2+
alias(libs.plugins.android.application)
3+
}
24

35
android {
4-
compileSdkVersion 28
6+
namespace = "com.example.android.tvleanback"
7+
compileSdk = 35
8+
9+
buildFeatures {
10+
buildConfig = true
11+
}
12+
513
defaultConfig {
614
applicationId "com.example.android.tvleanback"
7-
minSdkVersion 21
8-
targetSdkVersion 28
15+
minSdk = 23
16+
targetSdk = 35
917
versionCode 2
1018
versionName "1.3"
1119
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1220
}
21+
1322
buildTypes {
1423
release {
1524
minifyEnabled false
1625
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
1726
}
1827
}
28+
1929
compileOptions {
20-
sourceCompatibility JavaVersion.VERSION_1_8
21-
targetCompatibility JavaVersion.VERSION_1_8
30+
sourceCompatibility = JavaVersion.VERSION_1_8
31+
targetCompatibility = JavaVersion.VERSION_1_8
2232
}
2333
}
2434

2535
dependencies {
2636
implementation fileTree(include: ['*.jar'], dir: 'libs')
27-
implementation 'androidx.recyclerview:recyclerview:1.0.0'
28-
implementation 'androidx.leanback:leanback:1.0.0'
29-
implementation 'androidx.recommendation:recommendation:1.0.0'
30-
implementation 'androidx.leanback:leanback-preference:1.0.0'
31-
implementation 'androidx.annotation:annotation:1.0.1'
37+
implementation libs.androidx.recyclerview
38+
implementation libs.androidx.leanback
39+
implementation libs.androidx.leanback.preference
40+
implementation libs.androidx.annotation
3241

33-
implementation 'com.github.bumptech.glide:glide:4.3.1'
42+
implementation libs.glide
3443

35-
implementation 'com.google.android.exoplayer:exoplayer:2.6.1'
36-
implementation 'com.google.android.exoplayer:extension-leanback:2.6.1'
44+
implementation libs.androidx.media3.exoplayer
45+
implementation libs.androidx.media3.ui.leanback
3746

38-
testImplementation 'junit:junit:4.12'
47+
testImplementation libs.junit
3948
testImplementation 'org.robolectric:robolectric:3.8'
40-
androidTestImplementation "androidx.test.ext:junit:1.1.0"
41-
androidTestImplementation "androidx.test.ext:truth:1.1.0"
49+
androidTestImplementation libs.androidx.junit
50+
androidTestImplementation 'androidx.test.ext:truth:1.1.0'
4251
androidTestImplementation 'androidx.test:runner:1.1.1'
4352
androidTestImplementation 'androidx.test:rules:1.1.1'
4453
}

Leanback/app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,14 @@
1414
limitations under the License.
1515
-->
1616
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
17-
xmlns:tools="http://schemas.android.com/tools"
18-
package="com.example.android.tvleanback">
17+
xmlns:tools="http://schemas.android.com/tools">
1918

2019
<permission
2120
android:name="${applicationId}.ACCESS_VIDEO_DATA"
2221
android:protectionLevel="signature" />
2322

2423
<uses-permission android:name="${applicationId}.ACCESS_VIDEO_DATA" />
2524
<uses-permission android:name="android.permission.INTERNET" />
26-
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2725
<uses-permission android:name="android.permission.RECORD_AUDIO" />
2826

2927
<uses-feature
@@ -46,6 +44,7 @@
4644
tools:ignore="GoogleAppIndexingWarning">
4745
<activity
4846
android:name=".ui.MainActivity"
47+
android:exported="true"
4948
android:icon="@drawable/videos_by_google_banner"
5049
android:label="@string/app_name"
5150
android:logo="@drawable/videos_by_google_banner"
@@ -58,7 +57,9 @@
5857
</intent-filter>
5958
</activity>
6059

61-
<activity android:name=".mobile.MobileWelcomeActivity">
60+
<activity
61+
android:name=".mobile.MobileWelcomeActivity"
62+
android:exported="true">
6263
<intent-filter>
6364
<action android:name="android.intent.action.MAIN" />
6465

@@ -110,21 +111,9 @@
110111
android:readPermission="android.permission.GLOBAL_SEARCH" />
111112
</provider>
112113

113-
<receiver
114-
android:name=".recommendation.RecommendationReceiver"
115-
android:enabled="true"
116-
android:exported="false">
117-
<intent-filter>
118-
<action android:name="android.intent.action.BOOT_COMPLETED" />
119-
</intent-filter>
120-
</receiver>
121-
122114
<service
123115
android:name=".data.FetchVideoService"
124116
android:exported="false" />
125-
<service
126-
android:name=".recommendation.UpdateRecommendationsService"
127-
android:enabled="true" />
128117

129118
<activity android:name=".ui.OnboardingActivity"
130119
android:enabled="true"

Leanback/app/src/main/java/com/example/android/tvleanback/data/VideoProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ static UriMatcher buildUriMatcher() {
101101
}
102102

103103
private Cursor getSuggestions(String query) {
104-
query = query.toLowerCase();
104+
query = query.toLowerCase(java.util.Locale.ROOT);
105105
return sVideosContainingQueryBuilder.query(
106106
mOpenHelper.getReadableDatabase(),
107107
sVideosContainingQueryColumns,

Leanback/app/src/main/java/com/example/android/tvleanback/model/Video.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ public boolean equals(Object m) {
8080
return m instanceof Video && id == ((Video) m).id;
8181
}
8282

83+
@Override
84+
public int hashCode() {
85+
return Long.hashCode(id);
86+
}
87+
8388
public int describeContents() {
8489
return 0;
8590
}

Leanback/app/src/main/java/com/example/android/tvleanback/player/VideoPlayerGlue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import androidx.leanback.widget.ArrayObjectAdapter;
2323
import androidx.leanback.widget.PlaybackControlsRow;
2424

25-
import com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter;
25+
import androidx.media3.ui.leanback.LeanbackPlayerAdapter;
2626

2727
import java.util.concurrent.TimeUnit;
2828

Leanback/app/src/main/java/com/example/android/tvleanback/presenter/IconHeaderItemPresenter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
4141
LayoutInflater inflater = (LayoutInflater) viewGroup.getContext()
4242
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
4343

44-
View view = inflater.inflate(R.layout.icon_header_item, null);
44+
View view = inflater.inflate(R.layout.icon_header_item, viewGroup, false);
4545
view.setAlpha(mUnselectedAlpha); // Initialize icons to be at half-opacity.
4646

4747
return new ViewHolder(view);

Leanback/app/src/main/java/com/example/android/tvleanback/recommendation/RecommendationReceiver.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

Leanback/app/src/main/java/com/example/android/tvleanback/recommendation/UpdateRecommendationsService.java

Lines changed: 0 additions & 133 deletions
This file was deleted.

0 commit comments

Comments
 (0)