diff --git a/app/build.gradle b/app/build.gradle
index c1b95fd10049..94b178dc0ba1 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()}"
@@ -430,6 +431,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 a2abdd5d0b8f..cf479438ad78 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -623,6 +623,17 @@
android:name="com.nextcloud.client.etm.EtmActivity"
android:exported="false"
android:theme="@style/Theme.ownCloud.Toolbar" />
+
+
+
+
+
+
+
+
androidInjector() {
return dispatchingAndroidInjector;
}
+ //NMC Customization
+ private void initMarketTrackingSdks(){
+ TealiumSdkUtils.initialiseTealiumSDK(this);
+ AdjustSdkUtils.initialiseAdjustSDK(this);
+ }
+
public static void setAppTheme(DarkMode mode) {
switch (mode) {
case LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
diff --git a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
index 7f12948467c5..e1551da0f48f 100644
--- a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
+++ b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
@@ -71,6 +71,8 @@
import com.nextcloud.operations.PostMethod;
import com.nextcloud.utils.extensions.BundleExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
+import com.nmc.android.marketTracking.AdjustSdkUtils;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.databinding.AccountSetupBinding;
@@ -1362,6 +1364,10 @@ public void onAuthenticatorTaskCallback(RemoteOperationResult result)
}
private void endSuccess() {
+ // NMC: track successful login event
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_SUCCESSFUL_LOGIN, preferences);
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_SUCCESSFUL_LOGIN, preferences);
+
if (!onlyAdd) {
if (MDMConfig.INSTANCE.enforceProtection(this) && Objects.equals(preferences.getLockPreference(), SettingsActivity.LOCK_NONE)) {
Intent i = new Intent(this, SettingsActivity.class);
@@ -1769,4 +1775,11 @@ public void onSavedCertificate() {
public void onFailedSavingCertificate() {
DisplayUtils.showSnackMessage(this, R.string.ssl_validator_not_saved);
}
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ //track screen view when activity is visible
+ TealiumSdkUtils.trackView(TealiumSdkUtils.SCREEN_VIEW_LOGIN, preferences);
+ }
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
index 0e9cd20bd8c0..4ac2d3a3e32b 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
@@ -63,6 +63,7 @@
import com.nextcloud.client.network.ClientFactory;
import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.client.utils.IntentUtil;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.nextcloud.model.WorkerState;
import com.nextcloud.model.WorkerStateLiveData;
import com.nextcloud.utils.BuildHelper;
@@ -2477,6 +2478,9 @@ public void onStart() {
EventBus.getDefault().post(new TokenPushEvent());
checkForNewDevVersionNecessary(getApplicationContext());
+
+ //track screen view when activity is visible
+ TealiumSdkUtils.trackView(TealiumSdkUtils.SCREEN_VIEW_FILE_BROWSER, preferences);
}
private void registerRefreshFolderEventReceiver() {
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
index bde331c722a3..9ccb7a21f6c0 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
@@ -49,6 +49,7 @@
import com.nextcloud.client.network.ClientFactory;
import com.nextcloud.client.network.ConnectivityService;
import com.nextcloud.client.preferences.AppPreferences;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.nextcloud.client.preferences.AppPreferencesImpl;
import com.nextcloud.client.preferences.DarkMode;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
@@ -1113,6 +1114,13 @@ protected void onPostCreate(Bundle savedInstanceState) {
getDelegate().onPostCreate(savedInstanceState);
}
+ @Override
+ protected void onStart() {
+ super.onStart();
+ //track screen view when activity is visible
+ TealiumSdkUtils.trackView(TealiumSdkUtils.SCREEN_VIEW_SETTINGS, preferences);
+ }
+
@Override
protected void onDestroy() {
super.onDestroy();
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
index d18c26825cb6..476d83da1743 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
@@ -35,6 +35,8 @@ import com.nextcloud.client.jobs.upload.FileUploadWorker
import com.nextcloud.client.preferences.SubFolderRule
import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.isDialogFragmentReady
+import com.nmc.android.marketTracking.AdjustSdkUtils
+import com.nmc.android.marketTracking.TealiumSdkUtils
import com.owncloud.android.BuildConfig
import com.owncloud.android.MainApp
import com.owncloud.android.R
@@ -581,6 +583,9 @@ class SyncedFoldersActivity :
backgroundJobManager.startImmediateFilesSyncJob(syncedFolderDisplayItem.id, overridePowerSaving = false)
showBatteryOptimizationInfo()
}
+
+ //track event when user enable/disable auto upload on/off
+ trackAutoUploadEvent(syncedFolderDisplayItem.isEnabled)
}
override fun onSyncFolderSettingsClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem?) {
@@ -709,6 +714,14 @@ class SyncedFoldersActivity :
if (syncedFolder.isEnabled) {
showBatteryOptimizationInfo()
}
+
+ //track event when user enable/disable auto upload on/off
+ trackAutoUploadEvent(syncedFolder.isEnabled)
+ }
+
+ private fun trackAutoUploadEvent(enabled: Boolean) {
+ AdjustSdkUtils.trackEvent(if (enabled) AdjustSdkUtils.EVENT_TOKEN_SETTINGS_AUTO_UPLOAD_ON else AdjustSdkUtils.EVENT_TOKEN_SETTINGS_AUTO_UPLOAD_OFF, preferences)
+ TealiumSdkUtils.trackEvent(if (enabled) TealiumSdkUtils.EVENT_SETTINGS_AUTO_UPLOAD_ON else TealiumSdkUtils.EVENT_SETTINGS_AUTO_UPLOAD_OFF, preferences)
}
private fun saveOrUpdateSyncedFolder(item: SyncedFolderDisplayItem) {
diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalDialog.kt b/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalDialog.kt
index e42f1b7c626f..f07de12e475f 100644
--- a/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalDialog.kt
+++ b/app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalDialog.kt
@@ -9,27 +9,23 @@
package com.owncloud.android.ui.dialog
import android.app.Dialog
-import android.graphics.drawable.Drawable
+import android.content.DialogInterface
import android.os.Bundle
-import android.view.View
-import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
-import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.nextcloud.client.account.User
-import com.nextcloud.client.account.UserAccountManager
import com.nextcloud.client.di.Injectable
import com.nextcloud.client.jobs.BackgroundJobManager
+import com.nextcloud.client.preferences.AppPreferences
+import com.nmc.android.marketTracking.AdjustSdkUtils
+import com.nmc.android.marketTracking.TealiumSdkUtils
import com.nextcloud.utils.extensions.getParcelableArgument
import com.owncloud.android.R
-import com.owncloud.android.databinding.AccountRemovalDialogBinding
-import com.owncloud.android.datamodel.FileDataStorageManager
-import com.owncloud.android.utils.DisplayUtils
-import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject
-class AccountRemovalDialog : DialogFragment(), AvatarGenerationListener, Injectable {
+// NMC Customization: We don't need two option for logout. On logout directly logout the user locally from the app
+class AccountRemovalDialog : DialogFragment(), Injectable {
@Inject
lateinit var backgroundJobManager: BackgroundJobManager
@@ -37,137 +33,37 @@ class AccountRemovalDialog : DialogFragment(), AvatarGenerationListener, Injecta
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
+ @Inject
+ lateinit var appPreferences: AppPreferences
+
private var user: User? = null
- private lateinit var alertDialog: AlertDialog
- private var _binding: AccountRemovalDialogBinding? = null
- val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
user = requireArguments().getParcelableArgument(KEY_USER, User::class.java)
}
- override fun onStart() {
- super.onStart()
-
- // disable positive button and apply theming
- alertDialog = dialog as AlertDialog
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
-
- viewThemeUtils.platform.themeRadioButton(binding.radioLocalRemove)
- viewThemeUtils.platform.themeRadioButton(binding.radioRequestDeletion)
- viewThemeUtils.material.colorMaterialButtonPrimaryTonal(
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton
- )
- viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(
- alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton
- )
-
- binding.userName.text = UserAccountManager.getDisplayName(user)
- binding.account.text = user?.let { DisplayUtils.convertIdn(it.accountName, false) }
- }
-
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- _binding = AccountRemovalDialogBinding.inflate(layoutInflater)
-
- // start avatar generation
- setAvatar()
-
- // hide second option when plug-in isn't installed
- if (hasDropAccount()) {
- binding.requestDeletion.visibility = View.VISIBLE
- }
-
- val builder =
- MaterialAlertDialogBuilder(requireActivity())
- .setTitle(R.string.delete_account)
- .setView(binding.root)
- .setNegativeButton(R.string.common_cancel) { _, _ -> }
- .setPositiveButton(R.string.delete_account) { _, _ -> removeAccount() }
-
- // allow selection by clicking on list element
- binding.localRemove.setOnClickListener {
- binding.radioLocalRemove.performClick()
- }
- binding.requestDeletion.setOnClickListener {
- binding.radioRequestDeletion.performClick()
- }
-
- // set listeners for custom radio button list
- binding.radioLocalRemove.setOnClickListener {
- binding.radioRequestDeletion.isChecked = false
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).apply {
- text = getText(R.string.delete_account)
- isEnabled = true
- }
- }
- binding.radioRequestDeletion.setOnClickListener {
- binding.radioLocalRemove.isChecked = false
- alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).apply {
- text = getString(R.string.request_account_deletion_button)
- isEnabled = true
+ val builder = MaterialAlertDialogBuilder(requireActivity())
+ .setTitle(R.string.delete_account)
+ .setMessage(resources.getString(R.string.delete_account_warning, user!!.accountName))
+ .setIcon(R.drawable.ic_warning)
+ .setPositiveButton(R.string.common_ok) { _: DialogInterface?, _: Int ->
+ // track adjust and tealium events on logout confirmed
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_SETTINGS_LOGOUT, appPreferences)
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_SETTINGS_LOGOUT, appPreferences)
+ backgroundJobManager.startAccountRemovalJob(
+ user!!.accountName,
+ false
+ )
}
- }
-
- viewThemeUtils.dialog.colorMaterialAlertDialogBackground(requireActivity(), builder)
+ .setNegativeButton(R.string.common_cancel, null)
return builder.create()
}
- /**
- * Get value of `drop-account` capability.
- */
- private fun hasDropAccount(): Boolean {
- val capability = FileDataStorageManager(user, context?.contentResolver).getCapability(user)
- return capability.dropAccount.isTrue
- }
-
- /**
- * Start removal of account. Depending on which option is checked, either a browser will open to request deletion,
- * or the local account will be removed immediately.
- */
- private fun removeAccount() {
- user?.let { user ->
- if (binding.radioRequestDeletion.isChecked) {
- DisplayUtils.startLinkIntent(activity, user.server.uri.toString() + DROP_ACCOUNT_URI)
- } else {
- backgroundJobManager.startAccountRemovalJob(user.accountName, false)
- }
- }
- }
-
- /**
- * Start avatar generation.
- */
- private fun setAvatar() {
- try {
- val imageView = binding.userIcon
- imageView.tag = user!!.accountName
- DisplayUtils.setAvatar(
- user!!,
- this,
- resources.getDimension(R.dimen.list_item_avatar_icon_radius),
- resources,
- imageView,
- context
- )
- } catch (_: Exception) {
- }
- }
-
- override fun avatarGenerated(avatarDrawable: Drawable?, callContext: Any?) {
- avatarDrawable?.let {
- binding.userIcon.setImageDrawable(it)
- }
- }
-
- override fun shouldCallGeneratedCallback(tag: String?, callContext: Any?): Boolean {
- return binding.userIcon.tag == tag
- }
-
companion object {
private const val KEY_USER = "USER"
- private const val DROP_ACCOUNT_URI = "/settings/user/drop_account"
@JvmStatic
fun newInstance(user: User) = AccountRemovalDialog().apply {
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
index a9fd7d134b1f..70efa36946d2 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
@@ -37,6 +37,7 @@
import com.nextcloud.utils.extensions.BundleExtensionsKt;
import com.nextcloud.utils.extensions.FileExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.databinding.FileDetailsFragmentBinding;
@@ -374,6 +375,8 @@ public void onStart() {
super.onStart();
listenForTransferProgress();
EventBus.getDefault().register(this);
+ //track screen view when fragment is visible
+ TealiumSdkUtils.trackView(TealiumSdkUtils.SCREEN_VIEW_SHARING, preferences);
}
@Override
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
index 5854953c8d12..8625183eb35c 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
@@ -56,6 +56,9 @@
import com.owncloud.android.ui.adapter.ShareeListAdapter;
import com.owncloud.android.ui.adapter.ShareeListAdapterListener;
import com.owncloud.android.ui.asynctasks.RetrieveHoverCardAsyncTask;
+import com.nextcloud.client.preferences.AppPreferences;
+import com.nmc.android.marketTracking.AdjustSdkUtils;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
import com.owncloud.android.ui.fragment.util.FileDetailSharingFragmentHelper;
import com.owncloud.android.ui.helpers.FileOperationsHelper;
@@ -102,6 +105,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
@Inject ClientFactory clientFactory;
@Inject ViewThemeUtils viewThemeUtils;
@Inject UsersAndGroupsSearchConfig searchConfig;
+ @Inject AppPreferences appPreferences;
public static FileDetailSharingFragment newInstance(OCFile file, User user) {
FileDetailSharingFragment fragment = new FileDetailSharingFragment();
@@ -320,6 +324,10 @@ public void createPublicShareLink() {
// create without password if not enforced by server or we don't know if enforced;
fileOperationsHelper.shareFileViaPublicShare(file, null);
}
+
+ //track event on creating share link
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_CREATE_SHARING_LINK, appPreferences);
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_CREATE_SHARING_LINK, appPreferences);
}
@Override
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
index dca686d638d6..e5881bcda37d 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
@@ -17,7 +17,9 @@
import com.nextcloud.client.di.Injectable;
import com.nextcloud.client.documentscan.AppScanOptionalFeature;
import com.nextcloud.utils.BuildHelper;
+import com.nextcloud.client.preferences.AppPreferencesImpl;
import com.nextcloud.utils.EditorUtils;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.owncloud.android.R;
import com.owncloud.android.databinding.FileListActionsBottomSheetCreatorBinding;
import com.owncloud.android.databinding.FileListActionsBottomSheetFragmentBinding;
@@ -164,6 +166,12 @@ protected void onCreate(Bundle savedInstanceState) {
setupClickListener();
filterActionsForOfflineOperations();
+
+ //track screen view when fragment is visible
+ TealiumSdkUtils.trackView(TealiumSdkUtils.SCREEN_VIEW_FAB_PLUS,
+ //Need to create direct instance of AppPreferences as Injection doesn't work in Dialogs
+ //If we take AppPreferences as parameter in constructor it will affect the other NMC PRs test cases
+ AppPreferencesImpl.fromContext(fileActivity));
}
private void setupClickListener() {
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
index 5b38cf949374..83609c92d412 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
@@ -61,7 +61,11 @@
import com.nextcloud.utils.extensions.FileExtensionsKt;
import com.nextcloud.utils.extensions.IntentExtensionsKt;
import com.nextcloud.utils.fileNameValidator.FileNameValidator;
+import com.nmc.android.marketTracking.TrackingScanInterface;
import com.nextcloud.utils.view.FastScrollUtils;
+import com.nmc.android.marketTracking.AdjustSdkUtils;
+import com.nmc.android.marketTracking.TrackingScanInterfaceImpl;
+import com.nmc.android.marketTracking.TealiumSdkUtils;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
@@ -238,6 +242,13 @@ public class OCFileListFragment extends ExtendedListFragment implements
@Inject DeviceInfo deviceInfo;
+ /**
+ * Things to note about both the branches. 1. nmc/1867-scanbot branch: --> interface won't be initialised -->
+ * calling of interface method will be done here 2. nmc/1925-market_tracking --> interface will be initialised -->
+ * calling of interface method won't be done here
+ */
+ private TrackingScanInterface trackingScanInterface;
+
protected enum MenuItemAddRemove {
DO_NOTHING,
REMOVE_SORT,
@@ -262,6 +273,9 @@ public void onCreate(Bundle savedInstanceState) {
}
searchFragment = currentSearchType != null && isSearchEventSet(searchEvent);
+
+ //NMC customization will be initialised in nmc/1925-market_tracking
+ trackingScanInterface = new TrackingScanInterfaceImpl();
}
@Override
@@ -526,6 +540,10 @@ public void uploadFromApp() {
Intent.createChooser(action, getString(R.string.upload_chooser_title)),
FileDisplayActivity.REQUEST_CODE__SELECT_CONTENT_FROM_APPS
);
+
+ //track event photo/video/any upload button click
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_FAB_BOTTOM_PHOTO_VIDEO_UPLOAD, preferences);
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_FAB_BOTTOM_PHOTO_VIDEO_UPLOAD, preferences);
}
@Override
@@ -543,6 +561,10 @@ public void directCameraUpload() {
}
showDirectCameraUploadAlertDialog(fileDisplayActivity);
+
+ // NMC: track event for camera upload button click
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_FAB_BOTTOM_CAMERA_UPLOAD, preferences);
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_FAB_BOTTOM_CAMERA_UPLOAD, preferences);
}
private void showDirectCameraUploadAlertDialog(FileDisplayActivity fileDisplayActivity) {
@@ -585,6 +607,10 @@ public void uploadFiles() {
((FileActivity) getActivity()).getUser().orElseThrow(RuntimeException::new),
FileDisplayActivity.REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM,
getCurrentFile().isEncrypted());
+
+ // track event for uploading files button click
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_FAB_BOTTOM_FILE_UPLOAD, preferences);
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_FAB_BOTTOM_FILE_UPLOAD, preferences);
}
@Override
@@ -613,6 +639,14 @@ public void onShareIconClick(OCFile file) {
mContainerActivity.getFileOperationsHelper().sendShareFile(file);
});
}
+
+ //track event on click of Share button
+ trackSharingClickEvent();
+ }
+
+ private void trackSharingClickEvent() {
+ AdjustSdkUtils.trackEvent(AdjustSdkUtils.EVENT_TOKEN_FILE_BROWSER_SHARING, preferences);
+ TealiumSdkUtils.trackEvent(TealiumSdkUtils.EVENT_FILE_BROWSER_SHARING, preferences);
}
@Override
@@ -1306,6 +1340,8 @@ public boolean onFileActionChosen(@IdRes final int itemId, Set checkedFi
if (itemId == R.id.action_send_share_file) {
mContainerActivity.getFileOperationsHelper().sendShareFile(singleFile);
+ //track event on click of Share button
+ trackSharingClickEvent();
return true;
} else if (itemId == R.id.action_open_file_with) {
mContainerActivity.getFileOperationsHelper().openFile(singleFile);
@@ -1336,6 +1372,9 @@ public boolean onFileActionChosen(@IdRes final int itemId, Set checkedFi
mContainerActivity.showDetails(singleFile);
mContainerActivity.showSortListGroup(false);
+
+ //track event on click of Share button
+ trackSharingClickEvent();
return true;
} else if (itemId == R.id.action_set_as_wallpaper) {
mContainerActivity.getFileOperationsHelper().setPictureAs(singleFile, getView());
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index e9ec2516e131..af7290ad76dd 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -234,6 +234,7 @@
Zu sichernde Daten
Zugangsdaten falsch
Benutzerkonto löschen
+ Konto %s und alle lokalen Dateien löschen?\n\nLöschung kann nicht rückgängig gemacht werden.
Einträgen entfernen
Link löschen
Auswahl aufheben
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7fdc1987286d..60c7b196e33a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -224,6 +224,7 @@
Request deletion
Request permanent deletion of account by service provider
Remove account
+ Remove account %s and delete all local files?\n\nDeletion cannot be undone.
Avatar
Active user
Upload from…
diff --git a/gradle.properties b/gradle.properties
index 14f2cb920c7e..03ae736a017f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -10,7 +10,7 @@ android.useAndroidX=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
#android.debug.obsoleteApi=true
-
+ADJUST_APP_TOKEN="54qd7rraqav4"
# JVM arguments to optimize heap usage, enable heap dump on out-of-memory errors, and set the file encoding
org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g
diff --git a/nmc_marketing-dependencies.gradle b/nmc_marketing-dependencies.gradle
new file mode 100644
index 000000000000..79cc28d01fb6
--- /dev/null
+++ b/nmc_marketing-dependencies.gradle
@@ -0,0 +1,23 @@
+allprojects {
+ repositories {
+ jcenter()
+ maven {
+ url "https://maven.tealiumiq.com/android/releases/"
+ }
+ }
+}
+
+android {
+ buildTypes.each {
+ it.buildConfigField "String", "ADJUST_APP_TOKEN", "${ADJUST_APP_TOKEN}"
+ }
+}
+
+dependencies {
+ //Adjust SDK --> https://github.com/adjust/android_sdk
+ implementation 'com.adjust.sdk:adjust-android:4.28.1'
+ implementation 'com.android.installreferrer:installreferrer:2.2'
+
+ //tealium sdk
+ implementation 'com.tealium:library:5.8.0'
+}
\ No newline at end of file