diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java index 10ccd55e..b43c9f3c 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java @@ -40,6 +40,7 @@ import android.support.annotation.NonNull; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; +import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; @@ -51,6 +52,7 @@ import android.text.Html; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; +import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -179,7 +181,7 @@ public class MainActivity extends AppCompatActivity podUserProfile.setListener(this); //Orbot integration - OrbotStatusReceiver.setMainActivity(this); + LocalBroadcastManager.getInstance(this).registerReceiver(brRequestShowOrbot, new IntentFilter(OrbotStatusReceiver.REQUEST_SHOW_ORBOT)); OrbotHelper.requestStartTor(getApplicationContext()); if(appSettings.isProxyOrbot()) { if(!OrbotHelper.isOrbotInstalled(getApplicationContext())) { @@ -332,6 +334,7 @@ public class MainActivity extends AppCompatActivity Snackbar.make(swipeRefreshLayout, R.string.no_internet, Snackbar.LENGTH_LONG).show(); } } + LocalBroadcastManager.getInstance(this).unregisterReceiver(brRequestShowOrbot); } private void setupNavigationSlider() { @@ -384,6 +387,10 @@ public class MainActivity extends AppCompatActivity @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { + if(requestCode == OrbotHelper.START_TOR_RESULT) { + OrbotStatusReceiver.setProxy(this, data); + return; + } if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) { super.onActivityResult(requestCode, resultCode, data); return; @@ -422,6 +429,7 @@ public class MainActivity extends AppCompatActivity protected void onResume() { super.onResume(); registerReceiver(brLoadUrl, new IntentFilter(URL_MESSAGE)); + LocalBroadcastManager.getInstance(this).registerReceiver(brRequestShowOrbot, new IntentFilter(OrbotStatusReceiver.REQUEST_SHOW_ORBOT)); } @Override @@ -455,9 +463,17 @@ public class MainActivity extends AppCompatActivity } }; + private final BroadcastReceiver brRequestShowOrbot = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + requestOrbotStart(intent.getBooleanExtra(OrbotStatusReceiver.EXTRA_BACKGROUND_STARTS_DISABLED, false)); + } + }; + @Override protected void onPause() { unregisterReceiver(brLoadUrl); + LocalBroadcastManager.getInstance(this).unregisterReceiver(brRequestShowOrbot); super.onPause(); } @@ -1105,7 +1121,7 @@ public class MainActivity extends AppCompatActivity startDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - startActivityForResult(OrbotHelper.getShowOrbotStartIntent(), 1); + startActivityForResult(OrbotHelper.getShowOrbotStartIntent(), OrbotHelper.START_TOR_RESULT); } }).setNegativeButton(android.R.string.no, null).show(); } diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/OrbotStatusReceiver.java b/app/src/main/java/com/github/dfa/diaspora_android/util/OrbotStatusReceiver.java index d7073f58..0be9c451 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/util/OrbotStatusReceiver.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/util/OrbotStatusReceiver.java @@ -24,6 +24,7 @@ import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.github.dfa.diaspora_android.App; @@ -42,14 +43,14 @@ public class OrbotStatusReceiver extends BroadcastReceiver { public static final String EXTRA_HTTP_HOST = "org.torproject.android.intent.extra.HTTP_PROXY_HOST"; public static final String EXTRA_HTTP_PORT = "org.torproject.android.intent.extra.HTTP_PROXY_PORT"; + public static final String REQUEST_SHOW_ORBOT = "com.github.dfa.diaspora.request_show_orbot"; + public static final String EXTRA_BACKGROUND_STARTS_DISABLED = "com.github.dfa.diaspora.request_show_orbot.BG_START_DISABLED"; public static final String DEFAULT_HOST = "127.0.0.1"; public static final int DEFAULT_PORT = 8118; private static String host = ""; private static int port = 0; - private Intent lastStatus; - private Context lastContext; - private static MainActivity mainActivity; + private static boolean promptOnBackgroundStart = true; private AppSettings appSettings; private static boolean proxySet = false; @@ -59,19 +60,29 @@ public class OrbotStatusReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(OrbotHelper.ACTION_STATUS.equals(intent.getAction())) { - lastStatus = intent; - lastContext = context; if(appSettings == null) appSettings = new AppSettings(context.getApplicationContext()); String orbotStatus = intent.getExtras().getString(OrbotHelper.EXTRA_STATUS); - if(appSettings.isProxyOrbot()) { + if(appSettings.isProxyOrbot() && orbotStatus != null) { + //Status on if (orbotStatus.equals(OrbotHelper.STATUS_ON)) { - setProxy(lastContext, lastStatus); - } else if(orbotStatus.equals(OrbotHelper.STATUS_OFF)) { + setProxy(context, intent); + return; + } + //Status off + if(orbotStatus.equals(OrbotHelper.STATUS_OFF)) { Log.d(App.TAG, "Warning: Orbot reports status off."); - OrbotHelper.requestStartTor(context.getApplicationContext()); - } else if(orbotStatus.equals(OrbotHelper.STATUS_STARTS_DISABLED)) { + Intent orbotOffIntent = new Intent(REQUEST_SHOW_ORBOT); + orbotOffIntent.putExtra(EXTRA_BACKGROUND_STARTS_DISABLED, false); + LocalBroadcastManager.getInstance(context).sendBroadcast(orbotOffIntent); + return; + } + //Background starts disabled + if(orbotStatus.equals(OrbotHelper.STATUS_STARTS_DISABLED ) && promptOnBackgroundStart) { + promptOnBackgroundStart = false; Log.d(App.TAG, "Warning: Orbot has background starts disabled."); - if(mainActivity != null) mainActivity.requestOrbotStart(true); + Intent backgroundStartsDisabledIntent = new Intent(REQUEST_SHOW_ORBOT); + backgroundStartsDisabledIntent.putExtra(EXTRA_BACKGROUND_STARTS_DISABLED, true); + LocalBroadcastManager.getInstance(context).sendBroadcast(backgroundStartsDisabledIntent); } } } else { @@ -95,7 +106,7 @@ public class OrbotStatusReceiver extends BroadcastReceiver { } } } else { - Log.e(App.TAG, "OrbotStatusReceiver: lastStatus intent is null. Cannot set Proxy."); + setProxy(context, DEFAULT_HOST, DEFAULT_PORT); } } @@ -114,6 +125,7 @@ public class OrbotStatusReceiver extends BroadcastReceiver { } public static void resetProxy(Context context) { + promptOnBackgroundStart = true; try { OrbotStatusReceiver.host = ""; OrbotStatusReceiver.port = 0; @@ -135,7 +147,4 @@ public class OrbotStatusReceiver extends BroadcastReceiver { return proxySet; } - public static void setMainActivity(MainActivity main) { - mainActivity = main; - } }