diff --git a/Leanback/README.md b/Leanback/README.md index 60beea6c8..bb2103633 100644 --- a/Leanback/README.md +++ b/Leanback/README.md @@ -78,7 +78,27 @@ Need more information about getting started with Android TV? Check the [official ## Screenshots -[![Screenshot](screenshots/atv-leanback-all.png)](https://raw.githubusercontent.com/googlesamples/androidtv-Leanback/master/screenshots/atv-leanback-all.png) +| Browse Fragment | Row Fragment | Details Fragment | +|:---:|:---:|:---:| +| ![Browse Fragment](screenshots/browse.png) | ![Row Fragment](screenshots/row.png) | ![Details Fragment](screenshots/details.png) | + +| Row Fragment in Details | Vertical Grid Fragment | Card Views | +|:---:|:---:|:---:| +| ![Row Fragment in Details](screenshots/details_row.png) | ![Vertical Grid Fragment](screenshots/vertical_grid.png) | ![Card Views](screenshots/row.png) | + +| Search Fragment | Guided Step Fragment | Error Fragment | +|:---:|:---:|:---:| +| ![Search Fragment](screenshots/search.png) | ![Guided Step Fragment](screenshots/guided_step.png) | ![Error Fragment](screenshots/error.png) | + +| Onboarding Fragment | Settings Fragment | | +|:---:|:---:|:---:| +| ![Onboarding Fragment](screenshots/onboarding.png) | ![Settings Fragment](screenshots/settings.png) | | + +### Generating Screenshots +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: +```sh +./screenshots/capture_screenshots.sh [-s ] +``` ## Support diff --git a/Leanback/app/build.gradle b/Leanback/app/build.gradle index 0a6c1cb0b..b669de689 100644 --- a/Leanback/app/build.gradle +++ b/Leanback/app/build.gradle @@ -1,44 +1,53 @@ -apply plugin: 'com.android.application' +plugins { + alias(libs.plugins.android.application) +} android { - compileSdkVersion 28 + namespace = "com.example.android.tvleanback" + compileSdk = 35 + + buildFeatures { + buildConfig = true + } + defaultConfig { applicationId "com.example.android.tvleanback" - minSdkVersion 21 - targetSdkVersion 28 + minSdk = 23 + targetSdk = 35 versionCode 2 versionName "1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'androidx.recyclerview:recyclerview:1.0.0' - implementation 'androidx.leanback:leanback:1.0.0' - implementation 'androidx.recommendation:recommendation:1.0.0' - implementation 'androidx.leanback:leanback-preference:1.0.0' - implementation 'androidx.annotation:annotation:1.0.1' + implementation libs.androidx.recyclerview + implementation libs.androidx.leanback + implementation libs.androidx.leanback.preference + implementation libs.androidx.annotation - implementation 'com.github.bumptech.glide:glide:4.3.1' + implementation libs.glide - implementation 'com.google.android.exoplayer:exoplayer:2.6.1' - implementation 'com.google.android.exoplayer:extension-leanback:2.6.1' + implementation libs.androidx.media3.exoplayer + implementation libs.androidx.media3.ui.leanback - testImplementation 'junit:junit:4.12' + testImplementation libs.junit testImplementation 'org.robolectric:robolectric:3.8' - androidTestImplementation "androidx.test.ext:junit:1.1.0" - androidTestImplementation "androidx.test.ext:truth:1.1.0" + androidTestImplementation libs.androidx.junit + androidTestImplementation 'androidx.test.ext:truth:1.1.0' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test:rules:1.1.1' } diff --git a/Leanback/app/src/main/AndroidManifest.xml b/Leanback/app/src/main/AndroidManifest.xml index 1775138b5..6026f189f 100644 --- a/Leanback/app/src/main/AndroidManifest.xml +++ b/Leanback/app/src/main/AndroidManifest.xml @@ -14,8 +14,7 @@ limitations under the License. --> + xmlns:tools="http://schemas.android.com/tools"> - - + @@ -110,21 +111,9 @@ android:readPermission="android.permission.GLOBAL_SEARCH" /> - - - - - - - onCreateLoader(int id, Bundle args) { diff --git a/Leanback/app/src/main/java/com/example/android/tvleanback/ui/PlaybackFragment.java b/Leanback/app/src/main/java/com/example/android/tvleanback/ui/PlaybackFragment.java index 5803b8012..5663db67f 100644 --- a/Leanback/app/src/main/java/com/example/android/tvleanback/ui/PlaybackFragment.java +++ b/Leanback/app/src/main/java/com/example/android/tvleanback/ui/PlaybackFragment.java @@ -50,20 +50,10 @@ import com.example.android.tvleanback.model.VideoCursorMapper; import com.example.android.tvleanback.player.VideoPlayerGlue; import com.example.android.tvleanback.presenter.CardPresenter; -import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; -import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelector; -import com.google.android.exoplayer2.upstream.BandwidthMeter; -import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; -import com.google.android.exoplayer2.util.Util; +import androidx.media3.common.MediaItem; +import androidx.media3.common.util.Util; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.ui.leanback.LeanbackPlayerAdapter; import static com.example.android.tvleanback.ui.PlaybackFragment.VideoLoaderCallbacks.RELATED_VIDEOS_LOADER; @@ -77,8 +67,7 @@ public class PlaybackFragment extends VideoSupportFragment { private VideoPlayerGlue mPlayerGlue; private LeanbackPlayerAdapter mPlayerAdapter; - private SimpleExoPlayer mPlayer; - private TrackSelector mTrackSelector; + private ExoPlayer mPlayer; private PlaylistActionListener mPlaylistActionListener; private Video mVideo; @@ -90,7 +79,7 @@ public class PlaybackFragment extends VideoSupportFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mVideo = getActivity().getIntent().getParcelableExtra(VideoDetailsActivity.VIDEO); + mVideo = requireActivity().getIntent().getParcelableExtra(VideoDetailsActivity.VIDEO); mPlaylist = new Playlist(); mVideoLoaderCallbacks = new VideoLoaderCallbacks(mPlaylist); @@ -143,15 +132,10 @@ public void onStop() { } private void initializePlayer() { - BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); - TrackSelection.Factory videoTrackSelectionFactory = - new AdaptiveTrackSelection.Factory(bandwidthMeter); - mTrackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); - - mPlayer = ExoPlayerFactory.newSimpleInstance(getActivity(), mTrackSelector); - mPlayerAdapter = new LeanbackPlayerAdapter(getActivity(), mPlayer, UPDATE_DELAY); + mPlayer = new ExoPlayer.Builder(requireContext()).build(); + mPlayerAdapter = new LeanbackPlayerAdapter(requireContext(), mPlayer, UPDATE_DELAY); mPlaylistActionListener = new PlaylistActionListener(mPlaylist); - mPlayerGlue = new VideoPlayerGlue(getActivity(), mPlayerAdapter, mPlaylistActionListener); + mPlayerGlue = new VideoPlayerGlue(requireContext(), mPlayerAdapter, mPlaylistActionListener); mPlayerGlue.setHost(new VideoSupportFragmentGlueHost(this)); mPlayerGlue.playWhenPrepared(); @@ -165,8 +149,10 @@ private void releasePlayer() { if (mPlayer != null) { mPlayer.release(); mPlayer = null; - mTrackSelector = null; - mPlayerGlue = null; + if (mPlayerGlue != null) { + mPlayerGlue.setHost(null); + mPlayerGlue = null; + } mPlayerAdapter = null; mPlaylistActionListener = null; } @@ -180,16 +166,8 @@ private void play(Video video) { } private void prepareMediaForPlaying(Uri mediaSourceUri) { - String userAgent = Util.getUserAgent(getActivity(), "VideoPlayerGlue"); - MediaSource mediaSource = - new ExtractorMediaSource( - mediaSourceUri, - new DefaultDataSourceFactory(getActivity(), userAgent), - new DefaultExtractorsFactory(), - null, - null); - - mPlayer.prepare(mediaSource); + mPlayer.setMediaItem(MediaItem.fromUri(mediaSourceUri)); + mPlayer.prepare(); } private ArrayObjectAdapter initializeRelatedVideosRow() { @@ -257,16 +235,16 @@ public void onItemClicked( if (item instanceof Video) { Video video = (Video) item; - Intent intent = new Intent(getActivity(), VideoDetailsActivity.class); + Intent intent = new Intent(requireContext(), VideoDetailsActivity.class); intent.putExtra(VideoDetailsActivity.VIDEO, video); Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( - getActivity(), + requireActivity(), ((ImageCardView) itemViewHolder.view).getMainImageView(), VideoDetailsActivity.SHARED_ELEMENT_NAME) .toBundle(); - getActivity().startActivity(intent, bundle); + startActivity(intent, bundle); } } } @@ -290,7 +268,7 @@ public Loader onCreateLoader(int id, Bundle args) { // When loading related videos or videos for the playlist, query by category. String category = args.getString(VideoContract.VideoEntry.COLUMN_CATEGORY); return new CursorLoader( - getActivity(), + requireContext(), VideoContract.VideoEntry.CONTENT_URI, null, VideoContract.VideoEntry.COLUMN_CATEGORY + " = ?", diff --git a/Leanback/app/src/main/java/com/example/android/tvleanback/ui/VideoDetailsFragment.java b/Leanback/app/src/main/java/com/example/android/tvleanback/ui/VideoDetailsFragment.java index 6b3fd69fe..dab3c0a69 100644 --- a/Leanback/app/src/main/java/com/example/android/tvleanback/ui/VideoDetailsFragment.java +++ b/Leanback/app/src/main/java/com/example/android/tvleanback/ui/VideoDetailsFragment.java @@ -357,7 +357,7 @@ public void onResourceReady( } private void setupMovieListRow() { - String subcategories[] = {getString(R.string.related_movies)}; + String[] subcategories = {getString(R.string.related_movies)}; // Generating related video list. String category = mSelectedVideo.category; diff --git a/Leanback/build.gradle b/Leanback/build.gradle index 5953e4b80..06e4514b9 100644 --- a/Leanback/build.gradle +++ b/Leanback/build.gradle @@ -1,22 +1,4 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - repositories { - google() - mavenCentral() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - mavenCentral() - jcenter() - } +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false } \ No newline at end of file diff --git a/Leanback/gradle.properties b/Leanback/gradle.properties index 52c5562e2..4683f0b0d 100644 --- a/Leanback/gradle.properties +++ b/Leanback/gradle.properties @@ -1,2 +1,5 @@ android.enableJetifier = true -android.useAndroidX = true \ No newline at end of file +android.useAndroidX = true +org.gradle.jvmargs=-Xmx3072m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8 +android.suppressUnsupportedCompileSdk=35 +android.nonTransitiveRClass=false \ No newline at end of file diff --git a/Leanback/gradle/libs.versions.toml b/Leanback/gradle/libs.versions.toml new file mode 100644 index 000000000..faa2462aa --- /dev/null +++ b/Leanback/gradle/libs.versions.toml @@ -0,0 +1,60 @@ +[versions] +agp = "8.6.0" +kotlin = "1.9.23" +coreKtx = "1.13.1" +appcompat = "1.7.0" +activityCompose = "1.9.3" +composeBom = "2024.09.02" +tvMaterial = "1.0.0" +profileinstaller = "1.3.1" +leanback = "1.2.0" +media3 = "1.9.0" +coil = "2.7.0" +coroutines = "1.9.0" +lifecycle = "2.8.7" +preferenceKtx = "1.2.1" +junit = "4.13.2" +junitVersion = "1.1.5" +espressoCore = "3.5.1" +recyclerview = "1.0.0" +annotation = "1.0.1" +glide = "4.3.1" + +[libraries] +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } +androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-tv-material = { group = "androidx.tv", name = "tv-material", version.ref = "tvMaterial" } +androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" } +androidx-leanback = { group = "androidx.leanback", name = "leanback", version.ref = "leanback" } +androidx-leanback-preference = { group = "androidx.leanback", name = "leanback-preference", version.ref = "leanback" } +androidx-media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3" } +androidx-media3-ui = { group = "androidx.media3", name = "media3-ui", version.ref = "media3" } +androidx-media3-common = { group = "androidx.media3", name = "media3-common", version.ref = "media3" } +androidx-media3-ui-compose = { group = "androidx.media3", name = "media3-ui-compose", version.ref = "media3" } +androidx-media3-ui-compose-material3 = { group = "androidx.media3", name = "media3-ui-compose-material3", version.ref = "media3" } +androidx-media3-ui-leanback = { group = "androidx.media3", name = "media3-ui-leanback", version.ref = "media3" } +coil = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } +androidx-preference-ktx = { group = "androidx.preference", name = "preference-ktx", version.ref = "preferenceKtx" } +androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } +androidx-annotation = { group = "androidx.annotation", name = "annotation", version.ref = "annotation" } +glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } diff --git a/Leanback/gradle/wrapper/gradle-wrapper.properties b/Leanback/gradle/wrapper/gradle-wrapper.properties index 2c4ffec4f..1525bf364 100644 --- a/Leanback/gradle/wrapper/gradle-wrapper.properties +++ b/Leanback/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip diff --git a/Leanback/screenshots/browse.png b/Leanback/screenshots/browse.png new file mode 100644 index 000000000..a1b28a618 Binary files /dev/null and b/Leanback/screenshots/browse.png differ diff --git a/Leanback/screenshots/capture_screenshots.sh b/Leanback/screenshots/capture_screenshots.sh new file mode 100755 index 000000000..917ec7134 --- /dev/null +++ b/Leanback/screenshots/capture_screenshots.sh @@ -0,0 +1,140 @@ +#!/bin/bash +# +# Helper script to automatically navigate through the Leanback sample application +# and generate screenshots for all UI components and fragments. +# +# Usage: +# ./capture_screenshots.sh [-s ] +# ANDROID_SERIAL=localhost:42001 ./capture_screenshots.sh +# + +set -e + +SERIAL=${ANDROID_SERIAL:-} +while [[ $# -gt 0 ]]; do + case $1 in + -s|--serial) + if [[ $# -lt 2 ]]; then + echo "Error: -s/--serial requires an argument." + exit 1 + fi + SERIAL="$2" + shift 2 + ;; + *) + echo "Unknown option: $1" + echo "Usage: $0 [-s ]" + exit 1 + ;; + esac +done + +ADB=${ADB:-adb} +ADB_CMD="$ADB ${SERIAL:+-s $SERIAL}" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +OUTPUT_DIR="$SCRIPT_DIR" +mkdir -p "$OUTPUT_DIR" + +echo "=== Leanback Sample App Screenshot Generator ===" +echo "Output Directory: $OUTPUT_DIR" +if [[ -n "$SERIAL" ]]; then + echo "Target Device: $SERIAL" +fi + +echo "Checking ADB connection..." +$ADB_CMD devices | grep -E '\bdevice\b' > /dev/null || { + echo "Error: No connected Android device or emulator found." + echo "Please connect an Android TV emulator and try again." + exit 1 +} + +echo "Returning to Home and clearing any system popups..." +$ADB_CMD shell input keyevent KEYCODE_HOME +sleep 1 + +capture_screen() { + local filename=$1 + local title=$2 + echo "Capturing: $title -> screenshots/$filename" + $ADB_CMD exec-out screencap -p > "$OUTPUT_DIR/$filename" +} + +echo "=== 1/10: Onboarding Fragment ===" +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.OnboardingActivity +sleep 8 +capture_screen "onboarding.png" "Onboarding Fragment" + +echo "=== Completing Onboarding sequence ===" +# Just click next four times +for i in 1 2 3 4; do + $ADB_CMD shell input keyevent KEYCODE_DPAD_CENTER + sleep 1 +done + +echo "=== 2/10: Browse Fragment ===" +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.MainActivity +sleep 8 +capture_screen "browse.png" "Browse Fragment" + +echo "=== 3/10: Row Fragment (Card Views) ===" +$ADB_CMD shell input keyevent KEYCODE_DPAD_RIGHT +sleep 5 +capture_screen "row.png" "Row Fragment (Card Views)" + +echo "=== 4/10: Details Fragment ===" +$ADB_CMD shell input keyevent KEYCODE_DPAD_CENTER +sleep 8 +capture_screen "details.png" "Details Fragment" + +echo "=== 5/10: Row Fragment in Details Fragment ===" +$ADB_CMD shell input keyevent KEYCODE_DPAD_DOWN +sleep 2 +$ADB_CMD shell input keyevent KEYCODE_DPAD_DOWN +sleep 5 +capture_screen "details_row.png" "Row Fragment in Details Fragment" + +echo "=== 6/10: Vertical Grid Fragment ===" +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.VerticalGridActivity +sleep 8 +capture_screen "vertical_grid.png" "Vertical Grid Fragment" + +echo "=== 7/10: Search Fragment ===" +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.SearchActivity +sleep 6 +capture_screen "search.png" "Search Fragment" + +echo "=== 8/10: Guided Step Fragment ===" +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.GuidedStepActivity +sleep 8 +capture_screen "guided_step.png" "Guided Step Fragment" + +echo "=== 9/10: Settings Fragment ===" +# Launch MainActivity first so BrowseFragment renders in the background under the side-panel +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.MainActivity +sleep 8 +$ADB_CMD shell am start -n com.example.android.tvleanback/.ui.SettingsActivity +sleep 8 +capture_screen "settings.png" "Settings Fragment" + +echo "=== 10/10: Error Fragment ===" +$ADB_CMD shell am start -S -n com.example.android.tvleanback/.ui.MainActivity +sleep 8 +$ADB_CMD shell input keyevent KEYCODE_DPAD_LEFT +sleep 2 +for i in $(seq 1 6); do + $ADB_CMD shell input keyevent KEYCODE_DPAD_DOWN + sleep 2 +done +$ADB_CMD shell input keyevent KEYCODE_DPAD_RIGHT +sleep 2 +$ADB_CMD shell input keyevent KEYCODE_DPAD_RIGHT +sleep 2 +$ADB_CMD shell input keyevent KEYCODE_DPAD_RIGHT +sleep 2 +$ADB_CMD shell input keyevent KEYCODE_DPAD_CENTER +sleep 8 +capture_screen "error.png" "Error Fragment" + +echo "" +echo "=== ✅ All screenshots successfully generated in: $OUTPUT_DIR ===" diff --git a/Leanback/screenshots/details.png b/Leanback/screenshots/details.png new file mode 100644 index 000000000..f6e795002 Binary files /dev/null and b/Leanback/screenshots/details.png differ diff --git a/Leanback/screenshots/details_row.png b/Leanback/screenshots/details_row.png new file mode 100644 index 000000000..64383d6b1 Binary files /dev/null and b/Leanback/screenshots/details_row.png differ diff --git a/Leanback/screenshots/error.png b/Leanback/screenshots/error.png new file mode 100644 index 000000000..103e33b33 Binary files /dev/null and b/Leanback/screenshots/error.png differ diff --git a/Leanback/screenshots/guided_step.png b/Leanback/screenshots/guided_step.png new file mode 100644 index 000000000..e4fc2b344 Binary files /dev/null and b/Leanback/screenshots/guided_step.png differ diff --git a/Leanback/screenshots/onboarding.png b/Leanback/screenshots/onboarding.png new file mode 100644 index 000000000..a4f2cac63 Binary files /dev/null and b/Leanback/screenshots/onboarding.png differ diff --git a/Leanback/screenshots/row.png b/Leanback/screenshots/row.png new file mode 100644 index 000000000..13e7563a4 Binary files /dev/null and b/Leanback/screenshots/row.png differ diff --git a/Leanback/screenshots/search.png b/Leanback/screenshots/search.png new file mode 100644 index 000000000..cb234e33c Binary files /dev/null and b/Leanback/screenshots/search.png differ diff --git a/Leanback/screenshots/settings.png b/Leanback/screenshots/settings.png new file mode 100644 index 000000000..a55293541 Binary files /dev/null and b/Leanback/screenshots/settings.png differ diff --git a/Leanback/screenshots/vertical_grid.png b/Leanback/screenshots/vertical_grid.png new file mode 100644 index 000000000..94ea00e1a Binary files /dev/null and b/Leanback/screenshots/vertical_grid.png differ diff --git a/Leanback/settings.gradle b/Leanback/settings.gradle index e7b4def49..e87d37917 100644 --- a/Leanback/settings.gradle +++ b/Leanback/settings.gradle @@ -1 +1,16 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "Leanback" include ':app'