diff --git a/.DS_Store b/.DS_Store index 5e01c35..09aad5f 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/DemoSigmaInteractiveAndroid/.idea/gradle.xml b/DemoSigmaInteractiveAndroid/.idea/gradle.xml index 78708b3..00d25f9 100644 --- a/DemoSigmaInteractiveAndroid/.idea/gradle.xml +++ b/DemoSigmaInteractiveAndroid/.idea/gradle.xml @@ -4,7 +4,7 @@ diff --git a/DemoSigmaInteractiveAndroid/.idea/misc.xml b/DemoSigmaInteractiveAndroid/.idea/misc.xml index 59135fb..23c7f0b 100644 --- a/DemoSigmaInteractiveAndroid/.idea/misc.xml +++ b/DemoSigmaInteractiveAndroid/.idea/misc.xml @@ -1,6 +1,14 @@ - + + + + diff --git a/DemoSigmaInteractiveAndroid/.idea/runConfigurations.xml b/DemoSigmaInteractiveAndroid/.idea/runConfigurations.xml deleted file mode 100644 index 93e4b17..0000000 --- a/DemoSigmaInteractiveAndroid/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/DemoSigmaInteractiveAndroid/README.md b/DemoSigmaInteractiveAndroid/README.md index 7fea822..178ecae 100644 --- a/DemoSigmaInteractiveAndroid/README.md +++ b/DemoSigmaInteractiveAndroid/README.md @@ -4,9 +4,11 @@ ### I. Cài đặt +#### 1. Tích hợp SigmaInteractive sdk + Thêm file [SigmaInteractiveSDK.aar](https://github.com/phamngochai123/sigma-interactive-sdk-example/blob/mobile-android/libs/SigmaInteractiveSDK.aar) vào thư mục libs cùng cấp với thư mục app của project. -Thêm vào app/build.gradle: +Thêm dòng sau vào app/build.gradle: ```java dependencies { @@ -16,108 +18,125 @@ dependencies { } ``` -### II. Sử dụng - -1. Thêm SigmaInteractive sdk vào project (mục **I**). +#### 2. Thêm khai báo appId và version sdk interactive -2. Thêm sự kiện lắng nghe khi id3 bắt đầu parse để gửi dữ liệu cho sdk tương tác - - [SigmaRendererFactory](https://github.com/phamngochai123/sigma-interactive-sdk-example/blob/mobile-android/app/src/main/java/com/example/sigmainteractive/SigmaRendererFactory.java) xem trong demo +1. Mở file `/app/res/values/strings.xml` của bạn. +2. Thêm các thành phần `string` có tên là `interactive_app_id` và `interactive_app_version`, sau đó đặt những giá trị này thành ID và version của sdk interactive ( sẽ được gửi riêng khi đối tác tích hợp ). Ví dụ: nếu sdk có ID ứng dụng là `default-app` và version là `3.0.0` thì mã sẽ có dạng như sau: ```java - DefaultRenderersFactory renderersFactory = new SigmaRendererFactory(getApplicationContext(), new SigmaRendererFactory.Id3ParsedListener() { - @Override - public void onId3Parsed(Metadata 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")) { - if(SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView() != null) { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendID3InstantInteractive(value); - } - } - } - } - } - } - }); - player = new ExoPlayer.Builder(this, renderersFactory).build(); + default-app + 3.0.0 ``` - -3. Thêm sự kiện lắng nghe khi id3 trả ra đúng thời điểm hẹn giờ để gửi dữ liệu cho sdk tương tác +3. Mở file `/app/manifest/AndroidManifest.xml`. +4. Thêm các thành phần `meta-data` vào thành phần `application` cho ID và version của bạn: ```java - player.addAnalyticsListener(new AnalyticsListener() { - @Override - public void onMetadata(AnalyticsListener.EventTime eventTime, Metadata 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")) { - if(SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView() != null) { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendID3Interactive(value); - } - } - } - } - } - } - }); + + ... + + + ... + ``` -4. Tạo SigmaWebViewCallback để lắng nghe các sự kiện từ sdk tương tác. +### II. Sử dụng - 4.1 Trong hàm onReady gửi dữ liệu dạng json string cho sdk tương tác (bắt buộc) +#### 1. Thêm SigmaInteractive sdk vào project (mục **I**). - ```java - SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(userData != null ? userDataSend.toString() : "{}"); - ``` +#### 2. Thêm sự kiện lắng nghe khi id3 bắt đầu parse để gửi dữ liệu cho sdk tương tác (Bắt buộc nếu hiển thị overlay) -5. Mở view tương tác với vị trí (vị trí (x: 0, y: 0) ở góc trên bên trái màn hình), kích thước. Kích thước player, vị trí player so với view tương tác để sdk tương tác tính toán hiển thị. +[SigmaRendererFactory](https://github.com/phamngochai123/sigma-interactive-sdk-example/blob/mobile-android/app/src/main/java/com/example/sigmainteractive/SigmaRendererFactory.java) xem trong demo - ```java - SigmaInteractiveHelper.getInstance(PlayerActivity.this).openInteractiveView(xInteractiveView, yInteractiveView, widthInteractiveView, heightInteractiveView, url, sigmaWebviewCallback, widthPlayer, heightPlayer, xPlayer, yPlayer); - ``` +```java +DefaultRenderersFactory renderersFactory = new SigmaRendererFactory(getApplicationContext(), new SigmaRendererFactory.Id3ParsedListener() { + @Override + public void onId3Parsed(Metadata 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")) { + if(SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView() != null) { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendID3InstantInteractive(value); + } + } + } + } + } + } +}); +player = new ExoPlayer.Builder(this, renderersFactory).build(); +``` + +#### 3. Thêm sự kiện lắng nghe khi id3 trả ra đúng thời điểm hẹn giờ để gửi dữ liệu cho sdk tương tác (Bắt buộc nếu hiển thị overlay) + +```java +player.addAnalyticsListener(new AnalyticsListener() { + @Override + public void onMetadata(AnalyticsListener.EventTime eventTime, Metadata 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")) { + if(SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView() != null) { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendID3Interactive(value); + } + } + } + } + } + } +}); +``` + +#### 4. Tạo SigmaWebViewCallback để lắng nghe các sự kiện từ sdk tương tác. + +4.1 Trong hàm onReady gửi dữ liệu dạng json string cho sdk tương tác (bắt buộc) + + data bao gồm + +- token: token app ( string ) +- channelId: id của kênh đang xem ( string ) +- overlay: bật/tắt overlay (boolean, bật-true, tắt false). Nếu bật thì bắt buộc phải thêm sự kiện như mục 2-3 +- panel: bật/tắt panel (boolean, bật-true, tắt-false) + +```java +SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(dataSend); +``` + +#### 5. Mở view tương tác với vị trí (vị trí (x: 0, y: 0) ở góc trên bên trái màn hình), kích thước. Kích thước player, vị trí player so với view tương tác để sdk tương tác tính toán hiển thị. + +```java +SigmaInteractiveHelper.getInstance(PlayerActivity.this).openInteractiveView(xInteractiveView, yInteractiveView, widthInteractiveView, heightInteractiveView, url, sigmaWebviewCallback, widthPlayer, heightPlayer, xPlayer, yPlayer); +``` - #### SigmaInteractiveHelper #### - openInteractiveView - Mở view tương tác: - + ```java SigmaInteractiveHelper.getInstance(PlayerActivity.this).openInteractiveView(xInteractive, yInteractive, widthInteractiveView, heightInteractiveView, url, sigmaWebviewCallback, widthPlayer, heightPlayer, xPlayer, yPlayer); ``` - - - + - `PlayerActivity`: Activity muốn đặt view tương tác. - - `xInteractive`: Vị trí muốn đặt view tương tác theo trục x. - - `yInteractive`: Vị trí muốn đặt view tương tác theo trục y. - - `widthInteractiveView`: Chiều rộng của view tương tác. - - `heightInteractiveView`: Chiều cao của view tương tác. - - `url`: Link tương tác. - - `widthPlayer`: Chiều rộng của player. - - `heightPlayer`: Chiều caocủa player. - - `xPlayer`: Vị trí player theo trục x. - - `yPlayer`: Vị trí player theo trục y. - - `sigmaWebviewCallback`: Nghe các sự kiện bên tương tác gọi. - - #### Note: Khi nhận được sự kiện onReady của sdk tương tác cần gửi dữ liệu user cho sdk qua hàm `sendOnReadyBack` + - *Note: Khi nhận được sự kiện onReady của sdk tương tác cần gửi dữ liệu cho sdk qua hàm `sendOnReadyBack`. + + *Note: Khi nhận được sự kiện fullReload của sdk tương tác cần lấy lại token của app và gửi lại dữ liệu cho sdk qua hàm `sendOnReadyBack` ```java ex: @@ -133,21 +152,17 @@ private void openInteractiveView(int xInteractiveView, int yInteractiveView, int //Sự kiện khi sdk tương tác sẵn sàng @Override public void onReady() { - JSONObject userDataSend = new JSONObject(); - if (userData != null) { - Set keys = userData.keySet(); - for (String key : keys) { - try { - userDataSend.put(key, JSONObject.wrap(userData.get(key))); - } catch (JSONException e) { - e.printStackTrace(); - } - } - } - SigmaWebView interactiveView = SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView(); + SigmaWebView interactiveView = SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView(); if (interactiveView != null) { - //gửi dữ liệu cho sdk tương tác - interactiveView.sendOnReadyBack(userData != null ? userDataSend.toString() : "{}"); + JSONObject dataSend = getDataSend(false); + Runnable sendData = new Runnable() { + @Override + public void run() { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(dataSend); + } + }; + Handler mHandler = new Handler(); + mHandler.post(sendData); } } @@ -180,9 +195,50 @@ private void openInteractiveView(int xInteractiveView, int yInteractiveView, int Log.d("PlayerActivity=>", "onExitFullScreen"); PlayerActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } + + //Sự kiện khi hệ thống tương tác yêu cầu gửi lại data + @Override + public void fullReload() { + //get datasend with new token + JSONObject newDataSend = getDataSend(true); + Runnable sendData = new Runnable() { + @Override + public void run() { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(newDataSend); + } + }; + Handler mHandler = new Handler(); + mHandler.post(sendData); + } + + @Override + public void setSession(String session) { + Log.d("setSession=>", session); + } }; SigmaInteractiveHelper.getInstance(PlayerActivity.this).openInteractiveView(xInteractiveView, yInteractiveView, widthInteractiveView, heightInteractiveView, url, sigmaWebviewCallback, widthPlayer, heightPlayer, xPlayer, yPlayer); } + + + public JSONObject getDataSend(boolean isRefreshToken) { + JSONObject dataSend = null; + try { + dataSend = new JSONObject("{}"); + //add token to dataSend if userRole is not guest + if(!getKeyParams(Constant.keyUserRole).equals(Constant.roleGuest)) { + String tokenSend = isRefreshToken ? getNewToken() : TokenManager.getTokenCache(getApplicationContext()); + dataSend.put("token", tokenSend); + } + //send id channel + dataSend.put("channelId", getKeyParams(Constant.keyChannelId)); + //on-off overlay, panel (on-true, off-false) + dataSend.put("overlay", true); + dataSend.put("panel", true); + } catch (JSONException err){ + Log.d("Error", err.toString()); + } + return dataSend; + } ``` #### - getInteractiveView - lấy view tương tác hiện tại @@ -251,33 +307,43 @@ SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView ``` - `xInteractive`: Vị trí muốn đặt view tương tác theo trục x. - - `yInteractive`: Vị trí muốn đặt view tương tác theo trục y. - - `widthInteractiveView`: Chiều rộng của view tương tác. - - `heightInteractiveView`: Chiều cao của view tương tác. - - `widthPlayer`: Chiều rộng của player. - - `heightPlayer`: Chiều caocủa player. - - `xPlayer`: Vị trí player theo trục x. - - `yPlayer`: Vị trí player theo trục y. ```java - ex: - @Override - public void onConfigurationChanged(Configuration newConfig) { - Log.d("onConfigurationChanged", String.valueOf(newConfig.orientation)); - super.onConfigurationChanged(newConfig); - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, containerView.getLayoutParams().width, containerView.getLayoutParams().height, containerView.getLayoutParams().width, containerView.getLayoutParams().height, 0, 0); - } else { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, containerView.getLayoutParams().width, containerView.getLayoutParams().height, containerView.getLayoutParams().width, containerView.getLayoutParams().height, 0, 0); - } - } + ex:@Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setLayoutInteractive(newConfig); + } + public void setLayoutInteractive(Configuration newConfig) { + final View view = findViewById(android.R.id.content); + ViewTreeObserver observer = view.getViewTreeObserver(); + observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + //event when screen rotation is done + @Override + public void onGlobalLayout() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int height = containerView.getHeight(); + int width = containerView.getWidth(); + StyledPlayerView playerView = (StyledPlayerView) findViewById(R.id.player_view); + int widthPlayer = playerView.getWidth(); + int heightPlayer = playerView.getHeight(); + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, width, height, widthPlayer, heightPlayer, 0, 0); + } else { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, width, height, widthPlayer, heightPlayer, 0, 0); + } + view.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + }); + } ``` #### - clearInterActiveView - xóa view tương tác @@ -296,4 +362,4 @@ protected void onDestroy() { super.onDestroy(); ... } -``` \ No newline at end of file +``` diff --git a/DemoSigmaInteractiveAndroid/app/build.gradle b/DemoSigmaInteractiveAndroid/app/build.gradle index 5b04bb5..8e666b1 100644 --- a/DemoSigmaInteractiveAndroid/app/build.gradle +++ b/DemoSigmaInteractiveAndroid/app/build.gradle @@ -44,5 +44,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.google.android.exoplayer:exoplayer:2.17.0' implementation 'com.google.android.exoplayer:exoplayer-ui:2.17.0' + implementation 'com.auth0:java-jwt:3.19.2' implementation files('../libs/SigmaInteractiveSDK.aar') } \ No newline at end of file diff --git a/DemoSigmaInteractiveAndroid/app/src/main/AndroidManifest.xml b/DemoSigmaInteractiveAndroid/app/src/main/AndroidManifest.xml index 6cbb9c1..468f5a2 100644 --- a/DemoSigmaInteractiveAndroid/app/src/main/AndroidManifest.xml +++ b/DemoSigmaInteractiveAndroid/app/src/main/AndroidManifest.xml @@ -25,6 +25,12 @@ + + \ No newline at end of file diff --git a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/Constant.java b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/Constant.java new file mode 100644 index 0000000..6a709bd --- /dev/null +++ b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/Constant.java @@ -0,0 +1,25 @@ +package com.example.sigmainteractive; + +public class Constant { + static final String string = "string"; + static final String bool = "bool"; + static final String number = "number"; + static final String keyField = "key"; + static final String valueField = "value"; + static final String typeField = "type"; + static final String idField = "id"; + static final String expField = "exp"; + static final String roleField = "role"; + static final String roleUser = "user"; + static final String roleAdmin = "admin"; + static final String roleGuest = "guest"; + static final String appIdField = "appId"; + static final String userDataField = "userData"; + static final String keyUserRole = "userRole"; + static final String keyUserId = "userId"; + static final String keyChannelId = "channelId"; + static final String keyVideoLink = "videoLink"; + static final String keyUserData = "userData"; + static final String keySharePreferences = "app_shared_preferences"; + static final String keyAccessToken = "accessToken"; +} diff --git a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/ListChannel.java b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/ListChannel.java new file mode 100644 index 0000000..034a3ac --- /dev/null +++ b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/ListChannel.java @@ -0,0 +1,35 @@ +package com.example.sigmainteractive; + +public class ListChannel { + static final String baseUrlChannel = "https://dev-livestream.gviet.vn/manifest/"; + static final String vtv1Key = "vtv1"; + static final String vtv2Key = "vtv2"; + static final String vtv3Key = "vtv3"; + static final String vtv4Key = "vtv4"; + static public String getSource(String channelId) { + switch (channelId) { + case vtv1Key: + return baseUrlChannel + "VTV1-PACKAGE/master.m3u8"; + case vtv2Key: + return baseUrlChannel + "VTV2-PACKAGE/master.m3u8"; + case vtv3Key: + return baseUrlChannel + "VTV3-PACKAGE/master.m3u8"; + case vtv4Key: + return baseUrlChannel + "VTV4/master.m3u8"; + default: return ""; + } + } + static public String getId(String channelKey) { + switch (channelKey) { + case vtv1Key: + return "c9c2ebfb-2887-4de6-aec4-0a30aa848915"; + case vtv2Key: + return "32a55ed3-4ee1-42f8-819a-407b54a39923"; + case vtv3Key: + return "60346597-8ed9-48de-bd4d-8546d0070c7c"; + case vtv4Key: + return "22e1fdb6-8d10-4193-8411-562c7104aa2b"; + default: return "c9c2ebfb-2887-4de6-aec4-0a30aa848915"; + } + } +} diff --git a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/MainActivity.java b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/MainActivity.java index dd220ef..4b84e9b 100644 --- a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/MainActivity.java +++ b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/MainActivity.java @@ -2,34 +2,365 @@ import androidx.appcompat.app.AppCompatActivity; +import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; import android.os.Bundle; +import android.text.Editable; +import android.text.InputType; +import android.text.TextWatcher; import android.util.Log; +import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.TextView; import com.google.android.material.textfield.TextInputEditText; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + public class MainActivity extends AppCompatActivity { Button btnOpenPlayer; + Button btnGetChannel; + public String channelId = ListChannel.getId("vtv1"); + public String typeFiled = Constant.string; + public JSONArray dataUser = new JSONArray(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnOpenPlayer = findViewById(R.id.openPlayer); + btnGetChannel = findViewById(R.id.btnGetChannel); + TextInputEditText txtVideo = findViewById(R.id.txtLinkVideo); + txtVideo.setText(ListChannel.getSource(ListChannel.vtv1Key)); + checkAndShowBtnOpenWithOldConfig(); + } + public void checkAndShowBtnOpenWithOldConfig() { + TextInputEditText txtUid = findViewById(R.id.txtUid); + String accessTokenCache = SharePreferencesBase.getInstance(getApplicationContext()).getValue(Constant.keyAccessToken); + String userIdCache = SharePreferencesBase.getInstance(getApplicationContext()).getValue(Constant.keyUserId); + String userRoleCache = SharePreferencesBase.getInstance(getApplicationContext()).getValue(Constant.keyUserRole); + if(accessTokenCache != null && userIdCache != null && userRoleCache != null && accessTokenCache.length() > 0 && userIdCache.length() > 0 && userRoleCache.length() > 0) { + Button btnOpenOldConfig = findViewById(R.id.btnOpenWithOldConfig); + btnOpenOldConfig.setVisibility(View.VISIBLE); + txtUid.setText(userIdCache); + RadioGroup groupRoleUser = findViewById(R.id.groupRoleUser); + switch (userRoleCache) { + case Constant.roleAdmin: + groupRoleUser.check(R.id.roleAdmin); + break; + case Constant.roleGuest: + groupRoleUser.check(R.id.roleGuest); + break; + case Constant.roleUser: + groupRoleUser.check(R.id.roleUser); + break; + default:break; + } + } } - public void openPlayerActivity(View view) { TextInputEditText txtInput = findViewById(R.id.txtInputLink); TextInputEditText txtVideo = findViewById(R.id.txtLinkVideo); + TextInputEditText txtUid = findViewById(R.id.txtUid); Log.d("input link", txtInput.getText().toString()); String inputLinkInteractive = txtInput.getText().toString(); String inputVideoUrl = txtVideo.getText().toString(); Intent myIntent = new Intent(MainActivity.this, PlayerActivity.class); - if(inputLinkInteractive.length() > 0) { + if (inputLinkInteractive.length() > 0) { + myIntent.putExtra("interactiveLink", inputLinkInteractive); //Optional parameters + myIntent.putExtra("videoLink", inputVideoUrl); //Optional parameters + } + RadioGroup groupRoleUser = findViewById(R.id.groupRoleUser); + int idRole = groupRoleUser.getCheckedRadioButtonId(); + String userRole = Constant.roleUser; + switch (idRole) { + case R.id.roleAdmin: + userRole = Constant.roleAdmin; + break; + case R.id.roleGuest: + userRole = Constant.roleGuest; + break; + default:break; + } + long exp = System.currentTimeMillis() + 30*24*60*60*1000; + String token = TokenManager.genToken(String.valueOf(txtUid.getText()), userRole, exp, dataUser, getApplicationContext()); + myIntent.putExtra(Constant.keyUserRole, userRole); + myIntent.putExtra(Constant.keyUserId, String.valueOf(txtUid.getText())); + myIntent.putExtra(Constant.keyChannelId, channelId); + myIntent.putExtra(Constant.keyUserData, dataUser.toString()); + MainActivity.this.startActivity(myIntent); + checkAndShowBtnOpenWithOldConfig(); + } + public void openPlayerWithOldConfig(View view) { + TextInputEditText txtInput = findViewById(R.id.txtInputLink); + TextInputEditText txtVideo = findViewById(R.id.txtLinkVideo); + String inputLinkInteractive = txtInput.getText().toString(); + String inputVideoUrl = txtVideo.getText().toString(); + Intent myIntent = new Intent(MainActivity.this, PlayerActivity.class); + if (inputLinkInteractive.length() > 0) { myIntent.putExtra("interactiveLink", inputLinkInteractive); //Optional parameters myIntent.putExtra("videoLink", inputVideoUrl); //Optional parameters + myIntent.putExtra(Constant.keyChannelId, channelId); + myIntent.putExtra(Constant.keyUserData, SharePreferencesBase.getInstance(getApplicationContext()).getUserData()); + myIntent.putExtra(Constant.keyUserRole, SharePreferencesBase.getInstance(getApplicationContext()).getUserRole()); + myIntent.putExtra(Constant.keyUserId, SharePreferencesBase.getInstance(getApplicationContext()).getUserId()); } MainActivity.this.startActivity(myIntent); } + @SuppressLint("ResourceAsColor") + public void addFieldDataUser() { + try { + int idView = View.generateViewId(); + LinearLayout containerUserData = findViewById(R.id.containerUserData); + LinearLayout containerUserField = new LinearLayout(this); + containerUserField.setId(idView); + containerUserField.setOrientation(LinearLayout.VERTICAL); + containerUserField.setGravity(Gravity.CENTER_HORIZONTAL); + //wrap input + LinearLayout wrapUserField = new LinearLayout(this); + wrapUserField.setOrientation(LinearLayout.HORIZONTAL); + //left + LinearLayout wrapUserFieldLeft = new LinearLayout(this); + wrapUserFieldLeft.setOrientation(LinearLayout.VERTICAL); + LinearLayout.LayoutParams paramField = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, + 1.0f + ); + wrapUserFieldLeft.setLayoutParams(paramField); + TextView titleLeft = new TextView(this); + titleLeft.setText("Key"); + TextInputEditText txtInputKey = new TextInputEditText(this); + txtInputKey.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); + wrapUserFieldLeft.addView(titleLeft); + wrapUserFieldLeft.addView(txtInputKey); + //right + LinearLayout wrapUserFieldRight = new LinearLayout(this); + wrapUserFieldRight.setOrientation(LinearLayout.VERTICAL); + wrapUserFieldRight.setLayoutParams(paramField); + TextView titleRight = new TextView(this); + titleRight.setText("Value"); + wrapUserFieldRight.addView(titleRight); + txtInputKey.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + Log.d("onTextChanged=>", String.valueOf(s)); + changeFieldUser(idView, Constant.keyField, String.valueOf(s), 0, false, true); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + switch (typeFiled) { + case Constant.bool: + RadioGroup listValue = new RadioGroup(this); + listValue.setOrientation(LinearLayout.HORIZONTAL); + listValue.setLayoutParams(paramField); + listValue.setGravity(Gravity.CENTER_HORIZONTAL); + RadioButton itemTrue = new RadioButton(this); + RadioGroup.LayoutParams paramsItemTrue = new RadioGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + paramsItemTrue.setMargins(0, 0, 15, 0); + itemTrue.setLayoutParams(paramsItemTrue); + itemTrue.setText("True"); + int idItemTrue = View.generateViewId(); + itemTrue.setId(idItemTrue); + itemTrue.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + Log.d("onCheckedChanged=>true", String.valueOf(isChecked)); +// changeFieldUser(idView, Constant.valueField, "", 0, true, false); + } + }); + //item false + RadioButton itemFalse = new RadioButton(this); + int idItemFalse = View.generateViewId(); + itemFalse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + Log.d("onCheckedChanged=>false", String.valueOf(isChecked)); +// changeFieldUser(idView, Constant.valueField, "", 0, false, false); + } + }); + itemFalse.setText("False"); + itemFalse.setId(idItemFalse); + listValue.addView(itemTrue); + listValue.addView(itemFalse); + listValue.check(idItemTrue); + wrapUserFieldRight.addView(listValue); + listValue.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + Log.d("onCheckedChanged=>root", String.valueOf(checkedId)); + changeFieldUser(idView, Constant.valueField, "", 0, checkedId != idItemFalse, false); + } + }); + break; + case Constant.string: + case Constant.number: + TextInputEditText txtInputValue = new TextInputEditText(this); + txtInputValue.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); + if(typeFiled.equals(Constant.number)) { + txtInputValue.setInputType(InputType.TYPE_CLASS_NUMBER); + } + txtInputValue.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + Log.d("onTextChanged=>", String.valueOf(s)); + changeFieldUser(idView, Constant.valueField, typeFiled.equals(Constant.string) ? String.valueOf(s) : "", typeFiled.equals(Constant.number) ? Integer.parseInt(String.valueOf(s)) : 0, false, false); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + wrapUserFieldRight.addView(txtInputValue); + break; + default: + break; + } + //button delete + LinearLayout.LayoutParams paramsButton = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ); + paramsButton.setMargins(0, 10, 0, 20); + Button buttonDelete = new Button(this); + buttonDelete.setText("Delete"); + buttonDelete.setWidth(50); + buttonDelete.setLayoutParams(paramsButton); + buttonDelete.setBackgroundColor(getResources().getColor(R.color.red)); + GradientDrawable shape = new GradientDrawable(); + shape.setCornerRadius(8); + shape.setColor(Color.RED); + buttonDelete.setBackground(shape); + buttonDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try { + int indexDelete = 0; + for(int i=0; iAlertDialog.Builder with its constructor + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + +// 2. Chain together various setter methods to set the dialog characteristics + final CharSequence[] items = {Constant.string, Constant.bool, Constant.number}; + builder.setTitle("Select type").setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Log.d("onClick=>", String.valueOf(items[which])); + typeFiled = String.valueOf(items[which]); + addFieldDataUser(); + } + }); +// 3. Get the AlertDialog from create() + AlertDialog dialog = builder.create(); + dialog.show(); + } + + public void openListChannel(View view) { + // 1. Instantiate an AlertDialog.Builder with its constructor + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + +// 2. Chain together various setter methods to set the dialog characteristics + final CharSequence[] items = {ListChannel.vtv1Key, ListChannel.vtv2Key, ListChannel.vtv3Key, ListChannel.vtv4Key}; + builder.setTitle("Select channel").setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Log.d("onClick=>", String.valueOf(items[which])); + String source = ListChannel.getSource((String) items[which]); + channelId = ListChannel.getId((String) items[which]); + Log.d("source=>", source); + TextInputEditText txtVideo = findViewById(R.id.txtLinkVideo); + txtVideo.setText(source); + } + }); +// 3. Get the AlertDialog from create() + AlertDialog dialog = builder.create(); + dialog.show(); + } } diff --git a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/PlayerActivity.java b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/PlayerActivity.java index 549e452..6d75cc0 100644 --- a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/PlayerActivity.java +++ b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/PlayerActivity.java @@ -10,13 +10,17 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; +import android.graphics.Rect; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; +import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; @@ -27,20 +31,23 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.id3.TextInformationFrame; import com.google.android.exoplayer2.ui.StyledPlayerView; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.util.Calendar; +import java.util.HashMap; import java.util.Set; -public class PlayerActivity extends Activity { +public class PlayerActivity extends Activity implements Player.Listener { View containerView; - // private static boolean DEBUG = false; - public static final String VERSION = "2.0.0"; + public static final String VERSION = "3.0.0"; private static final String HTML_SDK = "https://dev-livestream.gviet.vn/ilp-statics/[SDK_VERSION]/android-mobile-interactive.html"; private static String sourcePlay = "https://dev-livestream.gviet.vn/manifest/VTV2-PACKAGE/master.m3u8"; ExoPlayer player; @@ -50,9 +57,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - // setContentView(R.layout.activity_player); containerView = this.findViewById(android.R.id.content); +// setKeyboardVisibilityListener(this); isPlaying = false; DefaultRenderersFactory renderersFactory = new SigmaRendererFactory(getApplicationContext(), new SigmaRendererFactory.Id3ParsedListener() { @Override @@ -97,41 +104,107 @@ public void onMetadata(AnalyticsListener.EventTime eventTime, Metadata metadata) }); StyledPlayerView playerView = (StyledPlayerView) findViewById(R.id.player_view); playerView.setPlayer(player); + sourcePlay = getKeyParams(Constant.keyVideoLink); + setupPlayer(); + } + public String getKeyParams(String key) { + Log.d("getKeyParams=>", key); Bundle params = getIntent().getExtras(); - if (params != null && params.getString("videoLink").length() > 0) { - sourcePlay = params.getString("videoLink"); + if (params != null && params.getString(key).length() > 0) { + return params.getString(key); + } + return ""; + } + @Override + public void onIsPlayingChanged(boolean isPlaying) { + Player.Listener.super.onIsPlayingChanged(isPlaying); + } + + @Override + public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { + Player.Listener.super.onPlayerStateChanged(playWhenReady, playbackState); + Log.d("onPlayerStateChanged=>", String.valueOf(playbackState)); + if(playbackState == Player.STATE_READY && SigmaInteractiveHelper.getInstance(PlayerActivity.this).interactiveView == null) { + Log.d("onPlayerStateChanged=>", "ready"); + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int height = displayMetrics.heightPixels; + int width = displayMetrics.widthPixels; + StyledPlayerView playerView = (StyledPlayerView) findViewById(R.id.player_view); + int widthPlayer = playerView.getWidth(); + int heightPlayer = playerView.getHeight(); + this.openInteractiveView(0, 0, width, height, widthPlayer, heightPlayer, 0, 0); } - setupPlayer(); } @Override public void onConfigurationChanged(Configuration newConfig) { - Log.d("onConfigurationChanged", String.valueOf(newConfig.orientation)); super.onConfigurationChanged(newConfig); - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, containerView.getLayoutParams().width, containerView.getLayoutParams().height, containerView.getLayoutParams().width, containerView.getLayoutParams().height, 0, 0); - } else { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, containerView.getLayoutParams().width, containerView.getLayoutParams().height, containerView.getLayoutParams().width, containerView.getLayoutParams().height, 0, 0); - } + setLayoutInteractive(newConfig); + } + public void setLayoutInteractive(Configuration newConfig) { + final View view = findViewById(android.R.id.content); + ViewTreeObserver observer = view.getViewTreeObserver(); + observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int height = containerView.getHeight(); + int width = containerView.getWidth(); + StyledPlayerView playerView = (StyledPlayerView) findViewById(R.id.player_view); + int widthPlayer = playerView.getWidth(); + int heightPlayer = playerView.getHeight(); + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, width, height, widthPlayer, heightPlayer, 0, 0); + } else { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).setLayoutInteractiveView(0, 0, width, height, widthPlayer, heightPlayer, 0, 0); + } + view.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + }); } private void setupPlayer(){ Uri videoUri = Uri.parse(sourcePlay); MediaItem mediaItem = MediaItem.fromUri(videoUri); // Set the media item to be played. player.setMediaItem(mediaItem); + player.addListener(this); // Prepare the player. player.prepare(); // Start the playback. player.play(); + player.setPlayWhenReady(true); isPlaying = true; - DisplayMetrics displayMetrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - int height = displayMetrics.heightPixels; - int width = displayMetrics.widthPixels; - this.openInteractiveView(0, 0, width, height, width, height, 0, 0, null); } - - private void openInteractiveView(int xInteractiveView, int yInteractiveView, int widthInteractiveView, int heightInteractiveView, int widthPlayer, int heightPlayer, int xPlayer, int yPlayer, Bundle userData) { + public String getNewToken() throws JSONException { + try { + String userRole = getKeyParams(Constant.keyUserRole); + String userId = getKeyParams(Constant.keyUserId); + String dataUserString = getKeyParams(Constant.keyUserData); + return TokenManager.genToken(userId, userRole, System.currentTimeMillis() + 30*24*60*60*1000, new JSONArray(dataUserString), getApplicationContext()); + } catch (JSONException e) { + e.printStackTrace(); + } + return ""; + } + public JSONObject getDataSend(boolean isRefreshToken) { + JSONObject dataSend = null; + try { + dataSend = new JSONObject("{}"); + if(!getKeyParams(Constant.keyUserRole).equals(Constant.roleGuest)) { + String tokenSend = isRefreshToken ? getNewToken() : TokenManager.getTokenCache(getApplicationContext()); + dataSend.put("token", tokenSend); + } + dataSend.put("channelId", getKeyParams(Constant.keyChannelId)); + dataSend.put("overlay", true); + dataSend.put("panel", true); + } catch (JSONException err){ + Log.d("Error", err.toString()); + } + return dataSend; + } + private void openInteractiveView(int xInteractiveView, int yInteractiveView, int widthInteractiveView, int heightInteractiveView, int widthPlayer, int heightPlayer, int xPlayer, int yPlayer) { if (containerView == null) return; Bundle params = getIntent().getExtras(); String interactiveLink = ""; // or other values @@ -144,21 +217,17 @@ private void openInteractiveView(int xInteractiveView, int yInteractiveView, int //Sự kiện khi sdk tương tác sẵn sàng @Override public void onReady() { - JSONObject userDataSend = new JSONObject(); - if (userData != null) { - Set keys = userData.keySet(); - for (String key : keys) { - try { - userDataSend.put(key, JSONObject.wrap(userData.get(key))); - } catch (JSONException e) { - e.printStackTrace(); - } - } - } SigmaWebView interactiveView = SigmaInteractiveHelper.getInstance(PlayerActivity.this).getInteractiveView(); - Log.d("onReady=>", userDataSend.toString()); if (interactiveView != null) { - SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(userData != null ? userDataSend.toString() : "{}"); + JSONObject dataSend = getDataSend(false); + Runnable sendData = new Runnable() { + @Override + public void run() { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(dataSend); + } + }; + Handler mHandler = new Handler(); + mHandler.post(sendData); } } @@ -191,23 +260,47 @@ public void onExitFullScreen() { Log.d("PlayerActivity=>", "onExitFullScreen"); PlayerActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } + //Sự kiện khi hệ thống tương tác yêu cầu gửi lại data + @Override + public void fullReload() { + //get datasend with new token + JSONObject newDataSend = getDataSend(true); + Runnable sendData = new Runnable() { + @Override + public void run() { + SigmaInteractiveHelper.getInstance(PlayerActivity.this).sendOnReadyBack(newDataSend); + } + }; + Handler mHandler = new Handler(); + mHandler.post(sendData); + } + + @Override + public void setSession(String session) { + Log.d("setSession=>", session); + } }; SigmaInteractiveHelper.getInstance(PlayerActivity.this).openInteractiveView(xInteractiveView, yInteractiveView, widthInteractiveView, heightInteractiveView, url, sigmaWebviewCallback, widthPlayer, heightPlayer, xPlayer, yPlayer); } @Override protected void onDestroy() { + Log.d("onPlayerStateChanged=>", "onDestroy"); + SigmaInteractiveHelper.getInstance(PlayerActivity.this).clearInterActiveView(); player.release(); isPlaying = false; - SigmaInteractiveHelper.getInstance(PlayerActivity.this).clearInterActiveView(); super.onDestroy(); } @Override protected void onPause() { - // simpleExoPlayer.setPlayWhenReady(false); - player.release(); isPlaying = false; super.onPause(); } + @Override + protected void onStop() { + isPlaying = false; + super.onStop(); + } + } \ No newline at end of file diff --git a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/SharePreferencesBase.java b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/SharePreferencesBase.java new file mode 100644 index 0000000..5455378 --- /dev/null +++ b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/SharePreferencesBase.java @@ -0,0 +1,58 @@ +package com.example.sigmainteractive; + +import android.content.Context; +import android.content.SharedPreferences; + +public class SharePreferencesBase { + private static SharePreferencesBase INSTANCE = null; + public static SharedPreferences mSharedPreferences = null; + public static String userId = ""; + public static String userRole = ""; + public static String userData = ""; + public static String accessToken = ""; + + public static SharePreferencesBase getInstance(Context context) { + if (INSTANCE == null) { + INSTANCE = new SharePreferencesBase(context); + } + return INSTANCE; + } + + public String getUserId() { + return getValue(Constant.keyUserId); + } + + public String getUserRole() { + return getValue(Constant.keyUserRole); + } + + public String getUserData() { + return getValue(Constant.keyUserData); + } + + public String getAccessToken() { + return getValue(Constant.keyAccessToken); + } + + public SharePreferencesBase(Context context) { + mSharedPreferences = context.getSharedPreferences(Constant.keySharePreferences, Context.MODE_PRIVATE); + userId = this.getValue(Constant.keyUserId); + accessToken = this.getValue(Constant.keyAccessToken); + userRole = this.getValue(Constant.keyUserRole); + userData = this.getValue(Constant.keyUserData); + } + + public String getValue(String name) { + return mSharedPreferences.getString(name, null); + } + + public void setValue(String name, String value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putString(name, value).apply(); + } + public void deleteKey(String key) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.remove(key).apply(); + } + +} diff --git a/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/TokenManager.java b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/TokenManager.java new file mode 100644 index 0000000..47091af --- /dev/null +++ b/DemoSigmaInteractiveAndroid/app/src/main/java/com/example/sigmainteractive/TokenManager.java @@ -0,0 +1,81 @@ +package com.example.sigmainteractive; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.util.Log; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTCreator; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTCreationException; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.Map; + +public class TokenManager { + static public final String key = "abd89b50-d760-4a97-bb24-0a44881fc04a"; + static public String genToken(String userId, String userRole, long exp, JSONArray userData, Context context) { + String token = ""; + Log.d("genToken=>", userId); + Log.d("genToken=>", userRole); + Map payloadClaims = new HashMap<>(); + payloadClaims.put(Constant.idField, userId); + payloadClaims.put(Constant.expField, exp); + payloadClaims.put(Constant.roleField, userRole); + SharePreferencesBase.getInstance(context).setValue(Constant.keyUserRole, userRole); + SharePreferencesBase.getInstance(context).setValue(Constant.keyUserId, userId); + try { + ApplicationInfo app = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); + payloadClaims.put(Constant.appIdField, app.metaData.getString("com.sigma.interactive.sdk.appId")); + Algorithm algorithm = Algorithm.HMAC256(key); + JWTCreator.Builder builder = JWT.create(); + Map payloadUserData = new HashMap<>(); + for(int i=0; i 0) { + switch (itemField.getString(Constant.typeField)) { + case Constant.string: + String valueField = itemField.getString(Constant.valueField); + if(valueField.length() > 0) { + payloadUserData.put(itemField.getString(Constant.keyField), itemField.getString(Constant.valueField)); + } + break; + case Constant.number: + payloadUserData.put(itemField.getString(Constant.keyField), itemField.getInt(Constant.valueField)); + break; + case Constant.bool: + payloadUserData.put(itemField.getString(Constant.keyField), itemField.getBoolean(Constant.valueField)); + break; + default:break; + } + } + } + Log.d("payloadUserData=>", String.valueOf(payloadUserData.size())); + if(payloadUserData.size() > 0) { + payloadClaims.put(Constant.userDataField, payloadUserData); + SharePreferencesBase.getInstance(context).setValue(Constant.keyUserData, userData.toString()); + } else { + SharePreferencesBase.getInstance(context).deleteKey(Constant.keyUserData); + } + token = builder.withPayload(payloadClaims).sign(algorithm); + } catch (JWTCreationException | JSONException| PackageManager.NameNotFoundException exception){ + //Invalid Signing configuration / Couldn't convert Claims. + } + Log.d("TokenGenerate=>", token); + setTokenCache(token, context); + return token; + } + static public void setTokenCache(String token, Context context) { + SharePreferencesBase.getInstance(context).setValue(Constant.keyAccessToken, token); + } + static public String getTokenCache(Context context) { + return SharePreferencesBase.getInstance(context).getValue(Constant.keyAccessToken); + } +} diff --git a/DemoSigmaInteractiveAndroid/app/src/main/res/layout/activity_main.xml b/DemoSigmaInteractiveAndroid/app/src/main/res/layout/activity_main.xml index 9118b5d..fc0d05a 100644 --- a/DemoSigmaInteractiveAndroid/app/src/main/res/layout/activity_main.xml +++ b/DemoSigmaInteractiveAndroid/app/src/main/res/layout/activity_main.xml @@ -21,77 +21,225 @@ android:layout_height="match_parent" android:keepScreenOn="true"> - + android:layout_height="match_parent"> - + android:layout_height="match_parent"> - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - -