diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java index 3b938e686..0ea593c9e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java @@ -17,7 +17,6 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; -import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; @@ -38,7 +37,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.drawerlayout.widget.DrawerLayout; @@ -55,13 +53,9 @@ import static androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE; import static java.util.Objects.requireNonNull; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING; -import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY; -import static org.briarproject.bramble.api.plugin.TorConstants.REASON_COUNTRY_BLOCKED; -import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA; import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD; import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent; -import static org.briarproject.briar.android.util.UiUtils.getCountryDisplayName; import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry; @MethodsNotNullByDefault @@ -94,9 +88,6 @@ public class NavDrawerActivity extends BriarActivity implements @Inject LifecycleManager lifecycleManager; - @Inject - LocationUtils locationUtils; - private DrawerLayout drawerLayout; private NavigationView navigation; @@ -120,10 +111,7 @@ public class NavDrawerActivity extends BriarActivity implements }); View drawerScrollView = findViewById(R.id.drawerScrollView); - PluginViewController pluginViewController = - new PluginViewController(drawerScrollView, this, viewModel); - pluginViewController.getReasonsTorDisabled().observeEvent(this, - this::showTorSettingsDialog); + new PluginViewController(drawerScrollView, this, viewModel); Toolbar toolbar = findViewById(R.id.toolbar); drawerLayout = findViewById(R.id.drawer_layout); @@ -362,42 +350,4 @@ public class NavDrawerActivity extends BriarActivity implements expiryWarning.setVisibility(GONE); } } - - private void showTorSettingsDialog(int reasonsDisabled) { - boolean battery = (reasonsDisabled & REASON_BATTERY) != 0; - boolean mobileData = (reasonsDisabled & REASON_MOBILE_DATA) != 0; - boolean location = (reasonsDisabled & REASON_COUNTRY_BLOCKED) != 0; - - StringBuilder s = new StringBuilder(); - if (location) { - s.append("\t\u2022 "); - s.append(getString(R.string.tor_override_network_setting, - getCountryDisplayName(locationUtils.getCurrentCountry()))); - s.append('\n'); - } - if (mobileData) { - s.append("\t\u2022 "); - s.append(getString(R.string.tor_override_mobile_data_setting)); - s.append('\n'); - } - if (battery) { - s.append("\t\u2022 "); - s.append(getString(R.string.tor_only_when_charging_title)); - s.append('\n'); - } - String message = - getString(R.string.tor_override_settings_body, s.toString()); - - AlertDialog.Builder b = - new AlertDialog.Builder(this, R.style.BriarDialogTheme); - b.setTitle(R.string.tor_override_settings_title); - b.setIcon(R.drawable.ic_settings_black_24dp); - b.setMessage(message); - b.setPositiveButton(R.string.tor_override_settings_confirm, - (dialog, which) -> - viewModel.setTorEnabled(battery, mobileData, location)); - b.setNegativeButton(R.string.cancel, (dialog, which) -> - dialog.dismiss()); - b.show(); - } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java index 8f1909541..ac47a092a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java @@ -18,6 +18,7 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.event.TransportStateEvent; import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.SettingsManager; +import org.briarproject.bramble.api.system.LocationUtils; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -45,6 +46,7 @@ import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE; import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; +import static org.briarproject.briar.android.util.UiUtils.getCountryDisplayName; import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting; @NotNullByDefault @@ -62,6 +64,7 @@ public class NavDrawerViewModel extends AndroidViewModel private final Executor dbExecutor; private final SettingsManager settingsManager; private final PluginManager pluginManager; + private final LocationUtils locationUtils; private final EventBus eventBus; private final MutableLiveData showExpiryWarning = @@ -79,11 +82,12 @@ public class NavDrawerViewModel extends AndroidViewModel @Inject NavDrawerViewModel(Application app, @DatabaseExecutor Executor dbExecutor, SettingsManager settingsManager, PluginManager pluginManager, - EventBus eventBus) { + LocationUtils locationUtils, EventBus eventBus) { super(app); this.dbExecutor = dbExecutor; this.settingsManager = settingsManager; this.pluginManager = pluginManager; + this.locationUtils = locationUtils; this.eventBus = eventBus; eventBus.addListener(this); updatePluginStates(); @@ -248,4 +252,7 @@ public class NavDrawerViewModel extends AndroidViewModel }); } + String getCurrentCountryName() { + return getCountryDisplayName(locationUtils.getCurrentCountry()); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewController.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewController.java index ea3de6d2d..828cdf0a3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewController.java @@ -10,14 +10,13 @@ import org.briarproject.bramble.api.plugin.Plugin.State; import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.briar.R; -import org.briarproject.briar.android.viewmodel.LiveEvent; -import org.briarproject.briar.android.viewmodel.MutableLiveEvent; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.AppCompatImageButton; import androidx.appcompat.widget.SwitchCompat; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; -import androidx.lifecycle.LifecycleOwner; import static android.os.Build.VERSION.SDK_INT; import static android.transition.TransitionManager.beginDelayedTransition; @@ -28,23 +27,26 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED; import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING; import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING; +import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY; +import static org.briarproject.bramble.api.plugin.TorConstants.REASON_COUNTRY_BLOCKED; +import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA; import static org.briarproject.briar.android.navdrawer.NavDrawerViewModel.TRANSPORT_IDS; class PluginViewController { + private final AppCompatActivity activity; private final NavDrawerViewModel viewModel; private final ConstraintLayout drawerContent; private final ConstraintSet collapsedConstraints, expandedConstraints; private final AppCompatImageButton chevronView; private final ImageView torIcon, wifiIcon, btIcon; private final SwitchCompat torSwitch, wifiSwitch, btSwitch; - private final MutableLiveEvent reasonsTorDisabled = - new MutableLiveEvent<>(); private boolean expanded = false; - PluginViewController(View v, LifecycleOwner owner, + PluginViewController(View v, AppCompatActivity activity, NavDrawerViewModel viewModel) { + this.activity = activity; this.viewModel = viewModel; drawerContent = v.findViewById(R.id.drawerContent); @@ -88,8 +90,8 @@ class PluginViewController { // changes its state switchCompat.toggle(); }); - viewModel.getPluginState(t) - .observe(owner, state -> stateUpdate(t, state)); + viewModel.getPluginState(t).observe(activity, state -> + stateUpdate(t, state)); } } @@ -105,17 +107,13 @@ class PluginViewController { expanded = !expanded; } - LiveEvent getReasonsTorDisabled() { - return reasonsTorDisabled; - } - private void tryToEnablePlugin(TransportId id) { if (id.equals(TorConstants.ID)) { int reasons = viewModel.getReasonsDisabled(id); if (reasons == 0 || reasons == REASON_USER) { viewModel.setPluginEnabled(id, true); } else { - reasonsTorDisabled.setEvent(reasons); + showTorSettingsDialog(reasons); } } else { viewModel.setPluginEnabled(id, true); @@ -160,4 +158,42 @@ class PluginViewController { icon.setColorFilter(color); } + private void showTorSettingsDialog(int reasonsDisabled) { + boolean battery = (reasonsDisabled & REASON_BATTERY) != 0; + boolean mobileData = (reasonsDisabled & REASON_MOBILE_DATA) != 0; + boolean location = (reasonsDisabled & REASON_COUNTRY_BLOCKED) != 0; + + StringBuilder s = new StringBuilder(); + if (location) { + s.append("\t\u2022 "); + s.append(activity.getString(R.string.tor_override_network_setting, + viewModel.getCurrentCountryName())); + s.append('\n'); + } + if (mobileData) { + s.append("\t\u2022 "); + s.append(activity.getString( + R.string.tor_override_mobile_data_setting)); + s.append('\n'); + } + if (battery) { + s.append("\t\u2022 "); + s.append(activity.getString(R.string.tor_only_when_charging_title)); + s.append('\n'); + } + String message = activity.getString( + R.string.tor_override_settings_body, s.toString()); + + AlertDialog.Builder b = + new AlertDialog.Builder(activity, R.style.BriarDialogTheme); + b.setTitle(R.string.tor_override_settings_title); + b.setIcon(R.drawable.ic_settings_black_24dp); + b.setMessage(message); + b.setPositiveButton(R.string.tor_override_settings_confirm, + (dialog, which) -> + viewModel.setTorEnabled(battery, mobileData, location)); + b.setNegativeButton(R.string.cancel, (dialog, which) -> + dialog.dismiss()); + b.show(); + } }