Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions FullDemo/playkitdemo/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kaltura.playkitdemo">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


<application
android:networkSecurityConfig="@xml/network_security_config"
Expand All @@ -29,6 +33,15 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package com.kaltura.playkitdemo;

import android.Manifest;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
Expand All @@ -22,10 +28,12 @@
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;

import com.google.ads.interactivemedia.v3.api.StreamRequest;
import com.google.gson.JsonObject;
Expand Down Expand Up @@ -73,7 +81,6 @@
import com.kaltura.playkit.plugins.ott.PhoenixAnalyticsConfig;
import com.kaltura.playkit.plugins.ott.PhoenixAnalyticsEvent;
import com.kaltura.playkit.plugins.ott.PhoenixAnalyticsPlugin;
import com.kaltura.playkit.plugins.playback.CustomPlaybackRequestAdapter;
import com.kaltura.playkit.plugins.playback.KalturaPlaybackRequestAdapter;
import com.kaltura.playkit.plugins.playback.KalturaUDRMLicenseRequestAdapter;
import com.kaltura.playkit.plugins.youbora.YouboraPlugin;
Expand All @@ -88,12 +95,12 @@
import com.kaltura.playkit.utils.Consts;
import com.kaltura.playkitvr.VRUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

import static com.kaltura.playkit.plugins.youbora.pluginconfig.YouboraConfig.KEY_CONTENT_METADATA_CAST;
Expand Down Expand Up @@ -144,7 +151,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
private static final PKLog log = PKLog.get("MainActivity");
public static final String IMA_PLUGIN = "IMA";
public static final String DAI_PLUGIN = "DAI";
public static int READ_EXTERNAL_STORAGE_PERMISSIONS_REQUEST = 123;
public static int STORAGE_PERMISSIONS_REQUEST_CODE = 123;
public static int changeMediaIndex = -1;
public static Long START_POSITION = 0L;

Expand All @@ -170,7 +177,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
private OrientationManager mOrientationManager;
private boolean userIsInteracting;
private PKTracks tracksInfo;
private boolean isAdsEnabled = true;
private boolean isAdsEnabled = false;
private boolean isDAIMode = false;

//Youbora analytics Constants
Expand Down Expand Up @@ -206,6 +213,11 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
public static final String DEVICE_CODE = "your_device_code";

private ExoPlayerWrapper.LoadControlStrategy loadControlStrategy;
private String logFileName = "PlaykitLogs.txt";

// Turn this true to start logcat logging
private boolean enableLogsCapturing = true;
private Process logsCapturingProcess = null;

