From c5393f3eaa5207130ae4999844331db5a783c3f0 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Fri, 4 Feb 2022 19:06:39 +0100
Subject: [PATCH 01/10] Allow searchable serialization to fail
---
.../de/mm20/launcher2/favorites/FavoritesItem.kt | 5 +++--
.../mm20/launcher2/favorites/FavoritesRepository.kt | 12 +++++++-----
.../main/java/de/mm20/launcher2/favorites/Module.kt | 2 +-
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesItem.kt b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesItem.kt
index 8dd6444f..2bff334f 100644
--- a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesItem.kt
+++ b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesItem.kt
@@ -18,9 +18,10 @@ data class FavoritesItem(
var pinPosition: Int,
var hidden: Boolean
) : KoinComponent {
- private val serializer: SearchableSerializer by inject { parametersOf(searchable) }
+ private val serializer: SearchableSerializer? by inject { parametersOf(searchable) }
- fun toDatabaseEntity(): FavoritesItemEntity {
+ fun toDatabaseEntity(): FavoritesItemEntity? {
+ val serializer = serializer ?: return null
return FavoritesItemEntity(
key = key,
diff --git a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt
index 48aba1f3..585ee9d6 100644
--- a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt
+++ b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt
@@ -103,7 +103,7 @@ internal class FavoritesRepositoryImpl(
pinPosition = 1,
hidden = false
)
- dao.insertReplaceExisting(favoritesItem.toDatabaseEntity())
+ favoritesItem.toDatabaseEntity()?.let { dao.insertReplaceExisting(it) }
}
}
}
@@ -132,7 +132,7 @@ internal class FavoritesRepositoryImpl(
pinPosition = 0,
hidden = true
)
- dao.insertReplaceExisting(favoritesItem.toDatabaseEntity())
+ favoritesItem.toDatabaseEntity()?.let { dao.insertReplaceExisting(it) }
}
}
}
@@ -149,8 +149,10 @@ internal class FavoritesRepositoryImpl(
scope.launch {
withContext(Dispatchers.IO) {
val item = FavoritesItem(searchable.key, searchable, 0, 0, false)
- AppDatabase.getInstance(context).searchDao()
- .incrementLaunchCount(item.toDatabaseEntity())
+ item.toDatabaseEntity()?.let {
+ AppDatabase.getInstance(context).searchDao()
+ .incrementLaunchCount(it)
+ }
}
}
}
@@ -167,7 +169,7 @@ internal class FavoritesRepositoryImpl(
scope.launch {
withContext(Dispatchers.IO) {
AppDatabase.getInstance(context).searchDao()
- .saveFavorites(favorites.map { it.toDatabaseEntity() })
+ .saveFavorites(favorites.mapNotNull { it.toDatabaseEntity() })
}
}
}
diff --git a/favorites/src/main/java/de/mm20/launcher2/favorites/Module.kt b/favorites/src/main/java/de/mm20/launcher2/favorites/Module.kt
index 3759ef60..ea8939dc 100644
--- a/favorites/src/main/java/de/mm20/launcher2/favorites/Module.kt
+++ b/favorites/src/main/java/de/mm20/launcher2/favorites/Module.kt
@@ -50,7 +50,7 @@ val favoritesModule = module {
if (searchable is Website) {
return@factory WebsiteSerializer()
}
- throw IllegalArgumentException("No known serializer exists for type ${searchable.javaClass.canonicalName}")
+ return@factory null
}
factory { (serialized: String) ->
From dfb198dd83c1c671522bda6be35e92068ea1dd5d Mon Sep 17 00:00:00 2001
From: BrightDV <92821484+BrightDV@users.noreply.github.com>
Date: Sun, 6 Feb 2022 15:28:37 +0100
Subject: [PATCH 02/10] correcting typo
---
i18n/src/main/res/values/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml
index c4f9cf6f..586f243d 100644
--- a/i18n/src/main/res/values/strings.xml
+++ b/i18n/src/main/res/values/strings.xml
@@ -210,7 +210,7 @@
Configure icon badges
Notification badges
Show a badge for applications with unread notifications
- Show a badge for suspended applicatoins
+ Show a badge for suspended applications
Suspended apps
Cloud badges
Show a badge for files that are stored in a cloud
From 7ba13a8ba75b7ab8d0c1b7d11902adceaa7eda05 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Sun, 6 Feb 2022 18:32:45 +0100
Subject: [PATCH 03/10] Upgrade AGP
---
build.gradle.kts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle.kts b/build.gradle.kts
index ee2a1325..43f8e21d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath("com.android.tools.build:gradle:7.1.0")
+ classpath("com.android.tools.build:gradle:7.1.1")
classpath(libs.kotlin.gradle)
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10")
// NOTE: Do not place your application dependencies here; they belong
From 7ad36684aed34098665400b35c68ec708b6990c3 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Sun, 6 Feb 2022 18:51:24 +0100
Subject: [PATCH 04/10] Open Nextcloud files in Nextcloud app if installed
---
.../launcher2/search/data/NextcloudFile.kt | 37 +++++++++++++------
1 file changed, 26 insertions(+), 11 deletions(-)
diff --git a/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt b/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt
index 792e286b..a1022ced 100644
--- a/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt
+++ b/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt
@@ -2,20 +2,18 @@ package de.mm20.launcher2.search.data
import android.content.Context
import android.content.Intent
+import android.content.pm.PackageManager
import android.net.Uri
-import de.mm20.launcher2.files.R
-import de.mm20.launcher2.helper.NetworkUtils
-import de.mm20.launcher2.nextcloud.NextcloudApiHelper
class NextcloudFile(
- fileId: Long,
- override val label: String,
- path: String,
- mimeType: String,
- size: Long,
- isDirectory: Boolean,
- val server: String,
- metaData: List>
+ fileId: Long,
+ override val label: String,
+ path: String,
+ mimeType: String,
+ size: Long,
+ isDirectory: Boolean,
+ val server: String,
+ metaData: List>
) : File(fileId, path, mimeType, size, isDirectory, metaData) {
override val badgeKey: String = "nextcloud://"
@@ -25,9 +23,26 @@ class NextcloudFile(
get() = true
override fun getLaunchIntent(context: Context): Intent? {
+ var nextcloudApp: String? = null
return Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse("$server/f/$id")
flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ `package` = getNextcloudAppPackage(context)
+ }
+ }
+
+ companion object {
+ private fun getNextcloudAppPackage(context: Context): String? {
+ val candidates = listOf("com.nextcloud.client", "com.nextcloud.android.beta")
+
+ for (c in candidates) {
+ try {
+ context.packageManager.getPackageInfo(c, 0)
+ return c
+ } catch (e: PackageManager.NameNotFoundException) {
+ }
+ }
+ return null
}
}
}
\ No newline at end of file
From 5f9450d09903cee5e50a5a7424a4efaf83196443 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Sun, 6 Feb 2022 18:57:14 +0100
Subject: [PATCH 05/10] Ah yes
Please concentrate.
---
.../src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt | 1 -
1 file changed, 1 deletion(-)
diff --git a/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt b/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt
index a1022ced..5bff0dae 100644
--- a/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt
+++ b/files/src/main/java/de/mm20/launcher2/search/data/NextcloudFile.kt
@@ -23,7 +23,6 @@ class NextcloudFile(
get() = true
override fun getLaunchIntent(context: Context): Intent? {
- var nextcloudApp: String? = null
return Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse("$server/f/$id")
flags = Intent.FLAG_ACTIVITY_NEW_TASK
From 9280056d880d730de93c7fe6845ddc97d092c8ad Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Sun, 6 Feb 2022 23:35:15 +0100
Subject: [PATCH 06/10] Initialize default web searches with color = 0
Use the app theme's primary color for search icons instead of crappy pseudo brand colors
---
.../src/main/java/de/mm20/launcher2/database/AppDatabase.kt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/database/src/main/java/de/mm20/launcher2/database/AppDatabase.kt b/database/src/main/java/de/mm20/launcher2/database/AppDatabase.kt
index 5088bb12..5a61f8f7 100644
--- a/database/src/main/java/de/mm20/launcher2/database/AppDatabase.kt
+++ b/database/src/main/java/de/mm20/launcher2/database/AppDatabase.kt
@@ -35,9 +35,9 @@ abstract class AppDatabase : RoomDatabase() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
db.execSQL("INSERT INTO Websearch (urlTemplate, label, color, icon) VALUES " +
- "('${context.getString(R.string.websearch_google_url)}', '${context.getString(R.string.websearch_google)}', 0xFF4285F4, NULL )," +
- "('${context.getString(R.string.websearch_youtube_url)}', '${context.getString(R.string.websearch_youtube)}', 0xFFFF0000, NULL )," +
- "('${context.getString(R.string.websearch_playstore_url)}', '${context.getString(R.string.websearch_playstore)}', 0xFF00D3FF, NULL );")
+ "('${context.getString(R.string.websearch_google_url)}', '${context.getString(R.string.websearch_google)}', 0, NULL )," +
+ "('${context.getString(R.string.websearch_youtube_url)}', '${context.getString(R.string.websearch_youtube)}', 0, NULL )," +
+ "('${context.getString(R.string.websearch_playstore_url)}', '${context.getString(R.string.websearch_playstore)}', 0, NULL );")
db.execSQL("INSERT INTO Widget (type, data, height, position, label) VALUES " +
"('internal', 'weather', -1, 0, '${context.getString(R.string.widget_name_weather)}')," +
From 5c104f76ee857d9866fffe4627b848e882359a27 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Mon, 7 Feb 2022 11:16:35 +0100
Subject: [PATCH 07/10] Remove obsolete WidgetViewModel
---
.../java/de/mm20/launcher2/widgets/Module.kt | 1 -
.../mm20/launcher2/widgets/WidgetViewModel.kt | 30 -------------------
2 files changed, 31 deletions(-)
delete mode 100644 widgets/src/main/java/de/mm20/launcher2/widgets/WidgetViewModel.kt
diff --git a/widgets/src/main/java/de/mm20/launcher2/widgets/Module.kt b/widgets/src/main/java/de/mm20/launcher2/widgets/Module.kt
index 8a6e4d1b..d1759bc0 100644
--- a/widgets/src/main/java/de/mm20/launcher2/widgets/Module.kt
+++ b/widgets/src/main/java/de/mm20/launcher2/widgets/Module.kt
@@ -6,5 +6,4 @@ import org.koin.dsl.module
val widgetsModule = module {
single { WidgetRepository(androidContext()) }
- viewModel { WidgetViewModel(get()) }
}
\ No newline at end of file
diff --git a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetViewModel.kt b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetViewModel.kt
deleted file mode 100644
index 6a690334..00000000
--- a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetViewModel.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package de.mm20.launcher2.widgets
-
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-
-class WidgetViewModel(
- private val widgetRepository: WidgetRepository
-) : ViewModel() {
-
-
- suspend fun getWidgets(): List {
- return withContext(viewModelScope.coroutineContext + Dispatchers.IO) {
- widgetRepository.getWidgets()
- }
- }
-
- fun saveWidgets(widgets: List) {
- viewModelScope.launch(Dispatchers.IO) {
- widgetRepository.saveWidgets(widgets)
- }
- }
-
- fun getInternalWidgets(): List {
- return widgetRepository.getInternalWidgets()
- }
-
-}
\ No newline at end of file
From fb407afe216570eb10b682572e8e1a8d7f0c4982 Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Mon, 7 Feb 2022 11:18:31 +0100
Subject: [PATCH 08/10] Save widgets in WidgetRepository coroutine scope
---
.../launcher2/ui/launcher/widgets/WidgetsVM.kt | 10 +++-------
.../de/mm20/launcher2/widgets/WidgetRepository.kt | 14 ++++++++------
2 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt
index 70f9ad2e..39693231 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt
@@ -3,14 +3,12 @@ package de.mm20.launcher2.ui.launcher.widgets
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
-import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.widgets.Widget
import de.mm20.launcher2.widgets.WidgetRepository
-import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
-class WidgetsVM: ViewModel(), KoinComponent {
+class WidgetsVM : ViewModel(), KoinComponent {
private val widgetRepository: WidgetRepository by inject()
val isEditMode = MutableLiveData(false)
@@ -24,12 +22,10 @@ class WidgetsVM: ViewModel(), KoinComponent {
}
fun saveWidgets(widgets: List) {
- viewModelScope.launch {
- widgetRepository.saveWidgets(widgets)
- }
+ widgetRepository.saveWidgets(widgets)
}
- fun getInternalWidgets() : List {
+ fun getInternalWidgets(): List {
return widgetRepository.getInternalWidgets()
}
}
\ No newline at end of file
diff --git a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt
index 65e3de6e..9d08cb96 100644
--- a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt
+++ b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt
@@ -3,15 +3,15 @@ package de.mm20.launcher2.widgets
import android.content.Context
import de.mm20.launcher2.widgets.R
import de.mm20.launcher2.database.AppDatabase
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.withContext
+import kotlinx.coroutines.*
import java.util.concurrent.Executors
class WidgetRepository(
val context: Context
) {
+ private val scope = CoroutineScope(Job() + Dispatchers.Default)
+
suspend fun getWidgets(): List {
return withContext(Dispatchers.IO) {
AppDatabase.getInstance(context).widgetDao().getWidgets().map { Widget(it) }
@@ -27,9 +27,11 @@ class WidgetRepository(
}
- suspend fun saveWidgets(widgets: List) {
- withContext(Dispatchers.IO) {
- AppDatabase.getInstance(context).widgetDao().updateWidgets(widgets.mapIndexed { i, widget -> widget.toDatabaseEntity(i) })
+ fun saveWidgets(widgets: List) {
+ scope.launch {
+ withContext(Dispatchers.IO) {
+ AppDatabase.getInstance(context).widgetDao().updateWidgets(widgets.mapIndexed { i, widget -> widget.toDatabaseEntity(i) })
+ }
}
}
}
\ No newline at end of file
From e8a5c1f24b7a8d723d25ae8e75a5ca766795362f Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Mon, 7 Feb 2022 18:35:08 +0100
Subject: [PATCH 09/10] Fix #22
Refresh widgets in widget view model after widgets have been changed
---
.../main/java/de/mm20/launcher2/database/WidgetDao.kt | 3 ++-
.../mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt | 5 ++---
.../de/mm20/launcher2/widgets/WidgetRepository.kt | 11 +++++++----
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt b/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt
index ef317713..d1584204 100644
--- a/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt
+++ b/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt
@@ -3,11 +3,12 @@ package de.mm20.launcher2.database
import androidx.lifecycle.LiveData
import androidx.room.*
import de.mm20.launcher2.database.entities.WidgetEntity
+import kotlinx.coroutines.flow.Flow
@Dao
interface WidgetDao {
@Query("SELECT * FROM Widget ORDER BY position ASC")
- fun getWidgets(): List
+ fun getWidgets(): Flow>
@Transaction
fun updateWidgets(widgets: List) {
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt
index 39693231..1f9db8df 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsVM.kt
@@ -2,6 +2,7 @@ package de.mm20.launcher2.ui.launcher.widgets
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
+import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData
import de.mm20.launcher2.widgets.Widget
import de.mm20.launcher2.widgets.WidgetRepository
@@ -13,9 +14,7 @@ class WidgetsVM : ViewModel(), KoinComponent {
val isEditMode = MutableLiveData(false)
- val widgets = liveData?> {
- emit(widgetRepository.getWidgets())
- }
+ val widgets = widgetRepository.getWidgets().asLiveData()
fun setEditMode(editMode: Boolean) {
isEditMode.value = editMode
diff --git a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt
index 9d08cb96..3d003361 100644
--- a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt
+++ b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt
@@ -4,6 +4,9 @@ import android.content.Context
import de.mm20.launcher2.widgets.R
import de.mm20.launcher2.database.AppDatabase
import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
import java.util.concurrent.Executors
class WidgetRepository(
@@ -12,10 +15,10 @@ class WidgetRepository(
private val scope = CoroutineScope(Job() + Dispatchers.Default)
- suspend fun getWidgets(): List {
- return withContext(Dispatchers.IO) {
- AppDatabase.getInstance(context).widgetDao().getWidgets().map { Widget(it) }
- }
+ fun getWidgets(): Flow> {
+ return AppDatabase.getInstance(context).widgetDao()
+ .getWidgets()
+ .map { it.map { Widget(it) } }
}
fun getInternalWidgets(): List {
From 658a29427c5ea5d191715d7d32dfc1a37ed3b64a Mon Sep 17 00:00:00 2001
From: MM20 <15646950+MM2-0@users.noreply.github.com>
Date: Mon, 7 Feb 2022 18:36:56 +0100
Subject: [PATCH 10/10] Version 1.4.3
---
app/build.gradle.kts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 2ffa6a3a..ea9c077f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -26,7 +26,7 @@ android {
minSdk = sdk.versions.minSdk.get().toInt()
targetSdk = sdk.versions.targetSdk.get().toInt()
versionCode = versionCodeDate()
- versionName = "1.4.2"
+ versionName = "1.4.3"
multiDexEnabled = true
signingConfig = signingConfigs.getByName("debug")
}