Initial commit
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="de.mm20.launcher2.preferences">
|
||||
|
||||
</manifest>
|
||||
@@ -0,0 +1,186 @@
|
||||
package de.mm20.launcher2.preferences
|
||||
|
||||
import android.app.Application
|
||||
import androidx.core.content.edit
|
||||
import androidx.preference.PreferenceManager
|
||||
|
||||
|
||||
class LauncherPreferences(val context: Application, version: Int = 3) {
|
||||
internal val preferences by lazy {
|
||||
PreferenceManager.getDefaultSharedPreferences(context)
|
||||
}
|
||||
|
||||
|
||||
var version by IntPreference("preferences_version", default = 1)
|
||||
|
||||
init {
|
||||
val oldVersion = this.version
|
||||
if ( version >= 2 && oldVersion <= 1) {
|
||||
val appStartAnim = preferences.getInt("app_start_anim", 0)
|
||||
preferences.edit {
|
||||
remove("app_start_anim")
|
||||
putString("app_start_anim", appStartAnim.toString())
|
||||
}
|
||||
}
|
||||
if (version >= 3 && oldVersion <= 2) {
|
||||
val translucentCards = preferences.getBoolean("translucent_cards", false)
|
||||
val theme = preferences.getString("theme", "2")
|
||||
|
||||
preferences.edit {
|
||||
remove("translucent_cards")
|
||||
putInt("card_opacity", if (translucentCards) 0xCC else 0xFF)
|
||||
if (theme == "4") {
|
||||
putString("theme", "1")
|
||||
putString("card_background", "2")
|
||||
}
|
||||
}
|
||||
}
|
||||
if (version >= 4 && oldVersion <= 3) {
|
||||
val appStartAnim = preferences.getString("app_start_anim", "5")
|
||||
if (appStartAnim == "0" || appStartAnim == "1")
|
||||
preferences.edit {
|
||||
putString("app_start_anim", "2")
|
||||
}
|
||||
}
|
||||
this.version = version
|
||||
}
|
||||
|
||||
|
||||
var theme by EnumPreference("theme", default = Themes.SYSTEM)
|
||||
var lightStatusBar by BooleanPreference("light_status_bar", default = false)
|
||||
var lightNavBar by BooleanPreference("light_nav_bar", default = false)
|
||||
var dimWallpaper by BooleanPreference("dim_wallpaper", default = false)
|
||||
var appStartAnim by EnumPreference("app_start_anim", default = AppStartAnimation.M)
|
||||
|
||||
var searchShowFavorites by BooleanPreference("search_show_favorites", default = true)
|
||||
var searchAutoAddFavorites by BooleanPreference("search_auto_add_favorites", default = true)
|
||||
var searchCalculator by BooleanPreference("search_calculator", default = true)
|
||||
var searchUnitConverter by BooleanPreference("search_unitconverter", default = true)
|
||||
var searchFiles by BooleanPreference("search_files", default = true)
|
||||
var searchWikipedia by BooleanPreference("search_wikipedia", default = true)
|
||||
var searchWikipediaMobileData by BooleanPreference("search_wikipedia_mobile_data", default = true)
|
||||
var searchWebsite by BooleanPreference("search_websites", default = true)
|
||||
var searchWebsitesProtocol by EnumPreference("search_websites_protocol", default = WebsiteProtocols.HTTPS)
|
||||
var searchWebsitesMobileData by BooleanPreference("search_websearch_mobile_data", default = true)
|
||||
var searchActivities by BooleanPreference("search_activities", default = true)
|
||||
var searchCalendars by BooleanPreference("search_calendars", default = true)
|
||||
var searchContacts by BooleanPreference("search_contacts", default = true)
|
||||
var searchWikipediaPictures by BooleanPreference("search_wikipedia_pictures", default = false)
|
||||
var searchOwncloud by BooleanPreference("search_owncloud", default = false)
|
||||
var searchNextcloud by BooleanPreference("search_nextcloud", default = false)
|
||||
var searchOneDrive by BooleanPreference("search_onedrive", default = false)
|
||||
var searchGDrive by BooleanPreference("search_gdrive", default = false)
|
||||
var searchGDriveMobileData by BooleanPreference("search_gdrive_mobile_data", default = false)
|
||||
|
||||
var notificationBadges by BooleanPreference("notification_badges", default = true)
|
||||
var cloudBadges by BooleanPreference("cloud_badges", default = true)
|
||||
var suspendBadges by BooleanPreference("suspended_badges", default = true)
|
||||
var profileBadges by BooleanPreference("profile_badges", default = true)
|
||||
var shortcutBadges by BooleanPreference("shortcut_badges", default = true)
|
||||
|
||||
var calendarMaxEvents by StringPreference("calendar_max_events", default = "10")
|
||||
|
||||
var legacyIconBg by StringPreference("legacy_icon_bg", default = "1")
|
||||
var blurCards by BooleanPreference("blur_cards", default = false)
|
||||
var searchStyle by EnumPreference("search_style", default = SearchStyles.NO_BG)
|
||||
var imperialUnits by BooleanPreference("imperial_units", default = context.resources.getBoolean(R.bool.default_imperialUnits))
|
||||
var translucentCards by BooleanPreference("translucent_cards", default = false)
|
||||
var iconShape by EnumPreference("icon_shape", default = IconShape.PLATFORM_DEFAULT)
|
||||
var firstRunVersion by IntPreference("first_run_version", default = 0)
|
||||
|
||||
var cardBackground by EnumPreference("card_background", default = CardBackground.DEFAULT)
|
||||
var cardOpacity by IntPreference("card_opacity", default = 0xFF)
|
||||
var cardStrokeWidth by IntPreference("card_stroke_width", default = 0)
|
||||
var cardRadius by IntPreference("card_radius", default = 8)
|
||||
|
||||
var wallpaperColor by IntPreference("wallpaper_color", default = 0x0)
|
||||
var isLightWallpaper by BooleanPreference("is_light_wallpaper", default = false)
|
||||
|
||||
var weatherProvider by EnumPreference("weather_provider", default = WeatherProviders.MET_NO)
|
||||
|
||||
var unselectedCalendars by LongListPreference("unselected_calendars", default = emptyList())
|
||||
var calendarHideAllday by BooleanPreference("calendar_hide_allday", default = false)
|
||||
|
||||
var hasRequestedNotificationPermission by BooleanPreference("requested_notification_permission", default = false)
|
||||
|
||||
var easterEggEnabled by BooleanPreference("easter_egg", default = false)
|
||||
|
||||
|
||||
fun doOnPreferenceChange(vararg keys: String, action: (String) -> Unit) {
|
||||
preferences.registerOnSharedPreferenceChangeListener { _, key ->
|
||||
if (keys.contains(key)) action(key)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
lateinit var instance: LauncherPreferences
|
||||
fun initialize(app: Application) {
|
||||
instance = LauncherPreferences(app)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum class WebsiteProtocols(override val value: String) : PreferenceEnum {
|
||||
HTTP("0"),
|
||||
HTTPS("1")
|
||||
}
|
||||
|
||||
enum class Themes(override val value: String) : PreferenceEnum {
|
||||
SYSTEM("2"),
|
||||
LIGHT("0"),
|
||||
DARK("1"),
|
||||
AUTO("3");
|
||||
|
||||
companion object {
|
||||
fun byValue(value: String): Themes {
|
||||
return values().first { it.value == value }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum class SearchStyles(override val value: String) : PreferenceEnum {
|
||||
NO_BG("0"),
|
||||
SOLID("1"),
|
||||
HIDDEN("2"),
|
||||
}
|
||||
|
||||
enum class IconShape(override val value: String) : PreferenceEnum {
|
||||
CIRCLE("0"),
|
||||
SQUARE("1"),
|
||||
ROUNDED_SQUARE("2"),
|
||||
TRIANGLE("3"),
|
||||
SQUIRCLE("4"),
|
||||
HEXAGON("5"),
|
||||
HEART("6"),
|
||||
PENTAGON("7"),
|
||||
PLATFORM_DEFAULT("8")
|
||||
}
|
||||
|
||||
enum class WeatherProviders(override val value: String) : PreferenceEnum {
|
||||
OPENWEATHERMAP("0"),
|
||||
HERE("3"),
|
||||
MET_NO("2");
|
||||
|
||||
companion object {
|
||||
fun byValue(value: String): WeatherProviders {
|
||||
return values().first { it.value == value }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum class CardBackground(override val value: String) : PreferenceEnum {
|
||||
DEFAULT("0"),
|
||||
BLACK("2");
|
||||
companion object {
|
||||
fun byValue(value: String): CardBackground {
|
||||
return values().first { it.value == value }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum class AppStartAnimation(override val value: String): PreferenceEnum {
|
||||
DEFAULT("5"),
|
||||
M("2"),
|
||||
FADE("3"),
|
||||
SLIDE_BOTTOM("4")
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package de.mm20.launcher2.preferences
|
||||
|
||||
import androidx.core.content.edit
|
||||
import de.mm20.launcher2.crashreporter.CrashReporter
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONException
|
||||
import kotlin.properties.ReadWriteProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
class StringPreference(val key: String, val default: String) : ReadWriteProperty<LauncherPreferences, String> {
|
||||
override fun getValue(thisRef: LauncherPreferences, property: KProperty<*>): String {
|
||||
return thisRef.preferences.getString(key, default)!!
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: LauncherPreferences, property: KProperty<*>, value: String) {
|
||||
thisRef.preferences.edit {
|
||||
putString(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class BooleanPreference(val key: String, val default: Boolean) : ReadWriteProperty<LauncherPreferences, Boolean> {
|
||||
override fun getValue(thisRef: LauncherPreferences, property: KProperty<*>): Boolean {
|
||||
return thisRef.preferences.getBoolean(key, default)
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: LauncherPreferences, property: KProperty<*>, value: Boolean) {
|
||||
thisRef.preferences.edit {
|
||||
putBoolean(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class IntPreference(val key: String, val default: Int) : ReadWriteProperty<LauncherPreferences, Int> {
|
||||
override fun getValue(thisRef: LauncherPreferences, property: KProperty<*>): Int {
|
||||
return thisRef.preferences.getInt(key, default)
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: LauncherPreferences, property: KProperty<*>, value: Int) {
|
||||
thisRef.preferences.edit {
|
||||
putInt(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class LongListPreference(val key: String, val default: List<Long>) : ReadWriteProperty<LauncherPreferences, List<Long>> {
|
||||
override fun getValue(thisRef: LauncherPreferences, property: KProperty<*>): List<Long> {
|
||||
val list = mutableListOf<Long>()
|
||||
try {
|
||||
val jsonArray = JSONArray(thisRef.preferences.getString(key, null) ?: return default)
|
||||
for (i in 0 until jsonArray.length()) {
|
||||
list.add(jsonArray.getLong(i))
|
||||
}
|
||||
} catch (e: JSONException) {
|
||||
CrashReporter.logException(e)
|
||||
return default
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: LauncherPreferences, property: KProperty<*>, value: List<Long>) {
|
||||
val jsonArray = JSONArray()
|
||||
for (i in value) {
|
||||
jsonArray.put(i)
|
||||
}
|
||||
thisRef.preferences.edit {
|
||||
putString(key, jsonArray.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
interface PreferenceEnum {
|
||||
val value: String
|
||||
}
|
||||
|
||||
class EnumPreference<T>(val key: String, val default: T) : ReadWriteProperty<LauncherPreferences, T> where T : Enum<T>, T : PreferenceEnum {
|
||||
override fun getValue(thisRef: LauncherPreferences, property: KProperty<*>): T {
|
||||
val value = thisRef.preferences.getString(key, null) ?: return default
|
||||
val enumConstants = default::class.java.enumConstants as Array<out T>
|
||||
return enumConstants.firstOrNull { it.value == value } ?: default
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: LauncherPreferences, property: KProperty<*>, value: T) {
|
||||
thisRef.preferences.edit {
|
||||
putString(key, value.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package de.mm20.launcher2.preferences
|
||||
|
||||
import androidx.datastore.core.CorruptionException
|
||||
import androidx.datastore.core.Serializer
|
||||
import com.google.protobuf.InvalidProtocolBufferException
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
|
||||
|
||||
object SettingsSerializer : Serializer<Settings> {
|
||||
override val defaultValue: Settings = Settings.getDefaultInstance()
|
||||
|
||||
override suspend fun readFrom(input: InputStream): Settings {
|
||||
try {
|
||||
return Settings.parseFrom(input)
|
||||
} catch (e: InvalidProtocolBufferException) {
|
||||
throw CorruptionException("Cannot read proto.", e)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun writeTo(t: Settings, output: OutputStream) {
|
||||
t.writeTo(output)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
syntax = "proto3";
|
||||
|
||||
option java_package = "de.mm20.launcher2.preferences";
|
||||
option java_multiple_files = true;
|
||||
|
||||
message Settings {
|
||||
message AppearanceSettings {
|
||||
enum Theme {
|
||||
Light = 0;
|
||||
Dark = 1;
|
||||
System = 2;
|
||||
}
|
||||
Theme theme = 1;
|
||||
bool light_status_bar = 2;
|
||||
bool light_nav_bar = 3;
|
||||
bool dim_wallpaper = 4;
|
||||
bool app_start_animation = 5;
|
||||
}
|
||||
AppearanceSettings appearance = 1;
|
||||
|
||||
message SearchSettings {
|
||||
bool show_favorites = 1;
|
||||
bool calculator = 2;
|
||||
bool unit_converter = 3;
|
||||
bool files = 4;
|
||||
bool wikipedia = 5;
|
||||
bool wikipedia_mobile_data = 6;
|
||||
bool wikipedia_pictures = 7;
|
||||
bool websites = 8;
|
||||
enum WebsitesProtocol {
|
||||
Https = 0;
|
||||
Http = 1;
|
||||
}
|
||||
WebsitesProtocol websitesProtocol = 9;
|
||||
bool websites_mobile_data = 10;
|
||||
bool activities = 11;
|
||||
bool calendar_events = 12;
|
||||
bool contacts = 13;
|
||||
bool owncloud = 14;
|
||||
bool nextcloud = 15;
|
||||
bool onedrive = 16;
|
||||
bool onedrive_mobile_data = 17;
|
||||
bool gdrive = 18;
|
||||
bool gdrive_mobile_data = 19;
|
||||
}
|
||||
SearchSettings search = 2;
|
||||
|
||||
message BadgeSettings {
|
||||
bool notification_badges = 1;
|
||||
bool cloud_badges = 2;
|
||||
bool suspend_badges = 3;
|
||||
bool profile_badges = 4;
|
||||
bool shortcut_badges = 5;
|
||||
}
|
||||
BadgeSettings badges = 3;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user