package com.kaltura.multipledtgplayer; import android.content.Context; import android.util.Log; import android.view.ViewGroup; 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.utils.Utilities; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import static com.kaltura.playersdk.utils.LogUtils.LOGD; /** * Created by Gleb on 9/28/16. */ public class VideoItemsLoader implements DownloadItemView.OnItemListener, DownloadStateListener { private List<VideoItem> mVideoItems; private ViewGroup mParent; private ContentManager mContentManager; private Context mContext; public VideoItemsLoader(Context context) { mContext = context; mVideoItems = new ArrayList<>(); mContentManager = ContentManager.getInstance(context); mContentManager.addDownloadStateListener(this); mContentManager.start(); } public void loadItems(String fileName) { String itemsString = Utilities.readAssetToString(mContext, fileName); 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"); VideoItem item = new VideoItem(config, flavorId, remoteUrl, key); item.setContentManager(mContentManager); mVideoItems.add(item); } } catch (JSONException e) { Log.e(getClass().getSimpleName(), "Error parsing json", e); } } private String getString(JSONObject jsonObject, String key) { return jsonObject.isNull(key) ? null : jsonObject.optString(key); } public void attachToParent(ViewGroup parent) { mParent = parent; parent.removeAllViews(); int itemId = 0; for (VideoItem videoItem : mVideoItems) { DownloadItemView itemView = new DownloadItemView(parent.getContext()); itemView.bind(videoItem); itemView.setItemId(itemId); itemView.setOnItemListener(this); parent.addView(itemView); itemId++; } } public void updateAll() { int itemId = 0; for (VideoItem videoItem : mVideoItems) { DownloadItemView itemView = (DownloadItemView)mParent.getChildAt(itemId); itemView.bind(videoItem); itemView.setItemId(itemId); itemView.setOnItemListener(this); itemId++; } } public VideoItem getItem(int position) { if (position >= 0 && position < mVideoItems.size()) { return mVideoItems.get(position); } return null; } public VideoItem findItemByMediaId(String entryId) { for (VideoItem videoItem : mVideoItems) { if (videoItem.config.getEntryId().equals(entryId)) { return videoItem; } } return null; } public int getItemPositionByMediaId(String entryId) { for (int i=0;i<mVideoItems.size();i++) { if (mVideoItems.get(i).config.getEntryId().equals(entryId)) { return i; } } return -1; } public DownloadItemView getView(int position) { if (position >= 0 && position < mParent.getChildCount()) { return (DownloadItemView)mParent.getChildAt(position); } return null; } public VideoItem getSelectedItem() { for (VideoItem videoItem : mVideoItems) { if (videoItem.isSelected) { return videoItem; } } return null; } @Override public void onCheck(int itemId, boolean isChecked) { for (int i=0;i<mVideoItems.size();i++) { VideoItem item = mVideoItems.get(i); if (i == itemId) { item.isSelected = isChecked; } else { item.isSelected = false; getView(i).bind(item); } } } @Override public void onDownloadClick(int itemId) { DownloadItem item = getItem(itemId).findDownloadItem(); if (item != null && item.getState() != DownloadState.COMPLETED) { item.loadMetadata(); } } public String getLocalPath(String itemId) { File localFile = mContentManager.getLocalFile(itemId); if (localFile != null) { return localFile.getAbsolutePath(); } return ""; //return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/" + itemId + ".mp4"; } public String getUrl(String entryId) { return mContentManager.getPlaybackURL(entryId); } @Override public void onDownloadComplete(DownloadItem item) { LOGD("download", "completed"); String localPath = getLocalPath(item.getItemId()); VideoItem videoItem = findItemByMediaId(item.getItemId()); if (localPath != null && videoItem != null) { LocalAssetsManager.registerAsset(mContext, videoItem.config, videoItem.flavorId, localPath, new LocalAssetsManager.AssetRegistrationListener() { @Override public void onRegistered(String assetPath) { LOGD("download", "Register successful"); } @Override public void onFailed(String assetPath, Exception error) { LOGD("download", "Register failed " + error.getMessage()); } }); } DownloadItemView view = getView(getItemPositionByMediaId(item.getItemId())); if (view != null) { view.bind(item); } } @Override public void onProgressChange(DownloadItem item, long downloadedBytes) { LOGD("onProgressChange", "downloaded " + downloadedBytes); DownloadItemView view = getView(getItemPositionByMediaId(item.getItemId())); if (view != null) { view.bind(item); } } @Override public void onDownloadStart(DownloadItem item) { LOGD("onDownloadStart", ""); DownloadItemView view = getView(getItemPositionByMediaId(item.getItemId())); if (view != null) { view.bind(item); } } @Override public void onDownloadPause(DownloadItem item) { LOGD("onDownloadPause", ""); DownloadItemView view = getView(getItemPositionByMediaId(item.getItemId())); if (view != null) { view.bind(item); } } @Override public void onDownloadStop(DownloadItem item) { LOGD("onDownloadStop", ""); DownloadItemView view = getView(getItemPositionByMediaId(item.getItemId())); if (view != null) { view.bind(item); } } @Override public void onDownloadMetadata(DownloadItem item, Exception error) { LOGD("onDownloadMetadata", ""); DownloadItem.TrackSelector trackSelector = item.getTrackSelector(); if (trackSelector != null) { 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)); } }