summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt
blob: 23c31e13abdb4b9e5d0132deab72ad5b8144253d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

package org.yuzu.yuzu_emu.features.settings.model

import android.text.TextUtils
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivityView
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
import java.util.*

class Settings {
    private var gameId: String? = null

    var isLoaded = false

    /**
     * A HashMap<String></String>, SettingSection> that constructs a new SettingSection instead of returning null
     * when getting a key not already in the map
     */
    class SettingsSectionMap : HashMap<String, SettingSection?>() {
        override operator fun get(key: String): SettingSection? {
            if (!super.containsKey(key)) {
                val section = SettingSection(key)
                super.put(key, section)
                return section
            }
            return super.get(key)
        }
    }

    var sections: HashMap<String, SettingSection?> = SettingsSectionMap()

    fun getSection(sectionName: String): SettingSection? {
        return sections[sectionName]
    }

    val isEmpty: Boolean
        get() = sections.isEmpty()

    fun loadSettings(view: SettingsActivityView) {
        sections = SettingsSectionMap()
        loadYuzuSettings(view)
        if (!TextUtils.isEmpty(gameId)) {
            loadCustomGameSettings(gameId!!, view)
        }
        isLoaded = true
    }

    private fun loadYuzuSettings(view: SettingsActivityView) {
        for ((fileName) in configFileSectionsMap) {
            sections.putAll(SettingsFile.readFile(fileName, view))
        }
    }

    private fun loadCustomGameSettings(gameId: String, view: SettingsActivityView) {
        // Custom game settings
        mergeSections(SettingsFile.readCustomGameSettings(gameId, view))
    }

    private fun mergeSections(updatedSections: HashMap<String, SettingSection?>) {
        for ((key, updatedSection) in updatedSections) {
            if (sections.containsKey(key)) {
                val originalSection = sections[key]
                originalSection!!.mergeSection(updatedSection!!)
            } else {
                sections[key] = updatedSection
            }
        }
    }

    fun loadSettings(gameId: String, view: SettingsActivityView) {
        this.gameId = gameId
        loadSettings(view)
    }

    fun saveSettings(view: SettingsActivityView) {
        if (TextUtils.isEmpty(gameId)) {
            view.showToastMessage(
                YuzuApplication.appContext.getString(R.string.ini_saved),
                false
            )

            for ((fileName, sectionNames) in configFileSectionsMap) {
                val iniSections = TreeMap<String, SettingSection>()
                for (section in sectionNames) {
                    iniSections[section] = sections[section]!!
                }

                SettingsFile.saveFile(fileName, iniSections, view)
            }
        } else {
            // Custom game settings
            view.showToastMessage(
                YuzuApplication.appContext.getString(R.string.gameid_saved, gameId),
                false
            )

            SettingsFile.saveCustomGameSettings(gameId, sections)
        }
    }

    companion object {
        const val SECTION_GENERAL = "General"
        const val SECTION_SYSTEM = "System"
        const val SECTION_RENDERER = "Renderer"
        const val SECTION_AUDIO = "Audio"
        const val SECTION_CPU = "Cpu"
        const val SECTION_THEME = "Theme"

        const val PREF_OVERLAY_INIT = "OverlayInit"
        const val PREF_CONTROL_SCALE = "controlScale"
        const val PREF_CONTROL_OPACITY = "controlOpacity"
        const val PREF_TOUCH_ENABLED = "isTouchEnabled"
        const val PREF_BUTTON_TOGGLE_0 = "buttonToggle0"
        const val PREF_BUTTON_TOGGLE_1 = "buttonToggle1"
        const val PREF_BUTTON_TOGGLE_2 = "buttonToggle2"
        const val PREF_BUTTON_TOGGLE_3 = "buttonToggle3"
        const val PREF_BUTTON_TOGGLE_4 = "buttonToggle4"
        const val PREF_BUTTON_TOGGLE_5 = "buttonToggle5"
        const val PREF_BUTTON_TOGGLE_6 = "buttonToggle6"
        const val PREF_BUTTON_TOGGLE_7 = "buttonToggle7"
        const val PREF_BUTTON_TOGGLE_8 = "buttonToggle8"
        const val PREF_BUTTON_TOGGLE_9 = "buttonToggle9"
        const val PREF_BUTTON_TOGGLE_10 = "buttonToggle10"
        const val PREF_BUTTON_TOGGLE_11 = "buttonToggle11"
        const val PREF_BUTTON_TOGGLE_12 = "buttonToggle12"
        const val PREF_BUTTON_TOGGLE_13 = "buttonToggle13"
        const val PREF_BUTTON_TOGGLE_14 = "buttonToggle14"

        const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter"
        const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable"
        const val PREF_MENU_SETTINGS_HAPTICS = "EmulationMenuSettings_Haptics"
        const val PREF_MENU_SETTINGS_LANDSCAPE = "EmulationMenuSettings_LandscapeScreenLayout"
        const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps"
        const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay"

        const val PREF_FIRST_APP_LAUNCH = "FirstApplicationLaunch"
        const val PREF_THEME = "Theme"
        const val PREF_THEME_MODE = "ThemeMode"
        const val PREF_BLACK_BACKGROUNDS = "BlackBackgrounds"

        private val configFileSectionsMap: MutableMap<String, List<String>> = HashMap()

        init {
            configFileSectionsMap[SettingsFile.FILE_NAME_CONFIG] =
                listOf(
                    SECTION_GENERAL,
                    SECTION_SYSTEM,
                    SECTION_RENDERER,
                    SECTION_AUDIO,
                    SECTION_CPU
                )
        }
    }
}