diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 2e64815f5..a77b923f2 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -61,6 +61,7 @@ import eu.siacs.conversations.ui.TimePreference; import eu.siacs.conversations.utils.AccountUtils; import eu.siacs.conversations.utils.Compatibility; import eu.siacs.conversations.utils.GeoHelper; +import eu.siacs.conversations.utils.TorServiceUtils; import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection; @@ -1092,9 +1093,11 @@ public class NotificationService { } final boolean showAllErrors = QuickConversationsService.isConversations(); final List errors = new ArrayList<>(); + boolean torNotAvailable = false; for (final Account account : mXmppConnectionService.getAccounts()) { if (account.hasErrorStatus() && account.showErrorNotification() && (showAllErrors || account.getLastErrorStatus() == Account.State.UNAUTHORIZED)) { errors.add(account); + torNotAvailable |= account.getStatus() == Account.State.TOR_NOT_AVAILABLE; } } if (mXmppConnectionService.foregroundNotificationNeedsUpdatingWhenErrorStateChanges()) { @@ -1113,7 +1116,23 @@ public class NotificationService { } mBuilder.addAction(R.drawable.ic_autorenew_white_24dp, mXmppConnectionService.getString(R.string.try_again), - createTryAgainIntent()); + createTryAgainIntent() + ); + if (torNotAvailable) { + if (TorServiceUtils.isOrbotInstalled(mXmppConnectionService)) { + mBuilder.addAction( + R.drawable.ic_play_circle_filled_white_48dp, + mXmppConnectionService.getString(R.string.start_orbot), + PendingIntent.getActivity(mXmppConnectionService, 147, TorServiceUtils.LAUNCH_INTENT, 0) + ); + } else { + mBuilder.addAction( + R.drawable.ic_file_download_white_24dp, + mXmppConnectionService.getString(R.string.install_orbot), + PendingIntent.getActivity(mXmppConnectionService, 146, TorServiceUtils.INSTALL_INTENT, 0) + ); + } + } mBuilder.setDeleteIntent(createDismissErrorIntent()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mBuilder.setVisibility(Notification.VISIBILITY_PRIVATE); diff --git a/src/main/java/eu/siacs/conversations/utils/TorServiceUtils.java b/src/main/java/eu/siacs/conversations/utils/TorServiceUtils.java index c3f6fd3c6..9fc9f5082 100644 --- a/src/main/java/eu/siacs/conversations/utils/TorServiceUtils.java +++ b/src/main/java/eu/siacs/conversations/utils/TorServiceUtils.java @@ -16,6 +16,9 @@ public class TorServiceUtils { private static final Uri ORBOT_PLAYSTORE_URI = Uri.parse("market://details?id=" + URI_ORBOT); private final static String ACTION_START_TOR = "org.torproject.android.START_TOR"; + public static final Intent INSTALL_INTENT = new Intent(Intent.ACTION_VIEW, ORBOT_PLAYSTORE_URI); + public static final Intent LAUNCH_INTENT = new Intent(ACTION_START_TOR); + public final static String ACTION_STATUS = "org.torproject.android.intent.action.STATUS"; public final static String EXTRA_STATUS = "org.torproject.android.intent.extra.STATUS"; @@ -30,17 +33,14 @@ public class TorServiceUtils { public static void downloadOrbot(Activity activity, int requestCode) { - final Intent intent = new Intent(Intent.ACTION_VIEW, ORBOT_PLAYSTORE_URI); try { - activity.startActivityForResult(intent, requestCode); + activity.startActivityForResult(INSTALL_INTENT, requestCode); } catch (ActivityNotFoundException e) { ToastCompat.makeText(activity, R.string.no_market_app_installed, ToastCompat.LENGTH_SHORT).show(); } } public static void startOrbot(Activity activity, int requestCode) { - final Intent launchIntent = new Intent(URI_ORBOT); - launchIntent.setAction(ACTION_START_TOR); - activity.startActivityForResult(launchIntent, requestCode); + activity.startActivityForResult(LAUNCH_INTENT, requestCode); } } diff --git a/src/main/res/drawable-hdpi/ic_play_circle_filled_white_48dp.png b/src/main/res/drawable-hdpi/ic_play_circle_filled_white_48dp.png new file mode 100644 index 000000000..30330cfad Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_play_circle_filled_white_48dp.png differ diff --git a/src/main/res/drawable-mdpi/ic_play_circle_filled_white_48dp.png b/src/main/res/drawable-mdpi/ic_play_circle_filled_white_48dp.png new file mode 100644 index 000000000..5dcdf0d7a Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_play_circle_filled_white_48dp.png differ diff --git a/src/main/res/drawable-xhdpi/ic_play_circle_filled_white_48dp.png b/src/main/res/drawable-xhdpi/ic_play_circle_filled_white_48dp.png new file mode 100644 index 000000000..9dc082586 Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_play_circle_filled_white_48dp.png differ diff --git a/src/main/res/drawable-xxhdpi/ic_play_circle_filled_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_play_circle_filled_white_48dp.png new file mode 100644 index 000000000..1d73fb5f4 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_play_circle_filled_white_48dp.png differ diff --git a/src/main/res/drawable-xxxhdpi/ic_play_circle_filled_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_play_circle_filled_white_48dp.png new file mode 100644 index 000000000..166f5c5ce Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_play_circle_filled_white_48dp.png differ