Initial commit

This commit is contained in:
MM20
2021-09-18 23:37:52 +02:00
commit 749e4e3073
938 changed files with 50475 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/build
+71
View File
@@ -0,0 +1,71 @@
import com.google.protobuf.gradle.*
plugins {
id("com.android.library")
id("kotlin-android")
id("com.google.protobuf").version("0.8.14")
}
android {
compileSdk = sdk.versions.compileSdk.get().toInt()
defaultConfig {
minSdk = sdk.versions.minSdk.get().toInt()
targetSdk = sdk.versions.targetSdk.get().toInt()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:${libs.versions.protobuf.get()}"
}
// Generates the java Protobuf-lite code for the Protobufs in this project. See
// https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
// for more information.
generateProtoTasks {
all().forEach { task ->
task.plugins {
create("java") {
option("lite")
}
}
}
}
}
dependencies {
implementation(libs.kotlin.stdlib)
implementation(libs.androidx.core)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.preference)
implementation(libs.androidx.datastore)
implementation(libs.protobuf.javalite)
implementation(project(":ktx"))
implementation(project(":i18n"))
implementation(project(":crashreporter"))
}
View File
+21
View File
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.kts.kts.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
+4
View File
@@ -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)
}
}
+57
View File
@@ -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;
}