diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/components/ButtonSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/components/ButtonSnippets.kt new file mode 100644 index 000000000..b94af5980 --- /dev/null +++ b/compose/snippets/src/main/java/com/example/compose/snippets/components/ButtonSnippets.kt @@ -0,0 +1,12 @@ +package com.example.compose.snippets.components + +import androidx.compose.runtime.Composable + +object ButtonSnippets { + // [START android_compose_snippets_button_example] + @Composable + fun ButtonExample() { + + } + // [END android_compose_snippets_button_example] +} \ No newline at end of file diff --git a/media/build.gradle.kts b/media/build.gradle.kts new file mode 100644 index 000000000..5fd94fc54 --- /dev/null +++ b/media/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + namespace = "com.example.media.snippets" + compileSdk = 35 + + defaultConfig { + minSdk = 21 + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } +} + +dependencies { + implementation("androidx.core:core-ktx:1.15.0") +} diff --git a/media/src/main/java/com/example/media/snippets/mediaplayer/DRMSnippets.kt b/media/src/main/java/com/example/media/snippets/mediaplayer/DRMSnippets.kt new file mode 100644 index 000000000..f76418dc4 --- /dev/null +++ b/media/src/main/java/com/example/media/snippets/mediaplayer/DRMSnippets.kt @@ -0,0 +1,58 @@ +package com.example.media.snippets.mediaplayer + +import android.media.MediaPlayer +import java.util.UUID + +class DRMSnippets { + private var mediaPlayer: MediaPlayer? = null + + fun syncDRM() { + // [START android_mediaplayer_drm_sync] + mediaPlayer?.apply { + setDataSource("https://example.com/video.mp4") + setOnDrmConfigHelper { _ -> /* configuration */ } // optional, for custom configuration + prepare() + drmInfo?.also { + prepareDrm(UUID.randomUUID()) + getKeyRequest(byteArrayOf(), byteArrayOf(), "", 0, null) + provideKeyResponse(byteArrayOf(), byteArrayOf()) + } + + // MediaPlayer is now ready to use + start() + // ...play/pause/resume... + stop() + releaseDrm() + } + // [END android_mediaplayer_drm_sync] + } + + // [START android_mediaplayer_drm_async] + inner class MyDrmActivity : MediaPlayer.OnDrmInfoListener, MediaPlayer.OnPreparedListener { + fun setupAsync(mediaPlayer: MediaPlayer) { + mediaPlayer.apply { + setOnPreparedListener(this@MyDrmActivity) + setOnDrmInfoListener(this@MyDrmActivity) + setDataSource("https://example.com/video.mp4") + prepareAsync() + } + } + + // If the data source content is protected you receive a call to the onDrmInfo() callback. + override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) { + mediaPlayer.apply { + prepareDrm(UUID.randomUUID()) + getKeyRequest(byteArrayOf(), byteArrayOf(), "", 0, null) + provideKeyResponse(byteArrayOf(), byteArrayOf()) + } + } + + // When prepareAsync() finishes, you receive a call to the onPrepared() callback. + // If there is a DRM, onDrmInfo() sets it up before executing this callback, + // so you can start the player. + override fun onPrepared(mediaPlayer: MediaPlayer) { + mediaPlayer.start() + } + } + // [END android_mediaplayer_drm_async] +} diff --git a/media/src/main/java/com/example/media/snippets/mediaplayer/DRMSnippetsJava.java b/media/src/main/java/com/example/media/snippets/mediaplayer/DRMSnippetsJava.java new file mode 100644 index 000000000..a2dc4bea1 --- /dev/null +++ b/media/src/main/java/com/example/media/snippets/mediaplayer/DRMSnippetsJava.java @@ -0,0 +1,66 @@ +package com.example.media.snippets.mediaplayer; + +import android.media.MediaPlayer; +import java.util.UUID; + +public class DRMSnippetsJava { + private MediaPlayer mediaPlayer; + + public void syncDRM() { + // [START android_mediaplayer_drm_sync_java] + try { + mediaPlayer.setDataSource("https://example.com/video.mp4"); + mediaPlayer.setOnDrmConfigHelper(null); // optional, for custom configuration + mediaPlayer.prepare(); + if (mediaPlayer.getDrmInfo() != null) { + mediaPlayer.prepareDrm(UUID.randomUUID()); + mediaPlayer.getKeyRequest(null, null, null, 0, null); + mediaPlayer.provideKeyResponse(null, null); + } + + // MediaPlayer is now ready to use + mediaPlayer.start(); + // ...play/pause/resume... + mediaPlayer.stop(); + mediaPlayer.releaseDrm(); + } catch (Exception e) { + // Handle exceptions + } + // [END android_mediaplayer_drm_sync_java] + } + + // [START android_mediaplayer_drm_async_java] + public class MyDrmActivity implements MediaPlayer.OnDrmInfoListener, MediaPlayer.OnPreparedListener { + public void setupAsync(MediaPlayer mediaPlayer) { + try { + mediaPlayer.setOnPreparedListener(this); + mediaPlayer.setOnDrmInfoListener(this); + mediaPlayer.setDataSource("https://example.com/video.mp4"); + mediaPlayer.prepareAsync(); + } catch (Exception e) { + // Handle exceptions + } + } + + // If the data source content is protected you receive a call to the onDrmInfo() callback. + @Override + public void onDrmInfo(MediaPlayer mediaPlayer, MediaPlayer.DrmInfo drmInfo) { + try { + mediaPlayer.prepareDrm(UUID.randomUUID()); + mediaPlayer.getKeyRequest(null, null, null, 0, null); + mediaPlayer.provideKeyResponse(null, null); + } catch (Exception e) { + // Handle exceptions + } + } + + // When prepareAsync() finishes, you receive a call to the onPrepared() callback. + // If there is a DRM, onDrmInfo() sets it up before executing this callback, + // so you can start the player. + @Override + public void onPrepared(MediaPlayer mediaPlayer) { + mediaPlayer.start(); + } + } + // [END android_mediaplayer_drm_async_java] +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 2a71512aa..ae86bb8f8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -38,6 +38,7 @@ include( ":misc", ":identity:credentialmanager", ":xr", + ":media", ":watchfacepush:validator", ":kmp:androidApp", ":kmp:shared"