diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java index 72926b07..2462b595 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java @@ -1,5 +1,44 @@ package com.panda3ds.pandroid.app; +import android.os.Bundle; + +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -public class BaseActivity extends AppCompatActivity {} +import com.panda3ds.pandroid.R; +import com.panda3ds.pandroid.data.config.GlobalConfig; + +public class BaseActivity extends AppCompatActivity { + private int currentTheme = GlobalConfig.get(GlobalConfig.KEY_APP_THEME); + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + applyTheme(); + super.onCreate(savedInstanceState); + } + + @Override + protected void onResume() { + super.onResume(); + if (GlobalConfig.get(GlobalConfig.KEY_APP_THEME) != currentTheme){ + recreate(); + } + } + + private void applyTheme(){ + switch (GlobalConfig.get(GlobalConfig.KEY_APP_THEME)){ + case GlobalConfig.VALUE_THEME_ANDROID: + setTheme(R.style.Theme_Pandroid); + break; + case GlobalConfig.VALUE_THEME_LIGHT: + setTheme(R.style.Theme_Pandroid_Light); + break; + case GlobalConfig.VALUE_THEME_DARK: + setTheme(R.style.Theme_Pandroid_Dark); + break; + case GlobalConfig.VALUE_THEME_BLACK: + setTheme(R.style.Theme_Pandroid_Black); + break; + } + currentTheme = GlobalConfig.get(GlobalConfig.KEY_APP_THEME); + } +} diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java index 22f888fe..08f2d70f 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java @@ -8,11 +8,13 @@ import com.panda3ds.pandroid.R; import com.panda3ds.pandroid.app.PreferenceActivity; import com.panda3ds.pandroid.app.base.BasePreferenceFragment; import com.panda3ds.pandroid.app.preferences.InputMapPreferences; +import com.panda3ds.pandroid.app.preferences.AppearancePreferences; public class SettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { setPreferencesFromResource(R.xml.start_preferences, rootKey); setItemClick("inputMap", (item) -> PreferenceActivity.launch(requireContext(), InputMapPreferences.class)); + setItemClick("appearance", (item)-> PreferenceActivity.launch(requireContext(), AppearancePreferences.class)); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/AppearancePreferences.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/AppearancePreferences.java new file mode 100644 index 00000000..63f79ddb --- /dev/null +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/AppearancePreferences.java @@ -0,0 +1,28 @@ +package com.panda3ds.pandroid.app.preferences; + +import android.app.Activity; +import android.os.Bundle; + +import androidx.annotation.Nullable; + +import com.panda3ds.pandroid.R; +import com.panda3ds.pandroid.app.BaseActivity; +import com.panda3ds.pandroid.app.base.BasePreferenceFragment; +import com.panda3ds.pandroid.data.config.GlobalConfig; +import com.panda3ds.pandroid.view.preferences.SingleSelectionPreferences; + +public class AppearancePreferences extends BasePreferenceFragment { + @Override + public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { + setPreferencesFromResource(R.xml.appearance_preference, rootKey); + + ((BaseActivity) requireActivity()).getSupportActionBar().setTitle(R.string.appearance); + + SingleSelectionPreferences themePreference = findPreference("theme"); + themePreference.setSelectedItem(GlobalConfig.get(GlobalConfig.KEY_APP_THEME)); + themePreference.setOnPreferenceChangeListener((preference, value) -> { + GlobalConfig.set(GlobalConfig.KEY_APP_THEME, (int) value); + return false; + }); + } +} diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputMapPreferences.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputMapPreferences.java index 007920bd..00f031ac 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputMapPreferences.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputMapPreferences.java @@ -8,8 +8,10 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.preference.Preference; +import androidx.preference.SeekBarPreference; import com.panda3ds.pandroid.R; +import com.panda3ds.pandroid.app.BaseActivity; import com.panda3ds.pandroid.app.base.BasePreferenceFragment; import com.panda3ds.pandroid.input.InputMap; import com.panda3ds.pandroid.input.KeyName; @@ -19,16 +21,35 @@ public class InputMapPreferences extends BasePreferenceFragment implements Activ private ActivityResultLauncher<String> requestKey; private String currentKey; + private SeekBarPreference deadZonePreference; + @Override public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { setPreferencesFromResource(R.xml.input_map_preferences, rootKey); + + ((BaseActivity) requireActivity()).getSupportActionBar().setTitle(R.string.controller_mapping); + for (KeyName key : KeyName.values()) { - if (key == KeyName.NULL) return; + if (key == KeyName.NULL) continue; setItemClick(key.name(), this::onItemPressed); } + + deadZonePreference = getPreferenceScreen().findPreference("dead_zone"); + + deadZonePreference.setOnPreferenceChangeListener((preference, value) -> { + InputMap.setDeadZone(((int)value/100.0f)); + refreshList(); + return false; + }); + refreshList(); } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @Override public void onAttach(@NonNull Context context) { super.onAttach(context); @@ -56,6 +77,8 @@ public class InputMapPreferences extends BasePreferenceFragment implements Activ } private void refreshList() { + deadZonePreference.setValue((int)(InputMap.getDeadZone()*100)); + deadZonePreference.setSummary(deadZonePreference.getValue()+"%"); for (KeyName key : KeyName.values()) { if (key == KeyName.NULL) continue; findPreference(key.name()).setSummary(InputMap.relative(key)); diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java index ddfee09e..95af3801 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java @@ -11,6 +11,13 @@ import java.io.Serializable; public class GlobalConfig { private static SharedPreferences data; + public static final int VALUE_THEME_ANDROID = 0; + public static final int VALUE_THEME_LIGHT = 1; + public static final int VALUE_THEME_DARK = 2; + public static final int VALUE_THEME_BLACK = 3; + + public static final Key<Integer> KEY_APP_THEME = new Key<>("app.theme", VALUE_THEME_ANDROID); + public static void initialize() { data = PandroidApplication.getAppContext() .getSharedPreferences(Constants.PREF_GLOBAL_CONFIG, Context.MODE_PRIVATE); diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java index 46407302..325ce1e7 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java @@ -1,5 +1,7 @@ package com.panda3ds.pandroid.data.game; +import android.graphics.Bitmap; + import java.util.UUID; public class GameMetadata { @@ -7,7 +9,7 @@ public class GameMetadata { private final String id; private final String romPath; private final String title; - private final int[] icon = new int[48 * 48]; + private transient final Bitmap icon = Bitmap.createBitmap(48,48, Bitmap.Config.RGB_565); private final String publisher; private final GameRegion[] regions = new GameRegion[]{GameRegion.None}; @@ -34,7 +36,7 @@ public class GameMetadata { return publisher; } - public int[] getIcon() { + public Bitmap getIcon() { return icon; } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputMap.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputMap.java index 6e61345c..b94ceaac 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputMap.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputMap.java @@ -36,7 +36,7 @@ public class InputMap { } public static void setDeadZone(float value) { - data.edit().putFloat(KEY_DEAD_ZONE, Math.max(0, Math.min(1.0F, value))).apply(); + data.edit().putFloat(KEY_DEAD_ZONE, Math.max(0.0f, Math.min(1.0f, value))).apply(); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java index 4ebd7241..a22c4842 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java @@ -3,8 +3,6 @@ package com.panda3ds.pandroid.utils; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.ParcelFileDescriptor; -import android.util.Log; import androidx.documentfile.provider.DocumentFile; @@ -27,15 +25,6 @@ public class FileUtils { return file.getName(); } - public static long getSize(String path) { - return DocumentFile.fromSingleUri(getContext(), parseUri(path)).length(); - } - - - public static String getCacheDir() { - return getContext().getCacheDir().getAbsolutePath(); - } - public static void makeUriPermanent(String uri, String mode) { int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; @@ -44,20 +33,4 @@ public class FileUtils { getContext().getContentResolver().takePersistableUriPermission(parseUri(uri), flags); } - - public static int openContentUri(String path, String mode) { - try { - Uri uri = parseUri(path); - ParcelFileDescriptor descriptor = getContext().getContentResolver().openFileDescriptor(uri, mode); - int fd = descriptor.getFd(); - descriptor.detachFd(); - descriptor.close(); - return fd; - } catch (Exception e) { - Log.e(Constants.LOG_TAG, "Error on openContentUri: " + e); - } - - return -1; - } - } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/ItemHolder.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/ItemHolder.java index d2ccba1f..54f86dae 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/ItemHolder.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/ItemHolder.java @@ -18,6 +18,8 @@ class ItemHolder extends RecyclerView.ViewHolder { public void apply(GameMetadata game) { ((AppCompatTextView) itemView.findViewById(R.id.title)) .setText(game.getTitle()); + ((GameIconView) itemView.findViewById(R.id.icon)) + .setImageBitmap(game.getIcon()); ((AppCompatTextView) itemView.findViewById(R.id.description)) .setText(game.getPublisher()); diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/preferences/SingleSelectionPreferences.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/preferences/SingleSelectionPreferences.java new file mode 100644 index 00000000..f4ddfd12 --- /dev/null +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/preferences/SingleSelectionPreferences.java @@ -0,0 +1,84 @@ +package com.panda3ds.pandroid.view.preferences; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.util.AttributeSet; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; + +import com.panda3ds.pandroid.R; +import com.panda3ds.pandroid.utils.Constants; + +public class SingleSelectionPreferences extends PreferenceCategory implements Preference.OnPreferenceClickListener { + private final Drawable transparent = new ColorDrawable(Color.TRANSPARENT); + private final Drawable doneDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_done); + + public SingleSelectionPreferences(@NonNull Context context) { + super(context); + } + + public SingleSelectionPreferences(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public SingleSelectionPreferences(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SingleSelectionPreferences(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + { + try { + TypedArray color = getContext().obtainStyledAttributes(new int[]{ + android.R.attr.textColorSecondary + }); + doneDrawable.setTint(color.getColor(0, Color.RED)); + color.recycle(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + color.close(); + } + } catch (Exception e) { + Log.e(Constants.LOG_TAG, "Error on obtain text color secondary: ", e); + } + } + + @Override + public void onAttached() { + super.onAttached(); + for (int i = 0; i < getPreferenceCount();i++) { + getPreference(i).setOnPreferenceClickListener(this); + } + } + + public void setSelectedItem(int index){ + onPreferenceClick(getPreference(index)); + } + + @Override + public boolean onPreferenceClick(@NonNull Preference preference) { + int index = 0; + for (int i = 0; i < getPreferenceCount(); i++){ + Preference item = getPreference(i); + if (item == preference){ + index = i; + item.setIcon(R.drawable.ic_done); + } else { + item.setIcon(transparent); + } + } + + callChangeListener(index); + return false; + } +} diff --git a/src/pandroid/app/src/main/res/color/bottom_navigation_indicator_tint.xml b/src/pandroid/app/src/main/res/color/bottom_navigation_indicator_tint.xml new file mode 100644 index 00000000..e0fc9112 --- /dev/null +++ b/src/pandroid/app/src/main/res/color/bottom_navigation_indicator_tint.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="?colorOnSecondary" android:state_checked="true"/> + <item android:color="?colorOnSurface"/> +</selector> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/color/text_secondary_dark.xml b/src/pandroid/app/src/main/res/color/text_secondary_dark.xml new file mode 100644 index 00000000..53a9cd15 --- /dev/null +++ b/src/pandroid/app/src/main/res/color/text_secondary_dark.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_focused="true" android:state_enabled="true" android:color="#000"/> + + <item android:state_activated="false" android:color="#8000"/> + <item android:state_enabled="false" android:color="#8000"/> + + <item android:color="#000"/> +</selector> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/color/text_secondary_light.xml b/src/pandroid/app/src/main/res/color/text_secondary_light.xml new file mode 100644 index 00000000..35136058 --- /dev/null +++ b/src/pandroid/app/src/main/res/color/text_secondary_light.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_focused="true" android:state_enabled="true" android:color="#FFF"/> + + <item android:state_activated="false" android:color="#AFFF"/> + <item android:state_enabled="false" android:color="#AFFF"/> + <item android:color="#FFF"/> +</selector> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/drawable/ic_done.xml b/src/pandroid/app/src/main/res/drawable/ic_done.xml new file mode 100644 index 00000000..25e52514 --- /dev/null +++ b/src/pandroid/app/src/main/res/drawable/ic_done.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#000000" + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/> +</vector> diff --git a/src/pandroid/app/src/main/res/drawable/ic_theme.xml b/src/pandroid/app/src/main/res/drawable/ic_theme.xml new file mode 100644 index 00000000..c3d2c7b3 --- /dev/null +++ b/src/pandroid/app/src/main/res/drawable/ic_theme.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#000000" + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z"/> +</vector> diff --git a/src/pandroid/app/src/main/res/drawable/temp_thumb.jpg b/src/pandroid/app/src/main/res/drawable/temp_thumb.jpg deleted file mode 100644 index e66782be..00000000 Binary files a/src/pandroid/app/src/main/res/drawable/temp_thumb.jpg and /dev/null differ diff --git a/src/pandroid/app/src/main/res/layout-land/activity_main.xml b/src/pandroid/app/src/main/res/layout-land/activity_main.xml index ba552154..fa4cfbca 100644 --- a/src/pandroid/app/src/main/res/layout-land/activity_main.xml +++ b/src/pandroid/app/src/main/res/layout-land/activity_main.xml @@ -24,6 +24,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:menu="@menu/main_activity_navigation" - app:labelVisibilityMode="selected"/> + app:labelVisibilityMode="selected" + style="@style/ThemedNavigationBottom"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/layout/activity_main.xml b/src/pandroid/app/src/main/res/layout/activity_main.xml index 1facabd3..6de64020 100644 --- a/src/pandroid/app/src/main/res/layout/activity_main.xml +++ b/src/pandroid/app/src/main/res/layout/activity_main.xml @@ -23,6 +23,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/fragment_container" app:labelVisibilityMode="selected" - app:menu="@menu/main_activity_navigation"/> + app:menu="@menu/main_activity_navigation" + style="@style/ThemedNavigationBottom"/> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/layout/holder_game.xml b/src/pandroid/app/src/main/res/layout/holder_game.xml index 169896e6..b2d46d1b 100644 --- a/src/pandroid/app/src/main/res/layout/holder_game.xml +++ b/src/pandroid/app/src/main/res/layout/holder_game.xml @@ -13,11 +13,11 @@ app:cardCornerRadius="16dp"> <com.panda3ds.pandroid.view.gamesgrid.GameIconView - android:id="@+id/cover" + android:id="@+id/icon" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" - android:src="@drawable/temp_thumb"/> + android:background="?colorSurfaceVariant"/> </androidx.cardview.widget.CardView> diff --git a/src/pandroid/app/src/main/res/layout/preference_start_item.xml b/src/pandroid/app/src/main/res/layout/preference_start_item.xml index 35aa5554..ecb10436 100644 --- a/src/pandroid/app/src/main/res/layout/preference_start_item.xml +++ b/src/pandroid/app/src/main/res/layout/preference_start_item.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="70dp" - android:layout_marginVertical="10dp" + android:layout_marginVertical="4dp" android:layout_marginHorizontal="10dp" android:background="@drawable/simple_card_background" android:backgroundTint="?colorSurfaceVariant"> diff --git a/src/pandroid/app/src/main/res/values-pt-rBR/strings.xml b/src/pandroid/app/src/main/res/values-pt-rBR/strings.xml index 90e533a7..e57feab5 100644 --- a/src/pandroid/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/pandroid/app/src/main/res/values-pt-rBR/strings.xml @@ -13,4 +13,15 @@ <string name="others">Outros</string> <string name="press_any_key">Pressione qualquer tecla</string> <string name="axis">Eixos</string> + <string name="dead_zone">Zona Morta</string> + <string name="options">Opções</string> + <string name="pref_input_map_summary">Mapeie um controle ou teclado</string> + <string name="controller_mapping">Mapeamento de controle</string> + <string name="theme">Tema</string> + <string name="pref_appearance_summary">Defina a aparência do aplicativo</string> + <string name="appearance">Aparência</string> + <string name="theme_device">Mesmo do dispositivo</string> + <string name="light">Claro</string> + <string name="dark">Escuro</string> + <string name="black">Preto</string> </resources> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/values/strings.xml b/src/pandroid/app/src/main/res/values/strings.xml index b7855eca..973e7acb 100644 --- a/src/pandroid/app/src/main/res/values/strings.xml +++ b/src/pandroid/app/src/main/res/values/strings.xml @@ -14,4 +14,15 @@ <string name="others">Others</string> <string name="press_any_key">Press any key</string> <string name="axis">Axis</string> + <string name="dead_zone">Dead zone</string> + <string name="options">Options</string> + <string name="pref_input_map_summary">Map physics controller or keyboard</string> + <string name="controller_mapping">Controller Mapping</string> + <string name="theme">Theme</string> + <string name="pref_appearance_summary">Set application theme</string> + <string name="appearance">Appearance</string> + <string name="theme_device">Device</string> + <string name="light">Light</string> + <string name="dark">Dark</string> + <string name="black">Black</string> </resources> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/values/styleable.xml b/src/pandroid/app/src/main/res/values/styleable.xml index 32e51685..c4bce805 100644 --- a/src/pandroid/app/src/main/res/values/styleable.xml +++ b/src/pandroid/app/src/main/res/values/styleable.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <resources> + + <style name="Pandroid"/> + <style name="ControllerStyle"/> <style name="ControllerStyle.SimpleButton"> <item name="android:layout_height">19pt</item> @@ -9,7 +12,19 @@ <item name="android:backgroundTintMode">multiply</item> <item name="android:backgroundTint">#FFF</item> </style> - <style name="HiddenTextAppearance"> - <item name="android:textSize">0.1px</item> + <style name="ThemedNavigationBottom"> + <item name="itemActiveIndicatorStyle">@style/ThemedNavigationBottom.Indicator</item> + <item name="labelVisibilityMode">selected</item> + <item name="android:background">#0000</item> + <item name="itemIconTint">@color/bottom_navigation_indicator_tint</item> </style> + <style name="ThemedNavigationBottom.Indicator" parent="Widget.Material3.BottomNavigationView.ActiveIndicator"> + <item name="color">?colorSecondary</item> + <item name="android:color">?colorSecondary</item> + </style> + + <style name="Pandroid.SeekbarPreference" parent="Preference.SeekBarPreference"> + <item name="android:textColorSecondary">#C00</item> + </style> + </resources> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/values/themes.xml b/src/pandroid/app/src/main/res/values/themes.xml index 812da8ea..c7d79080 100644 --- a/src/pandroid/app/src/main/res/values/themes.xml +++ b/src/pandroid/app/src/main/res/values/themes.xml @@ -1,9 +1,76 @@ -<resources xmlns:tools="http://schemas.android.com/tools"> +<resources> <!-- Base application theme. --> <style name="Base.Theme.Pandroid" parent="Theme.Material3.DayNight.NoActionBar"> <!-- Customize your light theme here. --> <!-- <item name="colorPrimary">@color/my_light_primary</item> --> + <item name="alertDialogTheme">@style/Theme.AppCompat.DayNight.Dialog</item> </style> <style name="Theme.Pandroid" parent="Base.Theme.Pandroid" /> + + <style name="Theme.Pandroid.Custom" parent="Theme.Pandroid"> + <item name="android:textColor">?colorOnSurface</item> + <item name="android:textSize">16sp</item> + <item name="android:textColorHint">?colorOnSurfaceVariant</item> + <item name="android:statusBarColor">?colorSurfaceVariant</item> + <item name="android:windowBackground">?colorSurface</item> + <item name="titleTextColor">?colorOnSurface</item> + <item name="hintTextColor">?colorOnSurfaceVariant</item> + <item name="colorOnBackground">?colorOnSurface</item> + </style> + + <style name="Theme.Pandroid.Dark" parent="Theme.Pandroid.Custom"> + <item name="colorSurface">#222</item> + <item name="colorOnSurface">#FFF</item> + + <item name="colorSurfaceVariant">#333</item> + <item name="colorOnSurfaceVariant">#BBB</item> + + <item name="colorPrimary">#FF6D00</item> + <item name="colorOnPrimary">#FFF</item> + + <item name="colorSecondary">#B37749</item> + <item name="colorOnSecondary">#FFF</item> + + <item name="android:textColorPrimary">@color/text_secondary_light</item> + <item name="android:textColorSecondary">@color/text_secondary_light</item> + <item name="android:windowLightStatusBar">false</item> + </style> + + <style name="Theme.Pandroid.Black" parent="Theme.Pandroid.Custom"> + <item name="colorSurface">#000000</item> + <item name="colorOnSurface">#FFF</item> + + <item name="colorSurfaceVariant">#202020</item> + <item name="colorOnSurfaceVariant">#BBB</item> + + <item name="colorPrimary">#FF6D00</item> + <item name="colorOnPrimary">#000000</item> + + <item name="colorSecondary">#B37749</item> + <item name="colorOnSecondary">#000000</item> + + <item name="android:textColorPrimary">@color/text_secondary_light</item> + <item name="android:textColorSecondary">@color/text_secondary_light</item> + <item name="android:windowLightStatusBar">false</item> + </style> + + <style name="Theme.Pandroid.Light" parent="Theme.Pandroid.Custom"> + <item name="colorSurface">#FFF</item> + <item name="colorOnSurface">#111</item> + + <item name="colorSurfaceVariant">#EEE</item> + <item name="colorOnSurfaceVariant">#222</item> + + <item name="colorPrimary">#FF6D00</item> + <item name="colorOnPrimary">#FFF</item> + + <item name="colorSecondary">#B37749</item> + <item name="colorOnSecondary">#FFF</item> + + <item name="android:windowLightStatusBar">true</item> + <item name="android:textColorPrimary">@color/text_secondary_dark</item> + <item name="android:textColorSecondary">@color/text_secondary_dark</item> + </style> + </resources> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/xml/appearance_preference.xml b/src/pandroid/app/src/main/res/xml/appearance_preference.xml new file mode 100644 index 00000000..dd1ed483 --- /dev/null +++ b/src/pandroid/app/src/main/res/xml/appearance_preference.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> + <com.panda3ds.pandroid.view.preferences.SingleSelectionPreferences + app:key="theme" + app:title="@string/theme" + app:iconSpaceReserved="false"> + + <Preference app:title="@string/theme_device"/> + <Preference app:title="@string/light"/> + <Preference app:title="@string/dark"/> + <Preference app:title="@string/black"/> + + </com.panda3ds.pandroid.view.preferences.SingleSelectionPreferences> +</PreferenceScreen> \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/xml/input_map_preferences.xml b/src/pandroid/app/src/main/res/xml/input_map_preferences.xml index 25b224d1..fbb6221f 100644 --- a/src/pandroid/app/src/main/res/xml/input_map_preferences.xml +++ b/src/pandroid/app/src/main/res/xml/input_map_preferences.xml @@ -2,6 +2,19 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + <PreferenceCategory + app:title="@string/options" + app:iconSpaceReserved="false"> + + <SeekBarPreference + android:key="dead_zone" + android:title="@string/dead_zone" + app:iconSpaceReserved="false" + android:summary="0%" + android:max="100"/> + + </PreferenceCategory> + <PreferenceCategory android:title="@string/axis" app:iconSpaceReserved="false"> diff --git a/src/pandroid/app/src/main/res/xml/start_preferences.xml b/src/pandroid/app/src/main/res/xml/start_preferences.xml index 48c8d7a9..57a6d32c 100644 --- a/src/pandroid/app/src/main/res/xml/start_preferences.xml +++ b/src/pandroid/app/src/main/res/xml/start_preferences.xml @@ -1,17 +1,26 @@ <?xml version="1.0" encoding="utf-8"?> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:divider="#F00"> <Preference - android:title="@string/app_name" - android:enabled="false" - android:summary="1.0" - android:layout="@layout/preference_simple_about"/> + app:title="@string/app_name" + app:enabled="false" + app:summary="1.0" + app:layout="@layout/preference_simple_about"/> <Preference - android:key="inputMap" - android:icon="@drawable/ic_key_a" - android:title="Controller Mapping" - android:summary="Map physics controller or keyboard" - android:layout="@layout/preference_start_item"/> + app:key="inputMap" + app:icon="@drawable/ic_key_a" + app:title="@string/controller_mapping" + app:summary="@string/pref_input_map_summary" + app:layout="@layout/preference_start_item"/> + + <Preference + app:key="appearance" + app:icon="@drawable/ic_theme" + app:title="@string/appearance" + app:summary="@string/pref_appearance_summary" + app:layout="@layout/preference_start_item"/> </PreferenceScreen> \ No newline at end of file