Show dialog from controller.

This commit is contained in:
akwizgran
2020-02-10 11:15:12 +00:00
parent 7b1c6f3fdd
commit e9ec5734e2
3 changed files with 58 additions and 65 deletions

View File

@@ -17,7 +17,6 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.activity.BriarActivity;
@@ -38,7 +37,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.drawerlayout.widget.DrawerLayout; 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.Objects.requireNonNull;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING; 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.BriarService.EXTRA_STARTUP_FAILED;
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD; 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.navdrawer.IntentRouter.handleExternalIntent;
import static org.briarproject.briar.android.util.UiUtils.getCountryDisplayName;
import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry; import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
@MethodsNotNullByDefault @MethodsNotNullByDefault
@@ -94,9 +88,6 @@ public class NavDrawerActivity extends BriarActivity implements
@Inject @Inject
LifecycleManager lifecycleManager; LifecycleManager lifecycleManager;
@Inject
LocationUtils locationUtils;
private DrawerLayout drawerLayout; private DrawerLayout drawerLayout;
private NavigationView navigation; private NavigationView navigation;
@@ -120,10 +111,7 @@ public class NavDrawerActivity extends BriarActivity implements
}); });
View drawerScrollView = findViewById(R.id.drawerScrollView); View drawerScrollView = findViewById(R.id.drawerScrollView);
PluginViewController pluginViewController = new PluginViewController(drawerScrollView, this, viewModel);
new PluginViewController(drawerScrollView, this, viewModel);
pluginViewController.getReasonsTorDisabled().observeEvent(this,
this::showTorSettingsDialog);
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
drawerLayout = findViewById(R.id.drawer_layout); drawerLayout = findViewById(R.id.drawer_layout);
@@ -362,42 +350,4 @@ public class NavDrawerActivity extends BriarActivity implements
expiryWarning.setVisibility(GONE); 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();
}
} }

View File

@@ -18,6 +18,7 @@ import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.event.TransportStateEvent; import org.briarproject.bramble.api.plugin.event.TransportStateEvent;
import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.Settings;
import org.briarproject.bramble.api.settings.SettingsManager; import org.briarproject.bramble.api.settings.SettingsManager;
import org.briarproject.bramble.api.system.LocationUtils;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; 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.TestingConstants.IS_DEBUG_BUILD;
import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN; 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.settings.SettingsFragment.SETTINGS_NAMESPACE;
import static org.briarproject.briar.android.util.UiUtils.getCountryDisplayName;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting; import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
@NotNullByDefault @NotNullByDefault
@@ -62,6 +64,7 @@ public class NavDrawerViewModel extends AndroidViewModel
private final Executor dbExecutor; private final Executor dbExecutor;
private final SettingsManager settingsManager; private final SettingsManager settingsManager;
private final PluginManager pluginManager; private final PluginManager pluginManager;
private final LocationUtils locationUtils;
private final EventBus eventBus; private final EventBus eventBus;
private final MutableLiveData<Boolean> showExpiryWarning = private final MutableLiveData<Boolean> showExpiryWarning =
@@ -79,11 +82,12 @@ public class NavDrawerViewModel extends AndroidViewModel
@Inject @Inject
NavDrawerViewModel(Application app, @DatabaseExecutor Executor dbExecutor, NavDrawerViewModel(Application app, @DatabaseExecutor Executor dbExecutor,
SettingsManager settingsManager, PluginManager pluginManager, SettingsManager settingsManager, PluginManager pluginManager,
EventBus eventBus) { LocationUtils locationUtils, EventBus eventBus) {
super(app); super(app);
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.settingsManager = settingsManager; this.settingsManager = settingsManager;
this.pluginManager = pluginManager; this.pluginManager = pluginManager;
this.locationUtils = locationUtils;
this.eventBus = eventBus; this.eventBus = eventBus;
eventBus.addListener(this); eventBus.addListener(this);
updatePluginStates(); updatePluginStates();
@@ -248,4 +252,7 @@ public class NavDrawerViewModel extends AndroidViewModel
}); });
} }
String getCurrentCountryName() {
return getCountryDisplayName(locationUtils.getCurrentCountry());
}
} }

View File

@@ -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.TorConstants;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.briar.R; 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.AppCompatImageButton;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet; import androidx.constraintlayout.widget.ConstraintSet;
import androidx.lifecycle.LifecycleOwner;
import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION.SDK_INT;
import static android.transition.TransitionManager.beginDelayedTransition; 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.DISABLED;
import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING; 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.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; import static org.briarproject.briar.android.navdrawer.NavDrawerViewModel.TRANSPORT_IDS;
class PluginViewController { class PluginViewController {
private final AppCompatActivity activity;
private final NavDrawerViewModel viewModel; private final NavDrawerViewModel viewModel;
private final ConstraintLayout drawerContent; private final ConstraintLayout drawerContent;
private final ConstraintSet collapsedConstraints, expandedConstraints; private final ConstraintSet collapsedConstraints, expandedConstraints;
private final AppCompatImageButton chevronView; private final AppCompatImageButton chevronView;
private final ImageView torIcon, wifiIcon, btIcon; private final ImageView torIcon, wifiIcon, btIcon;
private final SwitchCompat torSwitch, wifiSwitch, btSwitch; private final SwitchCompat torSwitch, wifiSwitch, btSwitch;
private final MutableLiveEvent<Integer> reasonsTorDisabled =
new MutableLiveEvent<>();
private boolean expanded = false; private boolean expanded = false;
PluginViewController(View v, LifecycleOwner owner, PluginViewController(View v, AppCompatActivity activity,
NavDrawerViewModel viewModel) { NavDrawerViewModel viewModel) {
this.activity = activity;
this.viewModel = viewModel; this.viewModel = viewModel;
drawerContent = v.findViewById(R.id.drawerContent); drawerContent = v.findViewById(R.id.drawerContent);
@@ -88,8 +90,8 @@ class PluginViewController {
// changes its state // changes its state
switchCompat.toggle(); switchCompat.toggle();
}); });
viewModel.getPluginState(t) viewModel.getPluginState(t).observe(activity, state ->
.observe(owner, state -> stateUpdate(t, state)); stateUpdate(t, state));
} }
} }
@@ -105,17 +107,13 @@ class PluginViewController {
expanded = !expanded; expanded = !expanded;
} }
LiveEvent<Integer> getReasonsTorDisabled() {
return reasonsTorDisabled;
}
private void tryToEnablePlugin(TransportId id) { private void tryToEnablePlugin(TransportId id) {
if (id.equals(TorConstants.ID)) { if (id.equals(TorConstants.ID)) {
int reasons = viewModel.getReasonsDisabled(id); int reasons = viewModel.getReasonsDisabled(id);
if (reasons == 0 || reasons == REASON_USER) { if (reasons == 0 || reasons == REASON_USER) {
viewModel.setPluginEnabled(id, true); viewModel.setPluginEnabled(id, true);
} else { } else {
reasonsTorDisabled.setEvent(reasons); showTorSettingsDialog(reasons);
} }
} else { } else {
viewModel.setPluginEnabled(id, true); viewModel.setPluginEnabled(id, true);
@@ -160,4 +158,42 @@ class PluginViewController {
icon.setColorFilter(color); 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();
}
} }