diff --git a/app/build.gradle b/app/build.gradle
index d89b137e29fb..42abf0e87d18 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -50,7 +50,8 @@ if (shotTest) {
apply plugin: 'shot'
}
apply plugin: 'com.google.devtools.ksp'
-
+// apply marketing SDK for NMC
+apply from: "$rootProject.projectDir/nmc_marketing-dependencies.gradle"
println "Gradle uses Java ${Jvm.current()}"
@@ -427,6 +428,9 @@ dependencies {
// splash screen dependency ref: https://developer.android.com/develop/ui/views/launch/splash-screen/migrate
implementation 'androidx.core:core-splashscreen:1.0.1'
+
+ // NMC: dependency required to capture Advertising ID for Adjust & MoEngage SDK
+ implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
}
configurations.configureEach {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6f89c63ac939..c69fbec4e95c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -606,6 +606,17 @@
android:name="com.nextcloud.client.etm.EtmActivity"
android:exported="false"
android:theme="@style/Theme.ownCloud.Toolbar" />
+
+
+
+
+
+
+
+
(R.id.logs_loading_progress).apply {
- viewThemeUtils.platform.themeHorizontalProgressBar(this)
+ //NMC Customization
+ ProgressBarThemeUtils.themeHorizontalProgressBar(this, resources.getColor(R.color.primary, null))
}
logsAdapter = LogsAdapter(this)
diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java
index b2517b5fa579..ff53897296c9 100644
--- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java
+++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java
@@ -339,6 +339,24 @@ default void onDarkThemeModeChanged(DarkMode mode) {
void setCurrentAccountName(String accountName);
+ /**
+ * Saves the data analysis from privacy settings
+ * on disabling it we should disable Adjust SDK tracking
+ *
+ * @param enableDataAnalysis to enable/disable data analysis
+ */
+ void setDataAnalysis(boolean enableDataAnalysis);
+ boolean isDataAnalysisEnabled();
+
+ /**
+ * Saves the privacy policy action taken by user
+ * this will maintain the state of current privacy policy action taken
+ * @see com.nmc.android.ui.LoginPrivacySettingsActivity for actions
+ * @param userAction taken by user
+ */
+ void setPrivacyPolicyAction(int userAction);
+ int getPrivacyPolicyAction();
+
/**
* Gets status of migration to user id, default false
*
diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
index 0801d9102745..028b9d7f967e 100644
--- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
+++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
@@ -22,6 +22,7 @@
import com.nextcloud.client.account.UserAccountManager;
import com.nextcloud.client.account.UserAccountManagerImpl;
import com.nextcloud.client.jobs.LogEntry;
+import com.nmc.android.ui.PrivacyUserAction;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.datamodel.ArbitraryDataProviderImpl;
import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -104,6 +105,9 @@ public final class AppPreferencesImpl implements AppPreferences {
private static final String LOG_ENTRY = "log_entry";
+ private static final String PREF__DATA_ANALYSIS = "data_analysis";
+ private static final String PREF__PRIVACY_POLICY_ACTION = "privacy_policy_action";
+
private final Context context;
private final SharedPreferences preferences;
private final UserAccountManager userAccountManager;
@@ -610,6 +614,27 @@ public void setCurrentAccountName(String accountName) {
preferences.edit().putString(PREF__SELECTED_ACCOUNT_NAME, accountName).apply();
}
+ @Override
+ public void setDataAnalysis(boolean enableDataAnalysis) {
+ preferences.edit().putBoolean(PREF__DATA_ANALYSIS, enableDataAnalysis).apply();
+ }
+
+ @Override
+ public boolean isDataAnalysisEnabled() {
+ //default value will be true
+ return preferences.getBoolean(PREF__DATA_ANALYSIS, true);
+ }
+
+ @Override
+ public void setPrivacyPolicyAction(int userAction) {
+ preferences.edit().putInt(PREF__PRIVACY_POLICY_ACTION, userAction).apply();
+ }
+
+ @Override
+ public int getPrivacyPolicyAction() {
+ return preferences.getInt(PREF__PRIVACY_POLICY_ACTION, PrivacyUserAction.NO_ACTION);
+ }
+
@Override
public boolean isUserIdMigrated() {
return preferences.getBoolean(PREF__MIGRATED_USER_ID, false);
diff --git a/app/src/main/java/com/nmc/android/marketTracking/AdjustSdkUtils.kt b/app/src/main/java/com/nmc/android/marketTracking/AdjustSdkUtils.kt
new file mode 100644
index 000000000000..2fc80427dc79
--- /dev/null
+++ b/app/src/main/java/com/nmc/android/marketTracking/AdjustSdkUtils.kt
@@ -0,0 +1,67 @@
+package com.nmc.android.marketTracking
+
+import android.app.Application
+import com.adjust.sdk.Adjust
+import com.adjust.sdk.AdjustConfig
+import com.adjust.sdk.AdjustEvent
+import com.nextcloud.client.preferences.AppPreferences
+import com.owncloud.android.BuildConfig
+
+object AdjustSdkUtils {
+ private val TAG = AdjustSdkUtils::class.java.simpleName
+
+ const val EVENT_TOKEN_LOGIN = "gb97gb"
+ const val EVENT_TOKEN_SUCCESSFUL_LOGIN = "gx6g7g"
+ const val EVENT_TOKEN_FILE_BROWSER_SHARING = "fqtiu7"
+ const val EVENT_TOKEN_CREATE_SHARING_LINK = "qeyql3"
+
+ /* event names to be tracked on clicking of FAB button which opens BottomSheet to select options */
+ const val EVENT_TOKEN_FAB_BOTTOM_FILE_UPLOAD = "4rd8r4"
+ const val EVENT_TOKEN_FAB_BOTTOM_PHOTO_VIDEO_UPLOAD = "v1g6ly"
+ const val EVENT_TOKEN_FAB_BOTTOM_DOCUMENT_SCAN = "7fec8n"
+ const val EVENT_TOKEN_FAB_BOTTOM_CAMERA_UPLOAD = "3czack"
+
+ /* events for settings screen */
+ const val EVENT_TOKEN_SETTINGS_LOGOUT = "g6mj9y"
+ const val EVENT_TOKEN_SETTINGS_RESET = "zi18r0"
+ const val EVENT_TOKEN_SETTINGS_AUTO_UPLOAD_ON = "vwd9yk"
+ const val EVENT_TOKEN_SETTINGS_AUTO_UPLOAD_OFF = "e95w5t"
+
+ const val EVENT_TOKEN_BACKUP_MANUAL = "oojr4y"
+ const val EVENT_TOKEN_BACKUP_AUTO = "7dkhkx"
+
+ @JvmStatic
+ fun initialiseAdjustSDK(application: Application) {
+ val config = AdjustConfig(
+ application, BuildConfig.ADJUST_APP_TOKEN,
+ getAdjustEnvironment()
+ )
+ Adjust.onCreate(config)
+ }
+
+ /**
+ * method to return the sdk environment for Adjust
+ */
+ @JvmStatic
+ fun getAdjustEnvironment(): String {
+ //for qa, beta, debug apk we have to use Sandbox env
+ if (BuildConfig.APPLICATION_ID.contains(".beta") || BuildConfig.DEBUG) {
+ return AdjustConfig.ENVIRONMENT_SANDBOX
+ }
+
+ //for release build apart from qa, beta flavours Prod env is used
+ return AdjustConfig.ENVIRONMENT_PRODUCTION
+ }
+
+ /**
+ * method to track events
+ * tracking event only if data analysis is enabled else don't track it
+ */
+ @JvmStatic
+ fun trackEvent(eventToken: String, appPreferences: AppPreferences?) {
+ if (appPreferences?.isDataAnalysisEnabled == true) {
+ val adjustEvent = AdjustEvent(eventToken)
+ Adjust.trackEvent(adjustEvent)
+ }
+ }
+}
diff --git a/app/src/main/java/com/nmc/android/marketTracking/TealiumSdkUtils.kt b/app/src/main/java/com/nmc/android/marketTracking/TealiumSdkUtils.kt
new file mode 100644
index 000000000000..806cc175eff1
--- /dev/null
+++ b/app/src/main/java/com/nmc/android/marketTracking/TealiumSdkUtils.kt
@@ -0,0 +1,107 @@
+package com.nmc.android.marketTracking
+
+import android.app.Application
+import com.nextcloud.client.preferences.AppPreferences
+import com.owncloud.android.BuildConfig
+import com.tealium.library.Tealium
+
+object TealiumSdkUtils {
+
+ //Pre-defined values for Tealium
+ //** DO NOT CHANGE THE VALUES **//
+ private const val INSTANCE_NAME = "tealium_main"
+ private const val ACCOUNT_NAME = "telekom"
+ private const val PROFILE_NAME = "magentacloud-app"
+
+ //Live Version of the app (published in app stores)
+ private const val PROD_ENV = "prod"
+
+ //Quality System
+ private const val QA_ENV = "qa"
+
+ //Staging System (Development System)
+ private const val DEV_ENV = "dev"
+
+ const val EVENT_SUCCESSFUL_LOGIN = "magentacloud-app.login.successful"
+ const val EVENT_FILE_BROWSER_SHARING = "magentacloud-app.filebrowser.sharing"
+ const val EVENT_CREATE_SHARING_LINK = "magentacloud-app.sharing.create"
+
+ /* event names to be tracked on clicking of FAB button which opens BottomSheet to select options */
+ const val EVENT_FAB_BOTTOM_DOCUMENT_SCAN = "magentacloud-app.plus.documentscan"
+ const val EVENT_FAB_BOTTOM_PHOTO_VIDEO_UPLOAD = "magentacloud-app.plus.fotovideoupload"
+ const val EVENT_FAB_BOTTOM_FILE_UPLOAD = "magentacloud-app.plus.fileupload"
+ const val EVENT_FAB_BOTTOM_CAMERA_UPLOAD = "magentacloud-app.plus.cameraupload"
+
+ /* events for settings screen */
+ const val EVENT_SETTINGS_LOGOUT = "magentacloud-app.settings.logout"
+ const val EVENT_SETTINGS_RESET = "magentacloud-app.settings.reset"
+ const val EVENT_SETTINGS_AUTO_UPLOAD_ON = "magentacloud-app.settings.autoupload-on"
+ const val EVENT_SETTINGS_AUTO_UPLOAD_OFF = "magentacloud-app.settings.autoupload-off"
+
+ const val EVENT_BACKUP_MANUAL = "magentacloud-app.backup.manual"
+ const val EVENT_BACKUP_AUTO = "magentacloud-app.backup.auto"
+
+ /* Screen View Names to be tracked */
+ const val SCREEN_VIEW_LOGIN = "magentacloud-app.login"
+ const val SCREEN_VIEW_FILE_BROWSER = "magentacloud-app.filebrowser"
+ const val SCREEN_VIEW_FAB_PLUS = "magentacloud-app.plus"
+ const val SCREEN_VIEW_SHARING = "magentacloud-app.sharing"
+ const val SCREEN_VIEW_SETTINGS = "magentacloud-app.settings"
+ const val SCREEN_VIEW_BACKUP = "magentacloud-app.backup"
+
+ @JvmStatic
+ fun initialiseTealiumSDK(application: Application) {
+ val tealConfig = Tealium.Config.create(
+ application,
+ ACCOUNT_NAME,
+ PROFILE_NAME,
+ getTealiumEnvironment()
+ )
+
+ // Override for the tag management webview URL (mobile.html)
+ //tealConfig.setOverrideTagManagementUrl("https://tags-eu.tiqcdn.com/utag/telekom/magentacloudapp/prod/mobile" +".html");
+ // Override for the tag management publish URL (compare to https://tealium.github.io/tealiumandroid/)
+ //tealConfig.setOverrideTagManagementUrl("https://tags-eu.tiqcdn.com/utag/telekom/magentacloudapp/prod");
+ Tealium.createInstance(INSTANCE_NAME, tealConfig)
+ }
+
+ /**
+ * method to return the tealium sdk environment
+ */
+ private fun getTealiumEnvironment(): String {
+ //if flavour is qa then return the qa environment
+ if (BuildConfig.FLAVOR == "qa") {
+ return QA_ENV
+ }
+
+ //if flavour is versionDev or the build has debug mode then return dev environment
+ if (BuildConfig.FLAVOR == "versionDev" || BuildConfig.DEBUG) {
+ return DEV_ENV
+ }
+
+ //for release build to play store return prod environment
+ return PROD_ENV
+ }
+
+ /**
+ * method to track events
+ * tracking event only if data analysis is enabled else don't track it
+ */
+ @JvmStatic
+ fun trackEvent(eventName: String, appPreferences: AppPreferences?) {
+ if (appPreferences?.isDataAnalysisEnabled == true) {
+ Tealium.getInstance(INSTANCE_NAME).trackEvent(eventName, null)
+ }
+ }
+
+ /**
+ * method to track view
+ * tracking view only if data analysis is enabled else don't track it
+ */
+ @JvmStatic
+ fun trackView(viewName: String, appPreferences: AppPreferences?) {
+ if (appPreferences?.isDataAnalysisEnabled == true) {
+ Tealium.getInstance(INSTANCE_NAME).trackView(viewName, null)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/nmc/android/marketTracking/TrackingScanInterface.kt b/app/src/main/java/com/nmc/android/marketTracking/TrackingScanInterface.kt
new file mode 100644
index 000000000000..3a517a29f458
--- /dev/null
+++ b/app/src/main/java/com/nmc/android/marketTracking/TrackingScanInterface.kt
@@ -0,0 +1,14 @@
+package com.nmc.android.marketTracking
+
+import com.nextcloud.client.preferences.AppPreferences
+
+/**
+ * interface to track the scanning events from nmc/1867-scanbot branch
+ * for implementation look nmc/1925-market_tracking branch
+ * this class will have the declaration for it since it has the tracking SDK's in place
+ * since we don't have scanning functionality in this branch so to handle the event we have used interface
+ */
+interface TrackingScanInterface {
+
+ fun sendScanEvent(appPreferences: AppPreferences)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/nmc/android/marketTracking/TrackingScanInterfaceImpl.kt b/app/src/main/java/com/nmc/android/marketTracking/TrackingScanInterfaceImpl.kt
new file mode 100644
index 000000000000..ed0c7cd5d92a
--- /dev/null
+++ b/app/src/main/java/com/nmc/android/marketTracking/TrackingScanInterfaceImpl.kt
@@ -0,0 +1,18 @@
+package com.nmc.android.marketTracking
+
+import com.nextcloud.client.preferences.AppPreferences
+
+/**
+ * interface impl to send the scanning events to tealium and adjust
+ * this class will have the implementation for it since it has the tracking SDK's in place
+ * since we don't have scanning functionality in this branch so to handle the event we have used interface
+ * calling of this method will be done from nmc/1867-scanbot
+ */
+class TrackingScanInterfaceImpl : TrackingScanInterface {
+
+ override fun sendScanEvent(appPreferences: AppPreferences) {
+ //track event on Scan Document button click
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_FAB_BOTTOM_DOCUMENT_SCAN, appPreferences)
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_FAB_BOTTOM_DOCUMENT_SCAN, appPreferences)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/nmc/android/ui/PrivacyUserAction.kt b/app/src/main/java/com/nmc/android/ui/PrivacyUserAction.kt
new file mode 100644
index 000000000000..6dca412cc29b
--- /dev/null
+++ b/app/src/main/java/com/nmc/android/ui/PrivacyUserAction.kt
@@ -0,0 +1,9 @@
+package com.nmc.android.ui
+
+//class to handle user action for privacy
+object PrivacyUserAction {
+ //privacy user action to maintain the state of privacy policy
+ const val NO_ACTION = 0 //user has taken no action
+ const val REJECT_ACTION = 1 //user rejected the privacy policy
+ const val ACCEPT_ACTION = 2 //user has accepted the privacy policy
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/nmc/android/ui/utils/ProgressBarThemeUtils.kt b/app/src/main/java/com/nmc/android/ui/utils/ProgressBarThemeUtils.kt
new file mode 100644
index 000000000000..ea274bb68c3a
--- /dev/null
+++ b/app/src/main/java/com/nmc/android/ui/utils/ProgressBarThemeUtils.kt
@@ -0,0 +1,28 @@
+package com.nmc.android.ui.utils
+
+import android.widget.ProgressBar
+import android.widget.SeekBar
+import androidx.annotation.ColorInt
+import androidx.core.graphics.BlendModeColorFilterCompat
+import androidx.core.graphics.BlendModeCompat
+
+/**
+ * theming progress and seek bar for NMC
+ */
+object ProgressBarThemeUtils {
+
+ @JvmStatic
+ fun themeHorizontalSeekBar(seekBar: SeekBar, @ColorInt color: Int) {
+ themeHorizontalProgressBar(seekBar, color)
+ seekBar.thumb.colorFilter =
+ BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_IN)
+ }
+
+ @JvmStatic
+ fun themeHorizontalProgressBar(progressBar: ProgressBar?, @ColorInt color: Int) {
+ progressBar?.indeterminateDrawable?.colorFilter =
+ BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_IN)
+ progressBar?.progressDrawable?.colorFilter =
+ BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_IN)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/owncloud/android/MainApp.java b/app/src/main/java/com/owncloud/android/MainApp.java
index 9fd3e2cb7abe..1bfda13e9931 100644
--- a/app/src/main/java/com/owncloud/android/MainApp.java
+++ b/app/src/main/java/com/owncloud/android/MainApp.java
@@ -61,6 +61,8 @@
import com.nextcloud.client.preferences.DarkMode;
import com.nextcloud.utils.extensions.ContextExtensionsKt;
import com.nmc.android.ui.LauncherActivity;
+import com.nmc.android.marketTracking.AdjustSdkUtils;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.owncloud.android.authentication.AuthenticatorActivity;
import com.owncloud.android.authentication.PassCodeManager;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
@@ -309,6 +311,11 @@ public void onCreate() {
initSecurityKeyManager();
+ // NMC Customization
+ // Adjust SDK has to be initialised before registerActivityLifecycleCallbacks method
+ // https://github.com/adjust/android_sdk#api-level-14-and-higher
+ initMarketTrackingSdks();
+
registerActivityLifecycleCallbacks(new ActivityInjector());
//update the app restart count when app is launched by the user
@@ -967,6 +974,12 @@ public AndroidInjector