package com.kaltura.dtgplayer;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import com.kaltura.dtg.ContentManager;
import com.kaltura.dtg.DownloadItem;
import com.kaltura.dtg.DownloadState;
import com.kaltura.dtg.DownloadStateListener;
import com.kaltura.playersdk.KPPlayerConfig;
import com.kaltura.playersdk.LocalAssetsManager;
import com.kaltura.playersdk.PlayerViewController;
import com.kaltura.playersdk.events.KPErrorEventListener;
import com.kaltura.playersdk.events.KPStateChangedEventListener;
import com.kaltura.playersdk.events.KPlayerState;
import com.kaltura.playersdk.types.KPError;
import com.kaltura.playersdk.utils.Utilities;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class MainActivity extends AppCompatActivity implements KPErrorEventListener, KPStateChangedEventListener {
private static final String TAG = "MainActivity";
private PlayerViewController mPlayer;
private ViewGroup mPlayerContainer;
private boolean mPlayerDetached;
private Item mSelectedItem;
private ContentManager mContentManager;
private PlayerViewController.SourceURLProvider mSourceURLProvider = new PlayerViewController.SourceURLProvider() {
@Override
public String getURL(String entryId, String currentURL) {
String playbackURL = mContentManager.getPlaybackURL(entryId);
return playbackURL;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
loadItems();
mPlayerContainer = (ViewGroup) findViewById(R.id.layout_player_container);
mContentManager = ContentManager.getInstance(this);
DownloadStateListener downloadStateListener = new DownloadStateListener() {
@Override
public void onDownloadComplete(DownloadItem item) {
}
@Override
public void onProgressChange(DownloadItem item, long downloadedBytes) {
}
@Override
public void onDownloadStart(DownloadItem item) {
}
@Override
public void onDownloadPause(DownloadItem item) {
}
@Override
public void onDownloadStop(DownloadItem item) {
}
@Override
public void onDownloadMetadata(DownloadItem item, Exception error) {
DownloadItem.TrackSelector trackSelector = item.getTrackSelector();
List<DownloadItem.Track> downloadedVideoTracks = trackSelector.getDownloadedTracks(DownloadItem.TrackType.VIDEO);
List<DownloadItem.Track> availableTracks = trackSelector.getAvailableTracks(DownloadItem.TrackType.AUDIO);
if (availableTracks.size() > 0) {
trackSelector.setSelectedTracks(DownloadItem.TrackType.AUDIO, availableTracks);
}
try {
trackSelector.apply();
} catch (IOException e) {
e.printStackTrace();
}
item.startDownload();
}
@Override
public void onTracksAvailable(DownloadItem item, DownloadItem.TrackSelector trackSelector) {
// Select lowest-resolution video
List<DownloadItem.Track> videoTracks = trackSelector.getAvailableTracks(DownloadItem.TrackType.VIDEO);
DownloadItem.Track minVideo = Collections.min(videoTracks, DownloadItem.Track.bitrateComparator);
trackSelector.setSelectedTracks(DownloadItem.TrackType.VIDEO, Collections.singletonList(minVideo));
}
};
mContentManager.addDownloadStateListener(downloadStateListener);
mContentManager.start();
setButtonAction(R.id.btn_download, new View.OnClickListener() {
@Override
public void onClick(View v) {
DownloadItem item = mContentManager.createItem(mSelectedItem.getDownloadItemId(), mSelectedItem.contentUrl);
if (item == null) {
uiLog("Already exists");
item = mContentManager.findItem(mSelectedItem.getDownloadItemId());
}
if (item != null) {
item.loadMetadata();
}
}
});
setButtonAction(R.id.btn_register, new View.OnClickListener() {
@Override
public void onClick(View v) {
DownloadItem downloadItem = mSelectedItem.findDownloadItem();
if (downloadItem == null || downloadItem.getState() != DownloadState.COMPLETED) {
uiLog("Content is not downloaded");
return;
}
KPPlayerConfig config = mSelectedItem.config;
LocalAssetsManager.registerAsset(MainActivity.this, config, null, mSelectedItem.getLocalPath(), new LocalAssetsManager.AssetRegistrationListener() {
@Override
public void onRegistered(String assetPath) {
uiLog("Register successful", null);
}
@Override
public void onFailed(String assetPath, Exception error) {
uiLog("Register failed", error);
}
});
}
});
setButtonAction(R.id.btn_play, new View.OnClickListener() {
@Override
public void onClick(View v) {
getPlayer();//.getMediaControl().start();
}
});
setButtonAction(R.id.btn_detach, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPlayer != null) {
mPlayerContainer.removeView(mPlayer);
mPlayerDetached = true;
}
}
});
setButtonAction(R.id.btn_status, new View.OnClickListener() {
@Override
public void onClick(View v) {
LocalAssetsManager.checkAssetStatus(MainActivity.this, mSelectedItem.getLocalPath(), new LocalAssetsManager.AssetStatusListener() {
@Override
public void onStatus(String assetPath, long expiryTimeSeconds, long availableTimeSeconds) {
uiLog("expiryTime:" + expiryTimeSeconds);
}
});
}
});
setButtonAction(R.id.btn_unregister, new View.OnClickListener() {
@Override
public void onClick(View v) {
LocalAssetsManager.unregisterAsset(MainActivity.this, mSelectedItem.config, mSelectedItem.getLocalPath(), new LocalAssetsManager.AssetRemovalListener() {
@Override
public void onRemoved(String assetPath) {
Log.d(TAG, "Removed " + assetPath);
}
});
}
});
}
private PlayerViewController getPlayer() {
KPPlayerConfig config = mSelectedItem.config;
if (mPlayer == null) {
mPlayer = new PlayerViewController(this);
mPlayerContainer.addView(mPlayer, new ViewGroup.LayoutParams(mPlayerContainer.getLayoutParams()));
mPlayer.loadPlayerIntoActivity(this);
mPlayer.initWithConfiguration(config);
mPlayer.setCustomSourceURLProvider(mSourceURLProvider);
mPlayer.setOnKPErrorEventListener(this);
mPlayer.setOnKPStateChangedEventListener(this);
} else {
if (mPlayerDetached) {
mPlayerContainer.addView(mPlayer, new ViewGroup.LayoutParams(mPlayerContainer.getLayoutParams()));
mPlayerDetached = false;
}
mPlayer.changeConfiguration(config);
}
return mPlayer;
}
void setButtonAction(int buttonId, View.OnClickListener clickListener) {
Button button = (Button) findViewById(buttonId);
assert button != null;
button.setOnClickListener(clickListener);
}
void uiLog(Object obj) {
uiLog(obj, null);
}
void uiLog(Object obj, Exception e) {
final String text = obj == null ? "<null>" : obj.toString();
final TextView textView = ((TextView) findViewById(R.id.txt_log));
assert textView != null;
Log.d(TAG, text, e);
textView.post(new Runnable() {
@Override
public void run() {
textView.append(text + "\n\n");
}
});
}
@Override
public void onKPlayerStateChanged(PlayerViewController playerViewController, KPlayerState state) {
uiLog("onKPlayerStateChanged:" + state);
}
@Override
public void onKPlayerError(PlayerViewController playerViewController, KPError error) {
uiLog("onKPlayerError", error.getException());
}
class Item {
KPPlayerConfig config;
String contentUrl;
String name;
Item(KPPlayerConfig config, String contentUrl, String name) {
this.config = config;
this.contentUrl = contentUrl;
this.name = name;
}
@Override
public String toString() {
String status = isDownloaded() ? "downloaded" : "online";
return name + " - " + status;
}
boolean isDownloaded() {
DownloadItem item = findDownloadItem();
return item != null && item.getState() == DownloadState.COMPLETED;
}
DownloadItem findDownloadItem() {
return mContentManager.findItem(getDownloadItemId());
}
String getLocalPath() {
return mContentManager.getLocalFile(getDownloadItemId()).getAbsolutePath();
}
private String getDownloadItemId() {
return config.getEntryId();
}
}
String getString(JSONObject jsonObject, String key) {
return jsonObject.isNull(key) ? null : jsonObject.optString(key);
}
void loadItems() {
String itemsString = Utilities.readAssetToString(this, "content.json");
ArrayList<Item> contentItems = new ArrayList<>();
try {
JSONObject content = new JSONObject(itemsString);
JSONObject baseConfig = content.getJSONObject("baseConfig");
JSONObject items = content.getJSONObject("items");
for (Iterator<String> it = items.keys(); it.hasNext(); ) {
String key = it.next();
KPPlayerConfig config = KPPlayerConfig.fromJSONObject(baseConfig);
JSONObject jsonItem = items.getJSONObject(key);
String entryId = getString(jsonItem, "entryId");
if (entryId == null) {
continue;
}
config.setEntryId(entryId);
String remoteUrl = getString(jsonItem, "remoteUrl");
String flavorId = getString(jsonItem, "flavorId");
config.setLocalContentId(key);
config.addConfig("autoPlay", "true");
Item item = new Item(config, remoteUrl, key);
contentItems.add(item);
}
} catch (JSONException e) {
Log.e(TAG, "Error parsing json", e);
}
Spinner spinner = (Spinner) findViewById(R.id.spn_content);
assert spinner != null;
ArrayAdapter<Item> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, contentItems);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mSelectedItem = (Item) parent.getSelectedItem();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
mSelectedItem = null;
}
});
}
}