From b559935cf0e17931f92f445095055c1c1ffb2778 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Tue, 30 Dec 2025 22:42:41 +0530 Subject: [PATCH] feat: add font customization --- .../contentproviders/MyContentProvider.kt | 58 ++++++++++++++++++- .../helpers/MyContentProviderHelper.kt | 20 ++++++- 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/thankyou/contentproviders/MyContentProvider.kt b/app/src/main/kotlin/org/fossify/thankyou/contentproviders/MyContentProvider.kt index 3331f2c2..f9a7f47f 100644 --- a/app/src/main/kotlin/org/fossify/thankyou/contentproviders/MyContentProvider.kt +++ b/app/src/main/kotlin/org/fossify/thankyou/contentproviders/MyContentProvider.kt @@ -2,16 +2,41 @@ package org.fossify.thankyou.contentproviders import android.content.ContentProvider import android.content.ContentValues +import android.content.UriMatcher import android.database.Cursor import android.net.Uri +import android.os.ParcelFileDescriptor +import android.os.ParcelFileDescriptor.MODE_CREATE +import android.os.ParcelFileDescriptor.MODE_TRUNCATE +import android.os.ParcelFileDescriptor.MODE_WRITE_ONLY +import org.fossify.commons.extensions.isFontFile import org.fossify.thankyou.helpers.MyContentProviderHelper +import java.io.File +import java.io.FileNotFoundException class MyContentProvider : ContentProvider() { private lateinit var dbHelper: MyContentProviderHelper + companion object { + private const val AUTHORITY = "org.fossify.android.provider" + private const val SETTINGS = 1 + private const val FONTS_FILE = 2 + + private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply { + addURI(AUTHORITY, "settings", SETTINGS) + addURI(AUTHORITY, "fonts/*", FONTS_FILE) + } + } + override fun insert(uri: Uri, contentValues: ContentValues?) = null - override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? { + override fun query( + uri: Uri, + projection: Array?, + selection: String?, + selectionArgs: Array?, + sortOrder: String? + ): Cursor? { return dbHelper.getGlobalConfigCursor() } @@ -20,11 +45,40 @@ class MyContentProvider : ContentProvider() { return true } - override fun update(uri: Uri, contentValues: ContentValues?, selection: String?, selectionArgs: Array?): Int { + override fun update( + uri: Uri, + contentValues: ContentValues?, + selection: String?, + selectionArgs: Array? + ): Int { return dbHelper.updatePreferences(contentValues!!) } override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0 override fun getType(uri: Uri) = "" + + override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor? { + if (uriMatcher.match(uri) != FONTS_FILE) throw FileNotFoundException(uri.toString()) + val name = uri.lastPathSegment ?: throw FileNotFoundException(uri.toString()) + val safeName = File(name).name + if (safeName.isFontFile()) throw FileNotFoundException("Not a font file") + + val fontsDir = File(context!!.filesDir, "fonts").apply { mkdirs() } + val file = File(fontsDir, safeName) + + return when { + mode.contains("w") -> { + ParcelFileDescriptor.open( + file, + MODE_CREATE or MODE_TRUNCATE or MODE_WRITE_ONLY + ) + } + + else -> { + if (!file.exists()) throw FileNotFoundException(uri.toString()) + ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY) + } + } + } } diff --git a/app/src/main/kotlin/org/fossify/thankyou/helpers/MyContentProviderHelper.kt b/app/src/main/kotlin/org/fossify/thankyou/helpers/MyContentProviderHelper.kt index ee156d25..5ca0d9d0 100644 --- a/app/src/main/kotlin/org/fossify/thankyou/helpers/MyContentProviderHelper.kt +++ b/app/src/main/kotlin/org/fossify/thankyou/helpers/MyContentProviderHelper.kt @@ -9,10 +9,13 @@ import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import org.fossify.commons.R +import org.fossify.commons.helpers.FONT_TYPE_SYSTEM_DEFAULT import org.fossify.commons.helpers.MyContentProvider.ACTION_GLOBAL_CONFIG_UPDATED import org.fossify.commons.helpers.MyContentProvider.COL_ACCENT_COLOR import org.fossify.commons.helpers.MyContentProvider.COL_APP_ICON_COLOR import org.fossify.commons.helpers.MyContentProvider.COL_BACKGROUND_COLOR +import org.fossify.commons.helpers.MyContentProvider.COL_FONT_NAME +import org.fossify.commons.helpers.MyContentProvider.COL_FONT_TYPE import org.fossify.commons.helpers.MyContentProvider.COL_ID import org.fossify.commons.helpers.MyContentProvider.COL_LAST_UPDATED_TS import org.fossify.commons.helpers.MyContentProvider.COL_PRIMARY_COLOR @@ -29,7 +32,7 @@ class MyContentProviderHelper private constructor( companion object { private const val DB_NAME = "Preferences.db" - private const val DB_VERSION = 1 + private const val DB_VERSION = 2 private const val TABLE_NAME = "settings" private const val PREF_ID = 1 @@ -48,13 +51,20 @@ class MyContentProviderHelper private constructor( $COL_ACCENT_COLOR INTEGER DEFAULT 0, $COL_APP_ICON_COLOR INTEGER DEFAULT 0, $COL_SHOW_CHECKMARKS_ON_SWITCHES INTEGER DEFAULT 0, - $COL_LAST_UPDATED_TS INTEGER DEFAULT 0 + $COL_LAST_UPDATED_TS INTEGER DEFAULT 0, + $COL_FONT_TYPE INTEGER DEFAULT 0, + $COL_FONT_NAME TEXT DEFAULT '' ) """.trimIndent() ) } - override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {} + override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + if (oldVersion < 2) { + db.execSQL("ALTER TABLE $TABLE_NAME ADD COLUMN $COL_FONT_TYPE INTEGER DEFAULT 0") + db.execSQL("ALTER TABLE $TABLE_NAME ADD COLUMN $COL_FONT_NAME TEXT DEFAULT ''") + } + } private fun initializePreferences() { with(context.resources) { @@ -70,6 +80,8 @@ class MyContentProviderHelper private constructor( put(COL_APP_ICON_COLOR, getColor(R.color.color_primary)) put(COL_SHOW_CHECKMARKS_ON_SWITCHES, false) put(COL_LAST_UPDATED_TS, 0) + put(COL_FONT_TYPE, FONT_TYPE_SYSTEM_DEFAULT) + put(COL_FONT_NAME, "") } ) } @@ -116,6 +128,8 @@ class MyContentProviderHelper private constructor( COL_APP_ICON_COLOR, COL_SHOW_CHECKMARKS_ON_SWITCHES, COL_LAST_UPDATED_TS, + COL_FONT_TYPE, + COL_FONT_NAME, ) val selection = "$COL_ID = ?"