From 3828d16971645e140051f24aa914cfd063d3d4e8 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Tue, 18 Jun 2019 10:52:21 +0100
Subject: [PATCH] Use injection to provide feature flags.

---
 .../briarproject/bramble/api/FeatureFlags.java | 11 +++++++++++
 .../briar/android/AndroidComponent.java        |  3 +++
 .../briarproject/briar/android/AppModule.java  | 18 ++++++++++++++++++
 .../briar/android/TestingConstants.java        | 11 -----------
 .../android/contact/ContactListFragment.java   |  6 ++++--
 .../conversation/ConversationActivity.java     |  6 ++++--
 6 files changed, 40 insertions(+), 15 deletions(-)
 create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/FeatureFlags.java

diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/FeatureFlags.java b/bramble-api/src/main/java/org/briarproject/bramble/api/FeatureFlags.java
new file mode 100644
index 0000000000..d30da78f29
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/FeatureFlags.java
@@ -0,0 +1,11 @@
+package org.briarproject.bramble.api;
+
+/**
+ * Interface for specifying which features are enabled in a build.
+ */
+public interface FeatureFlags {
+
+	boolean shouldEnableImageAttachments();
+
+	boolean shouldEnableRemoteContacts();
+}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
index e2473e8469..f718118262 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
@@ -7,6 +7,7 @@ import org.briarproject.bramble.BrambleAndroidModule;
 import org.briarproject.bramble.BrambleCoreEagerSingletons;
 import org.briarproject.bramble.BrambleCoreModule;
 import org.briarproject.bramble.account.BriarAccountModule;
+import org.briarproject.bramble.api.FeatureFlags;
 import org.briarproject.bramble.api.account.AccountManager;
 import org.briarproject.bramble.api.contact.ContactExchangeManager;
 import org.briarproject.bramble.api.contact.ContactManager;
@@ -161,6 +162,8 @@ public interface AndroidComponent
 
 	ViewModelProvider.Factory viewModelFactory();
 
+	FeatureFlags featureFlags();
+
 	void inject(SignInReminderReceiver briarService);
 
 	void inject(BriarService briarService);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
index 55e966549f..f544030b16 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
@@ -7,6 +7,7 @@ import android.os.StrictMode;
 
 import com.vanniktech.emoji.RecentEmoji;
 
+import org.briarproject.bramble.api.FeatureFlags;
 import org.briarproject.bramble.api.battery.BatteryManager;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.PublicKey;
@@ -59,6 +60,7 @@ import static java.util.Arrays.asList;
 import static java.util.Collections.emptyList;
 import static org.briarproject.bramble.api.reporting.ReportingConstants.DEV_ONION_ADDRESS;
 import static org.briarproject.bramble.api.reporting.ReportingConstants.DEV_PUBLIC_KEY_HEX;
+import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
 
 @Module(includes = {ContactExchangeModule.class, ViewModelModule.class})
 public class AppModule {
@@ -230,4 +232,20 @@ public class AppModule {
 		lifecycleManager.registerOpenDatabaseHook(recentEmoji);
 		return recentEmoji;
 	}
+
+	@Provides
+	FeatureFlags provideFeatureFlags() {
+		return new FeatureFlags() {
+
+			@Override
+			public boolean shouldEnableImageAttachments() {
+				return IS_DEBUG_BUILD;
+			}
+
+			@Override
+			public boolean shouldEnableRemoteContacts() {
+				return IS_DEBUG_BUILD;
+			}
+		};
+	}
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/TestingConstants.java b/briar-android/src/main/java/org/briarproject/briar/android/TestingConstants.java
index e84fbe7ed1..e3b970dc9c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/TestingConstants.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/TestingConstants.java
@@ -30,15 +30,4 @@ public interface TestingConstants {
 	long EXPIRY_DATE = IS_DEBUG_BUILD || IS_BETA_BUILD ?
 			BuildConfig.BuildTimestamp + 90 * 24 * 60 * 60 * 1000L :
 			Long.MAX_VALUE;
-
-	/**
-	 * Feature flag for enabling image attachments.
-	 */
-	boolean FEATURE_FLAG_IMAGE_ATTACHMENTS = IS_DEBUG_BUILD;
-
-	/**
-	 * Feature flag for enabling adding contacts at a distance.
-	 */
-	boolean FEATURE_FLAG_REMOTE_CONTACTS = IS_DEBUG_BUILD;
-
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
index 07ed8d8c49..7b5f1b5233 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
@@ -14,6 +14,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
 
+import org.briarproject.bramble.api.FeatureFlags;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager;
@@ -67,7 +68,6 @@ import static java.util.logging.Level.WARNING;
 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.FEATURE_FLAG_REMOTE_CONTACTS;
 import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID;
 import static org.briarproject.briar.android.util.UiUtils.isSamsung7;
 
@@ -85,6 +85,8 @@ public class ContactListFragment extends BaseFragment implements EventListener,
 	EventBus eventBus;
 	@Inject
 	AndroidNotificationManager notificationManager;
+	@Inject
+	FeatureFlags featureFlags;
 
 	private ContactListAdapter adapter;
 	private BriarRecyclerView list;
@@ -124,7 +126,7 @@ public class ContactListFragment extends BaseFragment implements EventListener,
 				container, false);
 
 		FabSpeedDial speedDial = contentView.findViewById(R.id.speedDial);
-		if (FEATURE_FLAG_REMOTE_CONTACTS) {
+		if (featureFlags.shouldEnableRemoteContacts()) {
 			speedDial.addOnMenuItemClickListener(this);
 		} else {
 			speedDial.setMenu(new FabSpeedDialMenu(contentView.getContext()));
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java
index dfbddcd7ac..e8dac0f320 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java
@@ -29,6 +29,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import org.briarproject.bramble.api.FeatureFlags;
 import org.briarproject.bramble.api.Pair;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager;
@@ -119,7 +120,6 @@ 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.bramble.util.StringUtils.isNullOrEmpty;
-import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_IMAGE_ATTACHMENTS;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_ATTACH_IMAGE;
 import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_INTRODUCTION;
 import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENTS;
@@ -156,6 +156,8 @@ public class ConversationActivity extends BriarActivity
 	Executor cryptoExecutor;
 	@Inject
 	ViewModelProvider.Factory viewModelFactory;
+	@Inject
+	FeatureFlags featureFlags;
 
 	// Fields that are accessed from background threads must be volatile
 	@Inject
@@ -262,7 +264,7 @@ public class ConversationActivity extends BriarActivity
 		list.getRecyclerView().addOnScrollListener(scrollListener);
 
 		textInputView = findViewById(R.id.text_input_container);
-		if (FEATURE_FLAG_IMAGE_ATTACHMENTS) {
+		if (featureFlags.shouldEnableImageAttachments()) {
 			ImagePreview imagePreview = findViewById(R.id.imagePreview);
 			sendController = new TextAttachmentController(textInputView,
 					imagePreview, this, this, viewModel);
-- 
GitLab