diff --git a/Source/Android/app/src/main/AndroidManifest.xml b/Source/Android/app/src/main/AndroidManifest.xml
index 3c87d9fd41..7e57b6cb3f 100644
--- a/Source/Android/app/src/main/AndroidManifest.xml
+++ b/Source/Android/app/src/main/AndroidManifest.xml
@@ -52,6 +52,10 @@
android:name=".activities.EmulationActivity"
android:theme="@style/DolphinEmulationGamecube"/>
+
+
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/OverlayConfigActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/OverlayConfigActivity.java
new file mode 100644
index 0000000000..41202000ec
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/OverlayConfigActivity.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright 2013 Dolphin Emulator Project
+ * Licensed under GPLv2+
+ * Refer to the license.txt file included.
+ */
+
+package org.dolphinemu.dolphinemu.activities;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.RelativeLayout;
+
+import org.dolphinemu.dolphinemu.R;
+import org.dolphinemu.dolphinemu.overlay.OverlayConfigButton;
+
+/**
+ * {@link Activity} used for configuring the input overlay.
+ */
+public final class OverlayConfigActivity extends Activity
+{
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Initialize all of the buttons to add.
+ final OverlayConfigButton buttonA = new OverlayConfigButton(this, "gcpad_a", R.drawable.gcpad_a);
+ final OverlayConfigButton buttonB = new OverlayConfigButton(this, "gcpad_b", R.drawable.gcpad_b);
+ final OverlayConfigButton buttonX = new OverlayConfigButton(this, "gcpad_x", R.drawable.gcpad_x);
+ final OverlayConfigButton buttonY = new OverlayConfigButton(this, "gcpad_y", R.drawable.gcpad_y);
+ final OverlayConfigButton buttonZ = new OverlayConfigButton(this, "gcpad_z", R.drawable.gcpad_z);
+ final OverlayConfigButton buttonS = new OverlayConfigButton(this, "gcpad_start", R.drawable.gcpad_start);
+ final OverlayConfigButton buttonL = new OverlayConfigButton(this, "gcpad_l", R.drawable.gcpad_l);
+ final OverlayConfigButton buttonR = new OverlayConfigButton(this, "gcpad_r", R.drawable.gcpad_r);
+ final OverlayConfigButton joystick = new OverlayConfigButton(this, "gcpad_joystick_range", R.drawable.gcpad_joystick_range);
+
+ // Add the buttons to the layout
+ final RelativeLayout configLayout = new RelativeLayout(this);
+ configLayout.addView(buttonA);
+ configLayout.addView(buttonB);
+ configLayout.addView(buttonX);
+ configLayout.addView(buttonY);
+ configLayout.addView(buttonZ);
+ configLayout.addView(buttonS);
+ configLayout.addView(buttonL);
+ configLayout.addView(buttonR);
+ configLayout.addView(joystick);
+
+ // Now set the layout
+ setContentView(configLayout);
+ }
+}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/OverlayConfigButton.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/OverlayConfigButton.java
new file mode 100644
index 0000000000..8013c8c6b0
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/OverlayConfigButton.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright 2013 Dolphin Emulator Project
+ * Licensed under GPLv2+
+ * Refer to the license.txt file included.
+ */
+
+package org.dolphinemu.dolphinemu.overlay;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.preference.PreferenceManager;
+import android.util.DisplayMetrics;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.widget.Button;
+
+import org.dolphinemu.dolphinemu.R;
+
+/**
+ * A movable {@link Button} for use within the
+ * input overlay configuration screen.
+ */
+public final class OverlayConfigButton extends Button implements OnTouchListener
+{
+ // SharedPreferences instance that the button positions are cached to.
+ private final SharedPreferences sharedPrefs;
+
+ // The String ID for this button.
+ //
+ // This ID is used upon releasing this button as the key for saving
+ // the X and Y coordinates of this button. This same key is also used
+ // for setting the coordinates of the button on the actual overlay during emulation.
+ //
+ // They can be accessed through SharedPreferences respectively as follows:
+ //
+ // SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ // float buttonX = sPrefs.getFloat(buttonId+"-X", -1f);
+ // float buttonY = sPrefs.getFloat(buttonId+"-Y", -1f);
+ //
+ private final String buttonId;
+
+ // The offset of the press while moving the button
+ private float moveOffsetX, moveOffsetY;
+
+ private Drawable resizeDrawable(Drawable image, float scale)
+ {
+ // Retrieve screen dimensions.
+ DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+
+ Bitmap b = ((BitmapDrawable) image).getBitmap();
+ Bitmap bitmapResized = Bitmap.createScaledBitmap(b,
+ (int) (displayMetrics.heightPixels * scale),
+ (int) (displayMetrics.heightPixels * scale),
+ true);
+
+ return new BitmapDrawable(getResources(), bitmapResized);
+ }
+
+ /**
+ * Constructor
+ *
+ * @param context the current {@link Context}.
+ * @param buttonId the String ID for this button.
+ * @param drawableId the Drawable ID for the image to represent this OverlayConfigButton.
+ */
+ public OverlayConfigButton(Context context, String buttonId, int drawableId)
+ {
+ super(context);
+
+ // Set the button ID.
+ this.buttonId = buttonId;
+
+ // Set the button as its own OnTouchListener.
+ setOnTouchListener(this);
+
+ // Get the SharedPreferences instance.
+ sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ // Decide scale based on button ID
+
+ // SeekBars are not able to set a minimum value, only a maximum value, which complicates
+ // things a bit. What happens here is after the SeekBar's value is retrieved, 25 is
+ // added so the value will never go below 25. It is then divided by 50 (25 + 25) so the
+ // default value will be 100%.
+ float scale;
+ float overlaySize = sharedPrefs.getInt("controls_size", 25);
+ overlaySize += 25;
+ overlaySize /= 50;
+
+ switch (drawableId)
+ {
+ case R.drawable.gcpad_b:
+ scale = 0.13f * overlaySize;
+ break;
+ case R.drawable.gcpad_x:
+ case R.drawable.gcpad_y:
+ scale = 0.18f * overlaySize;
+ break;
+ case R.drawable.gcpad_start:
+ scale = 0.12f * overlaySize;
+ break;
+ case R.drawable.gcpad_joystick_range:
+ scale = 0.30f * overlaySize;
+ break;
+ default:
+ scale = 0.20f * overlaySize;
+ break;
+ }
+
+ // Set the button's icon that represents it.
+ setBackground(resizeDrawable(getResources().getDrawable(drawableId), scale));
+
+ // Check if this button has previous values set that aren't the default.
+ final float x = sharedPrefs.getFloat(buttonId + "-X", -1f);
+ final float y = sharedPrefs.getFloat(buttonId + "-Y", -1f);
+
+ // If they are not -1, then they have a previous value set.
+ // Thus, we set those coordinate values.
+ if (x != -1f && y != -1f)
+ {
+ setX(x);
+ setY(y);
+ }
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event)
+ {
+ switch (event.getAction())
+ {
+ // Get the offset of the press within the button
+ // The event X and Y locations are the offset within the button, not the screen
+ case MotionEvent.ACTION_DOWN:
+ {
+ moveOffsetX = event.getX();
+ moveOffsetY = event.getY();
+ return true;
+ }
+
+ // Only change the X/Y coordinates when we move the button.
+ case MotionEvent.ACTION_MOVE:
+ {
+ setX(getX() + event.getX() - moveOffsetX);
+ setY(getY() + event.getY() - moveOffsetY);
+ return true;
+ }
+
+ // Whenever the press event has ended
+ // is when we save all of the information.
+ case MotionEvent.ACTION_UP:
+ {
+ // Add the current X and Y positions of this button into SharedPreferences.
+ SharedPreferences.Editor editor = sharedPrefs.edit();
+ editor.putFloat(buttonId + "-X", getX());
+ editor.putFloat(buttonId + "-Y", getY());
+ editor.apply();
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/Source/Android/app/src/main/res/xml/preferences.xml b/Source/Android/app/src/main/res/xml/preferences.xml
index 7e6a9f09ce..e275107c7b 100644
--- a/Source/Android/app/src/main/res/xml/preferences.xml
+++ b/Source/Android/app/src/main/res/xml/preferences.xml
@@ -42,7 +42,7 @@
android:title="@string/input_overlay_layout">