Skip to content

Commit 3ba5c33

Browse files
Merge branch 'master' into skip-auto-rename-if-wcf-disabled
Signed-off-by: Alper Öztürk <67455295+alperozturk96@users.noreply.github.com>
2 parents f197eeb + 90ebd53 commit 3ba5c33

24 files changed

Lines changed: 268 additions & 200 deletions

.github/workflows/analysis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ jobs:
7373
{
7474
echo "org.gradle.jvmargs=-Xmx5g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g"
7575
echo "org.gradle.configureondemand=true"
76+
echo "org.gradle.configuration-cache=false"
7677
echo "kapt.incremental.apt=true"
7778
} > "$HOME/.gradle/gradle.properties"
7879
scripts/analysis/analysis-wrapper.sh "${{ steps.get-vars.outputs.branch }}" "${{ secrets.LOG_USERNAME }}" "${{ secrets.LOG_PASSWORD }}" "$GITHUB_RUN_NUMBER" "${{ steps.get-vars.outputs.pr }}"

.github/workflows/codeql.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
with:
4444
swap-size-gb: 10
4545
- name: Initialize CodeQL
46-
uses: github/codeql-action/init@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0
46+
uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
4747
with:
4848
languages: ${{ matrix.language }}
4949
- name: Set up JDK 17
@@ -57,4 +57,4 @@ jobs:
5757
echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
5858
./gradlew assembleDebug
5959
- name: Perform CodeQL Analysis
60-
uses: github/codeql-action/analyze@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0
60+
uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2

