diff --git a/play-services-base-core/build.gradle b/play-services-base-core/build.gradle index 6bc36bec..b9262817 100644 --- a/play-services-base-core/build.gradle +++ b/play-services-base-core/build.gradle @@ -4,6 +4,7 @@ */ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' apply plugin: 'maven-publish' apply plugin: 'signing' @@ -12,6 +13,7 @@ dependencies { api "androidx.lifecycle:lifecycle-service:$lifecycleVersion" implementation "androidx.annotation:annotation:$annotationVersion" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" } android { @@ -24,6 +26,10 @@ android { targetSdkVersion androidTargetSdk } + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/play-services-base-core/src/main/AndroidManifest.xml b/play-services-base-core/src/main/AndroidManifest.xml index 13255d7c..9ae3d128 100644 --- a/play-services-base-core/src/main/AndroidManifest.xml +++ b/play-services-base-core/src/main/AndroidManifest.xml @@ -3,7 +3,12 @@ ~ SPDX-FileCopyrightText: 2020, microG Project Team ~ SPDX-License-Identifier: Apache-2.0 --> - + - + + + diff --git a/play-services-basement/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt similarity index 73% rename from play-services-basement/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt rename to play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt index 53a2ea0f..1287c3ea 100644 --- a/play-services-basement/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt +++ b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + package org.microg.gms.settings import android.content.ContentValues @@ -7,13 +12,13 @@ import android.net.Uri import android.os.Binder object SettingsContract { - const val AUTHORITY = "org.microg.gms.settings" - val AUTHORITY_URI: Uri = Uri.parse("content://$AUTHORITY") + fun getAuthority(context: Context) = "${context.packageName}.microg.settings" + fun getAuthorityUri(context: Context): Uri = Uri.parse("content://${getAuthority(context)}") object CheckIn { private const val id = "check-in" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val ENABLED = "checkin_enable_service" const val ANDROID_ID = "androidId" @@ -38,8 +43,8 @@ object SettingsContract { object Gcm { private const val id = "gcm" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val FULL_LOG = "gcm_full_log" const val LAST_PERSISTENT_ID = "gcm_last_persistent_id" @@ -72,8 +77,8 @@ object SettingsContract { object Auth { private const val id = "auth" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val TRUST_GOOGLE = "auth_manager_trust_google" const val VISIBLE = "auth_manager_visible" @@ -86,8 +91,8 @@ object SettingsContract { object Exposure { private const val id = "exposureNotification" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val SCANNER_ENABLED = "exposure_scanner_enabled" const val LAST_CLEANUP = "exposure_last_cleanup" @@ -100,8 +105,8 @@ object SettingsContract { object SafetyNet { private const val id = "safety-net" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" } private fun withoutCallingIdentity(f: () -> T): T { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt similarity index 90% rename from play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt rename to play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt index 9d39376d..b59da582 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt +++ b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + package org.microg.gms.settings import android.content.ContentProvider @@ -8,13 +13,13 @@ import android.content.SharedPreferences import android.database.Cursor import android.database.MatrixCursor import android.net.Uri -import androidx.preference.PreferenceManager +import android.preference.PreferenceManager import org.microg.gms.common.PackageUtils.warnIfNotMainProcess -import org.microg.gms.settings.SettingsContract.AUTHORITY import org.microg.gms.settings.SettingsContract.Auth import org.microg.gms.settings.SettingsContract.CheckIn import org.microg.gms.settings.SettingsContract.Exposure import org.microg.gms.settings.SettingsContract.Gcm +import org.microg.gms.settings.SettingsContract.getAuthority import java.io.File /** @@ -52,10 +57,10 @@ class SettingsProvider : ContentProvider() { selectionArgs: Array?, sortOrder: String? ): Cursor? = when (uri) { - CheckIn.CONTENT_URI -> queryCheckIn(projection ?: CheckIn.PROJECTION) - Gcm.CONTENT_URI -> queryGcm(projection ?: Gcm.PROJECTION) - Auth.CONTENT_URI -> queryAuth(projection ?: Auth.PROJECTION) - Exposure.CONTENT_URI -> queryExposure(projection ?: Exposure.PROJECTION) + CheckIn.getContentUri(context!!) -> queryCheckIn(projection ?: CheckIn.PROJECTION) + Gcm.getContentUri(context!!) -> queryGcm(projection ?: Gcm.PROJECTION) + Auth.getContentUri(context!!) -> queryAuth(projection ?: Auth.PROJECTION) + Exposure.getContentUri(context!!) -> queryExposure(projection ?: Exposure.PROJECTION) else -> null } @@ -68,10 +73,10 @@ class SettingsProvider : ContentProvider() { warnIfNotMainProcess(context, this.javaClass) if (values == null) return 0 when (uri) { - CheckIn.CONTENT_URI -> updateCheckIn(values) - Gcm.CONTENT_URI -> updateGcm(values) - Auth.CONTENT_URI -> updateAuth(values) - Exposure.CONTENT_URI -> updateExposure(values) + CheckIn.getContentUri(context!!) -> updateCheckIn(values) + Gcm.getContentUri(context!!) -> updateGcm(values) + Auth.getContentUri(context!!) -> updateAuth(values) + Exposure.getContentUri(context!!) -> updateExposure(values) else -> return 0 } return 1 @@ -221,7 +226,7 @@ class SettingsProvider : ContentProvider() { } override fun getType(uri: Uri): String { - return "vnd.android.cursor.item/vnd.$AUTHORITY.${uri.path}" + return "vnd.android.cursor.item/vnd.${getAuthority(context!!)}.${uri.path}" } override fun insert(uri: Uri, values: ContentValues?): Uri? { diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 7ed68b54..40a8d471 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -128,13 +128,6 @@ android:exported="true" android:permission="org.microg.gms.PROVISION" /> - - - - + return SettingsContract.getSettings(context, Auth.getContentUri(context), arrayOf(Auth.TRUST_GOOGLE)) { c -> c.getInt(0) != 0 } } @JvmStatic fun isAuthVisible(context: Context): Boolean { - return SettingsContract.getSettings(context, Auth.CONTENT_URI, arrayOf(Auth.VISIBLE)) { c -> + return SettingsContract.getSettings(context, Auth.getContentUri(context), arrayOf(Auth.VISIBLE)) { c -> c.getInt(0) != 0 } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt index bd122c35..84425258 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt @@ -13,7 +13,7 @@ object CheckinPrefs { @JvmStatic fun isEnabled(context: Context): Boolean { val projection = arrayOf(CheckIn.ENABLED) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> c.getInt(0) != 0 } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt index ccdb31af..ab2dc042 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt @@ -48,7 +48,7 @@ data class LastCheckinInfo( CheckIn.VERSION_INFO, CheckIn.DEVICE_DATA_VERSION_INFO, ) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> LastCheckinInfo( androidId = c.getLong(0), digest = c.getString(1), @@ -61,7 +61,7 @@ data class LastCheckinInfo( } @JvmStatic - fun clear(context: Context) = SettingsContract.setSettings(context, CheckIn.CONTENT_URI) { + fun clear(context: Context) = SettingsContract.setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ANDROID_ID, 0L) put(CheckIn.DIGEST, CheckIn.INITIAL_DIGEST) put(CheckIn.LAST_CHECK_IN, 0L) @@ -71,7 +71,7 @@ data class LastCheckinInfo( } } - fun write(context: Context) = SettingsContract.setSettings(context, CheckIn.CONTENT_URI) { + fun write(context: Context) = SettingsContract.setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ANDROID_ID, androidId) put(CheckIn.DIGEST, digest) put(CheckIn.LAST_CHECK_IN, lastCheckin) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt index e61eb4d1..d42c9e03 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt @@ -20,7 +20,7 @@ data class ServiceConfiguration(val enabled: Boolean) : Serializable suspend fun getCheckinServiceInfo(context: Context): ServiceInfo = withContext(Dispatchers.IO) { val projection = arrayOf(CheckIn.ENABLED, CheckIn.LAST_CHECK_IN, CheckIn.ANDROID_ID) - getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + getSettings(context, CheckIn.getContentUri(context), projection) { c -> ServiceInfo( configuration = ServiceConfiguration(c.getInt(0) != 0), lastCheckin = c.getLong(1), @@ -33,7 +33,7 @@ suspend fun setCheckinServiceConfiguration(context: Context, configuration: Serv val serviceInfo = getCheckinServiceInfo(context) if (serviceInfo.configuration == configuration) return@withContext // enabled state is not already set, setting it now - setSettings(context, CheckIn.CONTENT_URI) { + setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ENABLED, configuration.enabled) } if (configuration.enabled) { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt index 1f1e75d4..3a0b8b77 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt @@ -43,7 +43,7 @@ data class GcmPrefs( @JvmStatic fun get(context: Context): GcmPrefs { - return SettingsContract.getSettings(context, Gcm.CONTENT_URI, Gcm.PROJECTION) { c -> + return SettingsContract.getSettings(context, Gcm.getContentUri(context), Gcm.PROJECTION) { c -> GcmPrefs( isGcmLogEnabled = c.getInt(0) != 0, lastPersistedId = c.getString(1), @@ -62,7 +62,7 @@ data class GcmPrefs( fun write(context: Context, config: ServiceConfiguration) { val gcmPrefs = get(context) - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.ENABLE_GCM, config.enabled) put(Gcm.CONFIRM_NEW_APPS, config.confirmNewApps) put(Gcm.NETWORK_MOBILE, config.mobile) @@ -75,7 +75,7 @@ data class GcmPrefs( @JvmStatic fun clearLastPersistedId(context: Context) { - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LAST_PERSISTENT_ID, "") } } @@ -124,13 +124,13 @@ data class GcmPrefs( fun learnTimeout(context: Context, pref: String) { Log.d("GmsGcmPrefs", "learnTimeout: $pref") when (pref) { - PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.CONTENT_URI) { + PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_MOBILE, (learntMobileInterval * 0.95).toInt()) } - PREF_NETWORK_WIFI -> setSettings(context, Gcm.CONTENT_URI) { + PREF_NETWORK_WIFI -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_WIFI, (learntWifiInterval * 0.95).toInt()) } - else -> setSettings(context, Gcm.CONTENT_URI) { + else -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_OTHER, (learntOtherInterval * 0.95).toInt()) } } @@ -142,7 +142,7 @@ data class GcmPrefs( PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> { if (time > learntMobileInterval / 4 * 3) { val newInterval = (learntMobileInterval * 1.02).toInt() - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_MOBILE, max(MIN_INTERVAL, min(newInterval, MAX_INTERVAL))) } } @@ -150,7 +150,7 @@ data class GcmPrefs( PREF_NETWORK_WIFI -> { if (time > learntWifiInterval / 4 * 3) { val newInterval = (learntWifiInterval * 1.02).toInt() - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_WIFI, max(MIN_INTERVAL, min(newInterval, MAX_INTERVAL))) } } @@ -158,7 +158,7 @@ data class GcmPrefs( else -> { if (time > learntOtherInterval / 4 * 3) { val newInterval = (learntOtherInterval * 1.02).toInt() - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_OTHER, max(MIN_INTERVAL, min(newInterval, MAX_INTERVAL))) } } @@ -173,7 +173,7 @@ data class GcmPrefs( fun extendLastPersistedId(context: Context, id: String) { val newId = if (lastPersistedId.isNullOrEmpty()) id else "$lastPersistedId|$id" - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LAST_PERSISTENT_ID, newId) } } diff --git a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt index 03f4bc0a..1c2f792a 100644 --- a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt +++ b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt @@ -7,7 +7,7 @@ package org.microg.gms.nearby.exposurenotification import android.content.Context import android.content.Intent -import org.microg.gms.settings.SettingsContract.Exposure.CONTENT_URI +import org.microg.gms.settings.SettingsContract.Exposure.getContentUri import org.microg.gms.settings.SettingsContract.Exposure.LAST_CLEANUP import org.microg.gms.settings.SettingsContract.Exposure.SCANNER_ENABLED import org.microg.gms.settings.SettingsContract.getSettings @@ -16,12 +16,12 @@ import org.microg.gms.settings.SettingsContract.setSettings class ExposurePreferences(private val context: Context) { var enabled - get() = getSettings(context, CONTENT_URI, arrayOf(SCANNER_ENABLED)) { c -> + get() = getSettings(context, getContentUri(context), arrayOf(SCANNER_ENABLED)) { c -> c.getInt(0) != 0 } set(newStatus) { val changed = enabled != newStatus - setSettings(context, CONTENT_URI) { + setSettings(context, getContentUri(context)) { put(SCANNER_ENABLED, newStatus) } if (!changed) return @@ -34,10 +34,10 @@ class ExposurePreferences(private val context: Context) { } var lastCleanup - get() = getSettings(context, CONTENT_URI, arrayOf(LAST_CLEANUP)) { c -> + get() = getSettings(context, getContentUri(context), arrayOf(LAST_CLEANUP)) { c -> c.getLong(0) } - set(value) = setSettings(context, CONTENT_URI) { + set(value) = setSettings(context, getContentUri(context)) { put(LAST_CLEANUP, value) }