소스 검색

Convert Quick Button prefs to Proto instead of SharedPreferences (#77)

Joshua Kuestersteffen 4 년 전
부모
커밋
f4f28699fd

+ 21 - 0
app/build.gradle.kts

@@ -1,6 +1,9 @@
+import com.google.protobuf.gradle.*
+
 plugins {
     id("com.android.application")
     id("dagger.hilt.android.plugin")
+    id("com.google.protobuf") version "0.8.17"
     kotlin("android")
     kotlin("android.extensions")
     kotlin("kapt")
@@ -73,12 +76,16 @@ dependencies {
     implementation("androidx.appcompat:appcompat:1.2.0")
     implementation("androidx.recyclerview:recyclerview:1.1.0")
     implementation("androidx.constraintlayout:constraintlayout:2.0.1")
+    implementation("androidx.datastore:datastore:1.0.0")
+    implementation("androidx.datastore:datastore-core:1.0.0")
+    implementation("com.google.protobuf:protobuf-javalite:3.10.0")
 
     // Arch Components
     implementation("androidx.core:core-ktx:1.5.0-alpha03")
     implementation("androidx.fragment:fragment-ktx:1.2.5")
     implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")
     implementation("androidx.navigation:navigation-fragment-ktx:2.3.0")
+    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1")
     implementation("androidx.room:room-runtime:2.2.5")
     implementation("androidx.lifecycle:lifecycle-common-java8:2.2.0")
     kapt("androidx.room:room-compiler:2.2.5")
@@ -91,3 +98,17 @@ dependencies {
     kapt("androidx.hilt:hilt-compiler:1.0.0-alpha02")
     kapt("com.google.dagger:hilt-android-compiler:2.29-alpha")
 }
+protobuf {
+    protoc {
+        artifact = "com.google.protobuf:protoc:3.17.3"
+    }
+    generateProtoTasks {
+        all().forEach { task ->
+            task.builtins {
+                id("java") {
+                    option("lite")
+                }
+            }
+        }
+    }
+}

+ 112 - 0
app/src/main/java/com/sduduzog/slimlauncher/datasource/QuickButtonPreferencesRepository.kt

@@ -0,0 +1,112 @@
+package com.sduduzog.slimlauncher.datasource
+
+import android.util.Log
+import androidx.datastore.core.DataStore
+import androidx.lifecycle.LifecycleCoroutineScope
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.asLiveData
+import com.jkuester.unlauncher.datastore.QuickButtonPreferences
+import com.sduduzog.slimlauncher.R
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.catch
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.transform
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import java.io.IOException
+
+class QuickButtonPreferencesRepository(
+    private val quickButtonPreferencesStore: DataStore<QuickButtonPreferences>,
+    private val lifecycleScope: LifecycleCoroutineScope
+) {
+    companion object {
+        const val DEFAULT_ICON_LEFT = R.drawable.ic_call
+        const val DEFAULT_ICON_CENTER = R.drawable.ic_cog
+        const val DEFAULT_ICON_RIGHT = R.drawable.ic_photo_camera
+    }
+
+    private val quickButtonPreferencesFlow: Flow<QuickButtonPreferences> =
+        quickButtonPreferencesStore.data
+            .catch { exception ->
+                if (exception is IOException) {
+                    Log.e(
+                        "QuickButtonPrefRepo",
+                        "Error reading quick button preferences.",
+                        exception
+                    )
+                    emit(QuickButtonPreferences.getDefaultInstance())
+                } else {
+                    throw exception
+                }
+            }
+            .transform { prefs -> emit(validateQuickButtonPreferences(prefs)) }
+
+    fun liveData(): LiveData<QuickButtonPreferences> {
+        return quickButtonPreferencesFlow.asLiveData()
+    }
+
+    fun get(): QuickButtonPreferences {
+        return runBlocking {
+            quickButtonPreferencesFlow.first()
+        }
+    }
+
+    fun updateLeftIconId(iconId: Int) {
+        lifecycleScope.launch {
+            quickButtonPreferencesStore.updateData { currentPreferences ->
+                currentPreferences.toBuilder()
+                    .setLeftButton(
+                        currentPreferences.leftButton.toBuilder().setIconId(iconId).build()
+                    )
+                    .build()
+            }
+        }
+    }
+
+    fun updateCenterIconId(iconId: Int) {
+        lifecycleScope.launch {
+            quickButtonPreferencesStore.updateData { currentPreferences ->
+                currentPreferences.toBuilder()
+                    .setCenterButton(
+                        currentPreferences.centerButton.toBuilder().setIconId(iconId).build()
+                    )
+                    .build()
+            }
+        }
+    }
+
+    fun updateRightIconId(iconId: Int) {
+        lifecycleScope.launch {
+            quickButtonPreferencesStore.updateData { currentPreferences ->
+                currentPreferences.toBuilder()
+                    .setRightButton(
+                        currentPreferences.rightButton.toBuilder().setIconId(iconId).build()
+                    )
+                    .build()
+            }
+        }
+    }
+
+    private fun validateQuickButtonPreferences(prefs: QuickButtonPreferences): QuickButtonPreferences {
+        if (!prefs.hasLeftButton() || !prefs.hasCenterButton() || !prefs.hasRightButton()) {
+            val prefBuilder = prefs.toBuilder()
+            if (!prefs.hasLeftButton()) {
+                prefBuilder.leftButton =
+                    QuickButtonPreferences.QuickButton.newBuilder().setIconId(DEFAULT_ICON_LEFT)
+                        .build()
+            }
+            if (!prefs.hasCenterButton()) {
+                prefBuilder.centerButton =
+                    QuickButtonPreferences.QuickButton.newBuilder().setIconId(DEFAULT_ICON_CENTER)
+                        .build()
+            }
+            if (!prefs.hasRightButton()) {
+                prefBuilder.rightButton =
+                    QuickButtonPreferences.QuickButton.newBuilder().setIconId(DEFAULT_ICON_RIGHT)
+                        .build()
+            }
+            return prefBuilder.build()
+        }
+        return prefs
+    }
+}

+ 28 - 0
app/src/main/java/com/sduduzog/slimlauncher/datasource/QuickButtonPreferencesSerializer.kt

@@ -0,0 +1,28 @@
+package com.sduduzog.slimlauncher.datasource
+
+import androidx.datastore.core.CorruptionException
+import androidx.datastore.core.Serializer
+import com.google.protobuf.InvalidProtocolBufferException
+import com.jkuester.unlauncher.datastore.QuickButtonPreferences
+import java.io.InputStream
+import java.io.OutputStream
+
+/**
+ * Serializer for the [QuickButtonPreferences] object defined in unlauncher_data.proto.
+ */
+object QuickButtonPreferencesSerializer : Serializer<QuickButtonPreferences> {
+    override val defaultValue: QuickButtonPreferences = QuickButtonPreferences.getDefaultInstance()
+
+    @Suppress("BlockingMethodInNonBlockingContext")
+    override suspend fun readFrom(input: InputStream): QuickButtonPreferences {
+        try {
+            return QuickButtonPreferences.parseFrom(input)
+        } catch (exception: InvalidProtocolBufferException) {
+            throw CorruptionException("Cannot read proto.", exception)
+        }
+    }
+
+    @Suppress("BlockingMethodInNonBlockingContext")
+    override suspend fun writeTo(t: QuickButtonPreferences, output: OutputStream) =
+        t.writeTo(output)
+}

+ 59 - 0
app/src/main/java/com/sduduzog/slimlauncher/datasource/UnlauncherDataSource.kt

@@ -0,0 +1,59 @@
+package com.sduduzog.slimlauncher.datasource
+
+import android.content.Context
+import androidx.datastore.core.DataStore
+import androidx.datastore.dataStore
+import androidx.datastore.migrations.SharedPreferencesMigration
+import androidx.datastore.migrations.SharedPreferencesView
+import androidx.lifecycle.LifecycleCoroutineScope
+import com.jkuester.unlauncher.datastore.QuickButtonPreferences
+
+private val Context.quickButtonPreferencesStore: DataStore<QuickButtonPreferences> by dataStore(
+    fileName = "unlauncher_data.pb",
+    serializer = QuickButtonPreferencesSerializer,
+    produceMigrations = { context ->
+        listOf(
+            SharedPreferencesMigration(
+                context,
+                "settings",
+                setOf("quick_button_left", "quick_button_center", "quick_button_right")
+            ) { sharedPrefs: SharedPreferencesView, currentData: QuickButtonPreferences ->
+                val prefBuilder = currentData.toBuilder()
+                if (!currentData.hasLeftButton()) {
+                    prefBuilder.leftButton =
+                        QuickButtonPreferences.QuickButton.newBuilder().setIconId(
+                            sharedPrefs.getInt(
+                                "quick_button_left",
+                                QuickButtonPreferencesRepository.DEFAULT_ICON_LEFT
+                            )
+                        ).build()
+                }
+
+                if (!currentData.hasCenterButton()) {
+                    prefBuilder.centerButton =
+                        QuickButtonPreferences.QuickButton.newBuilder().setIconId(
+                            sharedPrefs.getInt(
+                                "quick_button_center",
+                                QuickButtonPreferencesRepository.DEFAULT_ICON_CENTER
+                            )
+                        ).build()
+                }
+                if (!currentData.hasRightButton()) {
+                    prefBuilder.rightButton =
+                        QuickButtonPreferences.QuickButton.newBuilder().setIconId(
+                            sharedPrefs.getInt(
+                                "quick_button_right",
+                                QuickButtonPreferencesRepository.DEFAULT_ICON_RIGHT
+                            )
+                        ).build()
+                }
+                prefBuilder.build()
+            }
+        )
+    }
+)
+
+class UnlauncherDataSource(context: Context, lifecycleScope: LifecycleCoroutineScope) {
+    val quickButtonPreferencesRepo =
+        QuickButtonPreferencesRepository(context.quickButtonPreferencesStore, lifecycleScope)
+}

+ 29 - 15
app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseQuickButtonDialog.kt

@@ -2,42 +2,56 @@ package com.sduduzog.slimlauncher.ui.dialogs
 
 import android.app.AlertDialog
 import android.app.Dialog
-import android.content.Context
 import android.content.DialogInterface
-import android.content.SharedPreferences
 import android.os.Bundle
-import androidx.core.content.edit
 import androidx.fragment.app.DialogFragment
 import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.datasource.QuickButtonPreferencesRepository
 
-class ChooseQuickButtonDialog(private var settingsKey: Int, private var defaultIconId: Int) : DialogFragment() {
-    private lateinit var settings: SharedPreferences
+class ChooseQuickButtonDialog(
+    private val repo: QuickButtonPreferencesRepository,
+    private val defaultIconId: Int
+) : DialogFragment() {
     private var onDismissListener: DialogInterface.OnDismissListener? = null
     private val iconIdsByIndex = mapOf(0 to defaultIconId, 1 to R.drawable.ic_empty)
     private val indexesByIconId = iconIdsByIndex.entries.associate { it.value to it.key }
 
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
         val builder = AlertDialog.Builder(requireContext())
-        settings = requireContext().getSharedPreferences(getString(R.string.prefs_settings), Context.MODE_PRIVATE)
 
-        val currentIconId = settings.getInt(getString(settingsKey), defaultIconId)
+        val quickButtonPrefs = repo.get()
+        var currentIconId = 0
+        when (defaultIconId) {
+            QuickButtonPreferencesRepository.DEFAULT_ICON_LEFT -> currentIconId =
+                quickButtonPrefs.leftButton.iconId
+            QuickButtonPreferencesRepository.DEFAULT_ICON_CENTER -> currentIconId =
+                quickButtonPrefs.centerButton.iconId
+            QuickButtonPreferencesRepository.DEFAULT_ICON_RIGHT -> currentIconId =
+                quickButtonPrefs.rightButton.iconId
+        }
 
         builder.setTitle(R.string.options_fragment_customize_quick_buttons)
 
-        builder.setSingleChoiceItems(R.array.quick_button_array, indexesByIconId[currentIconId]!!) { dialogInterface, i ->
+        builder.setSingleChoiceItems(
+            R.array.quick_button_array,
+            indexesByIconId[currentIconId]!!
+        ) { dialogInterface, i ->
             dialogInterface.dismiss()
-            settings.edit {
-                putInt(getString(settingsKey), iconIdsByIndex[i]!!)
+            when (defaultIconId) {
+                QuickButtonPreferencesRepository.DEFAULT_ICON_LEFT -> repo.updateLeftIconId(
+                    iconIdsByIndex[i]!!
+                )
+                QuickButtonPreferencesRepository.DEFAULT_ICON_CENTER -> repo.updateCenterIconId(
+                    iconIdsByIndex[i]!!
+                )
+                QuickButtonPreferencesRepository.DEFAULT_ICON_RIGHT -> repo.updateRightIconId(
+                    iconIdsByIndex[i]!!
+                )
             }
-
         }
         return builder.create()
     }
 
-    fun setOnDismissListener(onDismissListener: DialogInterface.OnDismissListener?) {
-        this.onDismissListener = onDismissListener
-    }
-
     override fun onDismiss(dialog: DialogInterface) {
         super.onDismiss(dialog)
         onDismissListener?.onDismiss(dialog)

+ 39 - 37
app/src/main/java/com/sduduzog/slimlauncher/ui/main/HomeFragment.kt

@@ -141,42 +141,49 @@ class HomeFragment(private val viewModel: MainViewModel) : BaseFragment(), OnLau
             }
         }
 
-        val leftButtonIcon = getQuickButtonIcon(R.string.prefs_settings_key_quick_button_left_icon_id, R.drawable.ic_call)
-        home_fragment_call.setImageResource(leftButtonIcon)
-        if(leftButtonIcon != R.drawable.ic_empty) {
-            home_fragment_call.setOnClickListener { view ->
-                try {
-                    val pm = context?.packageManager!!
-                    val intent = Intent(Intent.ACTION_DIAL)
-                    val componentName = intent.resolveActivity(pm)
-                    if (componentName == null) launchActivity(view, intent) else
-                        pm.getLaunchIntentForPackage(componentName.packageName)?.let {
-                            launchActivity(view, it)
-                        } ?: run { launchActivity(view, intent) }
-                } catch (e: Exception) {
-                    // Do nothing
+        getUnlauncherDataSource().quickButtonPreferencesRepo.liveData()
+            .observe(viewLifecycleOwner, { prefs ->
+                val leftButtonIcon = prefs.leftButton.iconId
+                home_fragment_call.setImageResource(leftButtonIcon)
+                if (leftButtonIcon != R.drawable.ic_empty) {
+                    home_fragment_call.setOnClickListener { view ->
+                        try {
+                            val pm = context?.packageManager!!
+                            val intent = Intent(Intent.ACTION_DIAL)
+                            val componentName = intent.resolveActivity(pm)
+                            if (componentName == null) launchActivity(view, intent) else
+                                pm.getLaunchIntentForPackage(componentName.packageName)?.let {
+                                    launchActivity(view, it)
+                                } ?: run { launchActivity(view, intent) }
+                        } catch (e: Exception) {
+                            // Do nothing
+                        }
+                    }
                 }
-            }
-        }
 
-        val centerButtonIcon = getQuickButtonIcon(R.string.prefs_settings_key_quick_button_center_icon_id, R.drawable.ic_cog)
-        home_fragment_options.setImageResource(centerButtonIcon)
-        if(centerButtonIcon != R.drawable.ic_empty) {
-            home_fragment_options.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_homeFragment_to_optionsFragment))
-        }
+                val centerButtonIcon = prefs.centerButton.iconId
+                home_fragment_options.setImageResource(centerButtonIcon)
+                if (centerButtonIcon != R.drawable.ic_empty) {
+                    home_fragment_options.setOnClickListener(
+                        Navigation.createNavigateOnClickListener(
+                            R.id.action_homeFragment_to_optionsFragment
+                        )
+                    )
+                }
 
-        val rightButtonIcon = getQuickButtonIcon(R.string.prefs_settings_key_quick_button_right_icon_id, R.drawable.ic_photo_camera)
-        home_fragment_camera.setImageResource(rightButtonIcon)
-        if(rightButtonIcon != R.drawable.ic_empty) {
-            home_fragment_camera.setOnClickListener {
-                try {
-                    val intent = Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)
-                    launchActivity(it, intent)
-                } catch (e: Exception) {
-                    // Do nothing
+                val rightButtonIcon = prefs.rightButton.iconId
+                home_fragment_camera.setImageResource(rightButtonIcon)
+                if (rightButtonIcon != R.drawable.ic_empty) {
+                    home_fragment_camera.setOnClickListener {
+                        try {
+                            val intent = Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)
+                            launchActivity(it, intent)
+                        } catch (e: Exception) {
+                            // Do nothing
+                        }
+                    }
                 }
-            }
-        }
+            })
 
         app_drawer_edit_text.addTextChangedListener(onTextChangeListener)
     }
@@ -243,11 +250,6 @@ class HomeFragment(private val viewModel: MainViewModel) : BaseFragment(), OnLau
         app_drawer_edit_text.clearFocus()
     }
 
-    private fun getQuickButtonIcon(buttonPrefKey: Int, defaultIconId: Int): Int {
-        return context?.getSharedPreferences(getString(R.string.prefs_settings), Context.MODE_PRIVATE)
-                ?.getInt(getString(buttonPrefKey), defaultIconId) ?: defaultIconId
-    }
-
     private val onTextChangeListener: TextWatcher = object : TextWatcher {
 
         override fun afterTextChanged(s: Editable?) {

+ 26 - 34
app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeQuickButtonsFragment.kt

@@ -1,12 +1,11 @@
 package com.sduduzog.slimlauncher.ui.options
 
-import android.content.Context
-import android.content.DialogInterface
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.datasource.QuickButtonPreferencesRepository
 import com.sduduzog.slimlauncher.ui.dialogs.ChooseQuickButtonDialog
 import com.sduduzog.slimlauncher.utils.BaseFragment
 import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.*
@@ -14,49 +13,42 @@ import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.*
 class CustomizeQuickButtonsFragment : BaseFragment() {
     override fun getFragmentView(): ViewGroup = customize_quick_buttons_fragment
 
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
         return inflater.inflate(R.layout.customize_quick_buttons_fragment, container, false)
     }
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
 
+        val prefsRepo = getUnlauncherDataSource().quickButtonPreferencesRepo
+
+        prefsRepo.liveData().observe(viewLifecycleOwner, { prefs ->
+            customize_quick_buttons_fragment_left.setImageResource(prefs.leftButton.iconId)
+            customize_quick_buttons_fragment_center.setImageResource(prefs.centerButton.iconId)
+            customize_quick_buttons_fragment_right.setImageResource(prefs.rightButton.iconId)
+        })
+
         customize_quick_buttons_fragment_left.setOnClickListener {
-            val chooseTimeFormatDialog = ChooseQuickButtonDialog(R.string.prefs_settings_key_quick_button_left_icon_id, R.drawable.ic_call)
-            chooseTimeFormatDialog.setOnDismissListener(DialogInterface.OnDismissListener {
-                setQuickButtonIcons()
-            })
-            chooseTimeFormatDialog.showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
+            ChooseQuickButtonDialog(
+                prefsRepo,
+                QuickButtonPreferencesRepository.DEFAULT_ICON_LEFT
+            ).showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
         }
         customize_quick_buttons_fragment_center.setOnClickListener {
-            val chooseTimeFormatDialog = ChooseQuickButtonDialog(R.string.prefs_settings_key_quick_button_center_icon_id, R.drawable.ic_cog)
-            chooseTimeFormatDialog.setOnDismissListener(DialogInterface.OnDismissListener {
-                setQuickButtonIcons()
-            })
-            chooseTimeFormatDialog.showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
+            ChooseQuickButtonDialog(
+                prefsRepo,
+                QuickButtonPreferencesRepository.DEFAULT_ICON_CENTER
+            ).showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
         }
         customize_quick_buttons_fragment_right.setOnClickListener {
-            val chooseTimeFormatDialog = ChooseQuickButtonDialog(R.string.prefs_settings_key_quick_button_right_icon_id, R.drawable.ic_photo_camera)
-            chooseTimeFormatDialog.setOnDismissListener(DialogInterface.OnDismissListener {
-                setQuickButtonIcons()
-            })
-            chooseTimeFormatDialog.showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
+            ChooseQuickButtonDialog(
+                prefsRepo,
+                QuickButtonPreferencesRepository.DEFAULT_ICON_RIGHT
+            ).showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
         }
     }
-
-    override fun onResume() {
-        super.onResume()
-        setQuickButtonIcons()
-    }
-
-    private fun setQuickButtonIcons() {
-        customize_quick_buttons_fragment_left.setImageResource(getIcon(R.string.prefs_settings_key_quick_button_left_icon_id, R.drawable.ic_call))
-        customize_quick_buttons_fragment_center.setImageResource(getIcon(R.string.prefs_settings_key_quick_button_center_icon_id, R.drawable.ic_cog))
-        customize_quick_buttons_fragment_right.setImageResource(getIcon(R.string.prefs_settings_key_quick_button_right_icon_id, R.drawable.ic_photo_camera))
-    }
-
-    private fun getIcon(buttonPrefKey: Int, defaultIconId: Int): Int {
-        return context?.getSharedPreferences(getString(R.string.prefs_settings), Context.MODE_PRIVATE)
-                ?.getInt(getString(buttonPrefKey), defaultIconId) ?: defaultIconId
-    }
 }

+ 11 - 1
app/src/main/java/com/sduduzog/slimlauncher/utils/BaseFragment.kt

@@ -12,12 +12,14 @@ import android.view.ViewGroup
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.app.ActivityOptionsCompat
 import androidx.fragment.app.Fragment
+import androidx.lifecycle.lifecycleScope
 import com.sduduzog.slimlauncher.BuildConfig
-import com.sduduzog.slimlauncher.MainActivity
 import com.sduduzog.slimlauncher.R
 import com.sduduzog.slimlauncher.data.model.App
+import com.sduduzog.slimlauncher.datasource.UnlauncherDataSource
 
 abstract class BaseFragment : Fragment(), ISubscriber {
+    private lateinit var unlauncherDataSource: UnlauncherDataSource
 
     abstract fun getFragmentView(): ViewGroup
 
@@ -98,4 +100,12 @@ abstract class BaseFragment : Fragment(), ISubscriber {
         filter.add(BuildConfig.APPLICATION_ID)
         return list.filterNot { filter.contains(it.packageName) }
     }
+
+    protected fun getUnlauncherDataSource(): UnlauncherDataSource {
+        if (!::unlauncherDataSource.isInitialized) {
+            unlauncherDataSource =
+                UnlauncherDataSource(requireContext(), viewLifecycleOwner.lifecycleScope)
+        }
+        return unlauncherDataSource
+    }
 }

+ 13 - 0
app/src/main/proto/unlauncher_data.proto

@@ -0,0 +1,13 @@
+syntax = "proto3";
+
+option java_package = "com.jkuester.unlauncher.datastore";
+option java_multiple_files = true;
+
+message QuickButtonPreferences {
+  message QuickButton {
+    int32 icon_id = 1;
+  }
+  QuickButton left_button = 1;
+  QuickButton center_button = 2;
+  QuickButton right_button = 3;
+}

+ 0 - 3
app/src/main/res/values-zh-rCN/strings.xml

@@ -25,9 +25,6 @@
     </string-array>
 
     <string name="prefs_settings" translatable="false">settings</string>
-    <string name="prefs_settings_key_quick_button_center_icon_id" translatable="false">quick_button_center</string>
-    <string name="prefs_settings_key_quick_button_left_icon_id" translatable="false">quick_button_left</string>
-    <string name="prefs_settings_key_quick_button_right_icon_id" translatable="false">quick_button_right</string>
     <string name="prefs_settings_key_theme" translatable="false">key_theme</string>
     <string name="prefs_settings_key_time_format" translatable="false">time_format</string>
     <string name="prefs_settings_key_toggle_status_bar" translatable="false">hide_status_bar</string>

+ 0 - 3
app/src/main/res/values/strings.xml

@@ -28,9 +28,6 @@
     </string-array>
 
     <string name="prefs_settings" translatable="false">settings</string>
-    <string name="prefs_settings_key_quick_button_center_icon_id" translatable="false">quick_button_center</string>
-    <string name="prefs_settings_key_quick_button_left_icon_id" translatable="false">quick_button_left</string>
-    <string name="prefs_settings_key_quick_button_right_icon_id" translatable="false">quick_button_right</string>
     <string name="prefs_settings_key_theme" translatable="false">key_theme</string>
     <string name="prefs_settings_key_time_format" translatable="false">time_format</string>
     <string name="prefs_settings_key_toggle_status_bar" translatable="false">hide_status_bar</string>