package com.qmusic.webdoengine;
import java.net.URLDecoder;
import java.util.Iterator;
import java.util.List;
import org.json.JSONObject;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.location.Location;
import android.net.Uri;
import android.os.Parcelable;
import android.support.v4.app.FragmentActivity;
import com.qmusic.R;
import com.qmusic.activities.BWebActivity;
import com.qmusic.activities.SplashActivity;
import com.qmusic.common.BLocationManager;
import com.qmusic.controls.dialogs.BToast;
import com.qmusic.uitls.BLog;
public final class BRoutingHelper {
static final String TAG = "BRoutingHelper";
static final String SCHEME_HTTP = "http://";
static final String SCHEME_HTTPS = "https://";
static final String SCHEME_MAILTO = "mailto:";
static final String SCHEME_MARKET = "market://";
static final String SCHEME_QMUSIC = "qmusic://";
static final String SCHEME_QMUSIC_DIRECTION_TO = "qmusic://directionTo";
static final String SCHEME_QMUSIC_MAP = "qmusic://map";
static final String SCHEME_QMUSIC_SMS = "qmusic://sms";
public static final boolean process(final FragmentActivity ctx, final String url) {
if (url == null) {
return false;
}
if (url.startsWith(SCHEME_HTTP) || url.startsWith(SCHEME_HTTPS)) {
try {
final String[] SUPPORTED_VIDEO_FORMATS = new String[] { ".3gp", ".mp4", ".webm" };
for (String format : SUPPORTED_VIDEO_FORMATS) {
if (url.endsWith(format)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "video/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
return true;
}
}
final String[] SUPPORTED_AUDIO_FORMATS = new String[] { ".aac", ".mp3", ".flac", ".ogg", ".wav" };
for (String format : SUPPORTED_AUDIO_FORMATS) {
if (url.endsWith(format)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "audio/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
return true;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
} else if (url.startsWith(SCHEME_MARKET)) {
try {
Intent goToMarket = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
BToast.toast("Couldn't launch the market");
} catch (Exception e) {
e.printStackTrace();
}
return true;
} else if (url.startsWith(SCHEME_MAILTO)) {
try {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setData(Uri.parse(url));
intent.putExtra(Intent.EXTRA_SUBJECT, "");
intent.putExtra(Intent.EXTRA_TEXT, "");
ctx.startActivity(intent);
} catch (ActivityNotFoundException ex) {
BToast.toast(R.string.has_no_email_client);
} catch (Exception e) {
e.printStackTrace();
}
return true;
} else if (url.startsWith(SCHEME_QMUSIC_MAP)) {
String geo = "";
try {
geo = url.substring(SCHEME_QMUSIC_MAP.length() + 1);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=" + geo));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
} catch (ActivityNotFoundException ex) {
// EdoDialogHelper.toast(R.string.has_no_map_client);
try {
String MAPURL_FORMAT = "http://maps.google.com/maps?saddr=%s&z=12&view=map";
String mapURL = String.format(MAPURL_FORMAT, geo);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(mapURL));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
} catch (Exception ex1) {
ex1.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return true;
} else if (url.startsWith(SCHEME_QMUSIC_DIRECTION_TO)) {
try {
// the geo must be lat,lon. not the name of the address
String geo = url.substring(SCHEME_QMUSIC_DIRECTION_TO.length() + 1);
Location currentLocation = BLocationManager.getInstance().getLastKnowLocation();
String geoURL;
if (currentLocation != null) {
String URL_FORMAT = "http://maps.google.com/maps?saddr=%s,%s&daddr=%s&z=12&view=map";
geoURL = String.format(URL_FORMAT, currentLocation.getLatitude(), currentLocation.getLongitude(), geo);
} else {
geoURL = "geo:0,0?q=" + geo;
}
Intent navigation = new Intent(Intent.ACTION_VIEW, Uri.parse(geoURL));
navigation.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(navigation);
} catch (ActivityNotFoundException ex) {
BToast.toast(R.string.has_no_map_client);
} catch (Exception ex) {
ex.printStackTrace();
}
return true;
} else if (url.startsWith(SCHEME_QMUSIC_SMS)) {
try {
String urlDecoded = URLDecoder.decode(url, "UTF-8");
String[] sms = urlDecoded.substring(SCHEME_QMUSIC_SMS.length() + 1).split(",");
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + sms[0]));
intent.putExtra("sms_body", sms[1]);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
} catch (ActivityNotFoundException ex) {
BToast.toast(R.string.has_no_sms_client);
} catch (Exception ex) {
ex.printStackTrace();
}
return true;
} else if (url.startsWith(SCHEME_QMUSIC)) {
final Uri data = Uri.parse(url);
return processEasilyDoPage(ctx, data);
}
return false;
}
public static final boolean processEasilyDoPage(final FragmentActivity ctx, final Uri data) {
String page = null;
final List<String> segments = data.getPathSegments();
// final String scheme = data.getScheme();
if (segments.size() > 0) {
page = segments.get(0);
}
Intent intent = null;
if ("web".equalsIgnoreCase(page)) {
intent = new Intent(ctx, BWebActivity.class);
intent.putExtra("url", data.getQueryParameter("url"));
} else {
intent = new Intent(ctx, SplashActivity.class);
intent.putExtra(SplashActivity.RE_LOGIN, true);
}
String p = data.getQueryParameter("p");
if ("true".equals(p)) {
intent.putExtra("p", p);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ctx.startActivity(intent);
return true;
}
public static void putExtra(final Intent intent, final JSONObject params) {
Iterator<String> keys = params.keys();
while (keys.hasNext()) {
final String key = keys.next();
if ("callback".equals(key) || "page".equals(key)) {
continue;
} else {
Object value = params.opt(key);
if (value instanceof String) {
intent.putExtra(key, (String) value);
} else if (value instanceof Number) {
intent.putExtra(key, (Number) value);
} else if (value instanceof Parcelable) {
intent.putExtra(key, (Parcelable) value);
} else {
BLog.e(TAG, "Unsupport type:" + value.getClass().getSimpleName() + ";value:" + value);
}
}
}
}
}