From 064d86dca7c331545d0713bea8d4460dfb481952 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 20 Jan 2024 10:47:43 +0100 Subject: [PATCH 1/9] chore(deps): AGP 8, Java 17, Kotlin 1.9.22, SSO 1.0.0 Signed-off-by: Stefan Niedermann --- .github/workflows/android.yml | 30 ++++++++++-- .github/workflows/codeql.yml | 6 +-- app/build.gradle | 48 +++++++++++-------- .../notes/branding/BrandedActivity.java | 2 +- .../notes/branding/BrandedFragment.java | 4 +- .../owncloud/notes/edit/BaseNoteFragment.java | 2 +- .../owncloud/notes/edit/EditNoteActivity.java | 2 +- .../edit/SearchableBaseNoteFragment.java | 3 +- .../importaccount/ImportAccountActivity.java | 4 +- .../owncloud/notes/main/MainViewModel.java | 2 +- .../main/MultiSelectedActionModeCallback.java | 2 +- .../ManageAccountsViewModel.java | 2 +- .../notes/persistence/ApiProvider.java | 4 +- .../notes/persistence/NotesRepository.java | 6 +-- build.gradle | 15 +++--- gradle.properties | 21 +------- gradle/wrapper/gradle-wrapper.properties | 2 +- 17 files changed, 82 insertions(+), 73 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 5ce8c09ea..91b9a68bd 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -15,6 +15,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4.1.1 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + check-latest: true + cache: 'gradle' - name: Validate Gradle Wrapper uses: gradle/wrapper-validation-action@v1 @@ -24,8 +30,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4.1.1 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + check-latest: true + cache: 'gradle' - name: Lint - run: bash ./gradlew lintDevDebug --stacktrace + run: bash ./gradlew lintDevDebug --stacktrace --no-configuration-cache test: name: Unit tests @@ -33,8 +45,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4.1.1 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + check-latest: true + cache: 'gradle' - name: Unit tests - run: bash ./gradlew test --stacktrace + run: bash ./gradlew test --stacktrace --no-configuration-cache apk: name: Generate APK @@ -42,8 +60,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4.1.1 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + check-latest: true + cache: 'gradle' - name: Build debug APK - run: bash ./gradlew assembleDev --stacktrace + run: bash ./gradlew assembleDev --stacktrace --no-configuration-cache - name: Upload APK uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1c3fa4639..25e8ecd87 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -38,12 +38,12 @@ jobs: - name: Set up JDK 17 uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 # v4.0.0 with: - distribution: "temurin" - java-version: 17 + distribution: 'temurin' + java-version: '17' - name: Assemble run: | mkdir -p "$HOME/.gradle" echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties" - ./gradlew assembleDebug + ./gradlew assembleDebug --no-configuration-cache - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@b374143c1149a9115d881581d29b8390bbcbb59c # v3.22.11 diff --git a/app/build.gradle b/app/build.gradle index beb52cdf1..5cfa0091d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,18 +2,13 @@ apply plugin: 'com.android.application' apply plugin: 'org.jetbrains.kotlin.android' android { - compileSdkVersion 33 - - compileOptions { - coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } + compileSdk 34 + namespace 'it.niedermann.owncloud.notes' defaultConfig { applicationId "it.niedermann.owncloud.notes" - minSdkVersion 24 - targetSdkVersion 33 + minSdk 24 + targetSdk 34 versionCode 40020000 versionName "4.2.0 Alpha1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -24,8 +19,19 @@ android { } } + compileOptions { + coreLibraryDesugaringEnabled true + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = '17' + } + buildFeatures { viewBinding true + buildConfig true } buildTypes { @@ -60,25 +66,25 @@ android { includeAndroidResources true } } - lint { + + lintOptions { abortOnError false disable 'MissingTranslation' } - namespace 'it.niedermann.owncloud.notes' } ext { glideVersion = '4.16.0' - roomVersion = "2.5.1" + roomVersion = "2.6.1" } dependencies { - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' // Nextcloud SSO - implementation 'com.github.nextcloud.android-common:ui:0.12.0' - implementation 'com.github.nextcloud:Android-SingleSignOn:0.8.1' - implementation 'com.github.stefan-niedermann:android-commons:0.2.9' + implementation 'com.github.nextcloud.android-common:ui:0.13.0' + implementation 'com.github.nextcloud:Android-SingleSignOn:1.0.0' + implementation 'com.github.stefan-niedermann:android-commons:0.4.0' implementation "com.github.stefan-niedermann.nextcloud-commons:sso-glide:$commonsVersion" implementation "com.github.stefan-niedermann.nextcloud-commons:exception:$commonsVersion" implementation("com.github.stefan-niedermann.nextcloud-commons:markdown:$commonsVersion") { @@ -91,16 +97,16 @@ dependencies { // Android X implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.core:core-splashscreen:1.0.1' - implementation 'androidx.fragment:fragment:1.6.1' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2' + implementation 'androidx.fragment:fragment:1.6.2' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0' implementation 'androidx.preference:preference:1.2.1' implementation 'androidx.recyclerview:recyclerview-selection:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'androidx.work:work-runtime:2.8.1' - implementation 'com.google.android.material:material:1.9.0' + implementation 'androidx.work:work-runtime:2.9.0' + implementation 'com.google.android.material:material:1.11.0' // Database implementation "androidx.room:room-runtime:${roomVersion}" diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java index 113db2a92..a3f55c24b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java @@ -20,7 +20,7 @@ protected void onStart() { super.onStart(); final var typedValue = new TypedValue(); - getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); + getTheme().resolveAttribute(com.google.android.material.R.attr.colorAccent, typedValue, true); colorAccent = typedValue.data; readBrandMainColorLiveData(this).observe(this, this::applyBrand); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedFragment.java index ac197ef8f..bed275755 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedFragment.java @@ -23,9 +23,9 @@ public void onStart() { final var context = requireContext(); final var typedValue = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); + context.getTheme().resolveAttribute(com.google.android.material.R.attr.colorAccent, typedValue, true); colorAccent = typedValue.data; - context.getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true); + context.getTheme().resolveAttribute(com.google.android.material.R.attr.colorPrimary, typedValue, true); colorPrimary = typedValue.data; @ColorInt final int color = BrandingUtil.readBrandMainColor(context); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java index 162454336..1d6adc0ec 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java @@ -103,7 +103,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat if (accountId > 0) { /* Switch account if account id has been provided */ this.localAccount = repo.getAccountById(accountId); - SingleAccountHelper.setCurrentAccount(requireContext().getApplicationContext(), localAccount.getAccountName()); + SingleAccountHelper.commitCurrentAccount(requireContext().getApplicationContext(), localAccount.getAccountName()); } isNew = false; note = originalNote = repo.getNoteById(id); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java index 71b43db5b..2b49cc297 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java @@ -71,7 +71,7 @@ protected void onCreate(final Bundle savedInstanceState) { try { if (SingleAccountHelper.getCurrentSingleSignOnAccount(this) == null) { - throw new NoCurrentAccountSelectedException(); + throw new NoCurrentAccountSelectedException(this); } } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { Toast.makeText(this, R.string.no_account_configured_yet, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java index 10c9510cb..1ca1c5f57 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java @@ -117,8 +117,7 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { searchMenuItem.collapseActionView(); - final var searchEditFrame = searchView.findViewById(R.id - .search_edit_frame); + final var searchEditFrame = searchView.findViewById(androidx.appcompat.R.id.search_edit_frame); searchEditFrame.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { int oldVisibility = -1; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java index 72ec0c268..c4e580790 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java @@ -88,7 +88,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { AccountImporter.onActivityResult(requestCode, resultCode, data, ImportAccountActivity.this, ssoAccount -> { runOnUiThread(() -> binding.progressCircular.setVisibility(View.VISIBLE)); - SingleAccountHelper.setCurrentAccount(getApplicationContext(), ssoAccount.name); + SingleAccountHelper.commitCurrentAccount(getApplicationContext(), ssoAccount.name); executor.submit(() -> { Log.i(TAG, "Added account: " + "name:" + ssoAccount.name + ", " + ssoAccount.url + ", userId" + ssoAccount.userId); try { @@ -135,7 +135,7 @@ public void onError(@NonNull Throwable t) { } catch (Throwable t) { t.printStackTrace(); ApiProvider.getInstance().invalidateAPICache(ssoAccount); - SingleAccountHelper.setCurrentAccount(this, null); + SingleAccountHelper.commitCurrentAccount(this, null); runOnUiThread(() -> { restoreCleanState(); if (t instanceof NextcloudHttpRequestFailedException && ((NextcloudHttpRequestFailedException) t).getStatusCode() == HttpURLConnection.HTTP_UNAVAILABLE) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index 75d02c52d..ec7254443 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -121,7 +121,7 @@ public LiveData getCurrentAccount() { public void postCurrentAccount(@NonNull Account account) { state.set(KEY_CURRENT_ACCOUNT, account); BrandingUtil.saveBrandColor(getApplication(), account.getColor()); - SingleAccountHelper.setCurrentAccount(getApplication(), account.getAccountName()); + SingleAccountHelper.commitCurrentAccount(getApplication(), account.getAccountName()); final var currentAccount = this.currentAccount.getValue(); // If only ETag or colors change, we must not reset the navigation diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java index 194dcbc88..6caf4f223 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java @@ -72,7 +72,7 @@ public MultiSelectedActionModeCallback( this.fragmentManager = fragmentManager; final TypedValue typedValue = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); + context.getTheme().resolveAttribute(com.google.android.material.R.attr.colorAccent, typedValue, true); colorAccent = typedValue.data; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java index b625b0767..6cbc199d8 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java @@ -66,7 +66,7 @@ public void deleteAccount(@NonNull Account account, @NonNull Context context) { } public void selectAccount(@Nullable Account account, @NonNull Context context) { - SingleAccountHelper.setCurrentAccount(context, (account == null) ? null : account.getAccountName()); + SingleAccountHelper.commitCurrentAccount(context, (account == null) ? null : account.getAccountName()); } public void countUnsynchronizedNotes(long accountId, @NonNull IResponseCallback callback) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java index 4be0a493d..bd1ae4eb3 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java @@ -124,7 +124,7 @@ public synchronized void invalidateAPICache(@NonNull SingleSignOnAccount ssoAcco if (API_CACHE.containsKey(ssoAccount.name)) { final var nextcloudAPI = API_CACHE.get(ssoAccount.name); if (nextcloudAPI != null) { - nextcloudAPI.stop(); + nextcloudAPI.close(); } API_CACHE.remove(ssoAccount.name); } @@ -141,7 +141,7 @@ public synchronized void invalidateAPICache() { if (API_CACHE.containsKey(key)) { final var nextcloudAPI = API_CACHE.get(key); if (nextcloudAPI != null) { - nextcloudAPI.stop(); + nextcloudAPI.close(); } API_CACHE.remove(key); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java index 1ea2f7cbf..74589cbc0 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java @@ -187,7 +187,7 @@ public void onSuccess(Void result) { public void onError(@NonNull Throwable t) { Log.e(TAG, "… Error while importing " + account.getAccountName() + ": " + t.getMessage()); deleteAccount(account); - SingleAccountHelper.setCurrentAccount(context, null); + SingleAccountHelper.commitCurrentAccount(context, null); callback.onError(t); } }); @@ -195,7 +195,7 @@ public void onError(@NonNull Throwable t) { Log.e(TAG, "… Could not find " + SingleSignOnAccount.class.getSimpleName() + " for account name " + account.getAccountName()); importExecutor.submit(() -> { deleteAccount(account); - SingleAccountHelper.setCurrentAccount(context, null); + SingleAccountHelper.commitCurrentAccount(context, null); callback.onError(e); }); } @@ -203,7 +203,7 @@ public void onError(@NonNull Throwable t) { Log.e(TAG, "… No network connection available to import " + account.getAccountName()); importExecutor.submit(() -> { deleteAccount(account); - SingleAccountHelper.setCurrentAccount(context, null); + SingleAccountHelper.commitCurrentAccount(context, null); callback.onError(new NetworkErrorException()); }); } diff --git a/build.gradle b/build.gradle index 2d4c67a29..ef8ab2c5b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,18 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - kotlinVersion = '1.8.22' - commonsVersion = '1.8.2' + kotlinVersion = '1.9.22' + commonsVersion = '1.9.0' } repositories { mavenCentral() google() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' + classpath 'com.android.tools.build:gradle:8.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" // NOTE: Do not place your application dependencies here; they belong @@ -28,12 +30,7 @@ allprojects { } subprojects { - tasks.withType(Test) { + tasks.withType(Test).configureEach { maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 } - tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions { - jvmTarget = "11" - } - } } diff --git a/gradle.properties b/gradle.properties index 0d0f8dee7..4e8e44e95 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,3 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 +org.gradle.configuration-cache=true android.useAndroidX=true -org.gradle.jvmargs=-Xmx4096m -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661ee..15de90249 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From fc827d71b81c5cb4cacfa4ed39bbad3e0bd97e0c Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 20 Jan 2024 10:56:56 +0100 Subject: [PATCH 2/9] chore: Use enhanced switch and pattern variables Signed-off-by: Stefan Niedermann --- .../owncloud/notes/about/AboutActivity.java | 31 +++++---------- .../branding/BrandedSwitchPreference.java | 3 +- .../owncloud/notes/edit/EditNoteActivity.java | 15 ++------ .../notes/edit/category/CategoryAdapter.java | 15 ++++---- .../notes/exception/tips/TipsAdapter.java | 16 +++----- .../owncloud/notes/main/MainActivity.java | 38 +++++++------------ .../owncloud/notes/main/MainViewModel.java | 24 ++++-------- .../notes/main/items/ItemAdapter.java | 32 ++++++---------- .../notes/main/items/NoteViewHolder.java | 2 +- .../list/NotesListViewItemTouchHelper.java | 13 ++++--- .../notes/main/items/section/SectionItem.java | 8 ++-- .../notes/main/navigation/NavigationItem.java | 12 +++--- .../notes/persistence/NotesRepository.java | 29 +++++--------- .../persistence/NotesServerSyncTask.java | 12 +++--- .../notes/persistence/entity/Account.java | 16 ++++---- .../persistence/entity/CategoryOptions.java | 4 +- .../entity/CategoryWithNotesCount.java | 10 ++--- .../notes/persistence/entity/Note.java | 11 +++--- .../entity/NotesListWidgetData.java | 8 ++-- .../entity/SingleNoteWidgetData.java | 4 +- .../shared/model/NavigationCategory.java | 7 ++-- .../notes/widget/AbstractWidgetData.java | 4 +- .../notelist/NoteListWidgetFactory.java | 33 +++++++--------- 23 files changed, 132 insertions(+), 215 deletions(-) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java index 1a31d88ca..ed03bbeb9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java @@ -34,17 +34,10 @@ protected void onCreate(Bundle savedInstanceState) { binding.pager.setAdapter(new TabsStateAdapter(this)); // generate title based on given position new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> { - switch (position) { - default: // Fall-through to credits tab - case POS_CREDITS: - tab.setText(R.string.about_credits_tab_title); - break; - case POS_CONTRIB: - tab.setText(R.string.about_contribution_tab_title); - break; - case POS_LICENSE: - tab.setText(R.string.about_license_tab_title); - break; + switch (position) { // Fall-through to credits tab + default -> tab.setText(R.string.about_credits_tab_title); + case POS_CONTRIB -> tab.setText(R.string.about_contribution_tab_title); + case POS_LICENSE -> tab.setText(R.string.about_license_tab_title); } }).attach(); } @@ -74,17 +67,11 @@ public int getItemCount() { @NonNull @Override public Fragment createFragment(int position) { - switch (position) { - default: // Fall-through to credits tab - case POS_CREDITS: - return new AboutFragmentCreditsTab(); - - case POS_CONTRIB: - return new AboutFragmentContributingTab(); - - case POS_LICENSE: - return new AboutFragmentLicenseTab(); - } + return switch (position) { // Fall-through to credits tab + default -> new AboutFragmentCreditsTab(); + case POS_CONTRIB -> new AboutFragmentContributingTab(); + case POS_LICENSE -> new AboutFragmentLicenseTab(); + }; } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSwitchPreference.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSwitchPreference.java index 6536b164b..faea9ff4a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSwitchPreference.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSwitchPreference.java @@ -74,8 +74,7 @@ private Switch findSwitchWidget(View view) { if (view instanceof Switch) { return (Switch) view; } - if (view instanceof ViewGroup) { - final var viewGroup = (ViewGroup) view; + if (view instanceof ViewGroup viewGroup) { for (int i = 0; i < viewGroup.getChildCount(); i++) { final var child = viewGroup.getChildAt(i); if (child instanceof ViewGroup) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java index 2b49cc297..954311095 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java @@ -397,17 +397,10 @@ public void onNoteUpdated(Note note) { @Override public void changeMode(@NonNull Mode mode, boolean reloadNote) { switch (mode) { - case EDIT: - launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_edit), reloadNote); - break; - case PREVIEW: - launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_preview), reloadNote); - break; - case DIRECT_EDIT: - launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_direct_edit), reloadNote); - break; - default: - throw new IllegalStateException("Unknown mode: " + mode); + case EDIT -> launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_edit), reloadNote); + case PREVIEW -> launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_preview), reloadNote); + case DIRECT_EDIT -> launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_direct_edit), reloadNote); + default -> throw new IllegalStateException("Unknown mode: " + mode); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java index cae09cc02..c15c40195 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ItemCategoryBinding; @@ -50,20 +51,20 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi final var categoryViewHolder = (CategoryViewHolder) holder; switch (category.id) { - case addItemId: - final var wrapDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, category.icon)); + case addItemId -> { + final var wrapDrawable = DrawableCompat.wrap(Objects.requireNonNull(ContextCompat.getDrawable(context, category.icon))); DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(context, R.color.icon_color_default)); categoryViewHolder.getIcon().setImageDrawable(wrapDrawable); categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryAdded()); - break; - case clearItemId: + } + case clearItemId -> { categoryViewHolder.getIcon().setImageDrawable(ContextCompat.getDrawable(context, category.icon)); categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryCleared()); - break; - default: + } + default -> { categoryViewHolder.getIcon().setImageDrawable(ContextCompat.getDrawable(context, category.icon)); categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryChosen(category.label)); - break; + } } categoryViewHolder.getCategory().setText(NoteUtil.extendCategory(category.label)); if (category.count != null && category.count > 0) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java index 33de3e817..fb3eccf05 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/tips/TipsAdapter.java @@ -88,19 +88,13 @@ public void setThrowables(@NonNull List throwables) { } else if (throwable instanceof NextcloudHttpRequestFailedException) { final int statusCode = ((NextcloudHttpRequestFailedException) throwable).getStatusCode(); switch (statusCode) { - case 302: + case 302 -> { add(R.string.error_dialog_server_app_enabled); add(R.string.error_dialog_redirect); - break; - case 500: - add(R.string.error_dialog_check_server_logs); - break; - case 503: - add(R.string.error_dialog_check_maintenance); - break; - case 507: - add(R.string.error_dialog_insufficient_storage); - break; + } + case 500 -> add(R.string.error_dialog_check_server_logs); + case 503 -> add(R.string.error_dialog_check_maintenance); + case 507 -> add(R.string.error_dialog_insufficient_storage); } } else if (throwable instanceof UnknownErrorException) { if ("com.nextcloud.android.sso.QueryParam".equals(throwable.getMessage())) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 43e482a75..014019142 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -231,26 +231,21 @@ protected void onCreate(Bundle savedInstanceState) { fabCreate.show(); switch (selectedCategory.getType()) { - case RECENT: { + case RECENT -> { activityBinding.searchText.setText(getString(R.string.search_in_all)); - break; } - case FAVORITES: { + case FAVORITES -> { activityBinding.searchText.setText(getString(R.string.search_in_category, getString(R.string.label_favorites))); - break; } - case UNCATEGORIZED: { + case UNCATEGORIZED -> { activityBinding.searchText.setText(getString(R.string.search_in_category, getString(R.string.action_uncategorized))); - break; } - case DEFAULT_CATEGORY: - default: { + default -> { final String category = selectedCategory.getCategory(); if (category == null) { throw new IllegalStateException(NavigationCategory.class.getSimpleName() + " type is " + DEFAULT_CATEGORY + ", but category is null."); } activityBinding.searchText.setText(getString(R.string.search_in_category, NoteUtil.extendCategory(category))); - break; } } @@ -368,7 +363,7 @@ protected void onResume() { try { // It is possible that after the deletion of the last account, this onResponse gets called before the ImportAccountActivity gets started. if (SingleAccountHelper.getCurrentSingleSignOnAccount(this) != null) { - mainViewModel.synchronizeNotes(currentAccount, new IResponseCallback() { + mainViewModel.synchronizeNotes(currentAccount, new IResponseCallback<>() { @Override public void onSuccess(Void v) { Log.d(TAG, "Successfully synchronized notes for " + currentAccount.getAccountName()); @@ -505,7 +500,7 @@ public void onError(@NonNull Throwable t) { tracker = ItemSelectionTracker.build(listView, adapter); adapter.setTracker(tracker); - tracker.addObserver(new SelectionTracker.SelectionObserver() { + tracker.addObserver(new SelectionTracker.SelectionObserver<>() { @Override public void onSelectionChanged() { super.onSelectionChanged(); @@ -541,19 +536,16 @@ private void selectItem(NavigationItem item, boolean closeNavigation) { // update current selection if (item.type != null) { switch (item.type) { - case RECENT: { + case RECENT -> { mainViewModel.postSelectedCategory(new NavigationCategory(RECENT)); - break; } - case FAVORITES: { + case FAVORITES -> { mainViewModel.postSelectedCategory(new NavigationCategory(FAVORITES)); - break; } - case UNCATEGORIZED: { + case UNCATEGORIZED -> { mainViewModel.postSelectedCategory(new NavigationCategory(UNCATEGORIZED)); - break; } - default: { + default -> { if (item.getClass() == NavigationItem.CategoryNavigationItem.class) { mainViewModel.postSelectedCategory(new NavigationCategory(((NavigationItem.CategoryNavigationItem) item).accountId, ((NavigationItem.CategoryNavigationItem) item).category)); } else { @@ -670,20 +662,18 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { - case REQUEST_CODE_CREATE_NOTE: { + case REQUEST_CODE_CREATE_NOTE -> { listView.scrollToPosition(0); - break; } - case REQUEST_CODE_SERVER_SETTINGS: { + case REQUEST_CODE_SERVER_SETTINGS -> { // Recreate activity completely, because theme switching makes problems when only invalidating the views. // @see https://github.com/nextcloud/notes-android/issues/529 if (RESULT_OK == resultCode) { ActivityCompat.recreate(this); return; } - break; } - default: { + default -> { try { AccountImporter.onActivityResult(requestCode, resultCode, data, this, (ssoAccount) -> { CapabilitiesWorker.update(this); @@ -695,7 +685,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name); final var capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null, ApiProvider.getInstance()); final String displayName = CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount, ApiProvider.getInstance()); - final var status$ = mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback() { + final var status$ = mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback<>() { @Override public void onSuccess(Account result) { executor.submit(() -> { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index ec7254443..101a10b0d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -155,14 +155,10 @@ public void postSelectedCategory(@NonNull NavigationCategory selectedCategory) { // Close sub categories switch (selectedCategory.getType()) { - case RECENT: - case FAVORITES: - case UNCATEGORIZED: { + case RECENT, FAVORITES, UNCATEGORIZED -> { postExpandedCategory(null); - break; } - case DEFAULT_CATEGORY: - default: { + default -> { final String category = selectedCategory.getCategory(); if (category == null) { postExpandedCategory(null); @@ -175,7 +171,6 @@ public void postSelectedCategory(@NonNull NavigationCategory selectedCategory) { postExpandedCategory(null); } } - break; } } } @@ -230,29 +225,25 @@ public LiveData> getNotesListLiveData() { Log.v(TAG, "[getNotesListLiveData] - sortMethod: " + sortingMethod.second); final LiveData> fromDatabase; switch (selectedCategory.getType()) { - case RECENT: { + case RECENT -> { Log.v(TAG, "[getNotesListLiveData] - category: " + RECENT); fromDatabase = sortingMethod.second == SORT_MODIFIED_DESC ? repo.searchRecentByModified$(accountId, searchQueryOrWildcard) : repo.searchRecentLexicographically$(accountId, searchQueryOrWildcard); - break; } - case FAVORITES: { + case FAVORITES -> { Log.v(TAG, "[getNotesListLiveData] - category: " + FAVORITES); fromDatabase = sortingMethod.second == SORT_MODIFIED_DESC ? repo.searchFavoritesByModified$(accountId, searchQueryOrWildcard) : repo.searchFavoritesLexicographically$(accountId, searchQueryOrWildcard); - break; } - case UNCATEGORIZED: { + case UNCATEGORIZED -> { Log.v(TAG, "[getNotesListLiveData] - category: " + UNCATEGORIZED); fromDatabase = sortingMethod.second == SORT_MODIFIED_DESC ? repo.searchUncategorizedByModified$(accountId, searchQueryOrWildcard) : repo.searchUncategorizedLexicographically$(accountId, searchQueryOrWildcard); - break; } - case DEFAULT_CATEGORY: - default: { + default -> { final String category = selectedCategory.getCategory(); if (category == null) { throw new IllegalStateException(NavigationCategory.class.getSimpleName() + " type is " + DEFAULT_CATEGORY + ", but category is null."); @@ -261,7 +252,6 @@ public LiveData> getNotesListLiveData() { fromDatabase = sortingMethod.second == SORT_MODIFIED_DESC ? repo.searchCategoryByModified$(accountId, searchQueryOrWildcard, category) : repo.searchCategoryLexicographically$(accountId, searchQueryOrWildcard, category); - break; } } @@ -382,7 +372,7 @@ private static List fromCategoriesWithNotesCount(@NonNull Contex public void synchronizeCapabilitiesAndNotes(@NonNull Account localAccount, @NonNull IResponseCallback callback) { Log.i(TAG, "[synchronizeCapabilitiesAndNotes] Synchronize capabilities for " + localAccount.getAccountName()); - synchronizeCapabilities(localAccount, new IResponseCallback() { + synchronizeCapabilities(localAccount, new IResponseCallback<>() { @Override public void onSuccess(Void v) { Log.i(TAG, "[synchronizeCapabilitiesAndNotes] Synchronize notes for " + localAccount.getAccountName()); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java index 769240420..995d926b9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java @@ -98,33 +98,31 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); if (gridView) { switch (viewType) { - case TYPE_SECTION: { + case TYPE_SECTION -> { return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(inflater)); } - case TYPE_NOTE_ONLY_TITLE: { + case TYPE_NOTE_ONLY_TITLE -> { return new NoteViewGridHolderOnlyTitle(ItemNotesListNoteItemGridOnlyTitleBinding.inflate(inflater, parent, false), noteClickListener, monospace, fontSize); } - case TYPE_NOTE_WITH_EXCERPT: - case TYPE_NOTE_WITHOUT_EXCERPT: { + case TYPE_NOTE_WITH_EXCERPT, TYPE_NOTE_WITHOUT_EXCERPT -> { return new NoteViewGridHolder(ItemNotesListNoteItemGridBinding.inflate(inflater, parent, false), noteClickListener, monospace, fontSize); } - default: { + default -> { throw new IllegalArgumentException("Not supported viewType: " + viewType); } } } else { switch (viewType) { - case TYPE_SECTION: { + case TYPE_SECTION -> { return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(inflater)); } - case TYPE_NOTE_WITH_EXCERPT: { + case TYPE_NOTE_WITH_EXCERPT -> { return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(inflater, parent, false), noteClickListener); } - case TYPE_NOTE_ONLY_TITLE: - case TYPE_NOTE_WITHOUT_EXCERPT: { + case TYPE_NOTE_ONLY_TITLE, TYPE_NOTE_WITHOUT_EXCERPT -> { return new NoteViewHolderWithoutExcerpt(ItemNotesListNoteItemWithoutExcerptBinding.inflate(inflater, parent, false), noteClickListener); } - default: { + default -> { throw new IllegalArgumentException("Not supported viewType: " + viewType); } } @@ -144,16 +142,10 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int } } switch (getItemViewType(position)) { - case TYPE_SECTION: { - ((SectionViewHolder) holder).bind((SectionItem) itemList.get(position)); - break; - } - case TYPE_NOTE_WITH_EXCERPT: - case TYPE_NOTE_WITHOUT_EXCERPT: - case TYPE_NOTE_ONLY_TITLE: { - ((NoteViewHolder) holder).bind(isSelected, (Note) itemList.get(position), showCategory, color, searchQuery); - break; - } + case TYPE_SECTION -> + ((SectionViewHolder) holder).bind((SectionItem) itemList.get(position)); + case TYPE_NOTE_WITH_EXCERPT, TYPE_NOTE_WITHOUT_EXCERPT, TYPE_NOTE_ONLY_TITLE -> + ((NoteViewHolder) holder).bind(isSelected, (Note) itemList.get(position), showCategory, color, searchQuery); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java index cf92dc063..197593209 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java @@ -105,7 +105,7 @@ protected void bindSearchableContent(@NonNull Context context, @NonNull TextView public abstract View getNoteSwipeable(); public ItemDetailsLookup.ItemDetails getItemDetails() { - return new ItemDetailsLookup.ItemDetails() { + return new ItemDetailsLookup.ItemDetails<>() { @Override public int getPosition() { return getAdapterPosition(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java index bb93b7b70..fa7d46d3c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java @@ -71,7 +71,7 @@ public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerVie @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { switch (direction) { - case ItemTouchHelper.LEFT: + case ItemTouchHelper.LEFT -> { viewHolder.setIsRecyclable(false); final var dbNoteWithoutContent = (Note) adapter.getItem(viewHolder.getLayoutPosition()); final var dbNoteLiveData = mainViewModel.getFullNote$(dbNoteWithoutContent.getId()); @@ -92,15 +92,16 @@ public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) }) .show(); }); - break; - case ItemTouchHelper.RIGHT: + } + case ItemTouchHelper.RIGHT -> { viewHolder.setIsRecyclable(false); final var adapterNote = (Note) adapter.getItem(viewHolder.getLayoutPosition()); final var toggleLiveData = mainViewModel.toggleFavoriteAndSync(adapterNote.getId()); toggleLiveData.observe(lifecycleOwner, (next) -> toggleLiveData.removeObservers(lifecycleOwner)); - break; - default: - //NoOp + } + default -> { + } + //NoOp } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/section/SectionItem.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/section/SectionItem.java index 6f7ca1c79..38cdd2379 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/section/SectionItem.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/section/SectionItem.java @@ -2,6 +2,8 @@ import androidx.annotation.NonNull; +import java.util.Objects; + import it.niedermann.owncloud.notes.shared.model.Item; public class SectionItem implements Item { @@ -28,11 +30,9 @@ public boolean isSection() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof SectionItem)) return false; - - SectionItem that = (SectionItem) o; + if (!(o instanceof SectionItem that)) return false; - return title != null ? title.equals(that.title) : that.title == null; + return Objects.equals(title, that.title); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/navigation/NavigationItem.java b/app/src/main/java/it/niedermann/owncloud/notes/main/navigation/NavigationItem.java index c92f04945..793529556 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/navigation/NavigationItem.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/navigation/NavigationItem.java @@ -10,6 +10,8 @@ import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.UNCATEGORIZED; +import java.util.Objects; + public class NavigationItem { @NonNull public String id; @@ -52,11 +54,9 @@ public CategoryNavigationItem(@NonNull String id, @NonNull String label, @Nullab @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof CategoryNavigationItem)) return false; + if (!(o instanceof CategoryNavigationItem that)) return false; if (!super.equals(o)) return false; - CategoryNavigationItem that = (CategoryNavigationItem) o; - if (accountId != that.accountId) return false; return category.equals(that.category); } @@ -73,14 +73,12 @@ public int hashCode() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof NavigationItem)) return false; - - final var that = (NavigationItem) o; + if (!(o instanceof NavigationItem that)) return false; if (icon != that.icon) return false; if (!id.equals(that.id)) return false; if (!label.equals(that.label)) return false; - if (count != null ? !count.equals(that.count) : that.count != null) return false; + if (!Objects.equals(count, that.count)) return false; return type == that.type; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java index 74589cbc0..f69e16fce 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java @@ -653,20 +653,16 @@ public void modifyCategoryOrder(long accountId, @NonNull NavigationCategory sele int orderIndex = sortingMethod.getId(); switch (selectedCategory.getType()) { - case FAVORITES: { + case FAVORITES -> { sp.putInt(ctx.getString(R.string.action_sorting_method) + ' ' + ctx.getString(R.string.label_favorites), orderIndex); - break; } - case UNCATEGORIZED: { + case UNCATEGORIZED -> { sp.putInt(ctx.getString(R.string.action_sorting_method) + ' ' + ctx.getString(R.string.action_uncategorized), orderIndex); - break; } - case RECENT: { + case RECENT -> { sp.putInt(ctx.getString(R.string.action_sorting_method) + ' ' + ctx.getString(R.string.label_all_notes), orderIndex); - break; } - case DEFAULT_CATEGORY: - default: { + default -> { final String category = selectedCategory.getCategory(); if (category != null) { if (db.getCategoryOptionsDao().modifyCategoryOrder(accountId, category, sortingMethod) == 0) { @@ -680,7 +676,6 @@ public void modifyCategoryOrder(long accountId, @NonNull NavigationCategory sele } else { throw new IllegalStateException("Tried to modify category order for " + ENavigationCategoryType.DEFAULT_CATEGORY + "but category is null."); } - break; } } sp.apply(); @@ -707,20 +702,16 @@ public LiveData getCategoryOrder(@NonNull NavigationCateg switch (selectedCategory.getType()) { // TODO make this account specific - case RECENT: { + case RECENT -> { prefKey = context.getString(R.string.action_sorting_method) + ' ' + context.getString(R.string.label_all_notes); - break; } - case FAVORITES: { + case FAVORITES -> { prefKey = context.getString(R.string.action_sorting_method) + ' ' + context.getString(R.string.label_favorites); - break; } - case UNCATEGORIZED: { + case UNCATEGORIZED -> { prefKey = context.getString(R.string.action_sorting_method) + ' ' + context.getString(R.string.action_uncategorized); - break; } - case DEFAULT_CATEGORY: - default: { + default -> { final String category = selectedCategory.getCategory(); if (category != null) { return db.getCategoryOptionsDao().getCategoryOrder(selectedCategory.getAccountId(), category); @@ -814,9 +805,7 @@ public synchronized void scheduleSync(@Nullable Account account, boolean onlyLoc if (account == null) { Log.i(TAG, SingleSignOnAccount.class.getSimpleName() + " is null. Is this a local account?"); } else { - if (syncActive.get(account.getId()) == null) { - syncActive.put(account.getId(), false); - } + syncActive.putIfAbsent(account.getId(), false); Log.d(TAG, "Sync requested (" + (onlyLocalChanges ? "onlyLocalChanges" : "full") + "; " + (Boolean.TRUE.equals(syncActive.get(account.getId())) ? "sync active" : "sync NOT active") + ") ..."); if (isSyncPossible() && (!Boolean.TRUE.equals(syncActive.get(account.getId())) || onlyLocalChanges)) { syncActive.put(account.getId(), true); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java index f50dd21ef..1ecfdc925 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java @@ -118,7 +118,7 @@ private boolean pushLocalChanges() { try { Note remoteNote; switch (note.getStatus()) { - case LOCAL_EDITED: + case LOCAL_EDITED -> { Log.v(TAG, " ...create/edit"); if (note.getRemoteId() != null) { Log.v(TAG, " ...Note has remoteId → try to edit"); @@ -160,8 +160,8 @@ private boolean pushLocalChanges() { } // Please note, that db.updateNote() realized an optimistic conflict resolution, which is required for parallel changes of this Note from the UI. repo.updateIfNotModifiedLocallyDuringSync(note.getId(), remoteNote.getModified().getTimeInMillis(), remoteNote.getTitle(), remoteNote.getFavorite(), remoteNote.getETag(), remoteNote.getContent(), generateNoteExcerpt(remoteNote.getContent(), remoteNote.getTitle()), note.getContent(), note.getCategory(), note.getFavorite()); - break; - case LOCAL_DELETED: + } + case LOCAL_DELETED -> { if (note.getRemoteId() == null) { Log.v(TAG, " ...delete (only local, since it has never been synchronized)"); } else { @@ -177,9 +177,9 @@ private boolean pushLocalChanges() { } // Please note, that db.deleteNote() realizes an optimistic conflict resolution, which is required for parallel changes of this Note from the UI. repo.deleteByNoteId(note.getId(), LOCAL_DELETED); - break; - default: - throw new IllegalStateException("Unknown State of Note " + note + ": " + note.getStatus()); + } + default -> + throw new IllegalStateException("Unknown State of Note " + note + ": " + note.getStatus()); } } catch (NextcloudHttpRequestFailedException e) { if (e.getStatusCode() == HTTP_NOT_MODIFIED) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java index 05b957f0f..04f55738e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java @@ -12,6 +12,7 @@ import java.io.Serializable; import java.util.Calendar; +import java.util.Objects; import it.niedermann.owncloud.notes.shared.model.Capabilities; @@ -180,9 +181,7 @@ public void setDirectEditingAvailable(boolean directEditingAvailable) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Account)) return false; - - Account account = (Account) o; + if (!(o instanceof Account account)) return false; if (id != account.id) return false; if (color != account.color) return false; @@ -190,15 +189,14 @@ public boolean equals(Object o) { if (!url.equals(account.url)) return false; if (!userName.equals(account.userName)) return false; if (!accountName.equals(account.accountName)) return false; - if (eTag != null ? !eTag.equals(account.eTag) : account.eTag != null) return false; - if (modified != null ? !modified.equals(account.modified) : account.modified != null) + if (!Objects.equals(eTag, account.eTag)) return false; + if (!Objects.equals(modified, account.modified)) return false; - if (apiVersion != null ? !apiVersion.equals(account.apiVersion) : account.apiVersion != null) + if (!Objects.equals(apiVersion, account.apiVersion)) return false; - if (capabilitiesETag != null ? !capabilitiesETag.equals(account.capabilitiesETag) : account.capabilitiesETag != null) + if (!Objects.equals(capabilitiesETag, account.capabilitiesETag)) return false; - if (directEditingAvailable != account.directEditingAvailable) return false; - return true; + return directEditingAvailable == account.directEditingAvailable; } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryOptions.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryOptions.java index da37ee311..35328ca8f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryOptions.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryOptions.java @@ -74,9 +74,7 @@ public void setSortingMethod(@Nullable CategorySortingMethod sortingMethod) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof CategoryOptions)) return false; - - CategoryOptions that = (CategoryOptions) o; + if (!(o instanceof CategoryOptions that)) return false; if (accountId != that.accountId) return false; if (!category.equals(that.category)) return false; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryWithNotesCount.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryWithNotesCount.java index 2eb71eb6e..139ce5c1c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryWithNotesCount.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/CategoryWithNotesCount.java @@ -2,6 +2,8 @@ import androidx.room.Ignore; +import java.util.Objects; + public class CategoryWithNotesCount { private long accountId; @@ -46,14 +48,12 @@ public void setCategory(String category) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof CategoryWithNotesCount)) return false; - - CategoryWithNotesCount that = (CategoryWithNotesCount) o; + if (!(o instanceof CategoryWithNotesCount that)) return false; if (accountId != that.accountId) return false; - if (category != null ? !category.equals(that.category) : that.category != null) + if (!Objects.equals(category, that.category)) return false; - return totalNotes != null ? totalNotes.equals(that.totalNotes) : that.totalNotes == null; + return Objects.equals(totalNotes, that.totalNotes); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Note.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Note.java index e0d0325c6..511327208 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Note.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Note.java @@ -14,6 +14,7 @@ import java.io.Serializable; import java.util.Calendar; +import java.util.Objects; import it.niedermann.owncloud.notes.shared.model.DBStatus; import it.niedermann.owncloud.notes.shared.model.Item; @@ -218,23 +219,21 @@ public void setScrollY(int scrollY) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Note)) return false; - - Note note = (Note) o; + if (!(o instanceof Note note)) return false; if (id != note.id) return false; if (accountId != note.accountId) return false; if (favorite != note.favorite) return false; if (scrollY != note.scrollY) return false; - if (remoteId != null ? !remoteId.equals(note.remoteId) : note.remoteId != null) + if (!Objects.equals(remoteId, note.remoteId)) return false; if (status != note.status) return false; if (!title.equals(note.title)) return false; if (!category.equals(note.category)) return false; - if (modified != null ? !modified.equals(note.modified) : note.modified != null) + if (!Objects.equals(modified, note.modified)) return false; if (!content.equals(note.content)) return false; - if (eTag != null ? !eTag.equals(note.eTag) : note.eTag != null) return false; + if (!Objects.equals(eTag, note.eTag)) return false; return excerpt.equals(note.excerpt); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NotesListWidgetData.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NotesListWidgetData.java index da784d1dc..ff319869e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NotesListWidgetData.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NotesListWidgetData.java @@ -8,6 +8,8 @@ import androidx.room.Ignore; import androidx.room.Index; +import java.util.Objects; + import it.niedermann.owncloud.notes.widget.AbstractWidgetData; @Entity( @@ -61,13 +63,11 @@ public int getMode() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof NotesListWidgetData)) return false; + if (!(o instanceof NotesListWidgetData that)) return false; if (!super.equals(o)) return false; - NotesListWidgetData that = (NotesListWidgetData) o; - if (mode != that.mode) return false; - return category != null ? category.equals(that.category) : that.category == null; + return Objects.equals(category, that.category); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/SingleNoteWidgetData.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/SingleNoteWidgetData.java index 3e726242b..753d1ed8c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/SingleNoteWidgetData.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/SingleNoteWidgetData.java @@ -51,9 +51,7 @@ public void setNoteId(long noteId) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof SingleNoteWidgetData)) return false; - - SingleNoteWidgetData that = (SingleNoteWidgetData) o; + if (!(o instanceof SingleNoteWidgetData that)) return false; return noteId == that.noteId; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/NavigationCategory.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/NavigationCategory.java index 52a3a1172..8d15a0d16 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/NavigationCategory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/NavigationCategory.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; import java.io.Serializable; +import java.util.Objects; import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.DEFAULT_CATEGORY; @@ -47,13 +48,11 @@ public String getCategory() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof NavigationCategory)) return false; - - NavigationCategory that = (NavigationCategory) o; + if (!(o instanceof NavigationCategory that)) return false; if (accountId != that.accountId) return false; if (type != that.type) return false; - return category != null ? category.equals(that.category) : that.category == null; + return Objects.equals(category, that.category); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/AbstractWidgetData.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/AbstractWidgetData.java index f561f638c..002cea65f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/AbstractWidgetData.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/AbstractWidgetData.java @@ -49,9 +49,7 @@ public void setThemeMode(@IntRange(from = 0, to = 2) int themeMode) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof AbstractWidgetData)) return false; - - AbstractWidgetData that = (AbstractWidgetData) o; + if (!(o instanceof AbstractWidgetData that)) return false; if (id != that.id) return false; if (accountId != that.accountId) return false; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java index 94548e982..7ef9e19ab 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java @@ -60,20 +60,17 @@ public void onDataSetChanged() { data = repo.getNoteListWidgetData(appWidgetId); Log.v(TAG, "--- data - " + data); switch (data.getMode()) { - case MODE_DISPLAY_ALL: - dbNotes.addAll(repo.searchRecentByModified(data.getAccountId(), "%")); - break; - case MODE_DISPLAY_STARRED: - dbNotes.addAll(repo.searchFavoritesByModified(data.getAccountId(), "%")); - break; - case MODE_DISPLAY_CATEGORY: - default: + case MODE_DISPLAY_ALL -> + dbNotes.addAll(repo.searchRecentByModified(data.getAccountId(), "%")); + case MODE_DISPLAY_STARRED -> + dbNotes.addAll(repo.searchFavoritesByModified(data.getAccountId(), "%")); + default -> { if (data.getCategory() != null) { dbNotes.addAll(repo.searchCategoryByModified(data.getAccountId(), "%", data.getCategory())); } else { dbNotes.addAll(repo.searchUncategorizedByModified(data.getAccountId(), "%")); } - break; + } } } catch (IllegalArgumentException e) { e.printStackTrace(); @@ -144,17 +141,13 @@ public RemoteViews getViewAt(int position) { @NonNull private static String getCategoryTitle(@NonNull Context context, int displayMode, String category) { - switch (displayMode) { - case MODE_DISPLAY_STARRED: - return context.getString(R.string.label_favorites); - case MODE_DISPLAY_CATEGORY: - return "".equals(category) - ? context.getString(R.string.action_uncategorized) - : category; - case MODE_DISPLAY_ALL: - default: - return context.getString(R.string.app_name); - } + return switch (displayMode) { + case MODE_DISPLAY_STARRED -> context.getString(R.string.label_favorites); + case MODE_DISPLAY_CATEGORY -> "".equals(category) + ? context.getString(R.string.action_uncategorized) + : category; + default -> context.getString(R.string.app_name); + }; } @Override From beaf01442fafef1bb5b95fa8c14ed7a8eb64bf6d Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 20 Jan 2024 11:19:10 +0100 Subject: [PATCH 3/9] fix(lint): Fix 80 character line issues Signed-off-by: Stefan Niedermann --- .../niedermann/owncloud/notes/about/AboutActivity.java | 9 ++++++--- .../owncloud/notes/branding/BrandedActivity.java | 4 ++-- .../notes/edit/SearchableBaseNoteFragment.java | 6 ++++-- .../owncloud/notes/edit/category/CategoryAdapter.java | 4 +++- .../owncloud/notes/main/items/ItemAdapter.java | 4 +++- .../notes/widget/notelist/NoteListWidgetFactory.java | 10 ++++++---- 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java index ed03bbeb9..f7d636675 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java @@ -35,9 +35,12 @@ protected void onCreate(Bundle savedInstanceState) { // generate title based on given position new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> { switch (position) { // Fall-through to credits tab - default -> tab.setText(R.string.about_credits_tab_title); - case POS_CONTRIB -> tab.setText(R.string.about_contribution_tab_title); - case POS_LICENSE -> tab.setText(R.string.about_license_tab_title); + default -> + tab.setText(R.string.about_credits_tab_title); + case POS_CONTRIB -> + tab.setText(R.string.about_contribution_tab_title); + case POS_LICENSE -> + tab.setText(R.string.about_license_tab_title); } }).attach(); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java index a3f55c24b..634291796 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedActivity.java @@ -8,7 +8,7 @@ import androidx.annotation.ColorInt; import androidx.appcompat.app.AppCompatActivity; -import it.niedermann.owncloud.notes.R; +import com.google.android.material.R; public abstract class BrandedActivity extends AppCompatActivity implements Branded { @@ -20,7 +20,7 @@ protected void onStart() { super.onStart(); final var typedValue = new TypedValue(); - getTheme().resolveAttribute(com.google.android.material.R.attr.colorAccent, typedValue, true); + getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); colorAccent = typedValue.data; readBrandMainColorLiveData(this).observe(this, this::applyBrand); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java index 1ca1c5f57..9316157df 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java @@ -14,6 +14,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.SearchView; +import androidx.core.content.ContextCompat; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -47,7 +48,7 @@ public abstract class SearchableBaseNoteFragment extends BaseNoteFragment { @Override public void onStart() { - this.color = getResources().getColor(R.color.defaultBrand); + this.color = ContextCompat.getColor(requireContext(), R.color.defaultBrand); super.onStart(); } @@ -117,7 +118,8 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { searchMenuItem.collapseActionView(); - final var searchEditFrame = searchView.findViewById(androidx.appcompat.R.id.search_edit_frame); + final var searchEditFrame = searchView.findViewById( + androidx.appcompat.R.id.search_edit_frame); searchEditFrame.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { int oldVisibility = -1; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java index c15c40195..0208205bc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java @@ -52,7 +52,9 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi switch (category.id) { case addItemId -> { - final var wrapDrawable = DrawableCompat.wrap(Objects.requireNonNull(ContextCompat.getDrawable(context, category.icon))); + final var wrapDrawable = DrawableCompat.wrap( + Objects.requireNonNull(ContextCompat.getDrawable( + context, category.icon))); DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(context, R.color.icon_color_default)); categoryViewHolder.getIcon().setImageDrawable(wrapDrawable); categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryAdded()); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java index 995d926b9..6f8ac2a8a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/ItemAdapter.java @@ -144,7 +144,9 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int switch (getItemViewType(position)) { case TYPE_SECTION -> ((SectionViewHolder) holder).bind((SectionItem) itemList.get(position)); - case TYPE_NOTE_WITH_EXCERPT, TYPE_NOTE_WITHOUT_EXCERPT, TYPE_NOTE_ONLY_TITLE -> + case TYPE_NOTE_WITH_EXCERPT, + TYPE_NOTE_WITHOUT_EXCERPT, + TYPE_NOTE_ONLY_TITLE -> ((NoteViewHolder) holder).bind(isSelected, (Note) itemList.get(position), showCategory, color, searchQuery); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java index 7ef9e19ab..d24d6d27e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java @@ -142,10 +142,12 @@ public RemoteViews getViewAt(int position) { @NonNull private static String getCategoryTitle(@NonNull Context context, int displayMode, String category) { return switch (displayMode) { - case MODE_DISPLAY_STARRED -> context.getString(R.string.label_favorites); - case MODE_DISPLAY_CATEGORY -> "".equals(category) - ? context.getString(R.string.action_uncategorized) - : category; + case MODE_DISPLAY_STARRED -> + context.getString(R.string.label_favorites); + case MODE_DISPLAY_CATEGORY -> + "".equals(category) + ? context.getString(R.string.action_uncategorized) + : category; default -> context.getString(R.string.app_name); }; } From 8efa364745915556de72dcea8797c369b51fc176 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 20 Jan 2024 11:26:36 +0100 Subject: [PATCH 4/9] fix(lint): Fix remaining 80 character line issue Signed-off-by: Stefan Niedermann --- .../owncloud/notes/edit/SearchableBaseNoteFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java index 9316157df..f1e86980a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/SearchableBaseNoteFragment.java @@ -48,7 +48,8 @@ public abstract class SearchableBaseNoteFragment extends BaseNoteFragment { @Override public void onStart() { - this.color = ContextCompat.getColor(requireContext(), R.color.defaultBrand); + this.color = ContextCompat.getColor( + requireContext(), R.color.defaultBrand); super.onStart(); } From 189f54fcd0833105fc277757ba366f4da0bd9dea Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 20 Jan 2024 12:07:34 +0100 Subject: [PATCH 5/9] chore(deps): Use Gradle 8.5 and target Robolectric to API 34 Signed-off-by: Stefan Niedermann --- app/src/test/resources/robolectric.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/test/resources/robolectric.properties b/app/src/test/resources/robolectric.properties index e23ee50f1..19571b586 100644 --- a/app/src/test/resources/robolectric.properties +++ b/app/src/test/resources/robolectric.properties @@ -1 +1 @@ -sdk=24, 30 \ No newline at end of file +sdk=24, 34 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 15de90249..a59520664 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 42d56e470f652bde1853cb256b0a643ba73c4263 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sun, 21 Jan 2024 09:51:23 +0100 Subject: [PATCH 6/9] chore(deps): Update dependencies and fix API changes Signed-off-by: Stefan Niedermann --- app/build.gradle | 2 +- .../owncloud/notes/branding/NotesViewThemeUtils.java | 4 ++-- .../owncloud/notes/exception/ExceptionActivity.java | 4 ++-- .../owncloud/notes/exception/ExceptionDialogFragment.java | 4 ++-- .../java/it/niedermann/owncloud/notes/main/MainActivity.java | 2 +- .../owncloud/notes/persistence/migration/Migration_20_21.java | 4 ++-- .../notes/persistence/sync/CapabilitiesDeserializer.java | 4 ++-- .../niedermann/owncloud/notes/shared/util/NotesColorUtil.java | 4 ++-- build.gradle | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5cfa0091d..a32873bb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,7 +84,7 @@ dependencies { // Nextcloud SSO implementation 'com.github.nextcloud.android-common:ui:0.13.0' implementation 'com.github.nextcloud:Android-SingleSignOn:1.0.0' - implementation 'com.github.stefan-niedermann:android-commons:0.4.0' + implementation 'com.github.stefan-niedermann:android-commons:1.0.0' implementation "com.github.stefan-niedermann.nextcloud-commons:sso-glide:$commonsVersion" implementation "com.github.stefan-niedermann.nextcloud-commons:exception:$commonsVersion" implementation("com.github.stefan-niedermann.nextcloud-commons:markdown:$commonsVersion") { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/NotesViewThemeUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/NotesViewThemeUtils.java index d3970b338..909a4c850 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/branding/NotesViewThemeUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/NotesViewThemeUtils.java @@ -125,7 +125,7 @@ public int getTextHighlightBackgroundColor(@NonNull Context context, @ColorInt int colorPrimary, @ColorInt int colorAccent) { if (isDarkMode(context)) { // Dark background - if (ColorUtil.INSTANCE.isColorDark(mainColor)) { // Dark brand color + if (ColorUtil.isColorDark(mainColor)) { // Dark brand color if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorPrimary)) { // But also dark text return mainColor; } else { @@ -139,7 +139,7 @@ public int getTextHighlightBackgroundColor(@NonNull Context context, } } } else { // Light background - if (ColorUtil.INSTANCE.isColorDark(mainColor)) { // Dark brand color + if (ColorUtil.isColorDark(mainColor)) { // Dark brand color if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorAccent)) { // But also dark text return Color.argb(77, Color.red(mainColor), Color.green(mainColor), Color.blue(mainColor)); } else { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java index 0761b6036..68aa1d30d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java @@ -38,14 +38,14 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } final var adapter = new TipsAdapter(this::startActivity); - final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(this, throwable, BuildConfig.FLAVOR); + final String debugInfos = ExceptionUtil.getDebugInfos(this, throwable, BuildConfig.FLAVOR); binding.tips.setAdapter(adapter); binding.tips.setNestedScrollingEnabled(false); binding.toolbar.setTitle(getString(R.string.simple_error)); binding.message.setText(throwable.getMessage()); binding.stacktrace.setText(debugInfos); - binding.copy.setOnClickListener((v) -> ClipboardUtil.INSTANCE.copyToClipboard(this, getString(R.string.simple_exception), "```\n" + debugInfos + "\n```")); + binding.copy.setOnClickListener((v) -> ClipboardUtil.copyToClipboard(this, getString(R.string.simple_exception), "```\n" + debugInfos + "\n```")); binding.close.setOnClickListener((v) -> finish()); adapter.setThrowables(Collections.singletonList(throwable)); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java index ca242a7fd..dc0b003bd 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java @@ -57,7 +57,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { final var adapter = new TipsAdapter((actionIntent) -> requireActivity().startActivity(actionIntent)); - final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(requireContext(), throwables, BuildConfig.FLAVOR); + final String debugInfos = ExceptionUtil.getDebugInfos(requireContext(), throwables, BuildConfig.FLAVOR); binding.tips.setAdapter(adapter); binding.stacktrace.setText(debugInfos); @@ -67,7 +67,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { return new MaterialAlertDialogBuilder(requireActivity()) .setView(binding.getRoot()) .setTitle(R.string.error_dialog_title) - .setPositiveButton(android.R.string.copy, (a, b) -> ClipboardUtil.INSTANCE.copyToClipboard(requireContext(), getString(R.string.simple_exception), "```\n" + debugInfos + "\n```")) + .setPositiveButton(android.R.string.copy, (a, b) -> ClipboardUtil.copyToClipboard(requireContext(), getString(R.string.simple_exception), "```\n" + debugInfos + "\n```")) .setNegativeButton(R.string.simple_close, null) .create(); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 014019142..21c9058d9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -595,7 +595,7 @@ public void applyBrand(int color) { util.notes.themeToolbarSearchView(binding.activityNotesListView.searchView); binding.headerView.setBackgroundColor(color); - @ColorInt final int headerTextColor = ColorUtil.INSTANCE.getForegroundColorForBackgroundColor(color); + @ColorInt final int headerTextColor = ColorUtil.getForegroundColorForBackgroundColor(color); binding.appName.setTextColor(headerTextColor); DrawableCompat.setTint(binding.logo.getDrawable(), headerTextColor); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_20_21.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_20_21.java index 32ede8b1b..db681f1b3 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_20_21.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_20_21.java @@ -113,13 +113,13 @@ private static void migrateAccounts(@NonNull SupportSQLiteDatabase db) { values.put("MODIFIED", cursor.getLong(COLUMN_POSITION_MODIFIED) * 1_000); values.put("APIVERSION", cursor.getString(COLUMN_POSITION_API_VERSION)); try { - values.put("COLOR", Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(cursor.getString(COLUMN_POSITION_COLOR)))); + values.put("COLOR", Color.parseColor(ColorUtil.formatColorToParsableHexString(cursor.getString(COLUMN_POSITION_COLOR)))); } catch (Exception e) { e.printStackTrace(); values.put("COLOR", -16743735); } try { - values.put("TEXTCOLOR", Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(cursor.getString(COLUMN_POSITION_TEXT_COLOR)))); + values.put("TEXTCOLOR", Color.parseColor(ColorUtil.formatColorToParsableHexString(cursor.getString(COLUMN_POSITION_TEXT_COLOR)))); } catch (Exception e) { e.printStackTrace(); values.put("TEXTCOLOR", -16777216); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/CapabilitiesDeserializer.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/CapabilitiesDeserializer.java index e3b268ab7..3d422c50e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/CapabilitiesDeserializer.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/CapabilitiesDeserializer.java @@ -51,14 +51,14 @@ public Capabilities deserialize(JsonElement json, Type typeOfT, JsonDeserializat final var theming = capabilities.getAsJsonObject(CAPABILITIES_THEMING); if (theming.has(CAPABILITIES_THEMING_COLOR)) { try { - response.setColor(Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(theming.get(CAPABILITIES_THEMING_COLOR).getAsString()))); + response.setColor(Color.parseColor(ColorUtil.formatColorToParsableHexString(theming.get(CAPABILITIES_THEMING_COLOR).getAsString()))); } catch (Exception e) { e.printStackTrace(); } } if (theming.has(CAPABILITIES_THEMING_COLOR_TEXT)) { try { - response.setTextColor(Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(theming.get(CAPABILITIES_THEMING_COLOR_TEXT).getAsString()))); + response.setTextColor(Color.parseColor(ColorUtil.formatColorToParsableHexString(theming.get(CAPABILITIES_THEMING_COLOR_TEXT).getAsString()))); } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java index 70c5316e9..46bc4a18f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java @@ -21,7 +21,7 @@ public static boolean contrastRatioIsSufficient(@ColorInt int colorOne, @ColorIn final var key = new ColorPair(colorOne, colorTwo); Boolean ret = CONTRAST_RATIO_SUFFICIENT_CACHE.get(key); if (ret == null) { - ret = ColorUtil.INSTANCE.getContrastRatio(colorOne, colorTwo) > 3d; + ret = ColorUtil.getContrastRatio(colorOne, colorTwo) > 3d; CONTRAST_RATIO_SUFFICIENT_CACHE.put(key, ret); return ret; } @@ -32,7 +32,7 @@ public static boolean contrastRatioIsSufficientBigAreas(@ColorInt int colorOne, final var key = new ColorPair(colorOne, colorTwo); var ret = CONTRAST_RATIO_SUFFICIENT_CACHE.get(key); if (ret == null) { - ret = ColorUtil.INSTANCE.getContrastRatio(colorOne, colorTwo) > 1.47d; + ret = ColorUtil.getContrastRatio(colorOne, colorTwo) > 1.47d; CONTRAST_RATIO_SUFFICIENT_CACHE.put(key, ret); return ret; } diff --git a/build.gradle b/build.gradle index ef8ab2c5b..e8d669adf 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { ext { kotlinVersion = '1.9.22' - commonsVersion = '1.9.0' + commonsVersion = '2.0.0' } repositories { mavenCentral() From 0318c972c6e1f7994f6e2b0b8889e041dafd3311 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sun, 21 Jan 2024 10:24:12 +0100 Subject: [PATCH 7/9] chore(deps): Update dependencies Signed-off-by: Stefan Niedermann --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e8d669adf..89fb5714c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { ext { kotlinVersion = '1.9.22' - commonsVersion = '2.0.0' + commonsVersion = '2.0.1' } repositories { mavenCentral() From e63eca94ff2e67fed9a8d833645dbf7d079d351d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sun, 21 Jan 2024 15:43:50 +0100 Subject: [PATCH 8/9] flavorDimensions upgrade: now a list not a string Signed-off-by: Andy Scherzinger --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a32873bb2..d80b1edcc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,7 @@ android { } - flavorDimensions "version" + flavorDimensions = ["version"] productFlavors { fdroid { From adf1a21afba16c84761614042eb2d1f91ee19098 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sun, 21 Jan 2024 15:49:05 +0100 Subject: [PATCH 9/9] bump mockito from 5.7.0 to 5.9.0 Signed-off-by: Andy Scherzinger --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d80b1edcc..b291580d5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ dependencies { testImplementation 'androidx.test:core:1.5.0' testImplementation 'androidx.arch.core:core-testing:2.2.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-core:5.7.0' + testImplementation 'org.mockito:mockito-core:5.9.0' testImplementation 'org.robolectric:robolectric:4.11.1' implementation fileTree(dir: 'libs', include: ['*.jar'])