diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml index 8be1cbf4d3b86536ffb3a0357c455c4f58d930be..e0dbc1a3d9d10fd3304349d73d1f6f1436ac2021 100644 --- a/briar-android/src/main/AndroidManifest.xml +++ b/briar-android/src/main/AndroidManifest.xml @@ -1,28 +1,34 @@ <?xml version="1.0" encoding="utf-8"?> <manifest package="org.briarproject.briar" - xmlns:tools="http://schemas.android.com/tools" - xmlns:android="http://schemas.android.com/apk/res/android"> - - <uses-feature android:name="android.hardware.bluetooth" android:required="false"/> - <uses-feature android:name="android.hardware.camera" android:required="false"/> - <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> - - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> - <uses-permission android:name="android.permission.BLUETOOTH" /> - <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> - <uses-permission android:name="android.permission.CAMERA" /> - <uses-permission android:name="android.permission.INTERNET" /> + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + <uses-feature + android:name="android.hardware.bluetooth" + android:required="false"/> + <uses-feature + android:name="android.hardware.camera" + android:required="false"/> + <uses-feature + android:name="android.hardware.touchscreen" + android:required="false"/> + + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> + <uses-permission android:name="android.permission.BLUETOOTH"/> + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> + <uses-permission android:name="android.permission.CAMERA"/> + <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> - <uses-permission android:name="android.permission.USE_FINGERPRINT"/> - <uses-permission android:name="android.permission.VIBRATE" /> - <uses-permission android:name="android.permission.WAKE_LOCK" /> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.VIBRATE"/> + <uses-permission android:name="android.permission.WAKE_LOCK"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> + + <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> - <uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" /> - <uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" /> + <uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC"/> + <uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE"/> <application android:name="org.briarproject.briar.android.BriarApplicationImpl" @@ -32,7 +38,8 @@ android:logo="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/BriarTheme" - tools:ignore="GoogleAppIndexingWarning"> + tools:ignore="GoogleAppIndexingWarning" + tools:targetApi="16"> <receiver android:name="org.briarproject.briar.android.login.SignInReminderReceiver" @@ -85,8 +92,8 @@ <activity android:name="org.briarproject.briar.android.splash.SplashScreenActivity" - android:theme="@style/BriarTheme.NoActionBar" - android:label="@string/app_name"> + android:label="@string/app_name" + android:theme="@style/BriarTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> @@ -95,20 +102,38 @@ <activity android:name="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - android:theme="@style/BriarTheme.NoActionBar" - android:launchMode="singleTop"> + android:launchMode="singleTask" + android:theme="@style/BriarTheme.NoActionBar"> + + <intent-filter> + <action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/> + <category android:name="android.intent.category.DEFAULT"/> + </intent-filter> + <intent-filter android:label="@string/add_contact_remotely_title_case"> + <action android:name="android.intent.action.VIEW"/> + + <category android:name="android.intent.category.DEFAULT"/> + <category android:name="android.intent.category.BROWSABLE"/> + + <data android:scheme="briar"/> + </intent-filter> + <intent-filter android:label="@string/add_contact_remotely_title_case"> + <action android:name="android.intent.action.SEND"/> + <category android:name="android.intent.category.DEFAULT"/> + <data android:mimeType="text/plain"/> + </intent-filter> + </activity> <activity android:name="org.briarproject.briar.android.conversation.ConversationActivity" android:label="@string/app_name" - android:theme="@style/BriarTheme.NoActionBar" android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity" + android:theme="@style/BriarTheme.NoActionBar" android:windowSoftInputMode="stateHidden|adjustResize"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -127,8 +152,7 @@ android:windowSoftInputMode="adjustResize"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -139,8 +163,7 @@ android:windowSoftInputMode="adjustResize|stateHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -159,8 +182,7 @@ android:windowSoftInputMode="adjustResize|stateHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity" - /> + android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/> </activity> <activity @@ -170,8 +192,7 @@ android:windowSoftInputMode="adjustResize|stateAlwaysHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity" - /> + android:value="org.briarproject.briar.android.privategroup.conversation.GroupActivity"/> </activity> <activity @@ -190,8 +211,7 @@ android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -200,8 +220,7 @@ android:parentActivityName="org.briarproject.briar.android.conversation.ConversationActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.conversation.ConversationActivity" - /> + android:value="org.briarproject.briar.android.conversation.ConversationActivity"/> </activity> <activity @@ -211,8 +230,7 @@ android:windowSoftInputMode="adjustResize"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -223,8 +241,7 @@ android:windowSoftInputMode="adjustResize|stateHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -234,8 +251,7 @@ android:windowSoftInputMode="adjustResize|stateHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.forum.ForumActivity" - /> + android:value="org.briarproject.briar.android.forum.ForumActivity"/> </activity> <activity @@ -245,8 +261,7 @@ android:windowSoftInputMode="adjustResize|stateHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.blog.BlogActivity" - /> + android:value="org.briarproject.briar.android.blog.BlogActivity"/> </activity> <activity @@ -265,8 +280,7 @@ android:parentActivityName="org.briarproject.briar.android.blog.BlogActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.blog.BlogActivity" - /> + android:value="org.briarproject.briar.android.blog.BlogActivity"/> </activity> <activity @@ -285,8 +299,7 @@ android:windowSoftInputMode="stateVisible|adjustResize"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.blog.BlogActivity" - /> + android:value="org.briarproject.briar.android.blog.BlogActivity"/> </activity> <activity @@ -296,8 +309,7 @@ android:windowSoftInputMode="stateHidden"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.blog.BlogActivity" - /> + android:value="org.briarproject.briar.android.blog.BlogActivity"/> </activity> <activity @@ -307,8 +319,7 @@ android:windowSoftInputMode="stateVisible|adjustResize"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -317,15 +328,14 @@ android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity android:name="org.briarproject.briar.android.keyagreement.ContactExchangeActivity" android:label="@string/add_contact_title" - android:theme="@style/BriarTheme.NoActionBar" - android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"> + android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity" + android:theme="@style/BriarTheme.NoActionBar"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> @@ -338,8 +348,7 @@ android:windowSoftInputMode="stateHidden|adjustResize"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.conversation.ConversationActivity" - /> + android:value="org.briarproject.briar.android.conversation.ConversationActivity"/> </activity> <activity @@ -354,12 +363,7 @@ android:permission="android.permission.READ_NETWORK_USAGE_HISTORY"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" - /> - <intent-filter> - <action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> + android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity"/> </activity> <activity @@ -368,8 +372,7 @@ android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.settings.SettingsActivity" - /> + android:value="org.briarproject.briar.android.settings.SettingsActivity"/> </activity> <activity @@ -378,8 +381,7 @@ android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.settings.SettingsActivity" - /> + android:value="org.briarproject.briar.android.settings.SettingsActivity"/> </activity> <activity @@ -388,8 +390,7 @@ android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" - android:value="org.briarproject.briar.android.settings.SettingsActivity" - /> + android:value="org.briarproject.briar.android.settings.SettingsActivity"/> </activity> <activity @@ -422,23 +423,8 @@ <activity android:name=".android.contact.add.remote.AddContactActivity" android:label="@string/add_contact_remotely_title_case" - android:launchMode="singleTask" android:theme="@style/BriarTheme" - android:windowSoftInputMode="stateHidden|adjustResize"> - <intent-filter> - <action android:name="android.intent.action.VIEW"/> - - <category android:name="android.intent.category.DEFAULT"/> - <category android:name="android.intent.category.BROWSABLE"/> - - <data android:scheme="briar"/> - </intent-filter> - <intent-filter> - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="text/plain"/> - </intent-filter> - </activity> + android:windowSoftInputMode="stateHidden|adjustResize"/> <activity android:name=".android.contact.add.remote.PendingContactListActivity" diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java index cf0b74416f24fcdb6b6890ae8a40c7683ea028ca..cd5871a92d7c323164a5312787fee2724e15757f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java @@ -9,6 +9,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.annotation.UiThread; import android.support.v4.app.NotificationCompat; @@ -73,10 +74,11 @@ import static android.support.v4.app.NotificationCompat.VISIBILITY_SECRET; import static android.support.v4.content.ContextCompat.getColor; import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID; import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID; -import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_BLOGS; -import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_CONTACTS; -import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_FORUMS; -import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_GROUPS; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.BLOG_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_ADDED_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.FORUM_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.GROUP_URI; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; @ThreadSafe @@ -101,7 +103,9 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private final Multiset<GroupId> blogCounts = new Multiset<>(); private int contactAddedTotal = 0; private int nextRequestId = 0; + @Nullable private ContactId blockedContact = null; + @Nullable private GroupId blockedGroup = null; private boolean blockSignInReminder = false; private boolean blockBlogs = false; @@ -325,9 +329,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } else { // Touching the notification shows the contact list Intent i = new Intent(appContext, NavDrawerActivity.class); - i.putExtra(INTENT_CONTACTS, true); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); - i.setData(Uri.parse(CONTACT_URI)); + i.setData(CONTACT_URI); TaskStackBuilder t = TaskStackBuilder.create(appContext); t.addParentStack(NavDrawerActivity.class); t.addNextIntent(i); @@ -363,9 +366,9 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, return defaults; } - private void setDeleteIntent(BriarNotificationBuilder b, String uri) { + private void setDeleteIntent(BriarNotificationBuilder b, Uri uri) { Intent i = new Intent(appContext, NotificationCleanupService.class); - i.setData(Uri.parse(uri)); + i.setData(uri); b.setDeleteIntent(PendingIntent.getService(appContext, nextRequestId++, i, 0)); } @@ -425,9 +428,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } else { // Touching the notification shows the group list Intent i = new Intent(appContext, NavDrawerActivity.class); - i.putExtra(INTENT_GROUPS, true); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); - i.setData(Uri.parse(GROUP_URI)); + i.setData(GROUP_URI); TaskStackBuilder t = TaskStackBuilder.create(appContext); t.addParentStack(NavDrawerActivity.class); t.addNextIntent(i); @@ -493,9 +495,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } else { // Touching the notification shows the forum list Intent i = new Intent(appContext, NavDrawerActivity.class); - i.putExtra(INTENT_FORUMS, true); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); - i.setData(Uri.parse(FORUM_URI)); + i.setData(FORUM_URI); TaskStackBuilder t = TaskStackBuilder.create(appContext); t.addParentStack(NavDrawerActivity.class); t.addNextIntent(i); @@ -546,9 +547,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, setDeleteIntent(b, BLOG_URI); // Touching the notification shows the combined blog feed Intent i = new Intent(appContext, NavDrawerActivity.class); - i.putExtra(INTENT_BLOGS, true); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); - i.setData(Uri.parse(BLOG_URI)); + i.setData(BLOG_URI); TaskStackBuilder t = TaskStackBuilder.create(appContext); t.addParentStack(NavDrawerActivity.class); t.addNextIntent(i); @@ -585,9 +585,8 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, setDeleteIntent(b, CONTACT_ADDED_URI); // Touching the notification shows the contact list Intent i = new Intent(appContext, NavDrawerActivity.class); - i.putExtra(INTENT_CONTACTS, true); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); - i.setData(Uri.parse(CONTACT_URI)); + i.setData(CONTACT_URI); TaskStackBuilder t = TaskStackBuilder.create(appContext); t.addParentStack(NavDrawerActivity.class); t.addNextIntent(i); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java b/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java index 44698d3f5fb053f4ba4e4627b77723d81551cea1..1d8ca912fc031ab48ecd8a51645ef8163ea57a95 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/NotificationCleanupService.java @@ -2,17 +2,18 @@ package org.briarproject.briar.android; import android.app.IntentService; import android.content.Intent; +import android.net.Uri; import android.support.annotation.Nullable; import org.briarproject.briar.api.android.AndroidNotificationManager; import javax.inject.Inject; -import static org.briarproject.briar.api.android.AndroidNotificationManager.BLOG_URI; -import static org.briarproject.briar.api.android.AndroidNotificationManager.CONTACT_URI; -import static org.briarproject.briar.api.android.AndroidNotificationManager.FORUM_URI; -import static org.briarproject.briar.api.android.AndroidNotificationManager.GROUP_URI; -import static org.briarproject.briar.api.android.AndroidNotificationManager.CONTACT_ADDED_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.BLOG_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_ADDED_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.CONTACT_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.FORUM_URI; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.GROUP_URI; public class NotificationCleanupService extends IntentService { @@ -37,7 +38,7 @@ public class NotificationCleanupService extends IntentService { @Override protected void onHandleIntent(@Nullable Intent i) { if (i == null || i.getData() == null) return; - String uri = i.getData().toString(); + Uri uri = i.getData(); if (uri.equals(CONTACT_URI)) { notificationManager.clearAllContactNotifications(); } else if (uri.equals(GROUP_URI)) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java index 8f476d4563c03039f2bad42636082a2656c8abf3..4db1bd6b2e04ccf09ddfbfb06cd1fd6023679980 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java @@ -12,11 +12,11 @@ import android.widget.CheckBox; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.briar.R; +import org.briarproject.briar.android.account.UnlockActivity; import org.briarproject.briar.android.controller.BriarController; import org.briarproject.briar.android.controller.DbController; import org.briarproject.briar.android.controller.handler.UiResultHandler; import org.briarproject.briar.android.login.StartupActivity; -import org.briarproject.briar.android.account.UnlockActivity; import org.briarproject.briar.android.logout.ExitActivity; import org.briarproject.briar.api.android.LockManager; @@ -66,9 +66,7 @@ public abstract class BriarActivity extends BaseActivity { @Nullable Intent data) { super.onActivityResult(request, result, data); if (request == REQUEST_PASSWORD) { - // The result can be RESULT_CANCELED if there's no account if (result == RESULT_OK) briarController.startAndBindService(); - else finish(); } else if (request == REQUEST_UNLOCK && result != RESULT_OK) { // We arrive here, if the user presses 'back' // in the Keyguard unlock screen, because UnlockActivity finishes. diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java index b043580166ba7e80aa04b8f1c82a49cd5a5f0f2a..3bca5ce75f149008c704bde48898bea4bb89c7aa 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java @@ -57,9 +57,9 @@ public class AddContactActivity extends BriarActivity implements }); Intent i = getIntent(); - if (i != null) { + if (state == null && i != null) { + // do not react to the intent again when recreating the activity onNewIntent(i); - setIntent(null); // don't keep the intent for configuration changes } if (state == null) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/IntentRouter.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/IntentRouter.java new file mode 100644 index 0000000000000000000000000000000000000000..9a9e1c1747ebfef7eaf560e4b0061cf4cc069950 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/IntentRouter.java @@ -0,0 +1,45 @@ +package org.briarproject.briar.android.navdrawer; + +import android.content.Context; +import android.content.Intent; + +import org.briarproject.briar.android.activity.BriarActivity; +import org.briarproject.briar.android.contact.add.remote.AddContactActivity; +import org.briarproject.briar.android.settings.SettingsActivity; + +import static android.content.Intent.ACTION_MANAGE_NETWORK_USAGE; +import static android.content.Intent.ACTION_SEND; +import static android.content.Intent.ACTION_VIEW; +import static android.content.Intent.EXTRA_TEXT; +import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; +import static org.briarproject.bramble.api.contact.HandshakeLinkConstants.LINK_REGEX; + +class IntentRouter { + + static void handleExternalIntent(Context ctx, Intent i) { + String action = i.getAction(); + // add remote contact with clicked briar:// link + if (ACTION_VIEW.equals(action) && "briar".equals(i.getScheme())) { + redirect(ctx, i, AddContactActivity.class); + } + // add remote contact with shared briar:// link + else if (ACTION_SEND.equals(action) && + "text/plain".equals(i.getType()) && + i.getStringExtra(EXTRA_TEXT) != null && + LINK_REGEX.matcher(i.getStringExtra(EXTRA_TEXT)).find()) { + redirect(ctx, i, AddContactActivity.class); + } + // network settings as launched from system settings app + else if (ACTION_MANAGE_NETWORK_USAGE.equals(action)) { + redirect(ctx, i, SettingsActivity.class); + } + } + + private static void redirect(Context ctx, Intent i, + Class<? extends BriarActivity> activityClass) { + i.setClass(ctx, activityClass); + i.addFlags(FLAG_ACTIVITY_CLEAR_TOP); + ctx.startActivity(i); + } + +} 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 a9901acf4acc52cc5814d7317955282ff246f114..1b8ea5c4ea7477937a5edebcf0d4fd72313a5c66 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 @@ -3,6 +3,7 @@ package org.briarproject.briar.android.navdrawer; import android.annotation.SuppressLint; import android.content.Intent; import android.content.res.Configuration; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -60,9 +61,11 @@ import static android.support.v4.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED; import static android.view.View.GONE; import static android.view.View.VISIBLE; 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.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.navdrawer.NavDrawerController.ExpiryWarning.NO; import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.UPDATE; import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry; @@ -73,14 +76,21 @@ public class NavDrawerActivity extends BriarActivity implements BaseFragmentListener, TransportStateListener, OnNavigationItemSelectedListener { - public static final String INTENT_CONTACTS = "intent_contacts"; - public static final String INTENT_GROUPS = "intent_groups"; - public static final String INTENT_FORUMS = "intent_forums"; - public static final String INTENT_BLOGS = "intent_blogs"; - public static final String INTENT_SIGN_OUT = "intent_sign_out"; - private static final Logger LOG = - Logger.getLogger(NavDrawerActivity.class.getName()); + getLogger(NavDrawerActivity.class.getName()); + + public static Uri CONTACT_URI = + Uri.parse("briar-content://org.briarproject.briar/contact"); + public static Uri GROUP_URI = + Uri.parse("briar-content://org.briarproject.briar/group"); + public static Uri FORUM_URI = + Uri.parse("briar-content://org.briarproject.briar/forum"); + public static Uri BLOG_URI = + Uri.parse("briar-content://org.briarproject.briar/blog"); + public static Uri CONTACT_ADDED_URI = + Uri.parse("briar-content://org.briarproject.briar/contact/added"); + public static Uri SIGN_OUT_URI = + Uri.parse("briar-content://org.briarproject.briar/sign-out"); private ActionBarDrawerToggle drawerToggle; @@ -95,26 +105,6 @@ public class NavDrawerActivity extends BriarActivity implements private List<Transport> transports; private BaseAdapter transportsAdapter; - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - exitIfStartupFailed(intent); - // TODO don't create new instances if they are on the stack (#606) - if (intent.getBooleanExtra(INTENT_GROUPS, false)) { - startFragment(GroupListFragment.newInstance(), R.id.nav_btn_groups); - } else if (intent.getBooleanExtra(INTENT_FORUMS, false)) { - startFragment(ForumListFragment.newInstance(), R.id.nav_btn_forums); - } else if (intent.getBooleanExtra(INTENT_CONTACTS, false)) { - startFragment(ContactListFragment.newInstance(), - R.id.nav_btn_contacts); - } else if (intent.getBooleanExtra(INTENT_BLOGS, false)) { - startFragment(FeedFragment.newInstance(), R.id.nav_btn_blogs); - } else if (intent.getBooleanExtra(INTENT_SIGN_OUT, false)) { - signOut(false, false); - } - setIntent(null); - } - @Override public void injectActivity(ActivityComponent component) { component.inject(this); @@ -153,7 +143,8 @@ public class NavDrawerActivity extends BriarActivity implements startFragment(ContactListFragment.newInstance(), R.id.nav_btn_contacts); } - if (getIntent() != null) { + if (state == null && getIntent() != null) { + // do not call this again when there's existing state onNewIntent(getIntent()); } } @@ -190,6 +181,37 @@ public class NavDrawerActivity extends BriarActivity implements } } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + // will call System.exit() + exitIfStartupFailed(intent); + + if ("briar-content".equals(intent.getScheme())) { + handleContentIntent(intent); + } else { + handleExternalIntent(this, intent); + } + } + + private void handleContentIntent(Intent intent) { + Uri uri = intent.getData(); + // TODO don't create new instances if they are on the stack (#606) + if (CONTACT_URI.equals(uri) || CONTACT_ADDED_URI.equals(uri)) { + startFragment(ContactListFragment.newInstance(), + R.id.nav_btn_contacts); + } else if (GROUP_URI.equals(uri)) { + startFragment(GroupListFragment.newInstance(), R.id.nav_btn_groups); + } else if (FORUM_URI.equals(uri)) { + startFragment(ForumListFragment.newInstance(), R.id.nav_btn_forums); + } else if (BLOG_URI.equals(uri)) { + startFragment(FeedFragment.newInstance(), R.id.nav_btn_blogs); + } else if (SIGN_OUT_URI.equals(uri)) { + signOut(false, false); + } + } + private void exitIfStartupFailed(Intent intent) { if (intent.getBooleanExtra(EXTRA_STARTUP_FAILED, false)) { finish(); @@ -325,7 +347,6 @@ public class NavDrawerActivity extends BriarActivity implements if (item != null) item.setVisible(visible); } - @SuppressWarnings("ConstantConditions") private void showExpiryWarning(ExpiryWarning expiry) { int daysUntilExpiry = getDaysUntilExpiry(); if (daysUntilExpiry < 0) signOut(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java index 6f5dcacc4a751852c76fc752b48bb0f126d084a6..b87e0e4cb67e61969ef8cf840d9fd25bca3835bd 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java @@ -79,10 +79,10 @@ import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ONLY_WHE import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; -import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; import static org.briarproject.briar.android.BriarApplication.ENTRY_ACTIVITY; +import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_RINGTONE; -import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_SIGN_OUT; +import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.SIGN_OUT_URI; import static org.briarproject.briar.android.util.UiUtils.hasScreenLock; import static org.briarproject.briar.android.util.UiUtils.triggerFeedback; import static org.briarproject.briar.api.android.AndroidNotificationManager.BLOG_CHANNEL_ID; @@ -578,7 +578,7 @@ public class SettingsFragment extends PreferenceFragmentCompat language.setValue(newValue); Intent intent = new Intent(getContext(), ENTRY_ACTIVITY); intent.setFlags(FLAG_ACTIVITY_CLEAR_TOP); - intent.putExtra(INTENT_SIGN_OUT, true); + intent.setData(SIGN_OUT_URI); requireActivity().startActivity(intent); requireActivity().finish(); }); diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java index 0a4951155cbfbe7c20bd6d4c62d7b6e8e52baa0d..eec2b8e9f65ec7106d0a4e118914ca7a8dca4948 100644 --- a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java +++ b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java @@ -43,13 +43,6 @@ public interface AndroidNotificationManager { String FAILURE_CHANNEL_ID = "zStartupFailure"; String REMINDER_CHANNEL_ID = "zSignInReminder"; - // Content URIs for pending intents - String CONTACT_URI = "content://org.briarproject.briar/contact"; - String GROUP_URI = "content://org.briarproject.briar/group"; - String FORUM_URI = "content://org.briarproject.briar/forum"; - String BLOG_URI = "content://org.briarproject.briar/blog"; - String CONTACT_ADDED_URI = "content://org.briarproject.briar/contact/added"; - // Actions for pending intents String ACTION_DISMISS_REMINDER = "dismissReminder";