Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert Media Folder to Kotlin #12132

Merged
merged 4 commits into from
Nov 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import android.app.Activity
import androidx.test.espresso.Espresso
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.closeSoftKeyboard
import androidx.test.espresso.action.ViewActions.scrollTo
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.DrawerActions
import androidx.test.espresso.contrib.NavigationViewActions
Expand Down Expand Up @@ -238,12 +240,15 @@ class FileDisplayActivityIT : AbstractOnServerIT() {
onView(withId(R.id.sort_button)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))

// browse into folder
onView(withId(R.id.list_root)).perform(
RecyclerViewActions.actionOnItemAtPosition<OCFileListItemViewHolder>(
0,
click()
onView(withId(R.id.list_root))
.perform(scrollTo())
.perform(closeSoftKeyboard())
.perform(
RecyclerViewActions.actionOnItemAtPosition<OCFileListItemViewHolder>(
0,
click()
)
)
)
shortSleep()
checkToolbarTitle(topFolder)
// sort button should now be visible
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,15 @@ public static void deleteAllFilesOnServer() {

if (!remoteFile.getRemotePath().equals("/")) {
if (remoteFile.isEncrypted()) {
assertTrue(new ToggleEncryptionRemoteOperation(remoteFile.getLocalId(),
remoteFile.getRemotePath(),
false)
.execute(client)
.isSuccess());
ToggleEncryptionRemoteOperation operation = new ToggleEncryptionRemoteOperation(remoteFile.getLocalId(),
remoteFile.getRemotePath(),
false);

boolean operationResult = operation
.execute(client)
.isSuccess();

assertTrue(operationResult);
}

boolean removeResult = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,19 @@ class MediaFoldersDetectionWork constructor(
)
val imageMediaFolderPaths: MutableList<String> = ArrayList()
val videoMediaFolderPaths: MutableList<String> = ArrayList()

for (imageMediaFolder in imageMediaFolders) {
imageMediaFolderPaths.add(imageMediaFolder.absolutePath)
imageMediaFolder.absolutePath?.let {
imageMediaFolderPaths.add(it)
}
}

for (videoMediaFolder in videoMediaFolders) {
imageMediaFolderPaths.add(videoMediaFolder.absolutePath)
videoMediaFolder.absolutePath?.let {
imageMediaFolderPaths.add(it)
}
}

val arbitraryDataString = arbitraryDataProvider.getValue(ACCOUNT_NAME_GLOBAL, KEY_MEDIA_FOLDERS)
if (!TextUtils.isEmpty(arbitraryDataString)) {
mediaFoldersModel = gson.fromJson(arbitraryDataString, MediaFoldersModel::class.java)
Expand Down
70 changes: 39 additions & 31 deletions app/src/main/java/com/owncloud/android/MainApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,12 @@ protected void attachBaseContext(Context base) {

if (!isCrashReportingProcess && !appInfo.isDebugBuild()) {
Thread.UncaughtExceptionHandler defaultPlatformHandler = Thread.getDefaultUncaughtExceptionHandler();
final ExceptionHandler crashReporter = new ExceptionHandler(this,
defaultPlatformHandler);
Thread.setDefaultUncaughtExceptionHandler(crashReporter);

if (defaultPlatformHandler != null) {
final ExceptionHandler crashReporter = new ExceptionHandler(this,
defaultPlatformHandler);
Thread.setDefaultUncaughtExceptionHandler(crashReporter);
}
}
}

Expand Down Expand Up @@ -791,25 +794,34 @@ private static void splitOutAutoUploadEntries(Clock clock,
+ syncedFolder.getId() + " - " + syncedFolder.getLocalPath());

for (MediaFolder imageMediaFolder : imageMediaFolders) {
if (imageMediaFolder.absolutePath.equals(syncedFolder.getLocalPath())) {
newSyncedFolder = (SyncedFolder) syncedFolder.clone();
newSyncedFolder.setType(MediaFolderType.IMAGE);
primaryKey = syncedFolderProvider.storeSyncedFolder(newSyncedFolder);
Log_OC.i(TAG, "Migrated image synced_folders record: "
+ primaryKey + " - " + newSyncedFolder.getLocalPath());
break;
String absolutePathOfImageFolder = imageMediaFolder.absolutePath;

if (absolutePathOfImageFolder != null) {
if (absolutePathOfImageFolder.equals(syncedFolder.getLocalPath())) {
newSyncedFolder = (SyncedFolder) syncedFolder.clone();
newSyncedFolder.setType(MediaFolderType.IMAGE);
primaryKey = syncedFolderProvider.storeSyncedFolder(newSyncedFolder);
Log_OC.i(TAG, "Migrated image synced_folders record: "
+ primaryKey + " - " + newSyncedFolder.getLocalPath());
break;
}
}
}

for (MediaFolder videoMediaFolder : videoMediaFolders) {
if (videoMediaFolder.absolutePath.equals(syncedFolder.getLocalPath())) {
newSyncedFolder = (SyncedFolder) syncedFolder.clone();
newSyncedFolder.setType(MediaFolderType.VIDEO);
primaryKey = syncedFolderProvider.storeSyncedFolder(newSyncedFolder);
Log_OC.i(TAG, "Migrated video synced_folders record: "
+ primaryKey + " - " + newSyncedFolder.getLocalPath());
break;
String absolutePathOfVideoFolder = videoMediaFolder.absolutePath;

if (absolutePathOfVideoFolder != null) {
if (absolutePathOfVideoFolder.equals(syncedFolder.getLocalPath())) {
newSyncedFolder = (SyncedFolder) syncedFolder.clone();
newSyncedFolder.setType(MediaFolderType.VIDEO);
primaryKey = syncedFolderProvider.storeSyncedFolder(newSyncedFolder);
Log_OC.i(TAG, "Migrated video synced_folders record: "
+ primaryKey + " - " + newSyncedFolder.getLocalPath());
break;
}
}

}
}

Expand All @@ -835,19 +847,22 @@ private static void cleanOldEntries(Clock clock) {

List<SyncedFolder> syncedFolderList = syncedFolderProvider.getSyncedFolders();
Map<Pair<String, String>, Long> syncedFolders = new HashMap<>();
ArrayList<Long> ids = new ArrayList<>();
for (SyncedFolder syncedFolder : syncedFolderList) {
Pair<String, String> checkPair = new Pair<>(syncedFolder.getAccount(), syncedFolder.getLocalPath());
if (syncedFolders.containsKey(checkPair)) {
if (syncedFolder.getId() > syncedFolders.get(checkPair)) {
syncedFolders.put(checkPair, syncedFolder.getId());
Long folderId = syncedFolders.get(checkPair);

if (folderId != null) {
if (syncedFolder.getId() > folderId) {
syncedFolders.put(checkPair, syncedFolder.getId());
}
}
} else {
syncedFolders.put(checkPair, syncedFolder.getId());
}
}

ids.addAll(syncedFolders.values());
ArrayList<Long> ids = new ArrayList<>(syncedFolders.values());

if (ids.size() > 0) {
int deletedCount = syncedFolderProvider.deleteSyncedFoldersNotInList(ids);
Expand All @@ -865,18 +880,11 @@ public AndroidInjector<Object> androidInjector() {
return dispatchingAndroidInjector;
}


public static void setAppTheme(DarkMode mode) {
switch (mode) {
case LIGHT:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
break;
case DARK:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
break;
case SYSTEM:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
break;
case LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
case DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
case SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,29 +16,31 @@
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
* License along with this program. If not, see <http:></http:>//www.gnu.org/licenses/>.
*/
package com.owncloud.android.datamodel;

import java.util.ArrayList;
import java.util.List;
package com.owncloud.android.datamodel

/**
* Business object representing a media folder with all information that are gathered via media queries.
*/
public class MediaFolder {
/** name of the folder. */
public String folderName;
class MediaFolder {
/** name of the folder. */
@JvmField
var folderName: String? = null

/** absolute path of the folder. */
@JvmField
var absolutePath: String? = null

/** absolute path of the folder. */
public String absolutePath;

/** list of file paths of the folder's content */
public List<String> filePaths = new ArrayList<>();
/** list of file paths of the folder's content */
@JvmField
var filePaths: List<String> = ArrayList()

/** total number of files in the media folder. */
public long numberOfFiles;
/** total number of files in the media folder. */
@JvmField
var numberOfFiles: Long = 0

/** type of media folder. */
public MediaFolderType type;
/** type of media folder. */
@JvmField
var type: MediaFolderType? = null
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,37 +17,28 @@
* You should have received a copy of the GNU Affero General Public
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.owncloud.android.datamodel;
package com.owncloud.android.datamodel

import android.util.SparseArray;
import android.util.SparseArray

/**
* Types of media folder.
*/
public enum MediaFolderType {
CUSTOM(0),
IMAGE(1),
VIDEO(2);

private Integer id;

private static SparseArray<MediaFolderType> reverseMap = new SparseArray<>(3);

static {
reverseMap.put(CUSTOM.getId(), CUSTOM);
reverseMap.put(IMAGE.getId(), IMAGE);
reverseMap.put(VIDEO.getId(), VIDEO);
}

MediaFolderType(Integer id) {
this.id = id;
}

public static MediaFolderType getById(Integer id) {
return reverseMap.get(id);
}

public Integer getId() {
return this.id;
enum class MediaFolderType(@JvmField val id: Int) {
CUSTOM(0), IMAGE(1), VIDEO(2);

companion object {
private val reverseMap = SparseArray<MediaFolderType>(3)

init {
reverseMap.put(CUSTOM.id, CUSTOM)
reverseMap.put(IMAGE.id, IMAGE)
reverseMap.put(VIDEO.id, VIDEO)
}

@JvmStatic
fun getById(id: Int?): MediaFolderType {
return reverseMap[id!!]
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Nextcloud Android client application
*
* @author Mario Danic
* @author Andy Scherzinger
* Copyright (C) 2018 Mario Danic
* Copyright (C) 2018 Andy Scherzinger
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.owncloud.android.datamodel

class MediaFoldersModel(var imageMediaFolders: List<String>, var videoMediaFolders: List<String>)
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ private ContentValues createContentValuesFromSyncedFolder(SyncedFolder syncedFol
cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_UPLOAD_ACTION, syncedFolder.getUploadAction());
cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_NAME_COLLISION_POLICY,
syncedFolder.getNameCollisionPolicyInt());
cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_TYPE, syncedFolder.getType().getId());
cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_TYPE, syncedFolder.getType().id);
cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_HIDDEN, syncedFolder.isHidden());
cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_SUBFOLDER_RULE, syncedFolder.getSubfolderRule().ordinal());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ private boolean showFooter() {
public int getSectionByLocalPathAndType(String localPath, int type) {
for (int i = 0; i < filteredSyncFolderItems.size(); i++) {
if (filteredSyncFolderItems.get(i).getLocalPath().equalsIgnoreCase(localPath) &&
filteredSyncFolderItems.get(i).getType().getId().equals(type)) {
filteredSyncFolderItems.get(i).getType().id == type) {
return i;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(existing ? 1 : 0);
dest.writeInt(enabled ? 1 : 0);
dest.writeInt(subfolderByDate ? 1 : 0);
dest.writeInt(type.getId());
dest.writeInt(type.id);
dest.writeString(account);
dest.writeInt(uploadAction);
dest.writeInt(nameCollisionPolicy.serialize());
Expand Down
Loading