diff --git a/detekt.yml b/detekt.yml
index 6efe6b3c56..cf76b5d197 100644
--- a/detekt.yml
+++ b/detekt.yml
@@ -1,5 +1,5 @@
build:
- maxIssues: 10
+ maxIssues: 12
weights:
# complexity: 2
# LongParameterList: 1
diff --git a/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt b/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
index eb576e06f9..32c9f3c882 100644
--- a/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
+++ b/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
@@ -19,218 +19,247 @@
* You should have received a copy of the GNU Affero General Public
* License along with this program. If not, see .
*/
+package com.owncloud.android.ui.activity
-package com.owncloud.android.ui.activity;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.PowerManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-
-import com.nextcloud.client.account.User;
-import com.nextcloud.client.core.Clock;
-import com.nextcloud.client.device.PowerManagementService;
-import com.nextcloud.client.di.Injectable;
-import com.nextcloud.client.jobs.BackgroundJobManager;
-import com.nextcloud.client.jobs.MediaFoldersDetectionWork;
-import com.nextcloud.client.jobs.NotificationWork;
-import com.nextcloud.client.preferences.AppPreferences;
-import com.nextcloud.java.util.Optional;
-import com.owncloud.android.BuildConfig;
-import com.owncloud.android.MainApp;
-import com.owncloud.android.R;
-import com.owncloud.android.databinding.SyncedFoldersLayoutBinding;
-import com.owncloud.android.datamodel.ArbitraryDataProvider;
-import com.owncloud.android.datamodel.MediaFolder;
-import com.owncloud.android.datamodel.MediaFolderType;
-import com.owncloud.android.datamodel.MediaProvider;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.datamodel.SyncedFolder;
-import com.owncloud.android.datamodel.SyncedFolderDisplayItem;
-import com.owncloud.android.datamodel.SyncedFolderProvider;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.files.services.NameCollisionPolicy;
-import com.owncloud.android.ui.adapter.SyncedFolderAdapter;
-import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
-import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment;
-import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable;
-import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.SyncedFolderUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeUtils;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
-import androidx.drawerlayout.widget.DrawerLayout;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.lifecycle.Lifecycle;
-import androidx.recyclerview.widget.GridLayoutManager;
-
-import static android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS;
-import static com.owncloud.android.datamodel.SyncedFolderDisplayItem.UNPERSISTED_ID;
+import android.annotation.SuppressLint
+import android.app.NotificationManager
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.net.Uri
+import android.os.Bundle
+import android.os.PowerManager
+import android.provider.Settings
+import android.text.TextUtils
+import android.util.Log
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import androidx.appcompat.app.AlertDialog
+import androidx.drawerlayout.widget.DrawerLayout
+import androidx.lifecycle.Lifecycle
+import androidx.recyclerview.widget.GridLayoutManager
+import com.nextcloud.client.core.Clock
+import com.nextcloud.client.device.PowerManagementService
+import com.nextcloud.client.di.Injectable
+import com.nextcloud.client.jobs.BackgroundJobManager
+import com.nextcloud.client.jobs.MediaFoldersDetectionWork
+import com.nextcloud.client.jobs.NotificationWork
+import com.nextcloud.client.preferences.AppPreferences
+import com.owncloud.android.BuildConfig
+import com.owncloud.android.MainApp
+import com.owncloud.android.R
+import com.owncloud.android.databinding.SyncedFoldersLayoutBinding
+import com.owncloud.android.datamodel.ArbitraryDataProvider
+import com.owncloud.android.datamodel.MediaFolder
+import com.owncloud.android.datamodel.MediaFolderType
+import com.owncloud.android.datamodel.MediaProvider
+import com.owncloud.android.datamodel.OCFile
+import com.owncloud.android.datamodel.SyncedFolder
+import com.owncloud.android.datamodel.SyncedFolderDisplayItem
+import com.owncloud.android.datamodel.SyncedFolderProvider
+import com.owncloud.android.files.services.FileUploader
+import com.owncloud.android.files.services.NameCollisionPolicy
+import com.owncloud.android.ui.adapter.SyncedFolderAdapter
+import com.owncloud.android.ui.decoration.MediaGridItemDecoration
+import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment
+import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener
+import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable
+import com.owncloud.android.utils.PermissionUtil
+import com.owncloud.android.utils.SyncedFolderUtils
+import com.owncloud.android.utils.theme.ThemeButtonUtils
+import com.owncloud.android.utils.theme.ThemeUtils
+import java.io.File
+import java.util.Locale
+import javax.inject.Inject
/**
* Activity displaying all auto-synced folders and/or instant upload media folders.
*/
-public class SyncedFoldersActivity extends FileActivity implements SyncedFolderAdapter.ClickListener,
- SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener, Injectable {
+@Suppress("TooManyFunctions")
+class SyncedFoldersActivity :
+ FileActivity(),
+ SyncedFolderAdapter.ClickListener,
+ OnSyncedFolderPreferenceListener,
+ Injectable {
- private static final String[] PRIORITIZED_FOLDERS = new String[]{"Camera", "Screenshots"};
- private static final String SYNCED_FOLDER_PREFERENCES_DIALOG_TAG = "SYNCED_FOLDER_PREFERENCES_DIALOG";
- private static final String TAG = SyncedFoldersActivity.class.getSimpleName();
+ companion object {
+ private const val SYNCED_FOLDER_PREFERENCES_DIALOG_TAG = "SYNCED_FOLDER_PREFERENCES_DIALOG"
+ private const val MAX_DISPLAY_FILES_PER_FOLDER = 7
+ // yes, there is a typo in this value
+ private const val KEY_SYNCED_FOLDER_INITIATED_PREFIX = "syncedFolderIntitiated_"
+ private val PRIORITIZED_FOLDERS = arrayOf("Camera", "Screenshots")
+ private val TAG = SyncedFoldersActivity::class.java.simpleName
- private SyncedFoldersLayoutBinding binding;
- private SyncedFolderAdapter adapter;
- private SyncedFolderProvider syncedFolderProvider;
- private SyncedFolderPreferencesDialogFragment syncedFolderPreferencesDialogFragment;
-
- private String path;
- private int type;
- @Inject AppPreferences preferences;
- @Inject PowerManagementService powerManagementService;
- @Inject Clock clock;
- @Inject BackgroundJobManager backgroundJobManager;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- binding = SyncedFoldersLayoutBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
-
- if (getIntent() != null && getIntent().getExtras() != null) {
- final String accountName = getIntent().getExtras().getString(NotificationWork.KEY_NOTIFICATION_ACCOUNT);
- Optional optionalUser = getUser();
- if (optionalUser.isPresent() && accountName != null) {
- User user = optionalUser.get();
- if (!accountName.equalsIgnoreCase(user.getAccountName())) {
- accountManager.setCurrentOwnCloudAccount(accountName);
- setUser(getUserAccountManager().getUser());
+ /**
+ * Sorts list of [SyncedFolderDisplayItem]s.
+ *
+ * @param syncFolderItemList list of items to be sorted
+ * @return sorted list of items
+ */
+ @JvmStatic
+ @Suppress("ComplexMethod")
+ fun sortSyncedFolderItems(syncFolderItemList: List): List {
+ return syncFolderItemList.sortedWith { f1, f2 ->
+ if (f1 == null && f2 == null) {
+ 0
+ } else if (f1 == null) {
+ -1
+ } else if (f2 == null) {
+ 1
+ } else if (f1.isEnabled && f2.isEnabled) {
+ when {
+ f1.folderName == null -> -1
+ f2.folderName == null -> 1
+ else -> f1.folderName.lowercase(Locale.getDefault()).compareTo(
+ f2.folderName.lowercase(Locale.getDefault())
+ )
+ }
+ } else if (f1.folderName == null && f2.folderName == null) {
+ 0
+ } else if (f1.isEnabled) {
+ -1
+ } else if (f2.isEnabled) {
+ 1
+ } else if (f1.folderName == null) {
+ -1
+ } else if (f2.folderName == null) {
+ 1
+ } else {
+ for (folder in PRIORITIZED_FOLDERS) {
+ if (folder == f1.folderName && folder == f2.folderName) {
+ return@sortedWith 0
+ } else if (folder == f1.folderName) {
+ return@sortedWith -1
+ } else if (folder == f2.folderName) {
+ return@sortedWith 1
+ }
+ }
+ f1.folderName.lowercase(Locale.getDefault()).compareTo(
+ f2.folderName.lowercase(Locale.getDefault())
+ )
}
}
+ }
+ }
- path = getIntent().getStringExtra(MediaFoldersDetectionWork.KEY_MEDIA_FOLDER_PATH);
- type = getIntent().getIntExtra(MediaFoldersDetectionWork.KEY_MEDIA_FOLDER_TYPE, -1);
+ @Inject
+ lateinit var preferences: AppPreferences
+
+ @Inject
+ lateinit var powerManagementService: PowerManagementService
+
+ @Inject
+ lateinit var clock: Clock
+
+ @Inject
+ lateinit var backgroundJobManager: BackgroundJobManager
+
+ private lateinit var binding: SyncedFoldersLayoutBinding
+ private lateinit var adapter: SyncedFolderAdapter
+ private lateinit var syncedFolderProvider: SyncedFolderProvider
+
+ private var syncedFolderPreferencesDialogFragment: SyncedFolderPreferencesDialogFragment? = null
+ private var path: String? = null
+ private var type = 0
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = SyncedFoldersLayoutBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ if (intent != null && intent.extras != null) {
+ val accountName = intent.extras!!.getString(NotificationWork.KEY_NOTIFICATION_ACCOUNT)
+ val optionalUser = user
+ if (optionalUser.isPresent && accountName != null) {
+ val user = optionalUser.get()
+ if (!accountName.equals(user.accountName, ignoreCase = true)) {
+ accountManager.setCurrentOwnCloudAccount(accountName)
+ setUser(userAccountManager.user)
+ }
+ }
+ path = intent.getStringExtra(MediaFoldersDetectionWork.KEY_MEDIA_FOLDER_PATH)
+ type = intent.getIntExtra(MediaFoldersDetectionWork.KEY_MEDIA_FOLDER_TYPE, -1)
// Cancel notification
- int notificationId = getIntent().getIntExtra(MediaFoldersDetectionWork.NOTIFICATION_ID, 0);
- NotificationManager notificationManager =
- (NotificationManager) getSystemService(Activity.NOTIFICATION_SERVICE);
- notificationManager.cancel(notificationId);
+ val notificationId = intent.getIntExtra(MediaFoldersDetectionWork.NOTIFICATION_ID, 0)
+ val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+ notificationManager.cancel(notificationId)
}
// setup toolbar
- setupToolbar();
- updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_synced_folders));
-
- setupDrawer();
- setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
-
- if (getSupportActionBar() != null) {
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ setupToolbar()
+ updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_synced_folders))
+ setupDrawer()
+ setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
+ if (supportActionBar != null) {
+ supportActionBar!!.setDisplayHomeAsUpEnabled(true)
}
-
if (mDrawerToggle != null) {
- mDrawerToggle.setDrawerIndicatorEnabled(false);
+ mDrawerToggle.isDrawerIndicatorEnabled = false
}
// TODO: The content loading should be done asynchronously
- setupContent();
-
+ setupContent()
if (ThemeUtils.themingEnabled(this)) {
- setTheme(R.style.FallbackThemingTheme);
+ setTheme(R.style.FallbackThemingTheme)
}
-
- binding.emptyList.emptyListViewAction.setOnClickListener(v -> showHiddenItems());
+ binding.emptyList.emptyListViewAction.setOnClickListener { showHiddenItems() }
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.activity_synced_folders, menu);
-
- if (powerManagementService.isPowerSavingExclusionAvailable()) {
- MenuItem item = menu.findItem(R.id.action_disable_power_save_check);
- item.setVisible(true);
-
- item.setChecked(preferences.isPowerCheckDisabled());
-
- item.setOnMenuItemClickListener(this::onDisablePowerSaveCheckClicked);
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ val inflater = menuInflater
+ inflater.inflate(R.menu.activity_synced_folders, menu)
+ if (powerManagementService.isPowerSavingExclusionAvailable) {
+ val item = menu.findItem(R.id.action_disable_power_save_check)
+ item.isVisible = true
+ item.isChecked = preferences.isPowerCheckDisabled
+ item.setOnMenuItemClickListener { powerCheck -> onDisablePowerSaveCheckClicked(powerCheck) }
}
-
- return true;
+ return true
}
- private boolean onDisablePowerSaveCheckClicked(MenuItem powerCheck) {
- if (!powerCheck.isChecked()) {
- showPowerCheckDialog();
+ private fun onDisablePowerSaveCheckClicked(powerCheck: MenuItem): Boolean {
+ if (!powerCheck.isChecked) {
+ showPowerCheckDialog()
}
-
- preferences.setPowerCheckDisabled(!powerCheck.isChecked());
- powerCheck.setChecked(!powerCheck.isChecked());
-
- return true;
+ preferences.isPowerCheckDisabled = !powerCheck.isChecked
+ powerCheck.isChecked = !powerCheck.isChecked
+ return true
}
- private void showPowerCheckDialog() {
- AlertDialog alertDialog = new AlertDialog.Builder(this)
+ private fun showPowerCheckDialog() {
+ val alertDialog = AlertDialog.Builder(this)
.setView(findViewById(R.id.root_layout))
- .setPositiveButton(R.string.common_ok, (dialog, which) -> dialog.dismiss())
+ .setPositiveButton(R.string.common_ok) { dialog, _ -> dialog.dismiss() }
.setTitle(R.string.autoupload_disable_power_save_check)
.setMessage(getString(R.string.power_save_check_dialog_message))
- .show();
-
- ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+ .show()
+ ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE))
}
/**
* sets up the UI elements and loads all media/synced folders.
*/
- private void setupContent() {
- final int gridWidth = getResources().getInteger(R.integer.media_grid_width);
- boolean lightVersion = getResources().getBoolean(R.bool.syncedFolder_light);
- adapter = new SyncedFolderAdapter(this, clock, gridWidth, this, lightVersion);
- syncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences, clock);
- binding.emptyList.emptyListIcon.setImageResource(R.drawable.nav_synced_folders);
- ThemeButtonUtils.colorPrimaryButton(binding.emptyList.emptyListViewAction, this);
-
- final GridLayoutManager lm = new GridLayoutManager(this, gridWidth);
- adapter.setLayoutManager(lm);
- int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing);
- binding.list.addItemDecoration(new MediaGridItemDecoration(spacing));
- binding.list.setLayoutManager(lm);
- binding.list.setAdapter(adapter);
-
- load(gridWidth * 2, false);
+ private fun setupContent() {
+ val gridWidth = resources.getInteger(R.integer.media_grid_width)
+ val lightVersion = resources.getBoolean(R.bool.syncedFolder_light)
+ adapter = SyncedFolderAdapter(this, clock, gridWidth, this, lightVersion)
+ syncedFolderProvider = SyncedFolderProvider(contentResolver, preferences, clock)
+ binding.emptyList.emptyListIcon.setImageResource(R.drawable.nav_synced_folders)
+ ThemeButtonUtils.colorPrimaryButton(binding.emptyList.emptyListViewAction, this)
+ val lm = GridLayoutManager(this, gridWidth)
+ adapter.setLayoutManager(lm)
+ val spacing = resources.getDimensionPixelSize(R.dimen.media_grid_spacing)
+ binding.list.addItemDecoration(MediaGridItemDecoration(spacing))
+ binding.list.layoutManager = lm
+ binding.list.adapter = adapter
+ load(gridWidth * 2, false)
}
- public void showHiddenItems() {
- if (adapter.getSectionCount() == 0 && adapter.getUnfilteredSectionCount() > adapter.getSectionCount()) {
- adapter.toggleHiddenItemsVisibility();
- binding.emptyList.emptyListView.setVisibility(View.GONE);
- binding.list.setVisibility(View.VISIBLE);
+ private fun showHiddenItems() {
+ if (adapter.sectionCount == 0 && adapter.unfilteredSectionCount > adapter.sectionCount) {
+ adapter.toggleHiddenItemsVisibility()
+ binding.emptyList.emptyListView.visibility = View.GONE
+ binding.list.visibility = View.VISIBLE
}
}
@@ -239,488 +268,422 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
*
* @param perFolderMediaItemLimit the amount of media items to be loaded/shown per media folder
*/
- private void load(final int perFolderMediaItemLimit, boolean force) {
- if (adapter.getItemCount() > 0 && !force) {
- return;
+ @SuppressLint("NotifyDataSetChanged")
+ private fun load(perFolderMediaItemLimit: Int, force: Boolean) {
+ if (adapter.itemCount > 0 && !force) {
+ return
}
- showLoadingContent();
- final List mediaFolders = MediaProvider.getImageFolders(getContentResolver(),
- perFolderMediaItemLimit, this, false);
- mediaFolders.addAll(MediaProvider.getVideoFolders(getContentResolver(), perFolderMediaItemLimit,
- this, false));
-
- List syncedFolderArrayList = syncedFolderProvider.getSyncedFolders();
- List currentAccountSyncedFoldersList = new ArrayList<>();
- User user = getUserAccountManager().getUser();
- for (SyncedFolder syncedFolder : syncedFolderArrayList) {
- if (syncedFolder.getAccount().equals(user.getAccountName())) {
+ showLoadingContent()
+ val mediaFolders = MediaProvider.getImageFolders(
+ contentResolver,
+ perFolderMediaItemLimit, this, false
+ )
+ mediaFolders.addAll(
+ MediaProvider.getVideoFolders(
+ contentResolver, perFolderMediaItemLimit,
+ this, false
+ )
+ )
+ val syncedFolderArrayList = syncedFolderProvider.syncedFolders
+ val currentAccountSyncedFoldersList: MutableList = ArrayList()
+ val user = userAccountManager.user
+ for (syncedFolder in syncedFolderArrayList) {
+ if (syncedFolder.account == user.accountName) {
// delete non-existing & disabled synced folders
- if (!new File(syncedFolder.getLocalPath()).exists() && !syncedFolder.isEnabled()) {
- syncedFolderProvider.deleteSyncedFolder(syncedFolder.getId());
+ if (!File(syncedFolder.localPath).exists() && !syncedFolder.isEnabled) {
+ syncedFolderProvider.deleteSyncedFolder(syncedFolder.id)
} else {
- currentAccountSyncedFoldersList.add(syncedFolder);
+ currentAccountSyncedFoldersList.add(syncedFolder)
}
}
}
-
- List syncFolderItems = sortSyncedFolderItems(
- mergeFolderData(currentAccountSyncedFoldersList, mediaFolders));
-
- adapter.setSyncFolderItems(syncFolderItems);
- adapter.notifyDataSetChanged();
- showList();
-
+ val syncFolderItems = sortSyncedFolderItems(
+ mergeFolderData(currentAccountSyncedFoldersList, mediaFolders)
+ )
+ adapter.setSyncFolderItems(syncFolderItems)
+ adapter.notifyDataSetChanged()
+ showList()
if (!TextUtils.isEmpty(path)) {
- int section = adapter.getSectionByLocalPathAndType(path, type);
+ val section = adapter.getSectionByLocalPathAndType(path, type)
if (section >= 0) {
- onSyncFolderSettingsClick(section, adapter.get(section));
+ onSyncFolderSettingsClick(section, adapter[section])
}
}
}
/**
- * Sorts list of {@link SyncedFolderDisplayItem}s.
- *
- * @param syncFolderItemList list of items to be sorted
- * @return sorted list of items
- */
- public static List sortSyncedFolderItems(List
- syncFolderItemList) {
- Collections.sort(syncFolderItemList, (f1, f2) -> {
- if (f1 == null && f2 == null) {
- return 0;
- } else if (f1 == null) {
- return -1;
- } else if (f2 == null) {
- return 1;
- } else if (f1.isEnabled() && f2.isEnabled()) {
- if (f1.getFolderName() == null) {
- return -1;
- }
- if (f2.getFolderName() == null) {
- return 1;
- }
-
- return f1.getFolderName().toLowerCase(Locale.getDefault()).compareTo(
- f2.getFolderName().toLowerCase(Locale.getDefault()));
- } else if (f1.getFolderName() == null && f2.getFolderName() == null) {
- return 0;
- } else if (f1.isEnabled()) {
- return -1;
- } else if (f2.isEnabled()) {
- return 1;
- } else if (f1.getFolderName() == null) {
- return -1;
- } else if (f2.getFolderName() == null) {
- return 1;
- }
-
- for (String folder : PRIORITIZED_FOLDERS) {
- if (folder.equals(f1.getFolderName()) && folder.equals(f2.getFolderName())) {
- return 0;
- } else if (folder.equals(f1.getFolderName())) {
- return -1;
- } else if (folder.equals(f2.getFolderName())) {
- return 1;
- }
- }
- return f1.getFolderName().toLowerCase(Locale.getDefault()).compareTo(
- f2.getFolderName().toLowerCase(Locale.getDefault()));
- });
-
- return syncFolderItemList;
- }
-
- /**
- * merges two lists of {@link SyncedFolder} and {@link MediaFolder} items into one of SyncedFolderItems.
+ * merges two lists of [SyncedFolder] and [MediaFolder] items into one of SyncedFolderItems.
*
* @param syncedFolders the synced folders
* @param mediaFolders the media folders
* @return the merged list of SyncedFolderItems
*/
- @NonNull
- private List mergeFolderData(List syncedFolders,
- @NonNull List mediaFolders) {
- Map syncedFoldersMap = createSyncedFoldersMap(syncedFolders);
- List result = new ArrayList<>();
-
- for (MediaFolder mediaFolder : mediaFolders) {
+ private fun mergeFolderData(
+ syncedFolders: List,
+ mediaFolders: List
+ ): List {
+ val syncedFoldersMap = createSyncedFoldersMap(syncedFolders)
+ val result: MutableList = ArrayList()
+ for (mediaFolder in mediaFolders) {
if (syncedFoldersMap.containsKey(mediaFolder.absolutePath + "-" + mediaFolder.type)) {
- SyncedFolder syncedFolder = syncedFoldersMap.get(mediaFolder.absolutePath + "-" + mediaFolder.type);
- syncedFoldersMap.remove(mediaFolder.absolutePath + "-" + mediaFolder.type);
-
+ val syncedFolder = syncedFoldersMap[mediaFolder.absolutePath + "-" + mediaFolder.type]
+ syncedFoldersMap.remove(mediaFolder.absolutePath + "-" + mediaFolder.type)
if (syncedFolder != null && SyncedFolderUtils.isQualifyingMediaFolder(syncedFolder)) {
- if (MediaFolderType.CUSTOM == syncedFolder.getType()) {
- result.add(createSyncedFolderWithoutMediaFolder(syncedFolder));
+ if (MediaFolderType.CUSTOM == syncedFolder.type) {
+ result.add(createSyncedFolderWithoutMediaFolder(syncedFolder))
} else {
- result.add(createSyncedFolder(syncedFolder, mediaFolder));
+ result.add(createSyncedFolder(syncedFolder, mediaFolder))
}
}
} else {
if (SyncedFolderUtils.isQualifyingMediaFolder(mediaFolder)) {
- result.add(createSyncedFolderFromMediaFolder(mediaFolder));
+ result.add(createSyncedFolderFromMediaFolder(mediaFolder))
}
}
}
-
- for (SyncedFolder syncedFolder : syncedFoldersMap.values()) {
- result.add(createSyncedFolderWithoutMediaFolder(syncedFolder));
+ for (syncedFolder in syncedFoldersMap.values) {
+ result.add(createSyncedFolderWithoutMediaFolder(syncedFolder))
}
-
- return result;
+ return result
}
- @NonNull
- private SyncedFolderDisplayItem createSyncedFolderWithoutMediaFolder(@NonNull SyncedFolder syncedFolder) {
-
- File localFolder = new File(syncedFolder.getLocalPath());
- File[] files = SyncedFolderUtils.getFileList(localFolder);
- List filePaths = getDisplayFilePathList(files);
-
- return new SyncedFolderDisplayItem(
- syncedFolder.getId(),
- syncedFolder.getLocalPath(),
- syncedFolder.getRemotePath(),
- syncedFolder.isWifiOnly(),
- syncedFolder.isChargingOnly(),
- syncedFolder.isExisting(),
- syncedFolder.isSubfolderByDate(),
- syncedFolder.getAccount(),
- syncedFolder.getUploadAction(),
- syncedFolder.getNameCollisionPolicyInt(),
- syncedFolder.isEnabled(),
- clock.getCurrentTime(),
+ private fun createSyncedFolderWithoutMediaFolder(syncedFolder: SyncedFolder): SyncedFolderDisplayItem {
+ val localFolder = File(syncedFolder.localPath)
+ val files = SyncedFolderUtils.getFileList(localFolder)
+ val filePaths = getDisplayFilePathList(files.toList())
+ return SyncedFolderDisplayItem(
+ syncedFolder.id,
+ syncedFolder.localPath,
+ syncedFolder.remotePath,
+ syncedFolder.isWifiOnly,
+ syncedFolder.isChargingOnly,
+ syncedFolder.isExisting,
+ syncedFolder.isSubfolderByDate,
+ syncedFolder.account,
+ syncedFolder.uploadAction,
+ syncedFolder.nameCollisionPolicyInt,
+ syncedFolder.isEnabled,
+ clock.currentTime,
filePaths,
- localFolder.getName(),
- files.length,
- syncedFolder.getType(),
- syncedFolder.isHidden());
+ localFolder.name,
+ files.size.toLong(),
+ syncedFolder.type,
+ syncedFolder.isHidden
+ )
}
/**
- * creates a SyncedFolderDisplayItem merging a {@link SyncedFolder} and a {@link MediaFolder} object instance.
+ * creates a SyncedFolderDisplayItem merging a [SyncedFolder] and a [MediaFolder] object instance.
*
* @param syncedFolder the synced folder object
* @param mediaFolder the media folder object
* @return the created SyncedFolderDisplayItem
*/
- @NonNull
- private SyncedFolderDisplayItem createSyncedFolder(@NonNull SyncedFolder syncedFolder, @NonNull MediaFolder mediaFolder) {
- return new SyncedFolderDisplayItem(
- syncedFolder.getId(),
- syncedFolder.getLocalPath(),
- syncedFolder.getRemotePath(),
- syncedFolder.isWifiOnly(),
- syncedFolder.isChargingOnly(),
- syncedFolder.isExisting(),
- syncedFolder.isSubfolderByDate(),
- syncedFolder.getAccount(),
- syncedFolder.getUploadAction(),
- syncedFolder.getNameCollisionPolicyInt(),
- syncedFolder.isEnabled(),
- clock.getCurrentTime(),
+ private fun createSyncedFolder(syncedFolder: SyncedFolder, mediaFolder: MediaFolder): SyncedFolderDisplayItem {
+ return SyncedFolderDisplayItem(
+ syncedFolder.id,
+ syncedFolder.localPath,
+ syncedFolder.remotePath,
+ syncedFolder.isWifiOnly,
+ syncedFolder.isChargingOnly,
+ syncedFolder.isExisting,
+ syncedFolder.isSubfolderByDate,
+ syncedFolder.account,
+ syncedFolder.uploadAction,
+ syncedFolder.nameCollisionPolicyInt,
+ syncedFolder.isEnabled,
+ clock.currentTime,
mediaFolder.filePaths,
mediaFolder.folderName,
mediaFolder.numberOfFiles,
mediaFolder.type,
- syncedFolder.isHidden());
+ syncedFolder.isHidden
+ )
}
/**
- * creates a {@link SyncedFolderDisplayItem} based on a {@link MediaFolder} object instance.
+ * creates a [SyncedFolderDisplayItem] based on a [MediaFolder] object instance.
*
* @param mediaFolder the media folder object
* @return the created SyncedFolderDisplayItem
*/
- @NonNull
- private SyncedFolderDisplayItem createSyncedFolderFromMediaFolder(@NonNull MediaFolder mediaFolder) {
- return new SyncedFolderDisplayItem(
- UNPERSISTED_ID,
- mediaFolder.absolutePath,
- getString(R.string.instant_upload_path) + "/" + mediaFolder.folderName,
- true,
- false,
- true,
- false,
- getAccount().name,
- FileUploader.LOCAL_BEHAVIOUR_FORGET,
- NameCollisionPolicy.ASK_USER.serialize(),
- false,
- clock.getCurrentTime(),
- mediaFolder.filePaths,
- mediaFolder.folderName,
- mediaFolder.numberOfFiles,
- mediaFolder.type,
- false);
+ private fun createSyncedFolderFromMediaFolder(mediaFolder: MediaFolder): SyncedFolderDisplayItem {
+ return SyncedFolderDisplayItem(
+ SyncedFolder.UNPERSISTED_ID,
+ mediaFolder.absolutePath,
+ getString(R.string.instant_upload_path) + "/" + mediaFolder.folderName,
+ true,
+ false,
+ true,
+ false,
+ account.name,
+ FileUploader.LOCAL_BEHAVIOUR_FORGET,
+ NameCollisionPolicy.ASK_USER.serialize(),
+ false,
+ clock.currentTime,
+ mediaFolder.filePaths,
+ mediaFolder.folderName,
+ mediaFolder.numberOfFiles,
+ mediaFolder.type,
+ false
+ )
}
- private List getDisplayFilePathList(File... files) {
- List filePaths = null;
-
- if (files != null && files.length > 0) {
- filePaths = new ArrayList<>();
- for (int i = 0; i < 7 && i < files.length; i++) {
- filePaths.add(files[i].getAbsolutePath());
- }
+ private fun getDisplayFilePathList(files: List?): List? {
+ if (!files.isNullOrEmpty()) {
+ return files.take(MAX_DISPLAY_FILES_PER_FOLDER)
+ .map { it.absolutePath }
}
-
- return filePaths;
+ return null
}
/**
- * creates a lookup map for a list of given {@link SyncedFolder}s with their local path as the key.
+ * creates a lookup map for a list of given [SyncedFolder]s with their local path as the key.
*
- * @param syncFolders list of {@link SyncedFolder}s
- * @return the lookup map for {@link SyncedFolder}s
+ * @param syncFolders list of [SyncedFolder]s
+ * @return the lookup map for [SyncedFolder]s
*/
- @NonNull
- private Map createSyncedFoldersMap(List syncFolders) {
- Map result = new HashMap<>();
+ private fun createSyncedFoldersMap(syncFolders: List?): MutableMap {
+ val result: MutableMap = HashMap()
if (syncFolders != null) {
- for (SyncedFolder syncFolder : syncFolders) {
- result.put(syncFolder.getLocalPath() + "-" + syncFolder.getType(), syncFolder);
+ for (syncFolder in syncFolders) {
+ result[syncFolder.localPath + "-" + syncFolder.type] = syncFolder
}
}
- return result;
+ return result
}
/**
* show recycler view list or the empty message info (in case list is empty).
*/
- private void showList() {
- binding.list.setVisibility(View.VISIBLE);
- binding.loadingContent.setVisibility(View.GONE);
- checkAndShowEmptyListContent();
+ private fun showList() {
+ binding.list.visibility = View.VISIBLE
+ binding.loadingContent.visibility = View.GONE
+ checkAndShowEmptyListContent()
}
- private void checkAndShowEmptyListContent() {
- if (adapter.getSectionCount() == 0 && adapter.getUnfilteredSectionCount() > adapter.getSectionCount()) {
- binding.emptyList.emptyListView.setVisibility(View.VISIBLE);
- int hiddenFoldersCount = adapter.getHiddenFolderCount();
-
- showEmptyContent(getString(R.string.drawer_synced_folders),
- getResources().getQuantityString(R.plurals.synced_folders_show_hidden_folders,
- hiddenFoldersCount,
- hiddenFoldersCount),
- getResources().getQuantityString(R.plurals.synced_folders_show_hidden_folders,
- hiddenFoldersCount,
- hiddenFoldersCount));
- } else if (adapter.getSectionCount() == 0 && adapter.getUnfilteredSectionCount() == 0) {
- binding.emptyList.emptyListView.setVisibility(View.VISIBLE);
- showEmptyContent(getString(R.string.drawer_synced_folders),
- getString(R.string.synced_folders_no_results));
+ private fun checkAndShowEmptyListContent() {
+ if (adapter.sectionCount == 0 && adapter.unfilteredSectionCount > adapter.sectionCount) {
+ binding.emptyList.emptyListView.visibility = View.VISIBLE
+ val hiddenFoldersCount = adapter.hiddenFolderCount
+ showEmptyContent(
+ getString(R.string.drawer_synced_folders),
+ resources.getQuantityString(
+ R.plurals.synced_folders_show_hidden_folders,
+ hiddenFoldersCount,
+ hiddenFoldersCount
+ ),
+ resources.getQuantityString(
+ R.plurals.synced_folders_show_hidden_folders,
+ hiddenFoldersCount,
+ hiddenFoldersCount
+ )
+ )
+ } else if (adapter.sectionCount == 0 && adapter.unfilteredSectionCount == 0) {
+ binding.emptyList.emptyListView.visibility = View.VISIBLE
+ showEmptyContent(
+ getString(R.string.drawer_synced_folders),
+ getString(R.string.synced_folders_no_results)
+ )
} else {
- binding.emptyList.emptyListView.setVisibility(View.GONE);
+ binding.emptyList.emptyListView.visibility = View.GONE
}
}
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- boolean result = true;
- int itemId = item.getItemId();
- if (itemId == android.R.id.home) {
- finish();
- } else if (itemId == R.id.action_create_custom_folder) {
- Log.d(TAG, "Show custom folder dialog");
- SyncedFolderDisplayItem emptyCustomFolder = new SyncedFolderDisplayItem(
- UNPERSISTED_ID,
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ var result = true
+ when (item.itemId) {
+ android.R.id.home -> finish()
+ R.id.action_create_custom_folder -> {
+ Log.d(TAG, "Show custom folder dialog")
+ val emptyCustomFolder = SyncedFolderDisplayItem(
+ SyncedFolder.UNPERSISTED_ID,
null,
null,
true,
false,
true,
false,
- getAccount().name,
+ account.name,
FileUploader.LOCAL_BEHAVIOUR_FORGET,
NameCollisionPolicy.ASK_USER.serialize(),
false,
- clock.getCurrentTime(),
+ clock.currentTime,
null,
MediaFolderType.CUSTOM,
- false);
- onSyncFolderSettingsClick(0, emptyCustomFolder);
-
- result = super.onOptionsItemSelected(item);
- } else {
- result = super.onOptionsItemSelected(item);
+ false
+ )
+ onSyncFolderSettingsClick(0, emptyCustomFolder)
+ result = super.onOptionsItemSelected(item)
+ }
+ else -> result = super.onOptionsItemSelected(item)
}
-
- return result;
+ return result
}
- @Override
- public void onSyncStatusToggleClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem) {
- if (syncedFolderDisplayItem.getId() > UNPERSISTED_ID) {
- syncedFolderProvider.updateSyncedFolderEnabled(syncedFolderDisplayItem.getId(),
- syncedFolderDisplayItem.isEnabled());
+ override fun onSyncStatusToggleClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem) {
+ if (syncedFolderDisplayItem.id > SyncedFolder.UNPERSISTED_ID) {
+ syncedFolderProvider.updateSyncedFolderEnabled(
+ syncedFolderDisplayItem.id,
+ syncedFolderDisplayItem.isEnabled
+ )
} else {
- long storedId = syncedFolderProvider.storeSyncedFolder(syncedFolderDisplayItem);
- if (storedId != -1) {
- syncedFolderDisplayItem.setId(storedId);
+ val storedId = syncedFolderProvider.storeSyncedFolder(syncedFolderDisplayItem)
+ if (storedId != -1L) {
+ syncedFolderDisplayItem.id = storedId
}
}
-
- if (syncedFolderDisplayItem.isEnabled()) {
- backgroundJobManager.startImmediateFilesSyncJob(false, false);
- showBatteryOptimizationInfo();
+ if (syncedFolderDisplayItem.isEnabled) {
+ backgroundJobManager.startImmediateFilesSyncJob(skipCustomFolders = false, overridePowerSaving = false)
+ showBatteryOptimizationInfo()
}
}
- @Override
- public void onSyncFolderSettingsClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem) {
- FragmentManager fm = getSupportFragmentManager();
- FragmentTransaction ft = fm.beginTransaction();
- ft.addToBackStack(null);
-
+ override fun onSyncFolderSettingsClick(section: Int, syncedFolderDisplayItem: SyncedFolderDisplayItem) {
+ val fm = supportFragmentManager
+ val ft = fm.beginTransaction()
+ ft.addToBackStack(null)
syncedFolderPreferencesDialogFragment = SyncedFolderPreferencesDialogFragment.newInstance(
- syncedFolderDisplayItem, section);
- syncedFolderPreferencesDialogFragment.show(ft, SYNCED_FOLDER_PREFERENCES_DIALOG_TAG);
- }
-
- @Override
- public void onVisibilityToggleClick(int section, SyncedFolderDisplayItem syncedFolder) {
- syncedFolder.setHidden(!syncedFolder.isHidden());
-
- saveOrUpdateSyncedFolder(syncedFolder);
- adapter.setSyncFolderItem(section, syncedFolder);
-
- checkAndShowEmptyListContent();
- }
-
- private void showEmptyContent(String headline, String message, String action) {
- showEmptyContent(headline, message);
- binding.emptyList.emptyListViewAction.setText(action);
- binding.emptyList.emptyListViewAction.setVisibility(View.VISIBLE);
- binding.emptyList.emptyListViewText.setVisibility(View.GONE);
- }
-
- private void showLoadingContent() {
- binding.loadingContent.setVisibility(View.VISIBLE);
- binding.emptyList.emptyListViewAction.setVisibility(View.GONE);
- }
-
- private void showEmptyContent(String headline, String message) {
- binding.emptyList.emptyListViewAction.setVisibility(View.GONE);
- binding.emptyList.emptyListView.setVisibility(View.VISIBLE);
- binding.list.setVisibility(View.GONE);
- binding.loadingContent.setVisibility(View.GONE);
-
- binding.emptyList.emptyListViewHeadline.setText(headline);
- binding.emptyList.emptyListViewText.setText(message);
- binding.emptyList.emptyListViewText.setVisibility(View.VISIBLE);
- binding.emptyList.emptyListIcon.setVisibility(View.VISIBLE);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == SyncedFolderPreferencesDialogFragment.REQUEST_CODE__SELECT_REMOTE_FOLDER
- && resultCode == RESULT_OK && syncedFolderPreferencesDialogFragment != null) {
- OCFile chosenFolder = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
- syncedFolderPreferencesDialogFragment.setRemoteFolderSummary(chosenFolder.getRemotePath());
+ syncedFolderDisplayItem, section
+ ).also {
+ it.show(ft, SYNCED_FOLDER_PREFERENCES_DIALOG_TAG)
}
- if (requestCode == SyncedFolderPreferencesDialogFragment.REQUEST_CODE__SELECT_LOCAL_FOLDER
- && resultCode == RESULT_OK && syncedFolderPreferencesDialogFragment != null) {
- String localPath = data.getStringExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES);
- syncedFolderPreferencesDialogFragment.setLocalFolderSummary(localPath);
+ }
+
+ override fun onVisibilityToggleClick(section: Int, syncedFolder: SyncedFolderDisplayItem) {
+ syncedFolder.isHidden = !syncedFolder.isHidden
+ saveOrUpdateSyncedFolder(syncedFolder)
+ adapter.setSyncFolderItem(section, syncedFolder)
+ checkAndShowEmptyListContent()
+ }
+
+ private fun showEmptyContent(headline: String, message: String, action: String) {
+ showEmptyContent(headline, message)
+ binding.emptyList.emptyListViewAction.text = action
+ binding.emptyList.emptyListViewAction.visibility = View.VISIBLE
+ binding.emptyList.emptyListViewText.visibility = View.GONE
+ }
+
+ private fun showLoadingContent() {
+ binding.loadingContent.visibility = View.VISIBLE
+ binding.emptyList.emptyListViewAction.visibility = View.GONE
+ }
+
+ private fun showEmptyContent(headline: String, message: String) {
+ binding.emptyList.emptyListViewAction.visibility = View.GONE
+ binding.emptyList.emptyListView.visibility = View.VISIBLE
+ binding.list.visibility = View.GONE
+ binding.loadingContent.visibility = View.GONE
+ binding.emptyList.emptyListViewHeadline.text = headline
+ binding.emptyList.emptyListViewText.text = message
+ binding.emptyList.emptyListViewText.visibility = View.VISIBLE
+ binding.emptyList.emptyListIcon.visibility = View.VISIBLE
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ if (requestCode == SyncedFolderPreferencesDialogFragment.REQUEST_CODE__SELECT_REMOTE_FOLDER &&
+ resultCode == RESULT_OK && syncedFolderPreferencesDialogFragment != null
+ ) {
+ val chosenFolder: OCFile = data!!.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER)!!
+ syncedFolderPreferencesDialogFragment!!.setRemoteFolderSummary(chosenFolder.remotePath)
+ } else if (
+ requestCode == SyncedFolderPreferencesDialogFragment.REQUEST_CODE__SELECT_LOCAL_FOLDER &&
+ resultCode == RESULT_OK && syncedFolderPreferencesDialogFragment != null
+ ) {
+ val localPath = data!!.getStringExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES)
+ syncedFolderPreferencesDialogFragment!!.setLocalFolderSummary(localPath)
} else {
- super.onActivityResult(requestCode, resultCode, data);
+ super.onActivityResult(requestCode, resultCode, data)
}
}
- @Override
- public void onSaveSyncedFolderPreference(SyncedFolderParcelable syncedFolder) {
+ override fun onSaveSyncedFolderPreference(syncedFolder: SyncedFolderParcelable) {
// custom folders newly created aren't in the list already,
// so triggering a refresh
- if (MediaFolderType.CUSTOM == syncedFolder.getType() && syncedFolder.getId() == UNPERSISTED_ID) {
- SyncedFolderDisplayItem newCustomFolder = new SyncedFolderDisplayItem(
+ if (MediaFolderType.CUSTOM == syncedFolder.type && syncedFolder.id == SyncedFolder.UNPERSISTED_ID) {
+ val newCustomFolder = SyncedFolderDisplayItem(
SyncedFolder.UNPERSISTED_ID,
- syncedFolder.getLocalPath(),
- syncedFolder.getRemotePath(),
- syncedFolder.isWifiOnly(),
- syncedFolder.isChargingOnly(),
- syncedFolder.isExisting(),
- syncedFolder.isSubfolderByDate(),
- syncedFolder.getAccount(),
- syncedFolder.getUploadAction(),
- syncedFolder.getNameCollisionPolicy().serialize(),
- syncedFolder.isEnabled(),
- clock.getCurrentTime(),
- new File(syncedFolder.getLocalPath()).getName(),
- syncedFolder.getType(),
- syncedFolder.isHidden());
-
- saveOrUpdateSyncedFolder(newCustomFolder);
- adapter.addSyncFolderItem(newCustomFolder);
+ syncedFolder.localPath,
+ syncedFolder.remotePath,
+ syncedFolder.isWifiOnly,
+ syncedFolder.isChargingOnly,
+ syncedFolder.isExisting,
+ syncedFolder.isSubfolderByDate,
+ syncedFolder.account,
+ syncedFolder.uploadAction,
+ syncedFolder.nameCollisionPolicy.serialize(),
+ syncedFolder.isEnabled,
+ clock.currentTime,
+ File(syncedFolder.localPath).name,
+ syncedFolder.type,
+ syncedFolder.isHidden
+ )
+ saveOrUpdateSyncedFolder(newCustomFolder)
+ adapter.addSyncFolderItem(newCustomFolder)
} else {
- SyncedFolderDisplayItem item = adapter.get(syncedFolder.getSection());
- updateSyncedFolderItem(item,
- syncedFolder.getId(),
- syncedFolder.getLocalPath(),
- syncedFolder.getRemotePath(),
- syncedFolder.isWifiOnly(),
- syncedFolder.isChargingOnly(),
- syncedFolder.isExisting(),
- syncedFolder.isSubfolderByDate(),
- syncedFolder.getUploadAction(),
- syncedFolder.getNameCollisionPolicy().serialize(),
- syncedFolder.isEnabled());
-
- saveOrUpdateSyncedFolder(item);
+ val item = adapter[syncedFolder.section]
+ updateSyncedFolderItem(
+ item,
+ syncedFolder.id,
+ syncedFolder.localPath,
+ syncedFolder.remotePath,
+ syncedFolder.isWifiOnly,
+ syncedFolder.isChargingOnly,
+ syncedFolder.isExisting,
+ syncedFolder.isSubfolderByDate,
+ syncedFolder.uploadAction,
+ syncedFolder.nameCollisionPolicy.serialize(),
+ syncedFolder.isEnabled
+ )
+ saveOrUpdateSyncedFolder(item)
// TODO test if notifyItemChanged is sufficient (should improve performance)
- adapter.notifyDataSetChanged();
+ adapter.notifyDataSetChanged()
}
-
- syncedFolderPreferencesDialogFragment = null;
-
- if (syncedFolder.isEnabled()) {
- showBatteryOptimizationInfo();
+ syncedFolderPreferencesDialogFragment = null
+ if (syncedFolder.isEnabled) {
+ showBatteryOptimizationInfo()
}
}
- private void saveOrUpdateSyncedFolder(SyncedFolderDisplayItem item) {
- if (item.getId() == UNPERSISTED_ID) {
+ private fun saveOrUpdateSyncedFolder(item: SyncedFolderDisplayItem) {
+ if (item.id == SyncedFolder.UNPERSISTED_ID) {
// newly set up folder sync config
- storeSyncedFolder(item);
+ storeSyncedFolder(item)
} else {
// existing synced folder setup to be updated
- syncedFolderProvider.updateSyncFolder(item);
- if (item.isEnabled()) {
- backgroundJobManager.startImmediateFilesSyncJob(false, false);
+ syncedFolderProvider.updateSyncFolder(item)
+ if (item.isEnabled) {
+ backgroundJobManager.startImmediateFilesSyncJob(skipCustomFolders = false, overridePowerSaving = false)
} else {
- String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + item.getId();
-
- ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().
- getContentResolver());
- arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey);
+ val syncedFolderInitiatedKey = KEY_SYNCED_FOLDER_INITIATED_PREFIX + item.id
+ val arbitraryDataProvider = ArbitraryDataProvider(MainApp.getAppContext().contentResolver)
+ arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey)
}
}
}
- private void storeSyncedFolder(SyncedFolderDisplayItem item) {
- ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().
- getContentResolver());
- long storedId = syncedFolderProvider.storeSyncedFolder(item);
- if (storedId != -1) {
- item.setId(storedId);
- if (item.isEnabled()) {
- backgroundJobManager.startImmediateFilesSyncJob(false, false);
+ private fun storeSyncedFolder(item: SyncedFolderDisplayItem) {
+ val arbitraryDataProvider = ArbitraryDataProvider(MainApp.getAppContext().contentResolver)
+ val storedId = syncedFolderProvider.storeSyncedFolder(item)
+ if (storedId != -1L) {
+ item.id = storedId
+ if (item.isEnabled) {
+ backgroundJobManager.startImmediateFilesSyncJob(skipCustomFolders = false, overridePowerSaving = false)
} else {
- String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + item.getId();
- arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey);
+ val syncedFolderInitiatedKey = KEY_SYNCED_FOLDER_INITIATED_PREFIX + item.id
+ arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey)
}
}
}
- @Override
- public void onCancelSyncedFolderPreference() {
- syncedFolderPreferencesDialogFragment = null;
+ override fun onCancelSyncedFolderPreference() {
+ syncedFolderPreferencesDialogFragment = null
}
- @Override
- public void onDeleteSyncedFolderPreference(SyncedFolderParcelable syncedFolder) {
- syncedFolderProvider.deleteSyncedFolder(syncedFolder.getId());
- adapter.removeItem(syncedFolder.getSection());
+ override fun onDeleteSyncedFolderPreference(syncedFolder: SyncedFolderParcelable) {
+ syncedFolderProvider.deleteSyncedFolder(syncedFolder.id)
+ adapter.removeItem(syncedFolder.section)
}
/**
@@ -737,77 +700,78 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
* @param nameCollisionPolicy what to do on name collision
* @param enabled is sync enabled
*/
- private void updateSyncedFolderItem(SyncedFolderDisplayItem item,
- long id,
- String localPath,
- String remotePath,
- boolean wifiOnly,
- boolean chargingOnly,
- boolean existing,
- boolean subfolderByDate,
- Integer uploadAction,
- Integer nameCollisionPolicy,
- boolean enabled) {
- item.setId(id);
- item.setLocalPath(localPath);
- item.setRemotePath(remotePath);
- item.setWifiOnly(wifiOnly);
- item.setChargingOnly(chargingOnly);
- item.setExisting(existing);
- item.setSubfolderByDate(subfolderByDate);
- item.setUploadAction(uploadAction);
- item.setNameCollisionPolicy(nameCollisionPolicy);
- item.setEnabled(enabled, clock.getCurrentTime());
+ @Suppress("LongParameterList")
+ private fun updateSyncedFolderItem(
+ item: SyncedFolderDisplayItem,
+ id: Long,
+ localPath: String,
+ remotePath: String,
+ wifiOnly: Boolean,
+ chargingOnly: Boolean,
+ existing: Boolean,
+ subfolderByDate: Boolean,
+ uploadAction: Int,
+ nameCollisionPolicy: Int,
+ enabled: Boolean
+ ) {
+ item.id = id
+ item.localPath = localPath
+ item.remotePath = remotePath
+ item.isWifiOnly = wifiOnly
+ item.isChargingOnly = chargingOnly
+ item.isExisting = existing
+ item.isSubfolderByDate = subfolderByDate
+ item.uploadAction = uploadAction
+ item.setNameCollisionPolicy(nameCollisionPolicy)
+ item.setEnabled(enabled, clock.currentTime)
}
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
- @NonNull int[] grantResults) {
- switch (requestCode) {
- case PermissionUtil.PERMISSIONS_EXTERNAL_STORAGE: {
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ when (requestCode) {
+ PermissionUtil.PERMISSIONS_EXTERNAL_STORAGE -> {
+
// If request is cancelled, result arrays are empty.
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
- int gridWidth = getResources().getInteger(R.integer.media_grid_width);
- load(gridWidth * 2, true);
+ val gridWidth = resources.getInteger(R.integer.media_grid_width)
+ load(gridWidth * 2, true)
} else {
// permission denied --> do nothing
- return;
+ return
}
- return;
+ return
}
- default:
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
- @Override
- protected void onResume() {
- super.onResume();
- }
-
- private void showBatteryOptimizationInfo() {
- if (powerManagementService.isPowerSavingExclusionAvailable() || checkIfBatteryOptimizationEnabled()) {
- AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog)
+ private fun showBatteryOptimizationInfo() {
+ if (powerManagementService.isPowerSavingExclusionAvailable || checkIfBatteryOptimizationEnabled()) {
+ val alertDialogBuilder = AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog)
.setTitle(getString(R.string.battery_optimization_title))
.setMessage(getString(R.string.battery_optimization_message))
- .setPositiveButton(getString(R.string.battery_optimization_disable), (dialog, which) -> {
+ .setPositiveButton(getString(R.string.battery_optimization_disable)) { _, _ ->
// show instant upload
- @SuppressLint("BatteryLife")
- Intent intent = new Intent(ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
- Uri.parse("package:" + BuildConfig.APPLICATION_ID));
-
- if (intent.resolveActivity(getPackageManager()) != null) {
- startActivity(intent);
+ @SuppressLint("BatteryLife") val intent = Intent(
+ Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
+ Uri.parse("package:" + BuildConfig.APPLICATION_ID)
+ )
+ if (intent.resolveActivity(packageManager) != null) {
+ startActivity(intent)
}
- })
- .setNeutralButton(getString(R.string.battery_optimization_close), (dialog, which) -> dialog.dismiss())
- .setIcon(R.drawable.ic_battery_alert);
-
- if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
- AlertDialog alertDialog = alertDialogBuilder.show();
- ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
- alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+ }
+ .setNeutralButton(getString(R.string.battery_optimization_close)) { dialog, _ -> dialog.dismiss() }
+ .setIcon(R.drawable.ic_battery_alert)
+ if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
+ val alertDialog = alertDialogBuilder.show()
+ ThemeButtonUtils.themeBorderlessButton(
+ alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+ alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
+ )
}
}
}
@@ -817,13 +781,11 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
*
* @return true if battery optimization is enabled
*/
- private boolean checkIfBatteryOptimizationEnabled() {
- PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
-
- if (powerManager == null) {
- return true;
+ private fun checkIfBatteryOptimizationEnabled(): Boolean {
+ val powerManager = getSystemService(POWER_SERVICE) as PowerManager?
+ return when {
+ powerManager != null -> !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
+ else -> true
}
-
- return !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID);
}
}