From 9f36081a8f84cbef302a210a4c779250133ec5ba Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 25 Oct 2013 16:52:46 -0400 Subject: [PATCH] [Android] Implement a very basic version of the input overlay configuration screen. Still a bit of a mess, but this will get cleaned up during finalizations. --- Source/Android/AndroidManifest.xml | 2 + Source/Android/res/drawable/button_a.png | Bin 0 -> 5178 bytes Source/Android/res/drawable/button_b.png | Bin 0 -> 4971 bytes Source/Android/res/drawable/button_start.png | Bin 0 -> 1511 bytes Source/Android/res/layout/emulation_view.xml | 8 + .../layout/input_overlay_config_layout.xml | 32 ++++ Source/Android/res/xml/input_prefs.xml | 164 +++++++++--------- .../dolphinemu/dolphinemu/AboutFragment.java | 2 +- .../emulation/EmulationActivity.java | 4 +- .../emulation/overlay/InputOverlay.java | 64 +++++++ .../emulation/overlay/InputOverlayItem.java | 107 ++++++++++++ .../dolphinemu/settings/PrefsActivity.java | 3 + .../{ => cpu}/CPUSettingsFragment.java | 2 +- .../{ => input}/InputConfigFragment.java | 13 +- .../input/InputOverlayConfigActivity.java | 27 +++ .../input/InputOverlayConfigButton.java | 52 ++++++ .../{ => video}/VideoSettingsFragment.java | 2 +- 17 files changed, 395 insertions(+), 87 deletions(-) create mode 100644 Source/Android/res/drawable/button_a.png create mode 100644 Source/Android/res/drawable/button_b.png create mode 100644 Source/Android/res/drawable/button_start.png create mode 100644 Source/Android/res/layout/input_overlay_config_layout.xml create mode 100644 Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java create mode 100644 Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayItem.java rename Source/Android/src/org/dolphinemu/dolphinemu/settings/{ => cpu}/CPUSettingsFragment.java (96%) rename Source/Android/src/org/dolphinemu/dolphinemu/settings/{ => input}/InputConfigFragment.java (95%) create mode 100644 Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigActivity.java create mode 100644 Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigButton.java rename Source/Android/src/org/dolphinemu/dolphinemu/settings/{ => video}/VideoSettingsFragment.java (99%) diff --git a/Source/Android/AndroidManifest.xml b/Source/Android/AndroidManifest.xml index 2e3964c65f..5b2a3cfee9 100644 --- a/Source/Android/AndroidManifest.xml +++ b/Source/Android/AndroidManifest.xml @@ -38,6 +38,8 @@ + + diff --git a/Source/Android/res/drawable/button_a.png b/Source/Android/res/drawable/button_a.png new file mode 100644 index 0000000000000000000000000000000000000000..7e685324ae8a4ad016eb1033d64b659966cfcd0c GIT binary patch literal 5178 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 literal 0 HcmV?d00001 diff --git a/Source/Android/res/drawable/button_start.png b/Source/Android/res/drawable/button_start.png new file mode 100644 index 0000000000000000000000000000000000000000..e79a9269ee5f6b35eccbfa29767a52e8fe30c69c GIT binary patch literal 1511 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|>mi z^mSxl*x1kgCy|wbfq}EYBeIx*f$uN~Gak=hk;1^hAXVZTQ4*Y=R#Ki=l*$m0n3-3i z=jR%tP-d)Ws%L0m@TF)W0|RTAr;B4qg!|U%(H^nxB5iwLPwvqF^@KIwUyRl9=x!H8xJ1b$Lp_+HEYp8`o~DxaCs4;-N&= zY^7xz!;+uho-^^}yPY$avA5NJdsF%|eQo{PnT3UgkETzX_H6pRd3B1)%8wWRs8{(X ze_Lwi%$fZyXWE_2Zg5`ia}5d(KK|9O_2c3@ckZOW5-4u33P{Rh{Lr^IVxmCT)+8B^ z#TF}8uKZb-lk?`*$B%`pw;Gz8Uk{It{_PtVcW>U6%?#^eFqbEnAqC>eRt(b$o(fzo>YVFI-%GN9G0wAME_^&3tZMbYgM)zAR&V`+D*C zrYUZ`4XIzFiZ5=SE1Hl}SNBgzTSiuPZ_nm?_wFs6H*a2cY;5dxYisNEpP$UF+^5`b zQ}tr?#2GVZ?p*bydo#lYFTV+oTdz)bK6Jv%z|6*`X6gR@|Cwb%!@}x>1OyVwii@p< zvMs)S`gE(mtINpD%RnctZ7IimOEG(k5lLIm?zT zxwCrRx_zp%F6%O8m|0l-NSBwNznqtsck&6vez{*a4$j+h|L$GeX8(%kN~fDIcrbc# znmKC}c|}ArSrQA+tXcLkLHGlUtfIW$dTVL6QUMf(r5T5 zT36)ec`&QPHShNA+wQKF_db08{@>KV;6hADNJ+RrR$R$${fbX?`u_5R3ygWm@>gx z&i2d3W?NI(|;x z@812}zJ~2mqs*rl3;Si?Bwp8K=u>JCJ|rhDzFkOIc=M^?CCQ=!6TVy#JaO*aztfR? z6OxO3&oNG%GG&X3r9-~Joga54`3~%!Eb`%aj@kT{<6)u?=7e^|exA2gYk|0no7=w^ zKB6atMO6Mc-*0>SwXvh4WB#7Kd;hbz6c&DrwJ3acX6E?{@fZt%C%fLR;MaKj!*cG0 zgtbCBrA|HEU*ZL`B01&cl&$NG=IU7=TS{5vu9J67&_=S`e z#a_JIK&j2WnsKF=-PXgMHw5)h$$n&4d*P=g`M>|}gl64+E+XIk&oRsJrHEKrS-o4K z5cjn5z@+NjuX7H3S+3N}og?&X@%Pmhf`U~iYXpDsMn892YhU~^;HQJjztb}Xo_|`W zkYm5KGIC?g!7bjbE)Pvs+b^2?EyU-B<(r5_)f_M1%AM6!I5SCjPFz@ccy-*fx&*~J z(~1q}S(dC*5Q!?Vf;w+>88^S_ZNwboq9lv-ropY?1l@b0;VDF)%PNc)I$z JtaD0e0su!o&&vP+ literal 0 HcmV?d00001 diff --git a/Source/Android/res/layout/emulation_view.xml b/Source/Android/res/layout/emulation_view.xml index 62cbbe703e..c4648b577b 100644 --- a/Source/Android/res/layout/emulation_view.xml +++ b/Source/Android/res/layout/emulation_view.xml @@ -11,4 +11,12 @@ android:focusable="false" android:focusableInTouchMode="false"/> + + + \ No newline at end of file diff --git a/Source/Android/res/layout/input_overlay_config_layout.xml b/Source/Android/res/layout/input_overlay_config_layout.xml new file mode 100644 index 0000000000..868f0b3166 --- /dev/null +++ b/Source/Android/res/layout/input_overlay_config_layout.xml @@ -0,0 +1,32 @@ + + + + + + + + + \ No newline at end of file diff --git a/Source/Android/res/xml/input_prefs.xml b/Source/Android/res/xml/input_prefs.xml index 899e559480..5dc15ac75e 100644 --- a/Source/Android/res/xml/input_prefs.xml +++ b/Source/Android/res/xml/input_prefs.xml @@ -2,86 +2,90 @@ + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java index 8b29e607d7..3695bfa40b 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java @@ -20,7 +20,7 @@ import android.widget.TextView; import java.util.ArrayList; import java.util.List; -import org.dolphinemu.dolphinemu.settings.VideoSettingsFragment; +import org.dolphinemu.dolphinemu.settings.video.VideoSettingsFragment; /** * Represents the about screen. diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java index 912fc021c5..8b8f4e0551 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/EmulationActivity.java @@ -21,8 +21,8 @@ import android.view.WindowManager.LayoutParams; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; -import org.dolphinemu.dolphinemu.settings.InputConfigFragment; -import org.dolphinemu.dolphinemu.settings.VideoSettingsFragment; +import org.dolphinemu.dolphinemu.settings.input.InputConfigFragment; +import org.dolphinemu.dolphinemu.settings.video.VideoSettingsFragment; import java.util.List; diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java new file mode 100644 index 0000000000..c2272fdc5f --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlay.java @@ -0,0 +1,64 @@ +package org.dolphinemu.dolphinemu.emulation.overlay; + +import java.util.HashSet; +import java.util.Set; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.view.View.OnTouchListener; + +/** + * Draws the interactive input overlay on top of the + * {@link NativeGLSurfaceView} that is rendering emulation. + */ +public final class InputOverlay extends SurfaceView implements OnTouchListener +{ + private final Set overlayItems = new HashSet(); + + /** + * Constructor + * + * @param context The current {@link Context}. + * @param attrs {@link AttributeSet} for parsing XML attributes. + */ + public InputOverlay(Context context, AttributeSet attrs) + { + super(context, attrs); + + // Force draw + setWillNotDraw(false); + + // Request focus for the overlay so it has priority on presses. + requestFocus(); + } + + @Override + public boolean onTouch(View v, MotionEvent event) + { + switch (event.getAction()) + { + case MotionEvent.ACTION_DOWN: + { + // TODO: Handle down presses. + return true; + } + } + + return false; + } + + @Override + public void onDraw(Canvas canvas) + { + super.onDraw(canvas); + + for (InputOverlayItem item : overlayItems) + { + item.draw(canvas); + } + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayItem.java new file mode 100644 index 0000000000..a45578b263 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/emulation/overlay/InputOverlayItem.java @@ -0,0 +1,107 @@ +package org.dolphinemu.dolphinemu.emulation.overlay; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; + +/** + * Represents a drawable image for the {@link InputOverlay} + */ +public final class InputOverlayItem +{ + // The image as a BitmapDrawable + private BitmapDrawable drawable; + + // Width and height of the underlying image. + private int width; + private int height; + + // X and Y coordinates to display this item at. + private int x; + private int y; + + // Image scale factor. + private float scaleFactor = 1.0f; + + // Rectangle that we draw this item to. + private Rect drawRect; + + /** + * Constructor. + * + * @param res Reference to the app resources for fetching display metrics. + * @param resId Resource ID of the {@link BitmapDrawable} to encapsulate. + */ + public InputOverlayItem(Resources res, int resId) + { + // Idiot-proof the constructor. + if (res == null) + throw new IllegalArgumentException("res cannot be null"); + + // Everything is valid, decode the filename as a bitmap. + drawable = (BitmapDrawable) res.getDrawable(resId); + Bitmap image = drawable.getBitmap(); + + // Set width/height + width = image.getWidth(); + height = image.getHeight(); + + // Initialize rectangle to zero width, height, x, and y. + drawRect = new Rect(); + } + + /** + * Constructor + * + * @param res Reference to the app resources for fetching display metrics. + * @param resId Resource ID of the {@link BitmapDrawable} to encapsulate. + * @param x X coordinate on the screen to place the control. + * @param y Y coordinate on the screen to place the control. + */ + public InputOverlayItem(Resources res, int resId, int x, int y) + { + this(res, resId); + + setPosition(x, y); + } + + /** + * Sets the position of this item on the screen. + * + * @param x New x-coordinate for this image. + * @param y New y-coordinate for this image. + */ + public void setPosition(int x, int y) + { + this.x = x; + this.y = y; + + drawRect.set(x, y, x + (int)(width * scaleFactor), y + (int)(height * scaleFactor)); + drawable.setBounds(drawRect); + } + + /** + * Sets a new scaling factor for the current image. + * + * @param scaleFactor The new scaling factor. Note that 1.0 is normal size. + */ + public void setScaleFactor(float scaleFactor) + { + this.scaleFactor = scaleFactor; + + // Adjust for the new scale factor. + setPosition(x, y); + } + + /** + * Draws this item to a given canvas. + * + * @param canvas The canvas to draw this item to. + */ + public void draw(Canvas canvas) + { + drawable.draw(canvas); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java index 51153866e1..5368475319 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/PrefsActivity.java @@ -7,6 +7,9 @@ package org.dolphinemu.dolphinemu.settings; import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.settings.cpu.CPUSettingsFragment; +import org.dolphinemu.dolphinemu.settings.input.InputConfigFragment; +import org.dolphinemu.dolphinemu.settings.video.VideoSettingsFragment; import android.app.ActionBar; import android.app.ActionBar.Tab; diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/CPUSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/cpu/CPUSettingsFragment.java similarity index 96% rename from Source/Android/src/org/dolphinemu/dolphinemu/settings/CPUSettingsFragment.java rename to Source/Android/src/org/dolphinemu/dolphinemu/settings/cpu/CPUSettingsFragment.java index 47f0cb7d35..77caec2b83 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/CPUSettingsFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/cpu/CPUSettingsFragment.java @@ -4,7 +4,7 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.settings; +package org.dolphinemu.dolphinemu.settings.cpu; import org.dolphinemu.dolphinemu.R; diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/InputConfigFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputConfigFragment.java similarity index 95% rename from Source/Android/src/org/dolphinemu/dolphinemu/settings/InputConfigFragment.java rename to Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputConfigFragment.java index a23f1b4a3f..2ada44ccff 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/InputConfigFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputConfigFragment.java @@ -4,12 +4,13 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.settings; +package org.dolphinemu.dolphinemu.settings.input; import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.preference.Preference; @@ -115,9 +116,17 @@ public final class InputConfigFragment extends PreferenceFragment // Everything is set, show the dialog. dialog.show(); + return true; } - return true; + if (pref.getKey().equals("inputOverlayConfigPref")) + { + Intent inputOverlayConfig = new Intent(getActivity(), InputOverlayConfigActivity.class); + startActivity(inputOverlayConfig); + return true; + } + + return false; } /** diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigActivity.java new file mode 100644 index 0000000000..3084c181d1 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigActivity.java @@ -0,0 +1,27 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings.input; + +import org.dolphinemu.dolphinemu.R; + +import android.app.Activity; +import android.os.Bundle; + +/** + * {@link Activity} used for configuring the input overlay. + */ +public final class InputOverlayConfigActivity extends Activity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // Set the initial layout. + setContentView(R.layout.input_overlay_config_layout); + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigButton.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigButton.java new file mode 100644 index 0000000000..cca596e85c --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/input/InputOverlayConfigButton.java @@ -0,0 +1,52 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2 + * Refer to the license.txt file included. + */ + +package org.dolphinemu.dolphinemu.settings.input; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.widget.Button; + +/** + * A movable {@link Button} for use within the + * input overlay configuration screen. + */ +public final class InputOverlayConfigButton extends Button implements OnTouchListener +{ + /** + * Constructor + * + * @param context The current {@link Context}. + * @param attribs {@link AttributeSet} for parsing XML attributes. + */ + public InputOverlayConfigButton(Context context, AttributeSet attribs) + { + super(context, attribs); + + // Set the button as its own OnTouchListener. + setOnTouchListener(this); + } + + @Override + public boolean onTouch(View v, MotionEvent event) + { + switch(event.getAction()) + { + // Only change the X/Y coordinates when we move the button. + case MotionEvent.ACTION_MOVE: + { + setX(getX() + event.getX()); + setY(getY() + event.getY()); + return true; + } + } + + return false; + } +} diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java similarity index 99% rename from Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java rename to Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java index fffea888a7..47f9ef475f 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/VideoSettingsFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java @@ -4,7 +4,7 @@ * Refer to the license.txt file included. */ -package org.dolphinemu.dolphinemu.settings; +package org.dolphinemu.dolphinemu.settings.video; import android.app.Activity; import android.content.SharedPreferences;