summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorMike Harris <atarimike@gmail.com>2017-10-07 23:52:13 -0700
committerMike Harris <atarimike@gmail.com>2017-10-16 20:36:12 -0700
commit94ed30b0550f29b58774fcd28aa98d28562be985 (patch)
tree0301139243524c5ba9b29a88dabcb4aebb956fad /Source/Android/app/src/main/java
parentc4d7814afa0e97784c6bc6b97dd9578c06867dd6 (diff)
Use the fragment backstack properly, and use fragment animations.
Make the MenuFragment added and removed by fragment transactions only, instead of being initially present in the XML. This fixes a glitch where it doesn't animate correctly the first time it's used.
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java117
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java25
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Animations.java42
3 files changed, 56 insertions, 128 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java
index 14d0e2c9be..f02a0e3b3b 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java
@@ -14,6 +14,7 @@ import android.preference.PreferenceManager;
import android.support.annotation.IntDef;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseIntArray;
import android.view.InputDevice;
@@ -24,7 +25,6 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
@@ -42,7 +42,6 @@ import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.utils.Animations;
import org.dolphinemu.dolphinemu.utils.Java_GCAdapter;
import org.dolphinemu.dolphinemu.utils.Java_WiimoteAdapter;
-import org.dolphinemu.dolphinemu.utils.Log;
import java.lang.annotation.Retention;
import java.util.List;
@@ -51,13 +50,12 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
public final class EmulationActivity extends AppCompatActivity
{
- private static final String FRAGMENT_SUBMENU_TAG = "submenu";
+ private static final String BACKSTACK_NAME_MENU = "menu";
+ private static final String BACKSTACK_NAME_SUBMENU = "submenu";
private View mDecorView;
private ImageView mImageView;
private EmulationFragment mEmulationFragment;
- private LinearLayout mMenuLayout;
-
private SharedPreferences mPreferences;
// So that MainActivity knows which view to invalidate before the return animation.
@@ -66,7 +64,6 @@ public final class EmulationActivity extends AppCompatActivity
private boolean mDeviceHasTouchScreen;
private boolean mSystemUiVisible;
private boolean mMenuVisible;
- private boolean mSubMenuVisible = false;
private static boolean mIsGameCubeGame;
@@ -221,7 +218,6 @@ public final class EmulationActivity extends AppCompatActivity
setContentView(R.layout.activity_emulation);
mImageView = (ImageView) findViewById(R.id.image_screenshot);
- mMenuLayout = (LinearLayout) findViewById(R.id.layout_ingame_menu);
mEmulationFragment = (EmulationFragment) getSupportFragmentManager()
.findFragmentById(R.id.fragment_emulation);
@@ -280,16 +276,6 @@ public final class EmulationActivity extends AppCompatActivity
{
setTitle(mSelectedTitle);
}
- else
- {
- MenuFragment menuFragment = (MenuFragment) getSupportFragmentManager()
- .findFragmentById(R.id.fragment_menu);
-
- if (menuFragment != null)
- {
- menuFragment.setTitleText(mSelectedTitle);
- }
- }
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
@@ -333,11 +319,9 @@ public final class EmulationActivity extends AppCompatActivity
{
if (!mDeviceHasTouchScreen)
{
- if (mSubMenuVisible)
- {
- removeSubMenu();
- }
- else
+ boolean popResult = getSupportFragmentManager().popBackStackImmediate(
+ BACKSTACK_NAME_SUBMENU, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ if (!popResult)
{
toggleMenu();
}
@@ -347,31 +331,28 @@ public final class EmulationActivity extends AppCompatActivity
mEmulationFragment.stopEmulation();
exitWithAnimation();
}
+
}
private void toggleMenu()
{
- if (mMenuVisible)
- {
- mMenuVisible = false;
-
- Animations.fadeViewOutToLeft(mMenuLayout)
- .withEndAction(new Runnable()
- {
- @Override
- public void run()
- {
- if (mMenuVisible)
- {
- mMenuLayout.setVisibility(View.GONE);
- }
- }
- });
- }
- else
- {
+ boolean result = getSupportFragmentManager().popBackStackImmediate(
+ BACKSTACK_NAME_MENU, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ mMenuVisible = false;
+
+ if (!result) {
+ // Removing the menu failed, so that means it wasn't visible. Add it.
+ Fragment fragment = MenuFragment.newInstance(mSelectedTitle);
+ getSupportFragmentManager().beginTransaction()
+ .setCustomAnimations(
+ R.animator.menu_slide_in_from_left,
+ R.animator.menu_slide_out_to_left,
+ R.animator.menu_slide_in_from_left,
+ R.animator.menu_slide_out_to_left)
+ .add(R.id.frame_menu, fragment)
+ .addToBackStack(BACKSTACK_NAME_MENU)
+ .commit();
mMenuVisible = true;
- Animations.fadeViewInFromLeft(mMenuLayout);
}
}
@@ -422,7 +403,7 @@ public final class EmulationActivity extends AppCompatActivity
finishAfterTransition();
}
};
-
+
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
@@ -496,14 +477,14 @@ public final class EmulationActivity extends AppCompatActivity
case MENU_ACTION_SAVE_ROOT:
if (!mDeviceHasTouchScreen)
{
- showMenu(SaveLoadStateFragment.SaveOrLoad.SAVE);
+ showSubMenu(SaveLoadStateFragment.SaveOrLoad.SAVE);
}
return;
case MENU_ACTION_LOAD_ROOT:
if (!mDeviceHasTouchScreen)
{
- showMenu(SaveLoadStateFragment.SaveOrLoad.LOAD);
+ showSubMenu(SaveLoadStateFragment.SaveOrLoad.LOAD);
}
return;
@@ -817,44 +798,22 @@ public final class EmulationActivity extends AppCompatActivity
hideSystemUiAfterDelay();
}
- private void showMenu(SaveLoadStateFragment.SaveOrLoad saveOrLoad)
+ private void showSubMenu(SaveLoadStateFragment.SaveOrLoad saveOrLoad)
{
+ // Get rid of any visible submenu
+ getSupportFragmentManager().popBackStack(
+ BACKSTACK_NAME_SUBMENU, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+
Fragment fragment = SaveLoadStateFragment.newInstance(saveOrLoad);
getSupportFragmentManager().beginTransaction()
- .setCustomAnimations(R.animator.menu_slide_in, R.animator.menu_slide_out)
- .replace(R.id.frame_submenu, fragment, FRAGMENT_SUBMENU_TAG)
+ .setCustomAnimations(
+ R.animator.menu_slide_in_from_right,
+ R.animator.menu_slide_out_to_right,
+ R.animator.menu_slide_in_from_right,
+ R.animator.menu_slide_out_to_right)
+ .replace(R.id.frame_submenu, fragment)
+ .addToBackStack(BACKSTACK_NAME_SUBMENU)
.commit();
- mSubMenuVisible = true;
- }
-
- private void removeSubMenu()
- {
- final Fragment fragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_SUBMENU_TAG);
-
- if (fragment != null)
- {
- // When removing a fragment without replacement, its animation must be done
- // manually beforehand.
- Animations.fadeViewOutToRight(fragment.getView())
- .withEndAction(new Runnable()
- {
- @Override
- public void run()
- {
- if (mMenuVisible)
- {
- getSupportFragmentManager().beginTransaction()
- .remove(fragment)
- .commit();
- }
- }
- });
- }
- else
- {
- Log.error("[EmulationActivity] Fragment not found, can't remove.");
- }
- mSubMenuVisible = false;
}
public String getSelectedTitle()
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java
index 2b718ac58d..34898e8f8b 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java
@@ -16,7 +16,7 @@ import org.dolphinemu.dolphinemu.activities.EmulationActivity;
public final class MenuFragment extends Fragment implements View.OnClickListener
{
- private TextView mTitleText;
+ private static final String KEY_TITLE = "title";
private static SparseIntArray buttonsActionsMap = new SparseIntArray();
static {
buttonsActionsMap.append(R.id.menu_take_screenshot, EmulationActivity.MENU_ACTION_TAKE_SCREENSHOT);
@@ -28,6 +28,17 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT);
}
+ public static MenuFragment newInstance(String title)
+ {
+ MenuFragment fragment = new MenuFragment();
+
+ Bundle arguments = new Bundle();
+ arguments.putSerializable(KEY_TITLE, title);
+ fragment.setArguments(arguments);
+
+ return fragment;
+ }
+
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
@@ -42,7 +53,12 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
button.setOnClickListener(this);
}
- mTitleText = (TextView) rootView.findViewById(R.id.text_game_title);
+ TextView titleText = rootView.findViewById(R.id.text_game_title);
+ String title = getArguments().getString(KEY_TITLE);
+ if (title != null)
+ {
+ titleText.setText(title);
+ }
return rootView;
}
@@ -57,9 +73,4 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
((EmulationActivity) getActivity()).handleMenuAction(action);
}
}
-
- public void setTitleText(String title)
- {
- mTitleText.setText(title);
- }
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Animations.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Animations.java
index cff0dcb363..777a921493 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Animations.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/Animations.java
@@ -2,55 +2,13 @@ package org.dolphinemu.dolphinemu.utils;
import android.view.View;
import android.view.ViewPropertyAnimator;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
public final class Animations
{
- private static final Interpolator DECELERATOR = new DecelerateInterpolator();
- private static final Interpolator ACCELERATOR = new AccelerateInterpolator();
-
private Animations()
{
}
- public static ViewPropertyAnimator fadeViewOutToRight(View view)
- {
- return view.animate()
- .withLayer()
- .setDuration(200)
- .setInterpolator(ACCELERATOR)
- .alpha(0.0f)
- .translationX(view.getWidth());
- }
-
- public static ViewPropertyAnimator fadeViewOutToLeft(View view)
- {
- return view.animate()
- .withLayer()
- .setDuration(200)
- .setInterpolator(ACCELERATOR)
- .alpha(0.0f)
- .translationX(-view.getWidth());
- }
-
- public static ViewPropertyAnimator fadeViewInFromLeft(View view)
- {
-
- view.setVisibility(View.VISIBLE);
-
- view.setTranslationX(-view.getWidth());
- view.setAlpha(0.0f);
-
- return view.animate()
- .withLayer()
- .setDuration(300)
- .setInterpolator(DECELERATOR)
- .alpha(1.0f)
- .translationX(0.0f);
- }
-
public static ViewPropertyAnimator fadeViewIn(View view)
{
view.setVisibility(View.VISIBLE);