From 15c088114faf673bf4f878f67f5c408e4a172e4c Mon Sep 17 00:00:00 2001 From: truong_tdm Date: Tue, 19 Jul 2022 16:42:16 +0700 Subject: [PATCH 1/2] init project --- .gitignore | 15 + .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/gradle.xml | 20 + .idea/misc.xml | 22 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/.idea/.gitignore | 3 + app/.idea/gradle.xml | 14 + app/.idea/misc.xml | 9 + app/.idea/modules.xml | 8 + app/.idea/vcs.xml | 6 + app/build.gradle | 73 +++ app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 24 + app/src/main/ic_launcher-playstore.png | Bin 0 -> 22335 bytes .../tdm/tdminteractive/PlayerActivity.java | 552 ++++++++++++++++++ .../tdminteractive/SigmaRendererFactory.java | 108 ++++ .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/ic_channel_background.xml | 76 +++ .../res/drawable/ic_launcher_background.xml | 74 +++ app/src/main/res/layout/activity_main.xml | 113 ++++ .../main/res/mipmap-anydpi-v26/ic_channel.xml | 5 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-xhdpi/ic_channel.png | Bin 0 -> 3810 bytes .../mipmap-xhdpi/ic_channel_foreground.png | Bin 0 -> 11277 bytes app/src/main/res/values-night/themes.xml | 16 + app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/ids.xml | 4 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 16 + .../tdm/tdminteractive/ExampleUnitTest.java | 17 + build.gradle | 9 + gradle.properties | 21 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++ gradlew.bat | 89 +++ libs/SigmaInteractiveTVSDK.aar | Bin 0 -> 11227 bytes settings.gradle | 16 + 43 files changed, 1617 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/.idea/.gitignore create mode 100644 app/.idea/gradle.xml create mode 100644 app/.idea/misc.xml create mode 100644 app/.idea/modules.xml create mode 100644 app/.idea/vcs.xml create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/tdm/tdminteractive/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/tdm/tdminteractive/PlayerActivity.java create mode 100644 app/src/main/java/com/tdm/tdminteractive/SigmaRendererFactory.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_channel_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_channel.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_channel.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_channel_foreground.png create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/com/tdm/tdminteractive/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 libs/SigmaInteractiveTVSDK.aar create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..b13b8d4 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +TDM Interactive \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..526b4c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0358047 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/.idea/.gitignore b/app/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/app/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/app/.idea/gradle.xml b/app/.idea/gradle.xml new file mode 100644 index 0000000..79e6703 --- /dev/null +++ b/app/.idea/gradle.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/.idea/misc.xml b/app/.idea/misc.xml new file mode 100644 index 0000000..46fefaa --- /dev/null +++ b/app/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/modules.xml b/app/.idea/modules.xml new file mode 100644 index 0000000..e1f9e1c --- /dev/null +++ b/app/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/vcs.xml b/app/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/app/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a9018c1 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,73 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.tdm.tdminteractive" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + +// implementation project(path: ':sigma_interactive') + + implementation files('../libs/SigmaInteractiveTVSDK.aar') + + implementation 'com.google.android.exoplayer:exoplayer:2.17.1' + +// for core support in exoplayer. + + implementation 'com.google.android.exoplayer:exoplayer-core:2.17.1' + // for adding dash support in our exoplayer. + + implementation 'com.google.android.exoplayer:exoplayer-dash:2.17.1' + +// for adding hls support in exoplayer. + + implementation 'com.google.android.exoplayer:exoplayer-hls:2.17.1' + +// for smooth streaming of video in our exoplayer. + + implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.17.1' + + implementation 'com.google.code.gson:gson:2.9.0' + + implementation 'com.android.volley:volley:1.2.1' + + implementation 'com.auth0:java-jwt:3.19.2' + + + + + +// for generating default ui of exoplayer + + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/tdm/tdminteractive/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/tdm/tdminteractive/ExampleInstrumentedTest.java new file mode 100644 index 0000000..d3a99d5 --- /dev/null +++ b/app/src/androidTest/java/com/tdm/tdminteractive/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.tdm.tdminteractive; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.tdm.tdminteractive", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ef21d99 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..2004f938e995d80693b76ca0d833e8b09df2295b GIT binary patch literal 22335 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 { + if (metadata != null) { + for (int i = 0; i < metadata.length(); i++) { + Metadata.Entry entry = metadata.get(i); + if (entry instanceof TextInformationFrame) { + String des = ((TextInformationFrame) entry).description; + String value = ((TextInformationFrame) entry).value; + if (des.toUpperCase().equals("TXXX")) { + _interactiveWebview.sendID3TagInstant(value); + } + } + } + } + }); + + exoPlayer = new ExoPlayer.Builder(this, renderersFactory).build(); + + + exoPlayer.addAnalyticsListener(new AnalyticsListener() { + @Override + public void onMetadata(EventTime eventTime, Metadata metadata) { + Log.d("checkListener", new Gson().toJson(metadata)); + if (metadata != null) { + for (int i = 0; i < metadata.length(); i++) { + Metadata.Entry entry = metadata.get(i); + if (entry instanceof TextInformationFrame) { + String des = ((TextInformationFrame) entry).description; + String value = ((TextInformationFrame) entry).value; + if (des.toUpperCase().equals("TXXX")) { + _interactiveWebview.sendID3Tag(value); + } + } + } + } + } + }); + + + mediaItem = new MediaItem.Builder() + .setUri(url) + .setClippingConfiguration(new MediaItem.ClippingConfiguration.Builder().build()).build(); + + playerView.setUseController(false); + + exoPlayer.setMediaItem(mediaItem); + exoPlayer.prepare(); + exoPlayer.setPlayWhenReady(true); + exoPlayer.addListener(new Player.Listener() { + + @Override + public void onPlayerError(PlaybackException error) { + if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) { + Log.d("onPlayerError", "errorCode: " + "ERROR_CODE_BEHIND_LIVE_WINDOW"); + exoPlayer.seekToDefaultPosition(); + exoPlayer.prepare(); + } else { + // Handle other errors. + } + } + + @Override + public void onIsPlayingChanged(boolean isPlaying) { + Log.d("onIsPlayingChanged", isPlaying + ""); + } + + @Override + public void onPlaybackStateChanged(int playbackState) { + + } + + @Override + public void onTimelineChanged(Timeline timeline, int reason) { + + } + + @Override + public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { + Log.d("exoPlayer", "onPlayWhenReadyChanged" + reason); + + } + }); + playerView.setPlayer(exoPlayer); + + } + + private void initInteractive(int index) { + currentIndexInteractive = index; + ((RelativeLayout) interactiveLayout).removeAllViews(); + _interactiveWebview = new SigmaWebView(this); + + ((RelativeLayout) interactiveLayout) + .addView(((WebView) _interactiveWebview), RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); + ((WebView) _interactiveWebview).setId(R.id.sigma_webview); + ((WebView) _interactiveWebview).bringToFront(); + _interactiveWebview.setActivity(PlayerActivity.this); + + token = ""; + if (currentIndexInteractive != 0) { + if (sharedPreferences.getString(idUser[currentIndexInteractive], "").length() > 0) { + token = sharedPreferences.getString(idUser[currentIndexInteractive], ""); + + } else { + RequestQueue queue = Volley.newRequestQueue(PlayerActivity.this); + + StringRequest request = new StringRequest(Request.Method.POST, "https://dev-livestream.gviet.vn/api/interactive/v1/users/gen-token", + response -> { + Log.d("StringRequest", "success: " + response); + try { + JSONObject jsonObject = new JSONObject(response); + sharedPreferences.edit().putString(idUser[currentIndexInteractive], jsonObject.optString("token", "")).apply(); + initInteractive(currentIndexInteractive); + return; + } catch (JSONException e) { + e.printStackTrace(); + } + }, error -> { + Log.d("StringRequest", "error: " + error.networkResponse.statusCode + "\n" + new Gson().toJson(error)); + }) { + @Override + public Map getHeaders() throws AuthFailureError { + HashMap header = new HashMap<>(); + header.put("authorization", KEY_AUTH); + return header; + } + + @Override + public byte[] getBody() throws AuthFailureError { + String body = new Gson().toJson(bodyTests[currentIndexInteractive]); + Log.d("checkBody", body); + + try { + return body == null ? null : body.getBytes("utf-8"); + } catch (UnsupportedEncodingException uee) { + VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", body, "utf-8"); + return null; + } + } + + @Override + public String getBodyContentType() { + return "application/json; charset=utf-8"; + } + + }; + + queue.add(request); + } + + } + + _interactiveWebview.setCallback(new SigmaWebViewCallback() { + @Override + public void onReady() { + Log.d("_interactiveWebview", "onReady"); + ((WebView) _interactiveWebview).setFocusable(true); + ((WebView) _interactiveWebview).requestFocus(); + _interactiveWebview.sendOnReadyBack(new Gson().toJson(getUserOption(token, currrentChannelId))); + } + + @Override + public void onReload() { + _interactiveWebview.sendOnReadyBack(new Gson().toJson(getUserOption(token, currrentChannelId))); + } + + @Override + public void onKeyDown(int code) { + Log.d("_interactiveWebview", "onKeyDown " + code); + + KeyEvent event = null; + + switch (code) { + case SigmaWebView.KEYCODE_UP: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP); + break; + case SigmaWebView.KEYCODE_DOWN: +// event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN); + btnGuest.requestFocus(); + ((WebView) _interactiveWebview).setFocusable(true); + ((WebView) _interactiveWebview).clearFocus(); + break; + case SigmaWebView.KEYCODE_LEFT: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT); + break; + case SigmaWebView.KEYCODE_RIGHT: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT); + break; + case SigmaWebView.KEYCODE_ENTER: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER); + break; + case SigmaWebView.KEYCODE_ESCAPE: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK); + break; + case SigmaWebView.KEYCODE_0: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0); + break; + case SigmaWebView.KEYCODE_1: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1); + break; + case SigmaWebView.KEYCODE_2: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_2); + break; + case SigmaWebView.KEYCODE_3: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_3); + break; + case SigmaWebView.KEYCODE_4: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_4); + break; + case SigmaWebView.KEYCODE_5: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_5); + break; + case SigmaWebView.KEYCODE_6: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_6); + break; + case SigmaWebView.KEYCODE_7: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_7); + break; + case SigmaWebView.KEYCODE_8: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_8); + break; + case SigmaWebView.KEYCODE_9: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_9); + break; + case SigmaWebView.KEYCODE_PAGEUP: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_PAGE_UP); + break; + case SigmaWebView.KEYCODE_PAGEDOWN: + event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_PAGE_DOWN); + break; + } + + if (event != null) { + PlayerActivity.this.onKeyDown(event.getKeyCode(), event); + } + } + + @Override + public void onOverlayShow() { + Log.d("_interactiveWebview", "onOverlayShow"); + } + + @Override + public void onOverlayHide() { + Log.d("_interactiveWebview", "onOverlayHide"); + } + + @Override + public void onSetSession(String s) { + + Log.d("_interactiveWebview", "onSetSession " + s); +// try { +// JSONObject jsonObject = new JSONObject(s); +// +// ((WebView) _interactiveWebview).setFocusable(true); +// ((WebView) _interactiveWebview).requestFocus(); +// _interactiveWebview.sendOnReadyBack(new Gson().toJson(getUserOption(token, currrchannelId))); +// ((WebView) _interactiveWebview).reload(); +// +// } catch (JSONException e) { +// e.printStackTrace(); +// } + } + }); + + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + Log.d("onKeyDownMain", keyCode + ""); + +// switch (keyCode) { +// case KeyEvent.KEYCODE_DPAD_UP: { +// //up channel +// if (currentIndex >= (urlChannels.length - 1)) { +// currentIndex = 0; +// } else { +// currentIndex++; +// } +// initPlayer(currentIndex); +// } +// case KeyEvent.KEYCODE_DPAD_DOWN: { +// //down channel +// if (currentIndex <= 0) { +// currentIndex = urlChannels.length - 1; +// } else { +// currentIndex--; +// } +// initPlayer(currentIndex); +// } +// case KeyEvent.KEYCODE_ENTER: +// case KeyEvent.KEYCODE_DPAD_CENTER: { +//// if (layoutViewGroup.getVisibility() == View.VISIBLE) { +//// layoutViewGroup.setVisibility(View.INVISIBLE); +//// } else { +//// ((RelativeLayout) _interactiveWebview).requestFocus(); +//// layoutViewGroup.clearFocus(); +//// } +// } +// } +// if (keyCode == KeyEvent.KEYCODE_BACK) { +// if (isInteractive) { +// Log.d("onKeyDownMain", "back"); +// _interactiveWebview.sendKeyBack(); +// } +// return true; +// } else { +// return super.onKeyDown(keyCode, event); +// } + return super.onKeyDown(keyCode, event); + + } + + private SigmaWebView.UserOptions getUserOption(String token, String channelId) { + return new SigmaWebView.UserOptions(token, channelId, + "default-app", "", true, "ArrowLeft", true, ""); + } + + public static boolean isKeyBack(int keyCode) { + switch (keyCode) { + case KeyEvent.KEYCODE_BACK: + case KeyEvent.KEYCODE_ESCAPE: + return true; + } + return false; + } + + + public static class BodyTest { + String role; + String id; + String appId; + UserData userData; + + public BodyTest(String role, String id, String appId, UserData userData) { + this.role = role; + this.id = id; + this.appId = appId; + this.userData = userData; + } + + public static class UserData { + String id; + String role; + String platform; + + public UserData(String id, String role, String platform) { + this.id = id; + this.role = role; + this.platform = platform; + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/tdm/tdminteractive/SigmaRendererFactory.java b/app/src/main/java/com/tdm/tdminteractive/SigmaRendererFactory.java new file mode 100644 index 0000000..a3a0c84 --- /dev/null +++ b/app/src/main/java/com/tdm/tdminteractive/SigmaRendererFactory.java @@ -0,0 +1,108 @@ +package com.tdm.tdminteractive; + +import android.content.Context; +import android.os.Looper; + +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.Renderer; +import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.metadata.MetadataDecoder; +import com.google.android.exoplayer2.metadata.MetadataDecoderFactory; +import com.google.android.exoplayer2.metadata.MetadataInputBuffer; +import com.google.android.exoplayer2.metadata.MetadataOutput; +import com.google.android.exoplayer2.metadata.MetadataRenderer; +import com.google.android.exoplayer2.metadata.emsg.EventMessageDecoder; +import com.google.android.exoplayer2.metadata.id3.Id3Decoder; +import com.google.android.exoplayer2.metadata.scte35.SpliceInfoDecoder; +import com.google.android.exoplayer2.util.MimeTypes; + +import java.util.ArrayList; + +public class SigmaRendererFactory extends DefaultRenderersFactory { + + /** + * @param context A {@link Context}. + */ + public SigmaRendererFactory(Context context) { + super(context); + } + + public interface Id3ParsedListener { + + void onId3Parsed(Metadata metadata); + } + + private Id3ParsedListener mListener; + + public SigmaRendererFactory(Context context, Id3ParsedListener listener) { + super(context); + mListener = listener; + } + + + + @Override + protected void buildMetadataRenderers( + Context context, + MetadataOutput output, + Looper outputLooper, + @ExtensionRendererMode int extensionRendererMode, + ArrayList out) { + out.add(new MetadataRenderer(output, outputLooper, new SigmaMetadataDecoderFactory(mListener))); + } + + public static class SigmaMetadataDecoderFactory implements MetadataDecoderFactory { + private Id3ParsedListener mListener; + public SigmaMetadataDecoderFactory(Id3ParsedListener listener){ + mListener = listener; + } + @Override + public boolean supportsFormat(Format format) { + @Nullable String mimeType = format.sampleMimeType; + return MimeTypes.APPLICATION_ID3.equals(mimeType) + || MimeTypes.APPLICATION_EMSG.equals(mimeType) + || MimeTypes.APPLICATION_SCTE35.equals(mimeType); + } + + @Override + public MetadataDecoder createDecoder(Format format) { + @Nullable String mimeType = format.sampleMimeType; + if (mimeType != null) { + switch (mimeType) { + case MimeTypes.APPLICATION_ID3: + return new SigmaId3Proxy(mListener); + case MimeTypes.APPLICATION_EMSG: + return new EventMessageDecoder(); + case MimeTypes.APPLICATION_SCTE35: + return new SpliceInfoDecoder(); + default: + break; + } + } + throw new IllegalArgumentException( + "Attempted to create decoder for unsupported MIME type: " + mimeType); + } + } + + public static class SigmaId3Proxy implements MetadataDecoder { + + private Id3Decoder mInternal = new Id3Decoder(); + private Id3ParsedListener mListener; + public SigmaId3Proxy(Id3ParsedListener listener){ + mListener = listener; + } + + @Override + public Metadata decode(MetadataInputBuffer inputBuffer) { + Metadata result = mInternal.decode(inputBuffer); + if (result != null && mListener != null) { + mListener.onId3Parsed(result); + } + return result; + } + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_channel_background.xml b/app/src/main/res/drawable/ic_channel_background.xml new file mode 100644 index 0000000..a1308f6 --- /dev/null +++ b/app/src/main/res/drawable/ic_channel_background.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..e4c56d5 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,113 @@ + + + + + + + + + +