diff --git a/metadata/de.mm20.launcher2.release.yml b/metadata/de.mm20.launcher2.release.yml index 3cc8c621a4..89c624ed3d 100644 --- a/metadata/de.mm20.launcher2.release.yml +++ b/metadata/de.mm20.launcher2.release.yml @@ -74,6 +74,15 @@ Builds: data/files/build.gradle.kts services/accounts/build.gradle.kts; do sed -i 's/^.*:ms-services.*$//' "$i"; sed -i 's/^.*:g-services.*$//' "$i"; done + - versionName: 1.25.0-fdroid + versionCode: 2023051600 + commit: 1ddee5d493db70e3d259080c82cf00c66520b7ba + patch: + - remove_ms_g_2023051600.patch + gradle: + - fdroid + output: app/app/build/outputs/apk/fdroid/release/app-fdroid-release-unsigned.apk + MaintainerNotes: |- Kvaesitso uses several external APIs for search providers. Several of them require signing up to obtain a developer API @@ -105,7 +114,11 @@ MaintainerNotes: |- Upstream provides an fdroid flavor, however there's no difference and it still needs to be patched. + For some reason, f-droid fails to pick up the correct gradle + version (compilation fails with default gradle version) + from distributionUrl if subdir is used. + AutoUpdateMode: None UpdateCheckMode: None -CurrentVersion: 1.21.1-fdroid -CurrentVersionCode: 2023012300 +CurrentVersion: 1.25.0-fdroid +CurrentVersionCode: 2023051600 diff --git a/metadata/de.mm20.launcher2.release/remove_ms_g_2023051600.patch b/metadata/de.mm20.launcher2.release/remove_ms_g_2023051600.patch new file mode 100644 index 0000000000..9b2727b918 --- /dev/null +++ b/metadata/de.mm20.launcher2.release/remove_ms_g_2023051600.patch @@ -0,0 +1,848 @@ +diff --git a/app/app/build.gradle.kts b/app/app/build.gradle.kts +index b4bfb556..5980764a 100644 +--- a/app/app/build.gradle.kts ++++ b/app/app/build.gradle.kts +@@ -74,11 +74,6 @@ android { + } + } + } +- configurations.all { +- //Fixes Error: Duplicate class: com.google.common.util.concurrent.ListenableFuture +- exclude(group = "com.google.guava", module = "listenablefuture") +- exclude(group = "org.apache.httpcomponents", module = "httpclient") +- } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 +@@ -131,11 +126,9 @@ dependencies { + implementation(project(":data:customattrs")) + implementation(project(":data:searchable")) + implementation(project(":data:files")) +- implementation(project(":libs:g-services")) + implementation(project(":core:i18n")) + implementation(project(":services:icons")) + implementation(project(":core:ktx")) +- implementation(project(":libs:ms-services")) + implementation(project(":services:music")) + implementation(project(":libs:nextcloud")) + implementation(project(":data:notifications")) +@@ -158,4 +151,4 @@ dependencies { + + // Uncomment this if you want annoying notifications in your debug builds yelling at you how terrible your code is + //debugImplementation(libs.leakcanary) +-} +\ No newline at end of file ++} +diff --git a/app/ui/build.gradle.kts b/app/ui/build.gradle.kts +index 5be3525b..c3ac9b5f 100644 +--- a/app/ui/build.gradle.kts ++++ b/app/ui/build.gradle.kts +@@ -139,8 +139,6 @@ dependencies { + implementation(project(":data:websites")) + implementation(project(":data:unitconverter")) + implementation(project(":libs:nextcloud")) +- implementation(project(":libs:g-services")) +- implementation(project(":libs:ms-services")) + implementation(project(":libs:owncloud")) + implementation(project(":services:accounts")) + implementation(project(":services:backup")) +@@ -148,4 +146,4 @@ dependencies { + implementation(project(":services:global-actions")) + implementation(project(":services:widgets")) + implementation(project(":services:favorites")) +-} +\ No newline at end of file ++} +diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreenVM.kt +index 3e629b79..ba76be2d 100644 +--- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreenVM.kt ++++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreenVM.kt +@@ -15,9 +15,9 @@ class BuildInfoSettingsScreenVM : ViewModel(), KoinComponent { + private val availableWeatherProviders = weatherRepository.getAvailableProviders() + + val buildFeatures = mapOf( +- "Accounts: Google" to accountsRepository.isSupported(AccountType.Google), ++ "Accounts: Google" to false, + "Weather providers: HERE" to availableWeatherProviders.contains(WeatherProvider.Here), + "Weather providers: Met No" to availableWeatherProviders.contains(WeatherProvider.MetNo), + "Weather providers: OpenWeatherMap" to availableWeatherProviders.contains(WeatherProvider.OpenWeatherMap), + ) +-} +\ No newline at end of file ++} +diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt +index ef7ef245..dea27124 100644 +--- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt ++++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt +@@ -139,42 +139,7 @@ fun FileSearchSettingsScreen() { + }, + enabled = owncloudAccount != null + ) +- +- if (viewModel.googleAvailable) { +- val gdrive by viewModel.gdrive.collectAsState() +- val googleAccount by viewModel.googleAccount +- AnimatedVisibility(googleAccount == null) { +- Banner( +- text = stringResource(R.string.no_account_google), +- icon = Icons.Rounded.AccountBox, +- primaryAction = { +- TextButton(onClick = { +- viewModel.login( +- context as AppCompatActivity, +- AccountType.Google +- ) +- }) { +- Text( +- stringResource(R.string.connect_account), +- ) +- } +- }, +- modifier = Modifier.padding(16.dp) +- ) +- } +- SwitchPreference( +- title = stringResource(R.string.preference_search_gdrive), +- summary = googleAccount?.let { +- stringResource(R.string.preference_search_gdrive_summary, it.userName) +- } ?: stringResource(R.string.preference_summary_not_logged_in), +- value = gdrive == true && googleAccount != null, +- onValueChanged = { +- viewModel.setGdrive(it) +- }, +- enabled = googleAccount != null +- ) +- } + } + } + } +-} +\ No newline at end of file ++} +diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreenVM.kt +index af6c07d2..27a507af 100644 +--- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreenVM.kt ++++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreenVM.kt +@@ -28,9 +28,6 @@ class FileSearchSettingsScreenVM : ViewModel(), KoinComponent { + val loading = mutableStateOf(true) + val nextcloudAccount = mutableStateOf(null) + val owncloudAccount = mutableStateOf(null) +- val googleAccount = mutableStateOf(null) +- +- val googleAvailable = accountsRepository.isSupported(AccountType.Google) + + fun onResume() { + viewModelScope.launch { +@@ -38,7 +35,6 @@ class FileSearchSettingsScreenVM : ViewModel(), KoinComponent { + accountsRepository.getCurrentlySignedInAccount(AccountType.Nextcloud) + owncloudAccount.value = + accountsRepository.getCurrentlySignedInAccount(AccountType.Owncloud) +- googleAccount.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Google) + loading.value = false + } + } +@@ -75,38 +71,6 @@ class FileSearchSettingsScreenVM : ViewModel(), KoinComponent { + } + } + +- val gdrive = dataStore.data.map { it.fileSearch.gdrive } +- .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) +- fun setGdrive(gdrive: Boolean) { +- viewModelScope.launch { +- dataStore.updateData { +- it.toBuilder() +- .setFileSearch( +- it.fileSearch +- .toBuilder() +- .setGdrive(gdrive) +- ) +- .build() +- } +- } +- } +- +- val onedrive = dataStore.data.map { it.fileSearch.onedrive } +- .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) +- fun setOneDrive(onedrive: Boolean) { +- viewModelScope.launch { +- dataStore.updateData { +- it.toBuilder() +- .setFileSearch( +- it.fileSearch +- .toBuilder() +- .setOnedrive(onedrive) +- ) +- .build() +- } +- } +- } +- + val owncloud = dataStore.data.map { it.fileSearch.owncloud } + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) + fun setOwncloud(owncloud: Boolean) { +@@ -130,4 +94,4 @@ class FileSearchSettingsScreenVM : ViewModel(), KoinComponent { + fun login(context: AppCompatActivity, accountType: AccountType) { + accountsRepository.signin(context, accountType) + } +-} +\ No newline at end of file ++} +diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt +index b220fa8a..26895dbd 100644 +--- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt ++++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt +@@ -55,8 +55,6 @@ fun IntegrationsSettingsScreen() { + + val owncloudUser by viewModel.owncloudUser + val nextcloudUser by viewModel.nextcloudUser +- val msUser by viewModel.msUser +- val googleUser by viewModel.googleUser + + val loading by viewModel.loading + +@@ -126,69 +124,7 @@ fun IntegrationsSettingsScreen() { + }, + enabled = !loading, + ) +- +- if (viewModel.isGoogleAvailable) { +- Preference( +- title = if (googleUser != null) { +- stringResource(R.string.preference_google) +- } else { +- stringResource(R.string.preference_google_signin) +- }, +- summary = googleUser?.let { +- stringResource(R.string.preference_signin_user, it.userName) +- } ?: stringResource(R.string.preference_google_signin_summary), +- onClick = { +- if (googleUser != null) { +- viewModel.signOut(AccountType.Google) +- } else { +- viewModel.signIn( +- context as AppCompatActivity, +- AccountType.Google +- ) +- } +- }, +- enabled = !loading, +- ) +- } + } + } + } + } +- +-@Composable +-fun GoogleSigninButton( +- onClick: () -> Unit, +-) { +- Surface( +- modifier = Modifier.height(40.dp), +- shadowElevation = 1.dp, +- color = Color.White, +- shape = RoundedCornerShape(2.dp), +- onClick = onClick +- ) { +- Row( +- verticalAlignment = Alignment.CenterVertically +- ) { +- Box( +- modifier = Modifier +- .size(40.dp) +- .background(Color.White), +- contentAlignment = Alignment.Center +- ) { +- Image( +- modifier = Modifier.size(18.dp), +- painter = painterResource(id = R.drawable.ic_google_g), +- contentDescription = null +- ) +- } +- Text( +- modifier = Modifier.padding(start = 13.dp, end = 8.dp), +- text = stringResource(id = R.string.preference_google_signin), +- fontFamily = FontFamily.SansSerif, +- color = Color(0f, 0f, 0f, 0.54f), +- fontSize = 14.sp, +- fontWeight = FontWeight.Medium +- ) +- } +- } +-} +\ No newline at end of file +diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreenVM.kt +index 97574426..31766768 100644 +--- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreenVM.kt ++++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreenVM.kt +@@ -14,10 +14,6 @@ import org.koin.core.component.inject + class IntegrationsSettingsScreenVM : ViewModel(), KoinComponent { + private val accountsRepository: AccountsRepository by inject() + +- val isGoogleAvailable = accountsRepository.isSupported(AccountType.Google) +- +- val googleUser = mutableStateOf(null) +- val msUser= mutableStateOf(null) + val nextcloudUser = mutableStateOf(null) + val owncloudUser = mutableStateOf(null) + +@@ -26,7 +22,6 @@ class IntegrationsSettingsScreenVM : ViewModel(), KoinComponent { + fun onResume() { + viewModelScope.launch { + loading.value = true +- googleUser.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Google) + nextcloudUser.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Nextcloud) + owncloudUser.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Owncloud) + loading.value = false +@@ -40,9 +35,8 @@ class IntegrationsSettingsScreenVM : ViewModel(), KoinComponent { + fun signOut(accountType: AccountType) { + accountsRepository.signout(accountType) + when(accountType){ +- AccountType.Google -> googleUser.value = null + AccountType.Nextcloud -> nextcloudUser.value = null + AccountType.Owncloud -> owncloudUser.value = null + } + } +-} +\ No newline at end of file ++} +diff --git a/build.gradle.kts b/build.gradle.kts +index 48481b37..9d9bbebd 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -21,7 +21,6 @@ allprojects { + repositories { + google() + mavenCentral() +- maven(url = "https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1") + jcenter() // For tinypinyin + } + } +@@ -30,4 +29,4 @@ tasks.create("clean") { + delete(rootProject.buildDir) + } + +-apply(from = "docs/deps-graph.gradle") +\ No newline at end of file ++apply(from = "docs/deps-graph.gradle") +diff --git a/data/files/build.gradle.kts b/data/files/build.gradle.kts +index fcb863d3..70558bd9 100644 +--- a/data/files/build.gradle.kts ++++ b/data/files/build.gradle.kts +@@ -46,11 +46,9 @@ dependencies { + + implementation(project(":core:base")) + implementation(project(":core:ktx")) +- implementation(project(":libs:ms-services")) +- implementation(project(":libs:g-services")) + implementation(project(":libs:nextcloud")) + implementation(project(":libs:owncloud")) + implementation(project(":core:i18n")) + implementation(project(":core:permissions")) + implementation(project(":core:crashreporter")) +-} +\ No newline at end of file ++} +diff --git a/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt b/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt +index f660d6b5..17cd9913 100644 +--- a/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt ++++ b/data/files/src/main/java/de/mm20/launcher2/files/FileSerialization.kt +@@ -72,127 +72,12 @@ class LocalFileDeserializer( + return null + } + } +- +-class GDriveFileSerializer : SearchableSerializer { +- override fun serialize(searchable: SavableSearchable): String { +- searchable as GDriveFile +- return jsonObjectOf( +- "id" to searchable.fileId, +- "label" to searchable.label, +- "path" to searchable.path, +- "mimeType" to searchable.mimeType, +- "size" to searchable.size, +- "directory" to searchable.isDirectory, +- "color" to searchable.directoryColor, +- "uri" to searchable.viewUri +- ).apply { +- for ((k, v) in searchable.metaData) { +- put( +- when (k) { +- R.string.file_meta_owner -> "owner" +- R.string.file_meta_dimensions -> "dimensions" +- else -> "other" +- }, v +- ) +- } +- }.toString() +- } +- +- override val typePrefix: String +- get() = "gdrive" +-} +- +-class GDriveFileDeserializer : SearchableDeserializer { +- override fun deserialize(serialized: String): SavableSearchable { +- val json = JSONObject(serialized) +- val id = json.getString("id") +- val label = json.getString("label") +- val path = json.getString("path") +- val mimeType = json.getString("mimeType") +- val size = json.getLong("size") +- val directory = json.getBoolean("directory") +- val color = json.optString("color") +- val uri = json.getString("uri") +- val owner = json.optString("owner") +- val dimensions = json.optString("dimensions") +- val metaData = mutableListOf>() +- owner.takeIf { it.isNotEmpty() }?.let { metaData.add(R.string.file_meta_owner to it) } +- dimensions.takeIf { it.isNotEmpty() } +- ?.let { metaData.add(R.string.file_meta_dimensions to it) } +- return GDriveFile( +- fileId = id, +- label = label, +- path = path, +- mimeType = mimeType, +- size = size, +- directoryColor = color, +- isDirectory = directory, +- viewUri = uri, +- metaData = metaData +- ) +- } +-} +- +-class OneDriveFileSerializer : SearchableSerializer { +- override fun serialize(searchable: SavableSearchable): String { +- searchable as OneDriveFile +- return jsonObjectOf( +- "id" to searchable.fileId, +- "label" to searchable.label, +- "mimeType" to searchable.mimeType, +- "size" to searchable.size, +- "directory" to searchable.isDirectory, +- "webUrl" to searchable.webUrl +- ).apply { +- for ((k, v) in searchable.metaData) { +- put( +- when (k) { +- R.string.file_meta_owner -> "owner" +- R.string.file_meta_dimensions -> "dimensions" +- else -> "other" +- }, v +- ) +- } +- }.toString() +- } +- +- override val typePrefix: String +- get() = "onedrive" +-} +- +-class OneDriveFileDeserializer : SearchableDeserializer { +- override fun deserialize(serialized: String): SavableSearchable { +- val json = JSONObject(serialized) +- val fileId = json.getString("id") +- val label = json.getString("label") +- val mimeType = json.getString("mimeType") +- val size = json.getLong("size") +- val isDirectory = json.getBoolean("directory") +- val webUrl = json.getString("webUrl") +- val owner = json.optString("owner") +- val dimensions = json.optString("dimensions") +- val metaData = mutableListOf>() +- owner.takeIf { it.isNotEmpty() }?.let { metaData.add(R.string.file_meta_owner to it) } +- dimensions.takeIf { it.isNotEmpty() } +- ?.let { metaData.add(R.string.file_meta_dimensions to it) } +- return OneDriveFile( +- fileId = fileId, +- label = label, +- path = "", +- mimeType = mimeType, +- size = size, +- isDirectory = isDirectory, +- metaData = metaData, +- webUrl = webUrl +- ) +- } +-} +- + class NextcloudFileSerializer : SearchableSerializer { + override fun serialize(searchable: SavableSearchable): String { + searchable as NextcloudFile + return jsonObjectOf( +- "id" to searchable.fileId, ++ ++ "id" to searchable.fileId, + "label" to searchable.label, + "path" to searchable.path, + "mimeType" to searchable.mimeType, +@@ -292,4 +177,4 @@ class OwncloudFileDeserializer : SearchableDeserializer { + + ) + } +-} +\ No newline at end of file ++} +diff --git a/data/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt b/data/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt +index 74792735..ff930e6d 100644 +--- a/data/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt ++++ b/data/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt +@@ -2,7 +2,6 @@ package de.mm20.launcher2.files + + import android.content.Context + import de.mm20.launcher2.files.providers.FileProvider +-import de.mm20.launcher2.files.providers.GDriveFileProvider + import de.mm20.launcher2.files.providers.LocalFileProvider + import de.mm20.launcher2.files.providers.NextcloudFileProvider + import de.mm20.launcher2.files.providers.OwncloudFileProvider +@@ -24,8 +23,6 @@ interface FileRepository { + fun search( + query: String, + local: Boolean = true, +- gdrive: Boolean = true, +- onedrive: Boolean = true, + nextcloud: Boolean = true, + owncloud: Boolean = true, + ): Flow> +@@ -50,8 +47,6 @@ internal class FileRepositoryImpl( + override fun search( + query: String, + local: Boolean, +- gdrive: Boolean, +- onedrive: Boolean, + nextcloud: Boolean, + owncloud: Boolean + ) = channelFlow { +@@ -63,7 +58,6 @@ internal class FileRepositoryImpl( + val providers = mutableListOf() + + if (local) providers.add(LocalFileProvider(context, permissionsManager)) +- if (gdrive) providers.add(GDriveFileProvider(context)) + if (nextcloud) providers.add(NextcloudFileProvider(nextcloudClient)) + if (owncloud) providers.add(OwncloudFileProvider(owncloudClient)) + +@@ -85,4 +79,4 @@ internal class FileRepositoryImpl( + } + } + } +-} +\ No newline at end of file ++} +diff --git a/data/files/src/main/java/de/mm20/launcher2/files/providers/GDriveFileProvider.kt b/data/files/src/main/java/de/mm20/launcher2/files/providers/GDriveFileProvider.kt +deleted file mode 100644 +index f6287616..00000000 +--- a/data/files/src/main/java/de/mm20/launcher2/files/providers/GDriveFileProvider.kt ++++ /dev/null +@@ -1,40 +0,0 @@ +-package de.mm20.launcher2.files.providers +- +-import android.content.Context +-import de.mm20.launcher2.files.R +-import de.mm20.launcher2.gservices.DriveFileMeta +-import de.mm20.launcher2.gservices.GoogleApiHelper +-import de.mm20.launcher2.search.data.File +-import de.mm20.launcher2.search.data.GDriveFile +- +-internal class GDriveFileProvider( +- private val context: Context +-) : FileProvider { +- override suspend fun search(query: String): List { +- if (query.length < 4) return emptyList() +- val driveFiles = GoogleApiHelper.getInstance(context).queryGDriveFiles(query) +- return driveFiles.map { +- GDriveFile( +- fileId = it.fileId, +- label = it.label, +- size = it.size, +- mimeType = it.mimeType, +- isDirectory = it.isDirectory, +- path = "", +- directoryColor = it.directoryColor, +- viewUri = it.viewUri, +- metaData = getMetadata(it.metadata) +- ) +- } +- } +- +- private fun getMetadata(file: DriveFileMeta): List> { +- val metaData = mutableListOf>() +- val owners = file.owners +- metaData.add(R.string.file_meta_owner to owners.joinToString(separator = ", ")) +- val width = file.width ?: file.width +- val height = file.height ?: file.height +- if (width != null && height != null) metaData.add(R.string.file_meta_dimensions to "${width}x$height") +- return metaData +- } +-} +\ No newline at end of file +diff --git a/data/searchable/src/main/java/de/mm20/launcher2/searchable/Serialization.kt b/data/searchable/src/main/java/de/mm20/launcher2/searchable/Serialization.kt +index cac42fd1..8152f94f 100644 +--- a/data/searchable/src/main/java/de/mm20/launcher2/searchable/Serialization.kt ++++ b/data/searchable/src/main/java/de/mm20/launcher2/searchable/Serialization.kt +@@ -46,12 +46,6 @@ internal fun getSerializer(searchable: Searchable?): SearchableSerializer { + if (searchable is Wikipedia) { + return WikipediaSerializer() + } +- if (searchable is GDriveFile) { +- return GDriveFileSerializer() +- } +- if (searchable is OneDriveFile) { +- return OneDriveFileSerializer() +- } + if (searchable is OwncloudFile) { + return OwncloudFileSerializer() + } +@@ -89,12 +83,6 @@ internal fun getDeserializer(context: Context, type: String): SearchableDeserial + if (type == Wikipedia.Domain) { + return WikipediaDeserializer(context) + } +- if (type == GDriveFile.Domain) { +- return GDriveFileDeserializer() +- } +- if (type == OneDriveFile.Domain) { +- return OneDriveFileDeserializer() +- } + if (type == NextcloudFile.Domain) { + return NextcloudFileDeserializer() + } +@@ -111,4 +99,4 @@ internal fun getDeserializer(context: Context, type: String): SearchableDeserial + return TagDeserializer() + } + return NullDeserializer() +-} +\ No newline at end of file ++} +diff --git a/gradle.properties b/gradle.properties +index 3b2f97aa..503cc4dd 100644 +--- a/gradle.properties ++++ b/gradle.properties +@@ -6,7 +6,7 @@ + # 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 -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 ++org.gradle.jvmargs=-Xmx2048m -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 +@@ -18,4 +18,4 @@ android.injected.testOnly=false + org.gradle.daemon=true + org.gradle.parallel=true + org.gradle.caching=true +-org.gradle.unsafe.configuration-cache=true +\ No newline at end of file ++org.gradle.unsafe.configuration-cache=true +diff --git a/services/accounts/build.gradle.kts b/services/accounts/build.gradle.kts +index a639739c..0f24031c 100644 +--- a/services/accounts/build.gradle.kts ++++ b/services/accounts/build.gradle.kts +@@ -40,9 +40,7 @@ dependencies { + + implementation(libs.koin.android) + +- implementation(project(":libs:g-services")) +- implementation(project(":libs:ms-services")) + implementation(project(":libs:owncloud")) + implementation(project(":libs:nextcloud")) + +-} +\ No newline at end of file ++} +diff --git a/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountType.kt b/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountType.kt +index bef71441..615a3c7b 100644 +--- a/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountType.kt ++++ b/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountType.kt +@@ -1,7 +1,6 @@ + package de.mm20.launcher2.accounts + + enum class AccountType { +- Google, + Nextcloud, + Owncloud, +-} +\ No newline at end of file ++} +diff --git a/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountsRepository.kt b/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountsRepository.kt +index aeb5d079..8420d957 100644 +--- a/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountsRepository.kt ++++ b/services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountsRepository.kt +@@ -2,7 +2,6 @@ package de.mm20.launcher2.accounts + + import android.app.Activity + import android.content.Context +-import de.mm20.launcher2.gservices.GoogleApiHelper + import de.mm20.launcher2.nextcloud.NextcloudApiHelper + import de.mm20.launcher2.owncloud.OwncloudClient + import kotlinx.coroutines.CoroutineScope +@@ -27,17 +26,11 @@ internal class AccountsRepositoryImpl( + ) : AccountsRepository { + private val scope = CoroutineScope(Job() + Dispatchers.Default) + +- private val googleApiHelper = GoogleApiHelper.getInstance(context) + private val nextcloudApiHelper = NextcloudApiHelper(context) + private val owncloudApiHelper = OwncloudClient(context) + + override fun signin(context: Activity, accountType: AccountType) { + when (accountType) { +- AccountType.Google -> { +- scope.launch { +- googleApiHelper.login(context) +- } +- } + AccountType.Nextcloud -> + scope.launch { + nextcloudApiHelper.login(context) +@@ -51,9 +44,6 @@ internal class AccountsRepositoryImpl( + + override fun signout(accountType: AccountType) { + when (accountType) { +- AccountType.Google -> { +- googleApiHelper.logout() +- } + AccountType.Nextcloud -> { + scope.launch { + nextcloudApiHelper.logout() +@@ -67,7 +57,6 @@ internal class AccountsRepositoryImpl( + + override fun isSupported(accountType: AccountType): Boolean { + return when (accountType) { +- AccountType.Google -> googleApiHelper.isAvailable() + AccountType.Nextcloud -> true + AccountType.Owncloud -> true + } +@@ -75,9 +64,6 @@ internal class AccountsRepositoryImpl( + + override suspend fun getCurrentlySignedInAccount(accountType: AccountType): Account? { + return when (accountType) { +- AccountType.Google -> { +- getGoogleAccount() +- } + AccountType.Nextcloud -> { + getNextcloudAccount() + } +@@ -87,19 +73,6 @@ internal class AccountsRepositoryImpl( + } + } + +- private suspend fun getGoogleAccount(): Account? { +- return googleApiHelper.getAccount()?.let { +- Account(it.name, AccountType.Google) +- } +- } +- +- private suspend fun getMicrosoftAccount(): Account? { +- return null +- /*return msGraphApiHelper.getUser()?.let { +- Account(it.name, AccountType.Microsoft) +- }*/ +- } +- + private suspend fun getNextcloudAccount(): Account? { + return nextcloudApiHelper.getLoggedInUser()?.let { + Account(it.displayName, AccountType.Nextcloud) +@@ -112,4 +85,4 @@ internal class AccountsRepositoryImpl( + } + } + +-} +\ No newline at end of file ++} +diff --git a/services/search/src/main/java/de/mm20/launcher2/search/SearchService.kt b/services/search/src/main/java/de/mm20/launcher2/search/SearchService.kt +index bb31f870..10ef0cb2 100644 +--- a/services/search/src/main/java/de/mm20/launcher2/search/SearchService.kt ++++ b/services/search/src/main/java/de/mm20/launcher2/search/SearchService.kt +@@ -22,11 +22,9 @@ import de.mm20.launcher2.search.data.Calculator + import de.mm20.launcher2.search.data.CalendarEvent + import de.mm20.launcher2.search.data.Contact + import de.mm20.launcher2.search.data.File +-import de.mm20.launcher2.search.data.GDriveFile + import de.mm20.launcher2.search.data.LauncherApp + import de.mm20.launcher2.search.data.LocalFile + import de.mm20.launcher2.search.data.NextcloudFile +-import de.mm20.launcher2.search.data.OneDriveFile + import de.mm20.launcher2.search.data.OwncloudFile + import de.mm20.launcher2.search.data.UnitConverter + import de.mm20.launcher2.search.data.Website +@@ -63,8 +61,6 @@ interface SearchService { + .build(), + files: FilesSearchSettings = Settings.FilesSearchSettings.newBuilder() + .setLocalFiles(false) +- .setGdrive(false) +- .setOnedrive(false) + .setOwncloud(false) + .setNextcloud(false) + .build(), +@@ -206,15 +202,13 @@ internal class SearchServiceImpl( + } + } + } +- if (files.localFiles || files.owncloud || files.onedrive || files.gdrive || files.nextcloud) { ++ if (files.localFiles || files.owncloud || files.nextcloud) { + launch { + fileRepository.search( + query, + local = files.localFiles, + nextcloud = files.nextcloud, + owncloud = files.owncloud, +- onedrive = files.onedrive, +- gdrive = files.gdrive, + ) + .withCustomLabels(customAttributesRepository) + .collectLatest { r -> +@@ -237,8 +231,6 @@ internal class SearchServiceImpl( + files.localFiles && it is LocalFile || + files.nextcloud && it is NextcloudFile || + files.owncloud && it is OwncloudFile || +- files.onedrive && it is OneDriveFile || +- files.gdrive && it is GDriveFile || + wikipedia.enabled && it is Wikipedia || + websites.enabled && it is Website || + calendars.enabled && it is CalendarEvent || +@@ -284,4 +276,4 @@ fun SearchResults.toList(): List { + searchActions, + other, + ).flatten() +-} +\ No newline at end of file ++} +diff --git a/settings.gradle.kts b/settings.gradle.kts +index ca0390f5..5a2cafd4 100644 +--- a/settings.gradle.kts ++++ b/settings.gradle.kts +@@ -200,26 +200,12 @@ dependencyResolutionManagement { + library("mathparser", "org.mariuszgromada.math", "MathParser.org-mXparser") + .version("4.4.2") + +- library("google.auth", "com.google.auth", "google-auth-library-oauth2-http") +- .version("1.14.0") +- library("google.apiclient", "com.google.api-client", "google-api-client") +- .version("2.1.2") +- library("google.drive", "com.google.apis", "google-api-services-drive") +- .version("v3-rev20221219-2.0.0") +- library("google.oauth2", "com.google.apis", "google-api-services-oauth2") +- .version("v2-rev20200213-2.0.0") +- + library("gson", "com.google.code.gson", "gson") + .version("2.10.1") + + library("guava", "com.google.guava", "guava") + .version("31.1-android") + +- library("microsoft.graph", "com.microsoft.graph", "microsoft-graph") +- .version("5.53.0") +- library("microsoft.identity", "com.microsoft.identity.client", "msal") +- .version("4.2.0") +- + version("protobuf", "3.14.0") + library("protobuf.protoc", "com.google.protobuf", "protoc") + .versionRef("protobuf") +@@ -284,8 +270,6 @@ include(":libs:material-color-utilities") + include(":libs:nextcloud") + include(":libs:owncloud") + include(":libs:webdav") +-include(":libs:g-services") +-include(":libs:ms-services") + include(":services:global-actions") + include(":services:widgets") + include(":services:favorites")