From 6acc998ef45ddd6762eadb1447989854d30ef7fc Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 11:34:28 +0530 Subject: [PATCH 01/12] Remove Git-based versionCode generation - Version 7000 is taken from last updated prebuilt repo apk --- build.gradle | 11 ----------- gradle.properties | 1 - opentasks/build.gradle | 18 +----------------- 3 files changed, 1 insertion(+), 29 deletions(-) diff --git a/build.gradle b/build.gradle index 6701d089..cf7ff4d5 100644 --- a/build.gradle +++ b/build.gradle @@ -11,18 +11,7 @@ buildscript { } } -def gitVersion = { -> - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'describe', '--tags', '--always', '--dirty' - standardOutput = stdout - } - return stdout.toString().trim() -} - allprojects { - version gitVersion() - repositories { google() jcenter() diff --git a/gradle.properties b/gradle.properties index e32164be..96d31509 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,5 @@ COMPILE_SDK_VERSION=29 MIN_SDK_VERSION=21 TARGET_SDK_VERSION=29 -VERSION_OVERRIDE=0 android.enableJetifier=true android.useAndroidX=true diff --git a/opentasks/build.gradle b/opentasks/build.gradle index 22010700..63d0c732 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -2,21 +2,6 @@ apply plugin: 'com.android.application' if (project.hasProperty('PLAY_STORE_SERVICE_ACCOUNT_CREDENTIALS')) { apply plugin: 'com.github.triplet.play' } -// commit number is only relevant to the application project -def gitCommitNo = { ref -> - def stdout = new ByteArrayOutputStream() - try { - exec { - commandLine 'git', 'rev-list', '--count', ref - standardOutput = stdout - } - - return Integer.parseInt(stdout.toString().trim()) - } - catch (Exception e) { - return 0 - } -} android { compileSdkVersion COMPILE_SDK_VERSION.toInteger() @@ -24,8 +9,7 @@ android { applicationId "foundation.e.tasks" minSdkVersion MIN_SDK_VERSION.toInteger() targetSdkVersion TARGET_SDK_VERSION.toInteger() - // spread version code to allow inserting versions if necessary - versionCode gitCommitNo('refs/remotes/origin/master') * 99 + gitCommitNo('HEAD') + Integer.parseInt(VERSION_OVERRIDE) + versionCode 7000 versionName '1.4.2' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" -- GitLab From ad07503b8d4237fa023887adac965c6827c68963 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 11:35:32 +0530 Subject: [PATCH 02/12] Remove custom keystore configuration --- opentasks/build.gradle | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/opentasks/build.gradle b/opentasks/build.gradle index 63d0c732..3100aa42 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -16,21 +16,8 @@ android { vectorDrawables.useSupportLibrary = true } - if (project.hasProperty("DMFS_RELEASE_KEYSTORE")) { - signingConfigs { - release { - storeFile file(DMFS_RELEASE_KEYSTORE) - storePassword DMFS_RELEASE_KEYSTORE_PASSWORD - keyAlias DMFS_RELEASE_KEY_ALIAS - keyPassword DMFS_RELEASE_KEY_PASSWORD - } - } - } buildTypes { release { - if (project.hasProperty("DMFS_RELEASE_KEYSTORE")) { - signingConfig signingConfigs.release - } minifyEnabled true proguardFiles 'proguard.cfg' } -- GitLab From 5e37b9b0e5fdbaf13cd3fce0caa7687c22471db5 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 11:35:45 +0530 Subject: [PATCH 03/12] Remove OpenTasks API-related configuration --- opentasks/build.gradle | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/opentasks/build.gradle b/opentasks/build.gradle index 3100aa42..aaba8db9 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -100,21 +100,3 @@ if (project.hasProperty('PLAY_STORE_SERVICE_ACCOUNT_CREDENTIALS')) { } } } - -task postVersion { - doLast { - if (project.hasProperty('OPENTASKS_API_KEY')) { - // publish version number on api.opentasks.app - ((HttpURLConnection) new URL('https://opentasks-app.appspot.com/v1/app/latest_version/').openConnection()).with({ - requestMethod = 'POST' - doOutput = true - setRequestProperty('Content-Type', 'application/x-www-form-urlencoded') - setRequestProperty('Authorization', "Token token=\"${OPENTASKS_API_KEY}\"") - outputStream.withPrintWriter({ printWriter -> - printWriter.write("version_code=${project.android.defaultConfig.versionCode}&version_name=${project.android.defaultConfig.versionName}") - }) - content - }) - } - } -} -- GitLab From 10d35b4480151f7f2e08467ebc16a2154cc9eab5 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 11:36:31 +0530 Subject: [PATCH 04/12] Remove Play Store publishing configuration --- build.gradle | 1 - opentasks/build.gradle | 26 -------------------------- 2 files changed, 27 deletions(-) diff --git a/build.gradle b/build.gradle index cf7ff4d5..c1fc2f7d 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.1.2' - classpath("com.github.triplet.gradle:play-publisher:2.8.1") } } diff --git a/opentasks/build.gradle b/opentasks/build.gradle index aaba8db9..2cf3cd65 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'com.android.application' -if (project.hasProperty('PLAY_STORE_SERVICE_ACCOUNT_CREDENTIALS')) { - apply plugin: 'com.github.triplet.play' -} android { compileSdkVersion COMPILE_SDK_VERSION.toInteger() @@ -77,26 +74,3 @@ dependencies { implementation 'androidx.preference:preference:1.1.1' implementation 'com.maltaisn:recurpicker:2.1.4' } - -if (project.hasProperty('PLAY_STORE_SERVICE_ACCOUNT_CREDENTIALS')) { - play { - serviceAccountCredentials = file(PLAY_STORE_SERVICE_ACCOUNT_CREDENTIALS) - // the track is determined automatically by the version number format - switch (version) { - case ~/^(\d+)(\.\d+)*(-\d+-[\w\d]+)?-dirty$/: - // work in progress goes to the internal track - track = "internal" - break - case ~/^(\d+)(\.\d+)*-\d+-[\w\d]+$/: - // untagged commits go to alpha - track = "alpha" - break - case ~/^(\d+)(\.\d+)*$/: - // tagged commits to go beta, from where they get promoted to releases - track = "beta" - break - default: - throw new IllegalArgumentException("Unrecognized version format") - } - } -} -- GitLab From b5affca02c6bed065f94fcf8ddad4d9fbad50e8f Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 11:38:09 +0530 Subject: [PATCH 05/12] Remove shared/common SDK version definitions --- gradle.properties | 3 --- opentasks-contract/build.gradle | 6 +++--- opentasks-provider/build.gradle | 6 +++--- opentasks-theme/build.gradle | 6 +++--- opentasks/build.gradle | 6 +++--- opentaskspal/build.gradle | 6 +++--- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/gradle.properties b/gradle.properties index 96d31509..dbb7bf70 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,2 @@ -COMPILE_SDK_VERSION=29 -MIN_SDK_VERSION=21 -TARGET_SDK_VERSION=29 android.enableJetifier=true android.useAndroidX=true diff --git a/opentasks-contract/build.gradle b/opentasks-contract/build.gradle index 674316aa..821932f3 100644 --- a/opentasks-contract/build.gradle +++ b/opentasks-contract/build.gradle @@ -1,11 +1,11 @@ apply plugin: 'com.android.library' android { - compileSdkVersion COMPILE_SDK_VERSION.toInteger() + compileSdkVersion 29 defaultConfig { - minSdkVersion MIN_SDK_VERSION.toInteger() - targetSdkVersion TARGET_SDK_VERSION.toInteger() + minSdkVersion 21 + targetSdkVersion 29 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/opentasks-provider/build.gradle b/opentasks-provider/build.gradle index 21857c95..c578a2db 100644 --- a/opentasks-provider/build.gradle +++ b/opentasks-provider/build.gradle @@ -1,11 +1,11 @@ apply plugin: 'com.android.library' android { - compileSdkVersion COMPILE_SDK_VERSION.toInteger() + compileSdkVersion 29 defaultConfig { - minSdkVersion MIN_SDK_VERSION.toInteger() - targetSdkVersion TARGET_SDK_VERSION.toInteger() + minSdkVersion 21 + targetSdkVersion 29 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/opentasks-theme/build.gradle b/opentasks-theme/build.gradle index 4021aacf..d619ce97 100644 --- a/opentasks-theme/build.gradle +++ b/opentasks-theme/build.gradle @@ -19,12 +19,12 @@ plugins { } android { - compileSdkVersion COMPILE_SDK_VERSION.toInteger() + compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { - minSdkVersion MIN_SDK_VERSION - targetSdkVersion TARGET_SDK_VERSION + minSdkVersion 21 + targetSdkVersion 29 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" diff --git a/opentasks/build.gradle b/opentasks/build.gradle index 2cf3cd65..f0d47b87 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -1,11 +1,11 @@ apply plugin: 'com.android.application' android { - compileSdkVersion COMPILE_SDK_VERSION.toInteger() + compileSdkVersion 29 defaultConfig { applicationId "foundation.e.tasks" - minSdkVersion MIN_SDK_VERSION.toInteger() - targetSdkVersion TARGET_SDK_VERSION.toInteger() + minSdkVersion 21 + targetSdkVersion 29 versionCode 7000 versionName '1.4.2' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/opentaskspal/build.gradle b/opentaskspal/build.gradle index 29967257..6d983818 100644 --- a/opentaskspal/build.gradle +++ b/opentaskspal/build.gradle @@ -1,11 +1,11 @@ apply plugin: 'com.android.library' android { - compileSdkVersion COMPILE_SDK_VERSION.toInteger() + compileSdkVersion 29 defaultConfig { - minSdkVersion MIN_SDK_VERSION.toInteger() - targetSdkVersion TARGET_SDK_VERSION.toInteger() + minSdkVersion 21 + targetSdkVersion 29 } packagingOptions { exclude 'META-INF/NOTICE' -- GitLab From d23021d29983df0ee1e102ed4840b3a72261a804 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 20 Nov 2025 22:17:41 +0530 Subject: [PATCH 06/12] Upgrade Gradle dependencies and target SDK 36 --- build.gradle | 6 +-- dependencies.gradle | 18 +++---- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- opentasks-contract/build.gradle | 9 ++-- opentasks-provider/build.gradle | 9 ++-- .../dmfs/provider/tasks/utils/ZippedTest.java | 5 +- opentasks-theme/build.gradle | 11 +++-- opentasks/build.gradle | 17 +++++-- opentasks/proguard.cfg | 6 +-- opentasks/src/main/AndroidManifest.xml | 15 +++++- .../java/org/dmfs/tasks/AboutFragment.java | 3 +- .../org/dmfs/tasks/AppSettingsActivity.java | 2 +- .../dmfs/tasks/InputTextDialogFragment.java | 3 +- .../dmfs/tasks/QuickAddDialogFragment.java | 2 +- .../tasks/StaleListBroadcastReceiver.java | 4 +- .../java/org/dmfs/tasks/TaskListActivity.java | 48 +++++++++---------- .../org/dmfs/tasks/actions/NotifyAction.java | 4 +- .../dmfs/tasks/actions/PostUndoAction.java | 4 +- .../groupings/BaseTaskViewDescriptor.java | 13 +++-- .../notification/TaskNotificationService.java | 2 +- .../tasks/widget/DescriptionFieldView.java | 2 +- opentaskspal/build.gradle | 9 ++-- .../readdata/EffectiveDueDateTest.java | 2 +- .../readdata/TaskDateTimeTest.java | 2 +- 25 files changed, 114 insertions(+), 85 deletions(-) diff --git a/build.gradle b/build.gradle index c1fc2f7d..bce2a6f8 100644 --- a/build.gradle +++ b/build.gradle @@ -2,18 +2,18 @@ buildscript { repositories { google() - jcenter() mavenCentral() + gradlePluginPortal() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.android.tools.build:gradle:8.13.1' } } allprojects { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } maven { url 'https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven'} } diff --git a/dependencies.gradle b/dependencies.gradle index 003aa290..ea38e080 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,12 +1,12 @@ def jems_version = '1.43' def contentpal_version = '0.6' -def androidx_test_runner_version = '1.1.1' +def androidx_test_runner_version = '1.7.0' ext.deps = [ // Support & Google libraries - support_appcompat : 'androidx.appcompat:appcompat:1.2.0', - support_annotations: 'androidx.annotation:annotation:1.1.0', - support_design : 'com.google.android.material:material:1.2.1', + support_appcompat : 'androidx.appcompat:appcompat:1.7.1', + support_annotations: 'androidx.annotation:annotation:1.9.1', + support_design : 'com.google.android.material:material:1.13.0', android_dashclock : 'com.google.android.apps.dashclock:dashclock-api:2.0.0', // dmfs @@ -21,13 +21,13 @@ ext.deps = [ retention_magic : 'com.github.dmfs:retention-magic:1.3', // 3rd party - codeka_carrot : 'au.com.codeka:carrot:2.4.0', + codeka_carrot : 'au.com.codeka:carrot:2.4.5', // Testing - junit : 'junit:junit:4.12', - hamcrest : 'org.hamcrest:hamcrest-library:1.3', - mockito : 'org.mockito:mockito-core:2.27.0', - robolectric : 'org.robolectric:robolectric:3.5.1', + junit : 'junit:junit:4.13.2', + hamcrest : 'org.hamcrest:hamcrest-library:3.0', + mockito : 'org.mockito:mockito-core:5.20.0', + robolectric : 'org.robolectric:robolectric:4.16', support_test_runner: "androidx.test:runner:$androidx_test_runner_version", support_test_rules : "androidx.test:rules:$androidx_test_runner_version", diff --git a/gradle.properties b/gradle.properties index dbb7bf70..38c803f5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 android.enableJetifier=true android.useAndroidX=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ce73a444..ed8581f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip diff --git a/opentasks-contract/build.gradle b/opentasks-contract/build.gradle index 821932f3..9b8a2711 100644 --- a/opentasks-contract/build.gradle +++ b/opentasks-contract/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 29 + namespace = "org.dmfs.tasks.contract" + compileSdkVersion 36 defaultConfig { minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 36 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -17,8 +18,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } } diff --git a/opentasks-provider/build.gradle b/opentasks-provider/build.gradle index c578a2db..8d3e6454 100644 --- a/opentasks-provider/build.gradle +++ b/opentasks-provider/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 29 + namespace = "org.dmfs.tasks.provider" + compileSdkVersion 36 defaultConfig { minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 36 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -17,8 +18,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } packagingOptions { exclude 'META-INF/NOTICE' diff --git a/opentasks-provider/src/test/java/org/dmfs/provider/tasks/utils/ZippedTest.java b/opentasks-provider/src/test/java/org/dmfs/provider/tasks/utils/ZippedTest.java index fef43ca9..f81928c0 100644 --- a/opentasks-provider/src/test/java/org/dmfs/provider/tasks/utils/ZippedTest.java +++ b/opentasks-provider/src/test/java/org/dmfs/provider/tasks/utils/ZippedTest.java @@ -51,6 +51,9 @@ public class ZippedTest public void testAbsent() { Object dummyObject = new Object(); - assertThat(new Zipped<>(absent(), new ValueSingle<>(dummyObject), dummy(BiFunction.class)), hasValue(sameInstance(dummyObject))); + assertThat( + new Zipped(absent(), new ValueSingle<>(dummyObject), dummy(BiFunction.class)), + hasValue(sameInstance(dummyObject)) + ); } } \ No newline at end of file diff --git a/opentasks-theme/build.gradle b/opentasks-theme/build.gradle index d619ce97..bf551b88 100644 --- a/opentasks-theme/build.gradle +++ b/opentasks-theme/build.gradle @@ -19,12 +19,13 @@ plugins { } android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + namespace = "org.dmfs.android.sync.opentasks_theme" + compileSdkVersion 36 + buildToolsVersion "35.0.0" defaultConfig { minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 36 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" @@ -37,8 +38,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } } diff --git a/opentasks/build.gradle b/opentasks/build.gradle index f0d47b87..49498b18 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 + namespace = "org.dmfs.tasks" + compileSdkVersion 36 defaultConfig { applicationId "foundation.e.tasks" minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 36 versionCode 7000 versionName '1.4.2' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -16,9 +17,15 @@ android { buildTypes { release { minifyEnabled true - proguardFiles 'proguard.cfg' + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard.cfg" + ) } } + buildFeatures { + buildConfig = true + } packagingOptions { exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' @@ -31,8 +38,8 @@ android { disable 'MissingTranslation' // TODO } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } } diff --git a/opentasks/proguard.cfg b/opentasks/proguard.cfg index bd574eba..a30497d1 100644 --- a/opentasks/proguard.cfg +++ b/opentasks/proguard.cfg @@ -15,15 +15,15 @@ -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService --keepclasseswithmembernames class * { +-keepclasseswithmembers class * { native ; } --keepclasseswithmembernames class * { +-keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } --keepclasseswithmembernames class * { +-keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } diff --git a/opentasks/src/main/AndroidManifest.xml b/opentasks/src/main/AndroidManifest.xml index c2018b27..8766402e 100644 --- a/opentasks/src/main/AndroidManifest.xml +++ b/opentasks/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -29,6 +28,7 @@ @@ -41,6 +41,7 @@ @@ -64,6 +65,7 @@ @@ -144,6 +146,7 @@ @@ -164,6 +168,7 @@ @@ -177,6 +182,7 @@ @@ -206,6 +212,7 @@ @@ -239,6 +246,7 @@ @@ -269,6 +277,7 @@ @@ -297,6 +306,7 @@ @@ -353,6 +363,7 @@ diff --git a/opentasks/src/main/java/org/dmfs/tasks/AboutFragment.java b/opentasks/src/main/java/org/dmfs/tasks/AboutFragment.java index f49a89db..d9cc3e84 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/AboutFragment.java +++ b/opentasks/src/main/java/org/dmfs/tasks/AboutFragment.java @@ -1,9 +1,10 @@ package org.dmfs.tasks; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.preference.PreferenceFragment; +import org.dmfs.tasks.BuildConfig; + import androidx.annotation.Nullable; diff --git a/opentasks/src/main/java/org/dmfs/tasks/AppSettingsActivity.java b/opentasks/src/main/java/org/dmfs/tasks/AppSettingsActivity.java index 182eaa99..cbf1b49f 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/AppSettingsActivity.java +++ b/opentasks/src/main/java/org/dmfs/tasks/AppSettingsActivity.java @@ -100,7 +100,7 @@ public final class AppSettingsActivity extends BaseActivity implements Preferenc Resources.Theme theme = super.getTheme(); if (Build.VERSION.SDK_INT < 29) { - theme.applyStyle(R.style.OpenTasks_Theme_Default, true); + theme.applyStyle(org.dmfs.android.sync.opentasks_theme.R.style.OpenTasks_Theme_Default, true); } return theme; } diff --git a/opentasks/src/main/java/org/dmfs/tasks/InputTextDialogFragment.java b/opentasks/src/main/java/org/dmfs/tasks/InputTextDialogFragment.java index 82c8959a..0201a174 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/InputTextDialogFragment.java +++ b/opentasks/src/main/java/org/dmfs/tasks/InputTextDialogFragment.java @@ -147,8 +147,7 @@ public class InputTextDialogFragment extends SupportDialogFragment implements On @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - final Context contextThemeWrapperLight = new ContextThemeWrapper(getActivity(), R.style.ThemeOverlay_AppCompat_Light); + final Context contextThemeWrapperLight = new ContextThemeWrapper(getActivity(), androidx.appcompat.R.style.ThemeOverlay_AppCompat_Light); LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapperLight); View view = localInflater.inflate(R.layout.fragment_input_text_dialog, container); diff --git a/opentasks/src/main/java/org/dmfs/tasks/QuickAddDialogFragment.java b/opentasks/src/main/java/org/dmfs/tasks/QuickAddDialogFragment.java index b3167211..2e751942 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/QuickAddDialogFragment.java +++ b/opentasks/src/main/java/org/dmfs/tasks/QuickAddDialogFragment.java @@ -204,7 +204,7 @@ public class QuickAddDialogFragment extends SupportDialogFragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final Context contextThemeWrapperDark = new ContextThemeWrapper(getActivity(), R.style.Base_Theme_AppCompat); + final Context contextThemeWrapperDark = new ContextThemeWrapper(getActivity(), androidx.appcompat.R.style.Base_Theme_AppCompat); View view = inflater.inflate(R.layout.fragment_quick_add_dialog, container); diff --git a/opentasks/src/main/java/org/dmfs/tasks/StaleListBroadcastReceiver.java b/opentasks/src/main/java/org/dmfs/tasks/StaleListBroadcastReceiver.java index 3134a4e1..5b728fec 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/StaleListBroadcastReceiver.java +++ b/opentasks/src/main/java/org/dmfs/tasks/StaleListBroadcastReceiver.java @@ -105,9 +105,9 @@ public final class StaleListBroadcastReceiver extends BroadcastReceiver .setContentIntent(PendingIntent.getActivity(context, 0, accountRequestIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .addAction(new Notification.Action.Builder(null, "Grant", PendingIntent.getActivity(context, 0, accountRequestIntent, PendingIntent.FLAG_UPDATE_CURRENT)).build()) - .setColor(new AttributeColor(theme, R.attr.colorPrimary).argb()) + .setColor(new AttributeColor(theme, androidx.appcompat.R.attr.colorPrimary).argb()) .setColorized(true) - .setSmallIcon(R.drawable.ic_24_opentasks) + .setSmallIcon(org.dmfs.tasks.provider.R.drawable.ic_24_opentasks) .build()); } } diff --git a/opentasks/src/main/java/org/dmfs/tasks/TaskListActivity.java b/opentasks/src/main/java/org/dmfs/tasks/TaskListActivity.java index 28081814..f28e0b0c 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/TaskListActivity.java +++ b/opentasks/src/main/java/org/dmfs/tasks/TaskListActivity.java @@ -520,27 +520,23 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C private void updateTitle(int pageId) { - switch (pageId) - { - case R.id.task_group_by_list: - getSupportActionBar().setTitle(R.string.task_group_title_list); - break; - case R.id.task_group_by_start: - getSupportActionBar().setTitle(R.string.task_group_title_start); - break; - case R.id.task_group_by_due: - getSupportActionBar().setTitle(R.string.task_group_title_due); - break; - case R.id.task_group_by_priority: - getSupportActionBar().setTitle(R.string.task_group_title_priority); - break; - case R.id.task_group_by_progress: - getSupportActionBar().setTitle(R.string.task_group_title_progress); - break; - - default: - getSupportActionBar().setTitle(R.string.task_group_title_default); - break; + if (pageId == R.id.task_group_by_list) { + getSupportActionBar().setTitle(R.string.task_group_title_list); + } + else if (pageId == R.id.task_group_by_start) { + getSupportActionBar().setTitle(R.string.task_group_title_start); + } + else if (pageId == R.id.task_group_by_due) { + getSupportActionBar().setTitle(R.string.task_group_title_due); + } + else if (pageId == R.id.task_group_by_priority) { + getSupportActionBar().setTitle(R.string.task_group_title_priority); + } + else if (pageId == R.id.task_group_by_progress) { + getSupportActionBar().setTitle(R.string.task_group_title_progress); + } + else { + getSupportActionBar().setTitle(R.string.task_group_title_default); } } @@ -736,14 +732,14 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C } }); SearchView searchView = (SearchView) mSearchItem.getActionView(); - EditText searchText = searchView.findViewById(R.id.search_src_text); - ImageView searchClose = searchView.findViewById(R.id.search_close_btn); + EditText searchText = searchView.findViewById(androidx.appcompat.R.id.search_src_text); + ImageView searchClose = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); searchClose.setImageResource(R.drawable.ic_close); - ImageView searchIcon = searchView.findViewById(R.id.search_mag_icon); + ImageView searchIcon = searchView.findViewById(androidx.appcompat.R.id.search_mag_icon); searchIcon.setImageDrawable(null); ImageViewCompat.setImageTintList(searchIcon, ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_default_primary_text))); - searchView.findViewById(R.id.search_plate).setBackground(null); + searchView.findViewById(androidx.appcompat.R.id.search_plate).setBackground(null); searchText.setHintTextColor(getResources().getColor(R.color.dark_gray)); searchText.setTextColor(getResources().getColor(R.color.color_default_primary_text)); @@ -839,7 +835,7 @@ public class TaskListActivity extends BaseActivity implements TaskListFragment.C if (Build.VERSION.SDK_INT < 29) { theme.applyStyle( - R.style.OpenTasks_Theme_Default, + org.dmfs.android.sync.opentasks_theme.R.style.OpenTasks_Theme_Default, true); } return theme; diff --git a/opentasks/src/main/java/org/dmfs/tasks/actions/NotifyAction.java b/opentasks/src/main/java/org/dmfs/tasks/actions/NotifyAction.java index 072f0750..e5648370 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/actions/NotifyAction.java +++ b/opentasks/src/main/java/org/dmfs/tasks/actions/NotifyAction.java @@ -180,7 +180,9 @@ public final class NotifyAction implements TaskAction builder.setDefaults(new Conditional(mRepost, context).value()); } // TODO: for now we only use the primary app color, later we allow the user to select how to color notifications: default, list, priority - builder.setColor(new AttributeColor(new ContextThemeWrapper(context, R.style.OpenTasks_Theme_Default), R.attr.colorPrimary).argb()); + builder.setColor(new AttributeColor(new ContextThemeWrapper(context, + org.dmfs.android.sync.opentasks_theme.R.style.OpenTasks_Theme_Default), + androidx.appcompat.R.attr.colorPrimary).argb()); //builder.setColor(new EffectiveTaskColor(data).argb()); NotificationManagerCompat.from(context).notify("tasks", notificationId, builder.build()); } diff --git a/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java b/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java index e705a278..dbfc3c97 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java +++ b/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java @@ -81,7 +81,9 @@ public final class PostUndoAction implements TaskAction PendingIntent.FLAG_CANCEL_CURRENT)); builder.setShowWhen(false); builder.setGroup(GROUP_UNDO); - builder.setColor(new AttributeColor(new ContextThemeWrapper(context, R.style.OpenTasks_Theme_Default), R.attr.colorPrimary).argb()); + builder.setColor(new AttributeColor(new ContextThemeWrapper(context, + org.dmfs.android.sync.opentasks_theme.R.style.OpenTasks_Theme_Default), + androidx.appcompat.R.attr.colorPrimary).argb()); NotificationManagerCompat.from(context).notify("tasks.undo", id, builder.build()); } diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/BaseTaskViewDescriptor.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/BaseTaskViewDescriptor.java index 3f7046da..5f4a8cc7 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/BaseTaskViewDescriptor.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/BaseTaskViewDescriptor.java @@ -254,15 +254,18 @@ public abstract class BaseTaskViewDescriptor implements ViewDescriptor { if (priority < 5) { - prioLabel.setBackgroundColor(new AttributeColor(prioLabel.getContext(), R.attr.colorHighPriority).argb()); + prioLabel.setBackgroundColor(new AttributeColor(prioLabel.getContext(), + org.dmfs.android.sync.opentasks_theme.R.attr.colorHighPriority).argb()); } if (priority == 5) { - prioLabel.setBackgroundColor(new AttributeColor(prioLabel.getContext(), R.attr.colorMediumPriority).argb()); + prioLabel.setBackgroundColor(new AttributeColor(prioLabel.getContext(), + org.dmfs.android.sync.opentasks_theme.R.attr.colorMediumPriority).argb()); } if (priority > 5) { - prioLabel.setBackgroundColor(new AttributeColor(prioLabel.getContext(), R.attr.colorLowPriority).argb()); + prioLabel.setBackgroundColor(new AttributeColor(prioLabel.getContext(), + org.dmfs.android.sync.opentasks_theme.R.attr.colorLowPriority).argb()); } prioLabel.setVisibility(View.VISIBLE); } @@ -284,8 +287,8 @@ public abstract class BaseTaskViewDescriptor implements ViewDescriptor cardView.findViewById(R.id.color_label).setAlpha(isClosed ? 0.4f : 1f); cardView.setCardElevation(view.getResources().getDimensionPixelSize( isClosed ? - R.dimen.opentasks_tasklist_card_elevation_closed : - R.dimen.opentasks_tasklist_card_elevation)); + org.dmfs.android.sync.opentasks_theme.R.dimen.opentasks_tasklist_card_elevation_closed : + org.dmfs.android.sync.opentasks_theme.R.dimen.opentasks_tasklist_card_elevation)); ((TextView) cardView.findViewById(android.R.id.title)) .setTextColor(new AttributeColor(view.getContext(), isClosed ? diff --git a/opentasks/src/main/java/org/dmfs/tasks/notification/TaskNotificationService.java b/opentasks/src/main/java/org/dmfs/tasks/notification/TaskNotificationService.java index a00316ba..5e7d89ac 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/notification/TaskNotificationService.java +++ b/opentasks/src/main/java/org/dmfs/tasks/notification/TaskNotificationService.java @@ -104,7 +104,7 @@ public class TaskNotificationService extends JobIntentService * Notifications of tasks which have been unpinned are removed. * Notifications of tasks which have changed otherwise are updated. */ - String authority = getString(R.string.opentasks_authority); + String authority = getString(org.dmfs.tasks.provider.R.string.opentasks_authority); Iterable currentNotifications = new org.dmfs.tasks.utils.Sorted<>( (o, o2) -> (int) (ContentUris.parseId(o.instance()) - ContentUris.parseId(o2.instance())), diff --git a/opentasks/src/main/java/org/dmfs/tasks/widget/DescriptionFieldView.java b/opentasks/src/main/java/org/dmfs/tasks/widget/DescriptionFieldView.java index eca15c9d..9c7852cd 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/widget/DescriptionFieldView.java +++ b/opentasks/src/main/java/org/dmfs/tasks/widget/DescriptionFieldView.java @@ -271,7 +271,7 @@ public class DescriptionFieldView extends AbstractFieldView implements OnChecked ColorStateList colorStateList = new ColorStateList( new int[][] { new int[] { android.R.attr.state_focused }, new int[] { -android.R.attr.state_focused } }, - new int[] { new AttributeColor(getContext(), R.attr.colorPrimary).argb(), 0 }); + new int[] { new AttributeColor(getContext(), androidx.appcompat.R.attr.colorPrimary).argb(), 0 }); ViewCompat.setBackgroundTintList(text, colorStateList); text.setOnFocusChangeListener((v, hasFocus) -> { diff --git a/opentaskspal/build.gradle b/opentaskspal/build.gradle index 6d983818..41582d8a 100644 --- a/opentaskspal/build.gradle +++ b/opentaskspal/build.gradle @@ -1,19 +1,20 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 29 + namespace = "org.dmfs.opentaskspal" + compileSdkVersion 36 defaultConfig { minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 36 } packagingOptions { exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } } diff --git a/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/EffectiveDueDateTest.java b/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/EffectiveDueDateTest.java index f266b6f2..a6982422 100644 --- a/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/EffectiveDueDateTest.java +++ b/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/EffectiveDueDateTest.java @@ -31,8 +31,8 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static org.dmfs.jems.mockito.doubles.TestDoubles.failingMock; import static org.dmfs.jems.optional.elementary.Absent.absent; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; diff --git a/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/TaskDateTimeTest.java b/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/TaskDateTimeTest.java index bf67d42b..2e240aeb 100644 --- a/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/TaskDateTimeTest.java +++ b/opentaskspal/src/test/java/org/dmfs/opentaskspal/readdata/TaskDateTimeTest.java @@ -30,8 +30,8 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.dmfs.jems.mockito.doubles.TestDoubles.failingMock; import static org.dmfs.optional.Absent.absent; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; -- GitLab From a579c3a380fe858ed555e01772c78fe2b9b5fc24 Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 20 Nov 2025 22:33:10 +0530 Subject: [PATCH 07/12] Update GitLab CI configuration --- .gitlab-ci.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2203f430..58abbe15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,20 +1,12 @@ -image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:legacy" +image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:latest" stages: - build -variables: - GRADLE_VERSION: "gradle-5.4.1" - GIT_SUBMODULE_STRATEGY: "recursive" - before_script: - - git fetch + - export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 - export GRADLE_USER_HOME=$(pwd)/.gradle - - curl -sL https://services.gradle.org/distributions/${GRADLE_VERSION}-bin.zip -o /gradle.zip - - unzip /gradle.zip -d /gradle - - PATH="$PATH:/gradle/${GRADLE_VERSION}/bin" - - JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS} -Dfile.encoding=UTF8" - - gradle dependencies + - chmod +x ./gradlew cache: key: ${CI_PROJECT_ID} @@ -24,7 +16,7 @@ cache: build: stage: build script: - - gradle assemble + - ./gradlew assemble artifacts: paths: - - opentasks/build/outputs/ + - opentasks/build/outputs/apk/ -- GitLab From 8209540f3c65310cefe6f3e58318bdfcf566961d Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 20 Nov 2025 23:00:25 +0530 Subject: [PATCH 08/12] Add FLAG_IMMUTABLE to PendingIntents on Android 12+ --- .../src/main/java/org/dmfs/tasks/actions/PostUndoAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java b/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java index dbfc3c97..4c6d6a9f 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java +++ b/opentasks/src/main/java/org/dmfs/tasks/actions/PostUndoAction.java @@ -70,7 +70,7 @@ public final class PostUndoAction implements TaskAction context, id, new Intent(context, ActionReceiver.class).setData(taskUri).setAction(ActionService.ACTION_UNDO_COMPLETE), - PendingIntent.FLAG_CANCEL_CURRENT)); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE)); builder.setContent(undoView); // When the notification is cleared, we perform the destructive action @@ -78,7 +78,7 @@ public final class PostUndoAction implements TaskAction context, id, new Intent(context, ActionReceiver.class).setData(taskUri).setAction(ActionService.ACTION_FINISH_COMPLETE), - PendingIntent.FLAG_CANCEL_CURRENT)); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE)); builder.setShowWhen(false); builder.setGroup(GROUP_UNDO); builder.setColor(new AttributeColor(new ContextThemeWrapper(context, -- GitLab From 21f8d91c8207ee242ba9fd1e34e0be7298b2cd6a Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 20 Nov 2025 23:24:48 +0530 Subject: [PATCH 09/12] Migrate build configuration to TOML --- build.gradle | 24 ++------------ dependencies.gradle | 38 --------------------- gradle/libs.versions.toml | 59 +++++++++++++++++++++++++++++++++ opentasks-contract/build.gradle | 4 ++- opentasks-provider/build.gradle | 36 ++++++++++---------- opentasks-theme/build.gradle | 11 +++--- opentasks/build.gradle | 46 +++++++++++++------------ opentaskspal/build.gradle | 28 ++++++++-------- settings.gradle | 18 ++++++++++ 9 files changed, 146 insertions(+), 118 deletions(-) delete mode 100644 dependencies.gradle create mode 100644 gradle/libs.versions.toml diff --git a/build.gradle b/build.gradle index bce2a6f8..9c5ba578 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,4 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - repositories { - google() - mavenCentral() - gradlePluginPortal() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.13.1' - } +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false } - -allprojects { - repositories { - google() - mavenCentral() - maven { url "https://jitpack.io" } - maven { url 'https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven'} - } -} - -apply from: "dependencies.gradle" diff --git a/dependencies.gradle b/dependencies.gradle deleted file mode 100644 index ea38e080..00000000 --- a/dependencies.gradle +++ /dev/null @@ -1,38 +0,0 @@ -def jems_version = '1.43' -def contentpal_version = '0.6' -def androidx_test_runner_version = '1.7.0' - -ext.deps = [ - // Support & Google libraries - support_appcompat : 'androidx.appcompat:appcompat:1.7.1', - support_annotations: 'androidx.annotation:annotation:1.9.1', - support_design : 'com.google.android.material:material:1.13.0', - android_dashclock : 'com.google.android.apps.dashclock:dashclock-api:2.0.0', - - // dmfs - jems : "org.dmfs:jems:$jems_version", - datetime : 'org.dmfs:rfc5545-datetime:0.2.4', - lib_recur : 'org.dmfs:lib-recur:0.12.2', - xml_magic : 'org.dmfs:android-xml-magic:0.1.1', - color_picker : 'com.github.dmfs:color-picker:1.3', - android_carrot : 'com.github.dmfs.androidcarrot:androidcarrot:13edc04', - bolts_color : 'com.github.dmfs.Bolts:color-bolts:0.1', - contentpal : "com.github.dmfs.contentpal:contentpal:$contentpal_version", - retention_magic : 'com.github.dmfs:retention-magic:1.3', - - // 3rd party - codeka_carrot : 'au.com.codeka:carrot:2.4.5', - - // Testing - junit : 'junit:junit:4.13.2', - hamcrest : 'org.hamcrest:hamcrest-library:3.0', - mockito : 'org.mockito:mockito-core:5.20.0', - robolectric : 'org.robolectric:robolectric:4.16', - support_test_runner: "androidx.test:runner:$androidx_test_runner_version", - support_test_rules : "androidx.test:rules:$androidx_test_runner_version", - - // dmfs testing - jems_testing : "org.dmfs:jems-testing:$jems_version", - contenttestpal : "com.github.dmfs.contentpal:contenttestpal:$contentpal_version", - contentpal_testing : "com.github.dmfs.contentpal:contentpal-testing:$contentpal_version" -] \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..553a6362 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,59 @@ +[versions] +android-carrot = "13edc04" +android-gradle-plugin = "8.13.1" +androidx-test-runner = "1.7.0" +annotation = "1.9.1" +appcompat = "1.7.1" +bolts-color = "0.1" +codeka-carrot = "2.4.5" +color-picker = "1.3" +contentpal = "0.6" +datetime = "0.2.4" +elib = "0.0.1-alpha11" +hamcrest = "3.0" +jems = "1.43" +junit = "4.13.2" +lib-recur = "0.12.2" +material = "1.13.0" +mockito = "5.20.0" +preference = "1.1.1" +recurpicker = "2.1.4" +retention-magic = "1.3" +robolectric = "4.16" +rxandroid = "2.1.1" +rxjava = "2.2.21" +xml-magic = "0.1.1" + +[libraries] +android-carrot = { module = "com.github.dmfs.androidcarrot:androidcarrot", version.ref = "android-carrot" } +android-dashclock = { module = "com.google.android.apps.dashclock:dashclock-api", version = "2.0.0" } +bolts-color = { module = "com.github.dmfs.Bolts:color-bolts", version.ref = "bolts-color" } +codeka-carrot = { module = "au.com.codeka:carrot", version.ref = "codeka-carrot" } +color-picker = { module = "com.github.dmfs:color-picker", version.ref = "color-picker" } +contentpal = { module = "com.github.dmfs.contentpal:contentpal", version.ref = "contentpal" } +contentpal-testing = { module = "com.github.dmfs.contentpal:contentpal-testing", version.ref = "contentpal" } +contenttestpal = { module = "com.github.dmfs.contentpal:contenttestpal", version.ref = "contentpal" } +datetime = { module = "org.dmfs:rfc5545-datetime", version.ref = "datetime" } +elib = { module = "foundation.e:elib", version.ref = "elib" } +hamcrest = { module = "org.hamcrest:hamcrest-library", version.ref = "hamcrest" } +jems = { module = "org.dmfs:jems", version.ref = "jems" } +jems-testing = { module = "org.dmfs:jems-testing", version.ref = "jems" } +junit = { module = "junit:junit", version.ref = "junit" } +lib-recur = { module = "org.dmfs:lib-recur", version.ref = "lib-recur" } +material = { module = "com.google.android.material:material", version.ref = "material" } +mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" } +preference = { module = "androidx.preference:preference", version.ref = "preference" } +recurpicker = { module = "com.maltaisn:recurpicker", version.ref = "recurpicker" } +retention-magic = { module = "com.github.dmfs:retention-magic", version.ref = "retention-magic" } +robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } +rxandroid = { module = "io.reactivex.rxjava2:rxandroid", version.ref = "rxandroid" } +rxjava = { module = "io.reactivex.rxjava2:rxjava", version.ref = "rxjava" } +support-annotations = { module = "androidx.annotation:annotation", version.ref = "annotation" } +support-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +support-test-rules = { module = "androidx.test:rules", version.ref = "androidx-test-runner" } +support-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test-runner" } +xml-magic = { module = "org.dmfs:android-xml-magic", version.ref = "xml-magic" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" } +android-library = { id = "com.android.library", version.ref = "android-gradle-plugin" } diff --git a/opentasks-contract/build.gradle b/opentasks-contract/build.gradle index 9b8a2711..2556a61c 100644 --- a/opentasks-contract/build.gradle +++ b/opentasks-contract/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.library' +plugins { + alias(libs.plugins.android.library) +} android { namespace = "org.dmfs.tasks.contract" diff --git a/opentasks-provider/build.gradle b/opentasks-provider/build.gradle index 8d3e6454..0ac44f88 100644 --- a/opentasks-provider/build.gradle +++ b/opentasks-provider/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.library' +plugins { + alias(libs.plugins.android.library) +} android { namespace = "org.dmfs.tasks.provider" @@ -29,23 +31,23 @@ android { dependencies { implementation project(':opentasks-contract') - implementation deps.datetime - implementation deps.lib_recur - implementation deps.jems + implementation libs.datetime + implementation libs.lib.recur + implementation libs.jems - testImplementation deps.robolectric - testImplementation deps.junit - testImplementation deps.mockito - testImplementation deps.jems_testing - testImplementation deps.hamcrest + testImplementation libs.robolectric + testImplementation libs.junit + testImplementation libs.mockito + testImplementation libs.jems.testing + testImplementation libs.hamcrest androidTestImplementation project(':opentaskspal') - androidTestImplementation deps.contenttestpal - androidTestImplementation deps.support_annotations - androidTestImplementation deps.support_test_runner - androidTestImplementation deps.support_test_rules - androidTestImplementation deps.mockito - androidTestImplementation deps.jems_testing - androidTestImplementation deps.hamcrest - androidTestImplementation deps.contentpal_testing + androidTestImplementation libs.contenttestpal + androidTestImplementation libs.support.annotations + androidTestImplementation libs.support.test.runner + androidTestImplementation libs.support.test.rules + androidTestImplementation libs.mockito + androidTestImplementation libs.jems.testing + androidTestImplementation libs.hamcrest + androidTestImplementation libs.contentpal.testing } diff --git a/opentasks-theme/build.gradle b/opentasks-theme/build.gradle index bf551b88..d675aad7 100644 --- a/opentasks-theme/build.gradle +++ b/opentasks-theme/build.gradle @@ -15,7 +15,7 @@ */ plugins { - id 'com.android.library' + alias(libs.plugins.android.library) } android { @@ -44,8 +44,7 @@ android { } dependencies { - - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.2.1' - implementation 'foundation.e:elib:0.0.1-alpha11' -} \ No newline at end of file + implementation libs.support.appcompat + implementation libs.material + implementation libs.elib +} diff --git a/opentasks/build.gradle b/opentasks/build.gradle index 49498b18..44550689 100644 --- a/opentasks/build.gradle +++ b/opentasks/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.application' +plugins { + alias(libs.plugins.android.application) +} android { namespace = "org.dmfs.tasks" @@ -46,38 +48,38 @@ android { dependencies { implementation project(':opentasks-theme') implementation project(':opentasks-provider') - implementation deps.support_appcompat - implementation deps.support_design - implementation(deps.xml_magic) { + implementation libs.support.appcompat + implementation libs.material + implementation(libs.xml.magic) { // xmlpull is part of the runtime, so don't pull it in here exclude group: 'xmlpull', module: 'xmlpull' } - implementation deps.android_dashclock - implementation deps.color_picker - implementation(deps.codeka_carrot) { + implementation libs.android.dashclock + implementation libs.color.picker + implementation(libs.codeka.carrot) { exclude module: 'iterators' // TODO Remove when iterators have been removed from codeka:carrot } - implementation(deps.android_carrot) { + implementation(libs.android.carrot) { exclude module: 'carrot' exclude module: 'iterators' exclude module: 'jems' } - implementation deps.jems - implementation deps.datetime - implementation deps.bolts_color - implementation deps.retention_magic + implementation libs.jems + implementation libs.datetime + implementation libs.bolts.color + implementation libs.retention.magic - testImplementation deps.junit - testImplementation deps.robolectric - testImplementation deps.jems_testing + testImplementation libs.junit + testImplementation libs.robolectric + testImplementation libs.jems.testing - androidTestImplementation deps.support_test_runner - androidTestImplementation deps.support_test_rules + androidTestImplementation libs.support.test.runner + androidTestImplementation libs.support.test.rules implementation project(path: ':opentaskspal') - implementation 'foundation.e:elib:0.0.1-alpha11' + implementation libs.elib - implementation 'io.reactivex.rxjava2:rxjava:2.2.21' - implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' - implementation 'androidx.preference:preference:1.1.1' - implementation 'com.maltaisn:recurpicker:2.1.4' + implementation libs.rxjava + implementation libs.rxandroid + implementation libs.preference + implementation libs.recurpicker } diff --git a/opentaskspal/build.gradle b/opentaskspal/build.gradle index 41582d8a..c9261579 100644 --- a/opentaskspal/build.gradle +++ b/opentaskspal/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.library' +plugins { + alias(libs.plugins.android.library) +} android { namespace = "org.dmfs.opentaskspal" @@ -20,17 +22,17 @@ android { dependencies { api project(':opentasks-contract') - api deps.contentpal - api deps.datetime - api deps.lib_recur - api deps.support_annotations - api deps.bolts_color + api libs.contentpal + api libs.datetime + api libs.lib.recur + api libs.support.annotations + api libs.bolts.color - implementation deps.jems + implementation libs.jems - testImplementation deps.contentpal_testing - testImplementation deps.jems_testing - testImplementation deps.robolectric - testImplementation deps.junit - testImplementation deps.mockito -} \ No newline at end of file + testImplementation libs.contentpal.testing + testImplementation libs.jems.testing + testImplementation libs.robolectric + testImplementation libs.junit + testImplementation libs.mockito +} diff --git a/settings.gradle b/settings.gradle index f5592faa..207dd202 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,20 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url "https://jitpack.io" } + maven { url "https://gitlab.e.foundation/api/v4/groups/9/-/packages/maven" } + } +} + include ':opentasks-theme' include ':opentasks', ':opentasks-provider', ':opentasks-contract', ':opentaskspal' -- GitLab From 5a15562a4fb94c2329263f8bac80c85666b1bee8 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 00:07:46 +0530 Subject: [PATCH 10/12] Add platform signing key for local testing --- keystore/platform.jks | Bin 0 -> 3052 bytes opentasks/build.gradle | 16 ++++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 keystore/platform.jks diff --git a/keystore/platform.jks b/keystore/platform.jks new file mode 100644 index 0000000000000000000000000000000000000000..b778840542e79c048bcf570aa960243eeb9b9d53 GIT binary patch literal 3052 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 Date: Fri, 21 Nov 2025 00:10:04 +0530 Subject: [PATCH 11/12] Request required runtime permissions --- opentasks/src/main/AndroidManifest.xml | 1 + .../org/dmfs/tasks/utils/BaseActivity.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/opentasks/src/main/AndroidManifest.xml b/opentasks/src/main/AndroidManifest.xml index 8766402e..9a037032 100644 --- a/opentasks/src/main/AndroidManifest.xml +++ b/opentasks/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + permissions = new ArrayList<>(); + List allPermissions = Arrays.asList(Manifest.permission.READ_CONTACTS, + Manifest.permission.POST_NOTIFICATIONS, "foundation.e.permission.READ_TASKS", + "foundation.e.permission.WRITE_TASKS"); + + for (String permission : allPermissions) { + if (permission.equals(Manifest.permission.POST_NOTIFICATIONS) + && Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + continue; + } + + if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { + permissions.add(permission); + } + } + + if (!permissions.isEmpty()) { + ActivityCompat.requestPermissions(this, permissions.toArray(new String[0]), REQUEST_PERMISSIONS); + } + } } -- GitLab From 5dd09786ab86cd30f0ca5933ffb4570d8f44b9ce Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 21 Nov 2025 10:59:45 +0530 Subject: [PATCH 12/12] Fix layout overlap with the status bar --- opentasks/src/main/res/layout/activity_settings.xml | 1 + opentasks/src/main/res/values-v27/styles.xml | 3 +++ opentasks/src/main/res/values/styles.xml | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/opentasks/src/main/res/layout/activity_settings.xml b/opentasks/src/main/res/layout/activity_settings.xml index ac7ce265..5a41e1ca 100644 --- a/opentasks/src/main/res/layout/activity_settings.xml +++ b/opentasks/src/main/res/layout/activity_settings.xml @@ -2,6 +2,7 @@ android:layout_width="match_parent" android:orientation="vertical" android:background="@color/color_default_background" + android:fitsSystemWindows="true" android:layout_height="match_parent"> true true + + + true \ No newline at end of file diff --git a/opentasks/src/main/res/values/styles.xml b/opentasks/src/main/res/values/styles.xml index b081a23b..e58f14e0 100644 --- a/opentasks/src/main/res/values/styles.xml +++ b/opentasks/src/main/res/values/styles.xml @@ -183,6 +183,9 @@ @color/e_secondary_text_color @color/accent @color/accent + + + true -- GitLab