static {
PKHttpClientManager.setHttpProvider("okhttp");
Expand All @@ -219,8 +231,10 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getPermissionToReadExternalStorage();
initDrm();
if (enableLogsCapturing) {
getPermissionToStorage();
}
/*try {
ProviderInstaller.installIfNeeded(this);
} catch (GooglePlayServicesRepairableException e) {
Expand Down Expand Up @@ -305,41 +319,149 @@ public void onClick(View v) {
});
}

private void getPermissionToReadExternalStorage() {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (enableLogsCapturing) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return true;
}
return false;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.start_logging:
if (logsCapturingProcess == null) {
appendLogsToFile();
} else {
promptMessage("", "Logs are already being captured");
}
return true;
case R.id.send_email:
sendLogsToEmail();
return true;
case R.id.stop_logging:
if (logsCapturingProcess != null) {
stopLogging();
} else {
promptMessage("", "No log capture process found.");
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
private void appendLogsToFile() {
try {
PKLog.setGlobalLevel(PKLog.Level.verbose);
File filePath = new File(Environment.getExternalStorageDirectory() + File.separator + logFileName);
if (filePath.exists()) {
filePath.delete();
}
boolean fileName = filePath.createNewFile();
if (fileName) {
Runtime.getRuntime().exec("logcat -b all -c");
String cmd = "logcat -f" + filePath.getAbsolutePath();
logsCapturingProcess = Runtime.getRuntime().exec(cmd);
promptMessage("", "Logging Started..");
}
} catch (IOException e) {
PKLog.setGlobalLevel(PKLog.Level.debug);
e.printStackTrace();
}
}

private void stopLogging() {
PKLog.setGlobalLevel(PKLog.Level.debug);
if (logsCapturingProcess != null) {
logsCapturingProcess.destroy();
logsCapturingProcess = null;
promptMessage("", "Logging Stopped..");
}
}

private void getPermissionToStorage() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {

if (ActivityCompat.shouldShowRequestPermissionRationale(
this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
|| ActivityCompat.shouldShowRequestPermissionRationale(
this, Manifest.permission.READ_EXTERNAL_STORAGE)) {

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Read External Storage and Write External Storage" +
" Storage permissions are required to do the task.");
builder.setTitle("Please grant those permissions");
builder.setPositiveButton("OK", (dialogInterface, i) -> ActivityCompat.requestPermissions(
MainActivity.this,
new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
},
STORAGE_PERMISSIONS_REQUEST_CODE
));
builder.setNeutralButton("Cancel",null);
AlertDialog dialog = builder.create();
dialog.show();
} else {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
STORAGE_PERMISSIONS_REQUEST_CODE
);
}
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
READ_EXTERNAL_STORAGE_PERMISSIONS_REQUEST);
}
}

// Callback with the request from calling requestPermissions(...)
// Callback with the request from calling getPermissionToStorage(...)
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[],
@NonNull int[] grantResults) {
// Make sure it's our original READ_CONTACTS request
if (requestCode == READ_EXTERNAL_STORAGE_PERMISSIONS_REQUEST) {
if (grantResults.length == 1 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Read Storage permission granted", Toast.LENGTH_SHORT).show();
if (requestCode == STORAGE_PERMISSIONS_REQUEST_CODE) {
if ((grantResults.length > 0) && (grantResults[0] + grantResults[1] == PackageManager.PERMISSION_GRANTED)) {
promptMessage("", "Permissions granted.");
} else {
boolean showRationale = ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
if (showRationale) {
// do something here to handle degraded mode
} else {
Toast.makeText(this, "Read Storage permission denied", Toast.LENGTH_SHORT).show();
}
promptMessage("", "Permissions denied.");
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

public void sendLogsToEmail() {
if (logsCapturingProcess != null) {
promptMessage("", "Please stop the logging.");
return;
}

try {
final Intent emailIntent = new Intent();
emailIntent.setAction(Intent.ACTION_SEND);
emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("vnd.android.cursor.dir/email");
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"your_email_address@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Sending Playkit Logs");
File filePath = new File(Environment.getExternalStorageDirectory() + File.separator + logFileName);
if (filePath.exists()) {
Uri fileURI = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", filePath);
emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, fileURI);
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Sending playkit logs");
this.startActivity(Intent.createChooser(emailIntent, "Sending email..."));
} else {
promptMessage("" , "There is no log file. Please start the session to capture logs.");
}
} catch (Throwable t) {
promptMessage("Request failed try again:" , t.toString());
}
}

private void registerPlugins() {

Expand All @@ -366,7 +488,7 @@ public void run() {
//onMediaLoaded(listodmedia.get(1));
}
} else {
Toast.makeText(MainActivity.this, "failed to fetch media data: " + (response.getError() != null ? response.getError().getMessage() : ""), Toast.LENGTH_LONG).show();
promptMessage("failed to fetch media data: ", (response.getError() != null ? response.getError().getMessage() : ""));
log.e("failed to fetch media data: " + (response.getError() != null ? response.getError().getMessage() : ""));
}
}
Expand Down Expand Up @@ -525,7 +647,6 @@ public int partnerId() {
}

private void onMediaLoaded(PKMediaEntry mediaEntry) {

if (mediaEntry.getMediaType() != PKMediaEntry.MediaEntryType.Vod) {
START_POSITION = null; // force live streams to play from live edge
}
Expand Down Expand Up @@ -1050,6 +1171,7 @@ protected void onPause() {

@Override
public void onDestroy() {
stopLogging();
if (player != null) {
player.removeListeners(this);
player.destroy();
Expand Down
10 changes: 10 additions & 0 deletions FullDemo/playkitdemo/src/main/res/menu/menu_main.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/start_logging"
android:title="@string/start_logging"/>
<item android:id="@+id/send_email"
android:title="@string/send_email" />
<item android:id="@+id/stop_logging"
android:title="@string/stop_logging" />
</menu>
3 changes: 3 additions & 0 deletions FullDemo/playkitdemo/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,7 @@
<string name="video">Video</string>
<string name="audio">Audio</string>
<string name="cc">CC</string>
<string name="start_logging">Start Logging</string>
<string name="stop_logging">Stop Logging</string>
<string name="send_email">Send Email</string>
</resources>
4 changes: 2 additions & 2 deletions FullDemo/playkitdemo/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">true</item>
<item name="windowNoTitle">false</item>
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
Expand Down
4 changes: 4 additions & 0 deletions FullDemo/playkitdemo/src/main/res/xml/provider_paths.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>