.github/workflows/qa.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ jobs:
4848
mkdir -p "$HOME/.gradle"
4949
echo "org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" > "$HOME/.gradle/gradle.properties"
5050
echo "org.gradle.caching=true; org.gradle.parallel=true; org.gradle.configureondemand=true; kapt.incremental.apt=true" >> "$HOME/.gradle/gradle.properties"
51-
sed -i "/qa/,/\}/ s/versionCode .*/versionCode ${{github.event.number}} /" "app/build.gradle"
52-
sed -i "/qa/,/\}/ s/versionName .*/versionName \"${{github.event.number}}\"/" "app/build.gradle"
51+
sed -i "/qa/,/\}/ s/versionCode.*/versionCode = ${{ github.event.number }}/" app/build.gradle.kts
52+
sed -i "/qa/,/\}/ s/versionName.*/versionName = \"${{ github.event.number }}\"/" app/build.gradle.kts
5353
./gradlew assembleQaDebug
5454
$(find /usr/local/lib/android/sdk/build-tools/*/apksigner | sort | tail -n1) sign --ks-pass pass:"$KS_PASS" --key-pass pass:"$KEY_PASS" --ks-key-alias key0 --ks ".github/workflows/QA_keystore.jks" app/build/outputs/apk/qa/debug/*qa-debug*.apk
5555
.github/workflows/uploadArtifact.sh "$LOG_USERNAME" "$LOG_PASSWORD" "${{github.event.number}}" "${{github.event.number}}" "$GITHUB_TOKEN"

.github/workflows/scorecard.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ jobs:
4242

4343
# Upload the results to GitHub's code scanning dashboard.
4444
- name: "Upload to code-scanning"
45-
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.0
45+
uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
4646
with:
4747
sarif_file: results.sarif

app/build.gradle.kts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -297,18 +297,19 @@ tasks.withType<SpotBugsTask>().configureEach {
297297
val variantName = variantNameCap.substring(0, 1).lowercase() + variantNameCap.substring(1)
298298
dependsOn("compile${variantNameCap}Sources")
299299

300-
classes =
301-
fileTree(layout.buildDirectory.get().asFile.toString() + "/intermediates/javac/${variantName}/compile${variantNameCap}JavaWithJavac/classes/")
302-
excludeFilter = file("${project.rootDir}/scripts/analysis/spotbugs-filter.xml")
303-
reports {
304-
register("xml") {
305-
required = true
306-
}
307-
register("html") {
308-
required = true
309-
outputLocation = layout.buildDirectory.file("reports/spotbugs/spotbugs.html").get().asFile
310-
setStylesheet("fancy.xsl")
311-
}
300+
classes = fileTree(
301+
layout.buildDirectory.get().asFile.toString() +
302+
"/intermediates/javac/${variantName}/compile${variantNameCap}JavaWithJavac/classes/"
303+
)
304+
excludeFilter.set(file("${project.rootDir}/scripts/analysis/spotbugs-filter.xml"))
305+
306+
reports.create("xml") {
307+
required.set(true)
308+
}
309+
reports.create("html") {
310+
required.set(true)
311+
outputLocation.set(layout.buildDirectory.file("reports/spotbugs/spotbugs.html"))
312+
setStylesheet("fancy.xsl")
312313
}
313314
}
314315

@@ -514,4 +515,4 @@ dependencies {
514515

515516
// kotlinx.serialization
516517
implementation(libs.kotlinx.serialization.json)
517-
}
518+
}

app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.kt

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -138,30 +138,34 @@ class AvatarGroupLayout @JvmOverloads constructor(
138138
avatar: ImageView,
139139
viewThemeUtils: ViewThemeUtils
140140
) {
141-
// maybe federated share
142-
val split = user.split("@".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
143-
val userId: String? = split[0]
144-
val server = split[1]
145-
146-
val url = "https://" + server + "/index.php/avatar/" + userId + "/" +
147-
resources.getInteger(R.integer.file_avatar_px)
148-
var placeholder: Drawable?
149-
try {
150-
placeholder = TextDrawable.createAvatarByUserId(userId, avatarRadius)
141+
val split = user.split("@")
142+
val userId = split.getOrNull(0) ?: user
143+
val server = split.getOrNull(1)
144+
145+
val url = if (server != null) {
146+
"https://$server/index.php/avatar/$userId/${resources.getInteger(R.integer.file_avatar_px)}"
147+
} else {
148+
// fallback: no federated server, maybe use local avatar
149+
null
150+
}
151+
152+
val placeholder: Drawable = try {
153+
TextDrawable.createAvatarByUserId(userId, avatarRadius)
151154
} catch (e: Exception) {
152155
Log_OC.e(TAG, "Error calculating RGB value for active account icon.", e)
153-
placeholder = viewThemeUtils.platform.colorDrawable(
154-
ResourcesCompat.getDrawable(
155-
resources,
156-
R.drawable.account_circle_white,
157-
null
158-
)!!,
156+
viewThemeUtils.platform.colorDrawable(
157+
ResourcesCompat
158+
.getDrawable(resources, R.drawable.account_circle_white, null)!!,
159159
ContextCompat.getColor(context, R.color.black)
160160
)
161161
}
162162

163163
avatar.tag = null
164-
loadCircularBitmapIntoImageView(context, url, avatar, placeholder)
164+
if (url != null) {
165+
loadCircularBitmapIntoImageView(context, url, avatar, placeholder)
166+
} else {
167+
avatar.setImageDrawable(placeholder)
168+
}
165169
}
166170

167171
override fun avatarGenerated(avatarDrawable: Drawable?, callContext: Any) {

app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,10 +1311,11 @@ class FileDisplayActivity :
13111311
val ocFileListFragment = leftFragment
13121312
syncAndUpdateFolder(ignoreETag = true, ignoreFocus = true)
13131313

1314-
var startFile: OCFile? = null
1315-
if (intent != null) {
1316-
startFile = getFileFromIntent(intent)
1317-
file = startFile
1314+
// Try to get the OCFile from the intent, if one was provided when launching this activity.
1315+
// 'file' comes from the FileActivity base class and represents the currently opened file or folder.
1316+
// We update it only when a valid file is found in the intent.
1317+
val startFile = intent?.let { getFileFromIntent(it) }?.also {
1318+
file = it
13181319
}
13191320

13201321
// refresh list of files

app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt

Lines changed: 33 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import android.view.Menu
2121
import android.view.MenuItem
2222
import android.view.View
2323
import androidx.activity.OnBackPressedCallback
24+
import androidx.lifecycle.lifecycleScope
2425
import androidx.localbroadcastmanager.content.LocalBroadcastManager
26+
import com.nextcloud.client.account.User
2527
import com.nextcloud.client.di.Injectable
2628
import com.nextcloud.utils.fileNameValidator.FileNameValidator
2729
import com.owncloud.android.R
@@ -48,6 +50,8 @@ import com.owncloud.android.utils.DisplayUtils
4850
import com.owncloud.android.utils.ErrorMessageAdapter
4951
import com.owncloud.android.utils.FileSortOrder
5052
import com.owncloud.android.utils.PathUtils
53+
import kotlinx.coroutines.Dispatchers
54+
import kotlinx.coroutines.launch
5155
import java.io.File
5256
import javax.inject.Inject
5357

@@ -60,7 +64,6 @@ open class FolderPickerActivity :
6064
OnSortingOrderListener {
6165

6266
private var mSyncBroadcastReceiver: SyncBroadcastReceiver? = null
63-
private var mSyncInProgress = false
6467
private var mSearchOnlyFolders = false
6568
var isDoNotEnterEncryptedFolder = false
6669
private set
@@ -105,7 +108,6 @@ open class FolderPickerActivity :
105108
}
106109

107110
updateActionBarTitleAndHomeButtonByString(captionText)
108-
setBackgroundText()
109111
handleBackPress()
110112
}
111113

@@ -211,25 +213,6 @@ open class FolderPickerActivity :
211213
transaction.commit()
212214
}
213215

214-
/**
215-
* Show a text message on screen view for notifying user if content is loading or folder is empty
216-
*/
217-
private fun setBackgroundText() {
218-
val listFragment = listOfFilesFragment
219-
220-
if (listFragment == null) {
221-
Log_OC.e(TAG, "OCFileListFragment is null")
222-
}
223-
224-
listFragment?.let {
225-
if (mSyncInProgress) {
226-
it.setEmptyListMessage(EmptyListState.LOADING)
227-
} else {
228-
it.setEmptyListMessage(EmptyListState.ADD_FOLDER)
229-
}
230-
}
231-
}
232-
233216
protected val listOfFilesFragment: OCFileListFragment?
234217
get() {
235218
val listOfFiles = supportFragmentManager.findFragmentByTag(TAG_LIST_OF_FOLDERS)
@@ -259,21 +242,33 @@ open class FolderPickerActivity :
259242
}
260243

261244
private fun startSyncFolderOperation(folder: OCFile?, ignoreETag: Boolean) {
262-
val currentSyncTime = System.currentTimeMillis()
263-
mSyncInProgress = true
264-
265-
RefreshFolderOperation(
266-
folder,
267-
currentSyncTime,
268-
false,
269-
ignoreETag,
270-
storageManager,
271-
user.orElseThrow { RuntimeException("User not set") },
272-
applicationContext
273-
).also {
274-
it.execute(account, this, null, null)
245+
val optionalUser = user ?: return
246+
if (optionalUser.isEmpty) {
247+
return
248+
}
249+
val user: User = optionalUser.get()
250+
listOfFilesFragment?.setEmptyListMessage(EmptyListState.LOADING)
251+
252+
lifecycleScope.launch(Dispatchers.IO) {
253+
val currentSyncTime = System.currentTimeMillis()
254+
val operation = RefreshFolderOperation(
255+
folder,
256+
currentSyncTime,
257+
false,
258+
ignoreETag,
259+
storageManager,
260+
user,
261+
applicationContext
262+
)
263+
operation.execute(
264+
account,
265+
this@FolderPickerActivity,
266+
{ _, _ ->
267+
listOfFilesFragment?.setEmptyListMessage(EmptyListState.LOCAL_FILE_LIST_EMPTY_FILE)
268+
},
269+
null
270+
)
275271
}
276-
setBackgroundText()
277272
}
278273

279274
override fun onResume() {
@@ -554,9 +549,7 @@ open class FolderPickerActivity :
554549
return
555550
}
556551

557-
if (FileSyncAdapter.EVENT_FULL_SYNC_START == event) {
558-
mSyncInProgress = true
559-
} else {
552+
if (FileSyncAdapter.EVENT_FULL_SYNC_START != event) {
560553
var (currentFile, currentDir) = getCurrentFileAndDirectory()
561554

562555
if (currentDir == null) {
@@ -572,22 +565,17 @@ open class FolderPickerActivity :
572565
file = currentFile
573566
}
574567

575-
mSyncInProgress = (
576-
FileSyncAdapter.EVENT_FULL_SYNC_END != event &&
577-
RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED != event
578-
)
579-
580568
checkCredentials(syncResult, event)
581569
}
582570

583571
DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT))
584-
Log_OC.d(TAG, "Setting progress visibility to $mSyncInProgress")
585-
setBackgroundText()
586572
} catch (e: RuntimeException) {
587573
Log_OC.e(TAG, "Error on broadcast receiver", e)
588574
// avoid app crashes after changing the serial id of RemoteOperationResult
589575
// in owncloud library with broadcast notifications pending to process
590576
DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT))
577+
} finally {
578+
listOfFilesFragment?.setEmptyListMessage(EmptyListState.LOCAL_FILE_LIST_EMPTY_FILE)
591579
}
592580
}
593581

