diff --git a/app/build.gradle b/app/build.gradle index c699b886..5e3445fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,10 +54,11 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.preference:preference:1.1.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'com.google.android.material:material:1.2.0-alpha02' implementation 'me.xdrop:fuzzywuzzy:1.2.0' implementation "androidx.core:core-ktx:1.1.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.documentfile:documentfile:1.0.1' } repositories { mavenCentral() diff --git a/app/src/main/java/emu/skyline/MainActivity.kt b/app/src/main/java/emu/skyline/MainActivity.kt index ed19bfb6..7e0a20a5 100644 --- a/app/src/main/java/emu/skyline/MainActivity.kt +++ b/app/src/main/java/emu/skyline/MainActivity.kt @@ -12,6 +12,7 @@ import android.view.View import android.widget.AdapterView import android.widget.AdapterView.OnItemClickListener import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.SearchView import androidx.documentfile.provider.DocumentFile import androidx.preference.PreferenceManager @@ -28,6 +29,7 @@ import java.io.File import java.io.IOException import java.util.* + class MainActivity : AppCompatActivity(), View.OnClickListener { private lateinit var sharedPreferences: SharedPreferences private var adapter = GameAdapter(this) @@ -67,21 +69,30 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { Log.w("refreshFiles", "Ran into exception while loading: " + e.message) } } - adapter.clear() - val entries: List = findFile("nro", NroLoader(this), DocumentFile.fromTreeUri(this, Uri.parse(sharedPreferences.getString("search_location", "")))!!, ArrayList()) - if (entries.isNotEmpty()) { - adapter.addHeader(getString(R.string.nro)) - for (entry in entries) - adapter.addItem(GameItem(entry)) - } else { - adapter.addHeader(getString(R.string.no_rom)) - } try { - adapter.save(File(applicationInfo.dataDir + "/roms.bin")) - } catch (e: IOException) { - Log.w("refreshFiles", "Ran into exception while saving: " + e.message) + adapter.clear() + val entries: List = findFile("nro", NroLoader(this), DocumentFile.fromTreeUri(this, Uri.parse(sharedPreferences.getString("search_location", "")))!!, ArrayList()) + if (entries.isNotEmpty()) { + adapter.addHeader(getString(R.string.nro)) + for (entry in entries) + adapter.addItem(GameItem(entry)) + } else { + adapter.addHeader(getString(R.string.no_rom)) + } + try { + adapter.save(File(applicationInfo.dataDir + "/roms.bin")) + } catch (e: IOException) { + Log.w("refreshFiles", "Ran into exception while saving: " + e.message) + } + sharedPreferences.edit().putBoolean("refresh_required", false).apply() + } catch (e: IllegalArgumentException) { + sharedPreferences.edit().remove("search_location").apply() + val intent = intent + finish() + startActivity(intent) + } catch (e: Exception) { + notifyUser(e.message!!) } - sharedPreferences.edit().putBoolean("refresh_required", false).apply() } override fun onCreate(savedInstanceState: Bundle?) { @@ -89,6 +100,12 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { setContentView(R.layout.main_activity) PreferenceManager.setDefaultValues(this, R.xml.preferences, false) sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) + AppCompatDelegate.setDefaultNightMode(when ((sharedPreferences.getString("app_theme", "2")?.toInt())) { + 0 -> AppCompatDelegate.MODE_NIGHT_NO + 1 -> AppCompatDelegate.MODE_NIGHT_YES + 2 -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + else -> AppCompatDelegate.MODE_NIGHT_UNSPECIFIED + }) setSupportActionBar(toolbar) open_fab.setOnClickListener(this) log_fab.setOnClickListener(this) diff --git a/app/src/main/java/emu/skyline/loader/BaseLoader.kt b/app/src/main/java/emu/skyline/loader/BaseLoader.kt index 3fa08d5f..5d7ec8d7 100644 --- a/app/src/main/java/emu/skyline/loader/BaseLoader.kt +++ b/app/src/main/java/emu/skyline/loader/BaseLoader.kt @@ -18,7 +18,7 @@ enum class TitleFormat { } internal class TitleEntry(var name: String, var author: String, var romType: TitleFormat, var valid: Boolean, @Transient var uri: Uri, @Transient var icon: Bitmap) : Serializable { - constructor(context: Context, author: String, romType: TitleFormat, valid: Boolean, uri: Uri) : this("", author, romType, valid, uri, context.resources.getDrawable(R.drawable.ic_missing_icon, context.theme).toBitmap(256, 256)) { + constructor(context: Context, author: String, romType: TitleFormat, valid: Boolean, uri: Uri) : this("", author, romType, valid, uri, context.resources.getDrawable(R.drawable.ic_missing, context.theme).toBitmap(256, 256)) { context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> val nameIndex: Int = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) cursor.moveToFirst() diff --git a/app/src/main/java/emu/skyline/utility/ThemePreference.kt b/app/src/main/java/emu/skyline/utility/ThemePreference.kt new file mode 100644 index 00000000..11553de8 --- /dev/null +++ b/app/src/main/java/emu/skyline/utility/ThemePreference.kt @@ -0,0 +1,24 @@ +package emu.skyline.utility + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.app.AppCompatDelegate +import androidx.preference.ListPreference + +class ThemePreference : ListPreference { + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + + constructor(context: Context?) : super(context) + + override fun callChangeListener(newValue: Any?): Boolean { + AppCompatDelegate.setDefaultNightMode(when((newValue as String).toInt()) { + 0 -> AppCompatDelegate.MODE_NIGHT_NO + 1 -> AppCompatDelegate.MODE_NIGHT_YES + 2 -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + else -> AppCompatDelegate.MODE_NIGHT_UNSPECIFIED + }) + return super.callChangeListener(newValue) + } +} diff --git a/app/src/main/res/drawable/ic_clear.xml b/app/src/main/res/drawable/ic_clear.xml index 6ed96059..a551f24e 100644 --- a/app/src/main/res/drawable/ic_clear.xml +++ b/app/src/main/res/drawable/ic_clear.xml @@ -1,10 +1,9 @@ diff --git a/app/src/main/res/drawable/ic_log.xml b/app/src/main/res/drawable/ic_log.xml index 0e627a4e..b97c1eee 100644 --- a/app/src/main/res/drawable/ic_log.xml +++ b/app/src/main/res/drawable/ic_log.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_missing.xml b/app/src/main/res/drawable/ic_missing.xml new file mode 100644 index 00000000..4f095d4c --- /dev/null +++ b/app/src/main/res/drawable/ic_missing.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_missing_icon.xml b/app/src/main/res/drawable/ic_missing_icon.xml deleted file mode 100644 index dd8f5dce..00000000 --- a/app/src/main/res/drawable/ic_missing_icon.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_open.xml b/app/src/main/res/drawable/ic_open.xml index 064aaa04..b2353ced 100644 --- a/app/src/main/res/drawable/ic_open.xml +++ b/app/src/main/res/drawable/ic_open.xml @@ -1,5 +1,9 @@ - - + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml index 96b6c239..273eb4ed 100644 --- a/app/src/main/res/drawable/ic_refresh.xml +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml index eafe1d00..16454e8b 100644 --- a/app/src/main/res/drawable/ic_search.xml +++ b/app/src/main/res/drawable/ic_search.xml @@ -1,11 +1,9 @@ diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml index 1afb5d53..0b4ff622 100644 --- a/app/src/main/res/drawable/ic_settings.xml +++ b/app/src/main/res/drawable/ic_settings.xml @@ -1,10 +1,9 @@ diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml index a83c833f..2571649f 100644 --- a/app/src/main/res/drawable/ic_share.xml +++ b/app/src/main/res/drawable/ic_share.xml @@ -1,11 +1,9 @@ diff --git a/app/src/main/res/layout/game_item.xml b/app/src/main/res/layout/game_item.xml index e21a8459..cb0a99de 100644 --- a/app/src/main/res/layout/game_item.xml +++ b/app/src/main/res/layout/game_item.xml @@ -13,7 +13,7 @@ android:layout_alignParentTop="false" android:layout_centerVertical="true" android:contentDescription="@string/icon" - android:src="@drawable/ic_missing_icon" /> + android:src="@drawable/ic_missing" /> diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index ffdd3829..721adb73 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -12,8 +12,8 @@ android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" - android:popupTheme="@style/ThemeOverlay.MaterialComponents.Light" - android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar" + android:theme="@style/AppTheme.ActionBar" + app:popupTheme="@style/AppTheme.PopupMenu" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -30,8 +30,7 @@ @@ -40,6 +39,7 @@ android:id="@+id/open_fab" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="16dp" android:layout_marginBottom="8dp" android:clickable="true" android:focusable="true" @@ -49,6 +49,8 @@ android:id="@+id/log_fab" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:layout_marginBottom="8dp" android:clickable="true" android:focusable="true" app:srcCompat="@drawable/ic_log" /> diff --git a/app/src/main/res/layout/section_item.xml b/app/src/main/res/layout/section_item.xml index 4b0a5fab..878ee086 100644 --- a/app/src/main/res/layout/section_item.xml +++ b/app/src/main/res/layout/section_item.xml @@ -13,7 +13,7 @@ android:layout_marginStart="5dp" android:layout_marginTop="2dp" android:layout_marginEnd="5dp" - android:textColor="@color/colorPrimary" + android:textColor="?colorSecondary" android:textSize="13sp" /> diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml index be124d4c..a5275947 100644 --- a/app/src/main/res/layout/settings_activity.xml +++ b/app/src/main/res/layout/settings_activity.xml @@ -10,7 +10,8 @@ android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" - android:theme="@style/ThemeOverlay.AppCompat.Dark" + android:theme="@style/AppTheme.ActionBar" + app:popupTheme="@style/AppTheme.PopupMenu" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/menu/toolbar_main.xml b/app/src/main/res/menu/toolbar_main.xml index 3dbf9f30..d08b41b3 100644 --- a/app/src/main/res/menu/toolbar_main.xml +++ b/app/src/main/res/menu/toolbar_main.xml @@ -4,6 +4,7 @@ diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 00000000..b7b5246e --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,9 @@ + + + #FFFF0000 + #BFFF0000 + #D7000000 + #FFFF0000 + #BFFF0000 + #DF000000 + diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index 4449f71b..b50b0623 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -12,4 +12,14 @@ 2 3 + + Light + Dark + Use System Default + + + 0 + 1 + 2 + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index beb6306e..365ad9a5 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,9 @@ - #E60012 - #AB0000 - #E60012 - \ No newline at end of file + #FFFF0000 + #BFFF0000 + #DFFFFFFF + #FFFF0000 + #BFFF0000 + #DFFFFFFF + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6837e093..d24a63f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,8 +21,8 @@ An error has occurred while sharing The logs have been cleared + Emulator Search Location - Logging Log Level Compact Logs Logs will be displayed in a compact form factor @@ -31,4 +31,5 @@ Use Docked Mode The system will emulate being in handheld mode The system will emulate being in docked mode + Theme diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 17a1fcd7..3a60d971 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,10 +1,18 @@ - - + + - diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index fb44746d..8df8aa71 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -17,16 +17,19 @@ + android:key="category_emulator" + android:title="@string/emulator"> - - +