package info.guardianproject.onionkit.ui; import info.guardianproject.otr.app.im.R; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; public class OrbotHelper { private final static int REQUEST_CODE_STATUS = 100; public final static String URI_ORBOT = "org.torproject.android"; public final static String TOR_BIN_PATH = "/data/data/org.torproject.android/app_bin/tor"; public final static String ACTION_START_TOR = "org.torproject.android.START_TOR"; public final static String ACTION_REQUEST_HS = "org.torproject.android.REQUEST_HS_PORT"; public final static int HS_REQUEST_CODE = 9999; private Context mContext = null; public OrbotHelper(Context context) { mContext = context; } public boolean isOrbotRunning() { int procId = TorServiceUtils.findProcessId(TOR_BIN_PATH); return (procId != -1); } public boolean isOrbotInstalled() { return isAppInstalled(URI_ORBOT); } private boolean isAppInstalled(String uri) { PackageManager pm = mContext.getPackageManager(); boolean installed = false; try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); installed = true; } catch (PackageManager.NameNotFoundException e) { installed = false; } return installed; } public void promptToInstall(Activity activity) { String uriMarket = activity.getString(R.string.market_orbot); // show dialog - install from market, f-droid or direct APK showDownloadDialog(activity, activity.getString(R.string.install_orbot_), activity.getString(R.string.you_must_have_orbot), activity.getString(R.string.yes), activity.getString(R.string.no), uriMarket); } private static AlertDialog showDownloadDialog(final Activity activity, CharSequence stringTitle, CharSequence stringMessage, CharSequence stringButtonYes, CharSequence stringButtonNo, final String uriString) { AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity); downloadDialog.setTitle(stringTitle); downloadDialog.setMessage(stringMessage); downloadDialog.setPositiveButton(stringButtonYes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { Uri uri = Uri.parse(uriString); Intent intent = new Intent(Intent.ACTION_VIEW, uri); activity.startActivity(intent); } }); downloadDialog.setNegativeButton(stringButtonNo, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { } }); return downloadDialog.show(); } public void requestOrbotStart(final Activity activity) { AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity); downloadDialog.setTitle(R.string.start_orbot_); downloadDialog .setMessage(R.string.orbot_doesn_t_appear_to_be_running_would_you_like_to_start_it_up_and_connect_to_tor_); downloadDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { Intent intent = new Intent(URI_ORBOT); intent.setAction(ACTION_START_TOR); activity.startActivityForResult(intent, 1); } }); downloadDialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) { } }); downloadDialog.show(); } public void requestHiddenServiceOnPort(Activity activity, int port) { Intent intent = new Intent(URI_ORBOT); intent.setAction(ACTION_REQUEST_HS); intent.putExtra("hs_port", port); activity.startActivityForResult(intent, HS_REQUEST_CODE); } }