From 3f9ea1a1ee1e4c60d89d0141ca928ffbf031bb1e Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Tue, 20 May 2025 20:36:38 +0200 Subject: [PATCH 1/6] Add adb_demo_mode.sh script to ease screenshot generation --- _ci/adb_demo_mode.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 _ci/adb_demo_mode.sh diff --git a/_ci/adb_demo_mode.sh b/_ci/adb_demo_mode.sh new file mode 100755 index 00000000..7c6678c0 --- /dev/null +++ b/_ci/adb_demo_mode.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +origin=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) || exit + +# shellcheck disable=SC1091 +. "${origin}/utils.sh" + +if [ $# -lt 1 ]; then + echo "Usage: $0 [on|off] [hhmm]" >&2 + exit +fi + +cmd=${1} + +hhmm=${2:-"1200"} + +# see available commands https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/docs/demo_mode.md +case "${cmd,,}" in + on) + warn "Don't forget to switch phone in English language" + info "Enabling demo mode" + adb shell settings put global sysui_demo_allowed 1 + adb shell am broadcast -a com.android.systemui.demo -e command enter || exit + adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm "${hhmm}" + adb shell am broadcast -a com.android.systemui.demo -e command battery -e plugged false -e level 100 -e powersave false + adb shell am broadcast -a com.android.systemui.demo -e command network -e wifi show -e level 4 + adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e datatype none -e level 4 -e fully true + adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false + adb shell cmd overlay enable com.android.internal.systemui.navbar.gestural + ;; +off) + info "Disabling demo mode" + adb shell am broadcast -a com.android.systemui.demo -e command exit + adb shell settings put global sysui_demo_allowed 0 + adb shell cmd overlay enable com.android.internal.systemui.navbar.threebutton + ;; +*) + step_error "Invalid command '${cmd}'" +esac + +step_done From 7424caba3bf9374cec1e4639e4c32fae3ae4949f Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 29 Sep 2024 23:35:33 +0200 Subject: [PATCH 2/6] Introduce `demo` flavor --- tasks-app-android/build.gradle.kts | 5 ++++ .../src/demo/google-services.json | 23 +++++++++++++++++ .../src/demo/res/values/strings.xml | 25 +++++++++++++++++++ .../tasks/app/di/platformModule.android.kt | 2 +- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tasks-app-android/src/demo/google-services.json create mode 100644 tasks-app-android/src/demo/res/values/strings.xml diff --git a/tasks-app-android/build.gradle.kts b/tasks-app-android/build.gradle.kts index aa1141fe..09e3484f 100644 --- a/tasks-app-android/build.gradle.kts +++ b/tasks-app-android/build.gradle.kts @@ -76,6 +76,11 @@ android { manifestPlaceholders["crashlyticsEnabled"] = false } + create("demo") { + initWith(getByName("dev")) + applicationIdSuffix = ".demo" + } + create("store") { dimension = "target" } diff --git a/tasks-app-android/src/demo/google-services.json b/tasks-app-android/src/demo/google-services.json new file mode 100644 index 00000000..07760dd8 --- /dev/null +++ b/tasks-app-android/src/demo/google-services.json @@ -0,0 +1,23 @@ +{ + "project_info": { + "project_number": "44853535682", + "project_id": "tasks-app-c632e", + "storage_bucket": "tasks-app-c632e.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:44853535682:android:912604c7085bbeb11e2c5b", + "android_client_info": { + "package_name": "net.opatry.tasks.app.demo" + } + }, + "api_key": [ + { + "current_key": "" + } + ] + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/tasks-app-android/src/demo/res/values/strings.xml b/tasks-app-android/src/demo/res/values/strings.xml new file mode 100644 index 00000000..82e4ee2b --- /dev/null +++ b/tasks-app-android/src/demo/res/values/strings.xml @@ -0,0 +1,25 @@ + + + + ๐Ÿ“ธ Taskfolio + \ No newline at end of file diff --git a/tasks-app-shared/src/androidMain/kotlin/net/opatry/tasks/app/di/platformModule.android.kt b/tasks-app-shared/src/androidMain/kotlin/net/opatry/tasks/app/di/platformModule.android.kt index 183e3266..f6bd1480 100644 --- a/tasks-app-shared/src/androidMain/kotlin/net/opatry/tasks/app/di/platformModule.android.kt +++ b/tasks-app-shared/src/androidMain/kotlin/net/opatry/tasks/app/di/platformModule.android.kt @@ -40,7 +40,7 @@ actual fun platformModule(target: String): Module = module { val context = get() val appContext = context.applicationContext val dbFile = appContext.getDatabasePath("tasks${dbNameSuffix}.db") - if (target == "test" && dbFile.exists()) { + if (target in arrayOf("test", "demo") && dbFile.exists()) { dbFile.delete() } Room.databaseBuilder(appContext, dbFile.absolutePath) From 2cef296a38855f3f11cb58f7ddf0490f8d05a1ac Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 29 Sep 2024 23:39:05 +0200 Subject: [PATCH 3/6] Create pre-filled Demo content --- tasks-app-android/build.gradle.kts | 4 + tasks-app-android/src/demo/assets/avatar.png | Bin 0 -> 9831 bytes .../opatry/tasks/app/init/FlavorCustomInit.kt | 245 ++++++++++++++++++ .../src/demo/res/values/strings.xml | 27 +- .../opatry/tasks/app/init/FlavorCustomInit.kt | 31 +++ .../net/opatry/tasks/app/TasksApplication.kt | 2 + .../opatry/tasks/app/init/FlavorCustomInit.kt | 31 +++ 7 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 tasks-app-android/src/demo/assets/avatar.png create mode 100644 tasks-app-android/src/demo/java/net/opatry/tasks/app/init/FlavorCustomInit.kt create mode 100644 tasks-app-android/src/dev/java/net/opatry/tasks/app/init/FlavorCustomInit.kt create mode 100644 tasks-app-android/src/store/java/net/opatry/tasks/app/init/FlavorCustomInit.kt diff --git a/tasks-app-android/build.gradle.kts b/tasks-app-android/build.gradle.kts index 09e3484f..ea96b31e 100644 --- a/tasks-app-android/build.gradle.kts +++ b/tasks-app-android/build.gradle.kts @@ -170,6 +170,10 @@ dependencies { implementation(projects.google.tasks) implementation(projects.tasksAppShared) + "demoImplementation"(projects.tasksCore) { + because("needed for prefilled content for screenshot generation") + } + debugImplementation(libs.androidx.ui.test.manifest) androidTestImplementation(libs.androidx.ui.test.junit4) diff --git a/tasks-app-android/src/demo/assets/avatar.png b/tasks-app-android/src/demo/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..271795d79aef5a353554e0d2d6e94696269185c4 GIT binary patch literal 9831 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 + val taskListDao = get() + val taskDao = get() + runBlocking { + withContext(Dispatchers.Default) { + userDao.setSignedInUser( + UserEntity( + remoteId = "demo", + email = "jane.do@acme.org", + name = "Jane Doe", + avatarUrl = "file:///android_asset/avatar.png", + isSignedIn = true, + ) + ) + val myTasksListId = taskListDao.insert( + TaskListEntity( + title = getString(R.string.demo_task_list_default), + lastUpdateDate = Clock.System.now(), + sorting = TaskListEntity.Sorting.DueDate, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "my_task1", + title = getString(R.string.demo_task_list_default_task1), + notes = getString(R.string.demo_task_list_default_task1_notes), + parentListLocalId = myTasksListId, + dueDate = Clock.System.now() + 1.days, + lastUpdateDate = Clock.System.now(), + position = "1", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "my_task2", + title = getString(R.string.demo_task_list_default_task2), + parentListLocalId = myTasksListId, + dueDate = Clock.System.now() - 1.days, + lastUpdateDate = Clock.System.now(), + position = "2", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "my_task3", + title = getString(R.string.demo_task_list_default_task3), + notes = getString(R.string.demo_task_list_default_task3_notes), + parentListLocalId = myTasksListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "3", + isCompleted = true, + completionDate = Clock.System.now() - 1.days, + ) + ) + val groceriesListId = taskListDao.insert( + TaskListEntity( + title = getString(R.string.demo_task_list_groceries), + lastUpdateDate = Clock.System.now(), + sorting = TaskListEntity.Sorting.Title, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "groceries_task1", + title = getString(R.string.demo_task_list_groceries_task1), + parentListLocalId = groceriesListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "1", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "groceries_task2", + title = getString(R.string.demo_task_list_groceries_task2), + parentListLocalId = groceriesListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "2", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "groceries_task3", + title = getString(R.string.demo_task_list_groceries_task3), + parentListLocalId = groceriesListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "3", + isCompleted = true, + completionDate = Clock.System.now() - 2.days, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "groceries_task4", + title = getString(R.string.demo_task_list_groceries_task4), + parentListLocalId = groceriesListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "4", + isCompleted = true, + completionDate = Clock.System.now(), + ) + ) + val homeListId = taskListDao.insert( + TaskListEntity( + title = getString(R.string.demo_task_list_home), + lastUpdateDate = Clock.System.now(), + sorting = TaskListEntity.Sorting.UserDefined, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "home_task1", + title = getString(R.string.demo_task_list_home_task1), + parentListLocalId = homeListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "1", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "home_task2", + title = getString(R.string.demo_task_list_home_task2), + parentListLocalId = homeListId, + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "2", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "home_task3", + title = getString(R.string.demo_task_list_home_task3), + notes = getString(R.string.demo_task_list_home_task3_notes), + parentListLocalId = homeListId, + dueDate = Clock.System.now() + 1.days, + lastUpdateDate = Clock.System.now(), + position = "3", + isCompleted = false, + ) + ) + val workListId = taskListDao.insert( + TaskListEntity( + title = getString(R.string.demo_task_list_work), + lastUpdateDate = Clock.System.now(), + sorting = TaskListEntity.Sorting.UserDefined, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "work_task1", + title = getString(R.string.demo_task_list_work_task1), + notes = getString(R.string.demo_task_list_work_task1_notes), + parentListLocalId = workListId, + dueDate = Clock.System.now() - 1.days, + lastUpdateDate = Clock.System.now(), + position = "1", + isCompleted = false, + ) + ) + val teamMeetingTaskId = taskDao.insert( + TaskEntity( + remoteId = "work_task2", + title = getString(R.string.demo_task_list_work_task2), + notes = getString(R.string.demo_task_list_work_task2_notes), + parentListLocalId = workListId, + dueDate = Clock.System.now(), + lastUpdateDate = Clock.System.now(), + position = "2", + isCompleted = false, + ) + ) + taskDao.insert( + TaskEntity( + remoteId = "work_task3", + title = getString(R.string.demo_task_list_work_task3), + notes = getString(R.string.demo_task_list_work_task3_notes), + parentListLocalId = workListId, + parentTaskLocalId = teamMeetingTaskId, + parentTaskRemoteId = "work_task2", + dueDate = null, + lastUpdateDate = Clock.System.now(), + position = "1", + isCompleted = false, + ) + ) + } + } + } +} \ No newline at end of file diff --git a/tasks-app-android/src/demo/res/values/strings.xml b/tasks-app-android/src/demo/res/values/strings.xml index 82e4ee2b..903a8af9 100644 --- a/tasks-app-android/src/demo/res/values/strings.xml +++ b/tasks-app-android/src/demo/res/values/strings.xml @@ -1,5 +1,5 @@