package io.scal.secureshareui.controller;
import info.guardianproject.netcipher.proxy.OrbotHelper;
import timber.log.Timber;
import io.scal.secureshareui.model.Account;
import io.scal.secureshareuilibrary.R;
import java.io.File;
import java.io.Serializable;
import java.util.HashMap;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.webkit.MimeTypeMap;
public abstract class SiteController {
private OnEventListener mPublishEventListener;
protected Context mContext;
protected Handler mHandler;
protected String mJobId; // this is whatever the app wants it to be, we'll pass it back with our callbacks
public static final int CONTROLLER_REQUEST_CODE = 101;
public static final int MESSAGE_TYPE_SUCCESS = 23423430;
public static final int MESSAGE_TYPE_FAILURE = 23423431;
public static final int MESSAGE_TYPE_PROGRESS = 23423432;
public static final String MESSAGE_KEY_TYPE = "message_type";
public static final String MESSAGE_KEY_JOB_ID = "job_id";
public static final String MESSAGE_KEY_CODE = "code";
public static final String MESSAGE_KEY_MESSAGE = "message";
public static final String MESSAGE_KEY_RESULT = "result";
public static final String MESSAGE_KEY_PROGRESS = "progress";
public static final String MESSAGE_KEY_EXCEPTION = "exception";
public static final String EXTRAS_KEY_DATA = "data";
public static final String EXTRAS_KEY_USERNAME = "username";
public static final String EXTRAS_KEY_CREDENTIALS = "credentials";
public static final String VALUE_KEY_TITLE = "title";
public static final String VALUE_KEY_SLUG = "slug";
public static final String VALUE_KEY_BODY = "body";
public static final String VALUE_KEY_TAGS = "tags";
public static final String VALUE_KEY_AUTHOR = "author";
public static final String VALUE_KEY_PROFILE_URL = "profileUrl";
public static final String VALUE_KEY_LOCATION_NAME = "locationName";
public static final String VALUE_KEY_MEDIA_PATH = "mediaPath";
public static final String VALUE_KEY_USE_TOR = "use_tor";
public static final String VALUE_KEY_LICENSE_URL = "licenseUrl";
public static final String VALUE_KEY_PUBLISH_TO_STORYMAKER = "publish_to_storymaker"; // TODO generalize this, allow clie
protected static final String ORBOT_HOST = "127.0.0.1";
protected static final int ORBOT_HTTP_PORT = 8118;
protected static final int ORBOT_SOCKS_PORT = 9050;
public static int METADATA_REQUEST_CODE = 24153;
private static final String TAG = "SiteController";
public interface OnEventListener {
public void onSuccess(Account publishAccount);
public void onFailure(Account publishAccount, String failureMessage);
public void onRemove(Account account);
}
public SiteController(Context context, Handler handler, String jobId) {
mContext = context;
mHandler = handler;
mJobId = jobId;
}
public abstract void startAuthentication(Account account);
/**
* Gives a SiteController a chance to add metadata to the intent resulting from the ChooseAccounts process
* that gets passed to each SiteController during publishing
* @param intent
*/
public abstract void startMetadataActivity(Intent intent);
public abstract void upload(Account account, HashMap<String, String> valueMap);
public static boolean torCheck(boolean useTor, Context mContext) {
if(useTor && OrbotHelper.isOrbotRunning(mContext))
{
Timber.d("use tor");
return true;
}
else
{
Timber.d("don't use tor");
return false;
}
}
public static SiteController getSiteController(String site, Context context, Handler handler, String jobId) {
if (site.equals(FacebookSiteController.SITE_KEY)) {
return new FacebookSiteController(context, handler, jobId);
}
else if (site.equals(SoundCloudSiteController.SITE_KEY)) {
return new SoundCloudSiteController(context, handler, jobId);
}
else if (site.equals(YoutubeSiteController.SITE_KEY)) {
return new YoutubeSiteController(context, handler, jobId);
}
else if (site.equals(FlickrSiteController.SITE_KEY)) {
return new FlickrSiteController(context, handler, jobId);
}
else if (site.equals(SSHSiteController.SITE_KEY)) {
return new SSHSiteController(context, handler, jobId);
}
else if (site.equals(ArchiveSiteController.SITE_KEY)) {
return new ArchiveSiteController(context, handler, jobId);
} else if (site.equals(ZTSiteController.SITE_KEY)) {
return new ZTSiteController(context, handler, jobId);
} else if (site.equals(S3SiteController.SITE_KEY)) {
return new S3SiteController(context, handler, jobId);
}
return null;
}
public static boolean isAudioFile(File mediaFile) {
if(getMimeType(mediaFile).contains("audio")) {
return true;
}
return false;
}
public static boolean isImageFile(File mediaFile) {
if(getMimeType(mediaFile).contains("image")) {
return true;
}
return false;
}
public static boolean isVideoFile(File mediaFile) {
if(getMimeType(mediaFile).contains("video")) {
return true;
}
return false;
}
private static String getMimeType(File mediaFile) {
Uri fileUri = Uri.fromFile(mediaFile);
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(fileUri.toString());
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
}
public OnEventListener getOnPublishEventListener() {
return this.mPublishEventListener;
}
public void setOnEventListener(OnEventListener publishEventListener) {
this.mPublishEventListener = publishEventListener;
}
/**
* result is a site specific unique id that we can use to fetch the data,
* build an embed tag, etc. for some sites this might be a URL
*
* @param result
*/
public void jobSucceeded(String result) {
Message msg = new Message();
Bundle data = new Bundle();
data.putInt(MESSAGE_KEY_TYPE, MESSAGE_TYPE_SUCCESS);
data.putString(MESSAGE_KEY_JOB_ID, mJobId);
data.putString(MESSAGE_KEY_RESULT, result);
msg.setData(data);
mHandler.sendMessage(msg);
}
public void jobFailed(Exception exception, int errorCode, String errorMessage) {
Message msg = new Message();
Bundle data = new Bundle();
data.putInt(MESSAGE_KEY_TYPE, MESSAGE_TYPE_FAILURE);
data.putString(MESSAGE_KEY_JOB_ID, mJobId);
data.putInt(MESSAGE_KEY_CODE, errorCode);
data.putString(MESSAGE_KEY_MESSAGE, errorMessage);
data.putSerializable("exception", (Serializable) exception);
msg.setData(data);
mHandler.sendMessage(msg);
}
public void jobProgress(float progress, String message) {
Message msg = new Message();
Bundle data = new Bundle();
data.putInt(MESSAGE_KEY_TYPE, MESSAGE_TYPE_PROGRESS);
data.putString(MESSAGE_KEY_JOB_ID, mJobId);
data.putFloat(MESSAGE_KEY_PROGRESS, progress);
data.putString(MESSAGE_KEY_MESSAGE, message);
msg.setData(data);
mHandler.sendMessage(msg);
}
public static int getAccountIcon(String site, boolean isConnected, boolean areCredentialsValid) {
if (site.equals(FacebookSiteController.SITE_KEY)) {
if (!isConnected) { //not connected
return R.drawable.ic_context_facebook;
}
//since connected, check if valid
return areCredentialsValid ? R.drawable.ic_context_facebook_on : R.drawable.ic_context_facebook_error;
}
else if (site.equals(YoutubeSiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_youtube;
}
return areCredentialsValid ? R.drawable.ic_context_youtube_on : R.drawable.ic_context_youtube_error;
}
else if (site.equals(SoundCloudSiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_soundcloud;
}
return areCredentialsValid ? R.drawable.ic_context_soundcloud_on : R.drawable.ic_context_soundcloud_error;
}
else if (site.equals(FlickrSiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_flickr;
}
return areCredentialsValid ? R.drawable.ic_context_flickr_on : R.drawable.ic_context_flickr_error;
}
else if (site.equals(SSHSiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_server;
}
return areCredentialsValid ? R.drawable.ic_context_server_on : R.drawable.ic_context_server_error;
}
else if (site.equals(ArchiveSiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_iarchive;
}
return areCredentialsValid ? R.drawable.ic_context_iarchive_on : R.drawable.ic_context_iarchive_error;
}
else if (site.equals(S3SiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_server; // FIXME we need a storymaker server icon
}
return areCredentialsValid ? R.drawable.ic_context_iarchive_on : R.drawable.ic_context_iarchive_error;
}
else if (site.equals(ZTSiteController.SITE_KEY)) {
if (!isConnected) {
return R.drawable.ic_context_server;
}
return areCredentialsValid ? R.drawable.ic_context_server_on : R.drawable.ic_context_server_error;
}
return R.drawable.ic_launcher;
}
}