package org.webinos.android.impl.media;
import java.util.List;
import java.util.Locale;
import org.meshpoint.anode.AndroidContext;
import org.meshpoint.anode.module.IModule;
import org.meshpoint.anode.module.IModuleContext;
import org.webinos.api.media.MediaCallback;
import org.webinos.api.media.PlaybackManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.util.Log;
public class PlaybackManagerImpl extends PlaybackManager implements IModule {
private static final String TAG = PlaybackManagerImpl.class.getName();
private IModuleContext moduleContext;
private Context androidContext;
@Override
public Object startModule(IModuleContext ctx) {
Log.v(TAG, "startModule");
this.moduleContext = ctx;
this.androidContext = ((AndroidContext) ctx).getAndroidContext();
return this;
}
@Override
public void stopModule() {
Log.v(TAG, "stopModule");
}
@Override
public void play(String urlstr, MediaCallback callback) {
// Do video playback via VLC as VideoView can't handle MPEG-TS
// or raw H.264
// Arno, 2012-10-24: Volatile, if VLC radically changes package
// name, we doomed. But normal Intent searching won't grok
// VLC's hack with the demuxer in the scheme: http/h264:
// so we have to do it this way.
//
String pkgname = getPackageNameForVLC("org.videolan.vlc.betav7neon");
if (pkgname == "") {
callback.onCallback(true);
return;
}
// Arno, 2012-10-24: LIVESOURCE=ANDROID
// Force VLC to use H.264 demuxer via URL, see
// http://wiki.videolan.org/VLC_command-line_help
// urlstr += " :network-caching=50";
// urlstr += " :http-caching=50";
Uri intentUri = Uri.parse(urlstr);
Intent intent = new Intent();
ComponentName cn = new ComponentName(pkgname, pkgname + ".gui.video.VideoPlayerActivity");
intent.setComponent(cn);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(intentUri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
androidContext.startActivity(intent);
} catch (Exception e) {
callback.onCallback(true);
}
callback.onCallback(false);
}
private String getPackageNameForVLC(String vlcCurrentPackageName) {
String vlcpkgnameprefix = "org.videolan.vlc";
try {
// From
// http://stackoverflow.com/questions/2780102/open-another-application-from-your-own-intent
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveinfo_list = androidContext.getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : resolveinfo_list) {
String ilcpn = info.activityInfo.packageName.toLowerCase(Locale.US);
if (ilcpn.startsWith(vlcpkgnameprefix)) {
return info.activityInfo.packageName;
}
}
// VLC not found, prompt user to install
openPlayStore(vlcCurrentPackageName);
} catch (Exception e) {
openPlayStore(vlcCurrentPackageName);
}
return "";
}
private void openPlayStore(String packageName) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
androidContext.startActivity(intent);
}
@Override
public void playPause(MediaCallback callback) {
// TODO Auto-generated method stub
}
@Override
public void stop(MediaCallback callback) {
// TODO Auto-generated method stub
}
@Override
public void forward(MediaCallback callback) {
// TODO Auto-generated method stub
}
@Override
public void backward(MediaCallback callback) {
// TODO Auto-generated method stub
}
@Override
public void volumeUp(MediaCallback callback) {
// TODO Auto-generated method stub
}
@Override
public void volumeDown(MediaCallback callback) {
// TODO Auto-generated method stub
}
}