package com.kaltura.localassetsdemo; import android.Manifest; import android.content.pm.PackageManager; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; 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.CompoundButton; import android.widget.Spinner; import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; 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.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import static com.kaltura.playersdk.utils.LogUtils.LOGD; import static com.kaltura.playersdk.utils.LogUtils.LOGE; public class MainActivity extends AppCompatActivity implements KPErrorEventListener, KPStateChangedEventListener { private static final String TAG = "MainActivity"; private static final int REQUEST_WRITE_STORAGE = 200; private PlayerViewController mPlayer; private ViewGroup mPlayerContainer; private boolean mPlayerDetached; private Item mSelectedItem; private ArrayList<Item> mContentItems; private HashMap<String, Integer> mContentMap; private PlayerViewController.SourceURLProvider mSourceURLProvider = new PlayerViewController.SourceURLProvider() { @Override public String getURL(String entryId, String currentURL) { Item item = mContentItems.get(mContentMap.get(entryId)); if (item != null) { if (item.isDownloaded()) { return item.localPath; } else { return item.contentUrl; } } return null; } }; @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); } askPermission(); loadItems(); mPlayerContainer = (ViewGroup) findViewById(R.id.layout_player_container); final WifiManager wifiManager = (WifiManager)this.getSystemService(WIFI_SERVICE); Switch wifiSwitch = (Switch) findViewById(R.id.switch_wifi); assert wifiSwitch != null; wifiSwitch.setChecked(wifiManager.isWifiEnabled()); wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { wifiManager.setWifiEnabled(isChecked); } }); setButtonAction(R.id.btn_register, new View.OnClickListener() { @Override public void onClick(View v) { if (mSelectedItem.localPath == null) { uiLog("Content is not downloaded"); return; } KPPlayerConfig config = mSelectedItem.config; LocalAssetsManager.registerAsset(MainActivity.this, config, mSelectedItem.flavorId, mSelectedItem.localPath, 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_load, 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.localPath, 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.localPath, new LocalAssetsManager.AssetRemovalListener() { @Override public void onRemoved(String assetPath) { LOGD(TAG, "Removed " + assetPath); } }); } }); } private void askPermission() { boolean hasPermission = (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); if (!hasPermission) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_WRITE_STORAGE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //if permission granted } else { Toast.makeText(this, "The app was not allowed to write to your storage.", Toast.LENGTH_LONG).show(); } } } } 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; LOGD(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 flavorId; String contentUrl; String localPath; String name; public Item(KPPlayerConfig config, String flavorId, String contentUrl, String localPath, String name) { this.config = config; this.flavorId = flavorId; this.contentUrl = contentUrl; this.localPath = localPath; this.name = name; } @Override public String toString() { String status = isDownloaded() ? "downloaded" : "online"; return name + " - " + status; } public boolean isDownloaded() { return localPath != null && new File(localPath).canRead(); } } String getString(JSONObject jsonObject, String key) { return jsonObject.isNull(key) ? null : jsonObject.optString(key); } void loadItems() { String itemsString = Utilities.readAssetToString(this, "content.json"); mContentItems = new ArrayList<>(); mContentMap = new HashMap<>(); 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 localPath = getString(jsonItem, "localPath"); String remoteUrl = getString(jsonItem, "remoteUrl"); String flavorId = getString(jsonItem, "flavorId"); config.setLocalContentId(key); Item item = new Item(config, flavorId, remoteUrl, localPath, key); mContentItems.add(item); mContentMap.put(entryId, mContentItems.size()-1); } } catch (JSONException e) { LOGE(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, mContentItems); 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) { } }); } }