app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,14 @@ open class ExtendedListFragment :
704704
true
705705
)
706706
}
707+
EmptyListState.ERROR -> {
708+
setMessageForEmptyList(
709+
R.string.file_list_error_headline,
710+
R.string.file_list_error_description,
711+
R.drawable.ic_no_internet,
712+
false
713+
)
714+
}
707715
else -> {
708716
setMessageForEmptyList(
709717
R.string.file_list_empty_headline,

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
225225
protected SearchType currentSearchType;
226226
protected boolean searchFragment;
227227
protected SearchEvent searchEvent;
228-
protected AsyncTask<Void, Void, Boolean> remoteOperationAsyncTask;
228+
private OCFileListSearchTask searchTask;
229229
protected String mLimitToMimeType;
230230
private FloatingActionButton mFabMain;
231231
public static boolean isMultipleFileSelectedForCopyOrMove = false;
@@ -350,8 +350,8 @@ public void onDetach() {
350350
setOnRefreshListener(null);
351351
mContainerActivity = null;
352352

353-
if (remoteOperationAsyncTask != null) {
354-
remoteOperationAsyncTask.cancel(true);
353+
if (searchTask != null) {
354+
searchTask.cancel();
355355
}
356356
super.onDetach();
357357
}
@@ -1907,10 +1907,10 @@ protected void handleSearchEvent(SearchEvent event) {
19071907
return;
19081908
}
19091909

1910-
// avoid calling api multiple times if async task is already executing
1911-
if (remoteOperationAsyncTask != null && remoteOperationAsyncTask.getStatus() != AsyncTask.Status.FINISHED) {
1910+
// avoid calling api multiple times if task is already executing
1911+
if (searchTask != null && !searchTask.isFinished()) {
19121912
if (searchEvent != null) {
1913-
Log_OC.d(TAG, "OCFileListSearchAsyncTask already running skipping new api call for search event: " + searchEvent.getSearchType());
1913+
Log_OC.d(TAG, "OCFileListSearchTask already running skipping new api call for search event: " + searchEvent.getSearchType());
19141914
}
19151915

19161916
return;
@@ -1941,11 +1941,10 @@ protected void handleSearchEvent(SearchEvent event) {
19411941

19421942
final User currentUser = accountManager.getUser();
19431943

1944-
final RemoteOperation remoteOperation = getSearchRemoteOperation(currentUser, event);
1944+
final var remoteOperation = getSearchRemoteOperation(currentUser, event);
19451945

1946-
remoteOperationAsyncTask = new OCFileListSearchAsyncTask(mContainerActivity, this, remoteOperation, currentUser, event);
1947-
1948-
remoteOperationAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
1946+
searchTask = new OCFileListSearchTask(mContainerActivity, this, remoteOperation, currentUser, event, SharedListFragment.TASK_TIMEOUT);
1947+
searchTask.execute();
19491948
}
19501949

19511950

0 commit comments

Comments
 (0)