From 24efce4cea12ff8b7934464814e601b8eab3d18b Mon Sep 17 00:00:00 2001 From: sigmabeta Date: Sat, 9 Jan 2016 20:32:10 -0500 Subject: [PATCH] Refactor TvMainActivity to MVP architecture --- .../dolphinemu/activities/TvMainActivity.java | 142 ++++++++---------- .../dolphinemu/ui/main/MainActivity.java | 9 +- .../dolphinemu/ui/main/MainPresenter.java | 31 ++++ .../dolphinemu/ui/main/MainView.java | 4 + 4 files changed, 105 insertions(+), 81 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/TvMainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/TvMainActivity.java index c772451954..23ad7230da 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/TvMainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/TvMainActivity.java @@ -28,12 +28,15 @@ import org.dolphinemu.dolphinemu.model.GameProvider; import org.dolphinemu.dolphinemu.model.TvSettingsItem; import org.dolphinemu.dolphinemu.ui.main.MainActivity; import org.dolphinemu.dolphinemu.ui.main.MainPresenter; +import org.dolphinemu.dolphinemu.ui.main.MainView; import org.dolphinemu.dolphinemu.utils.StartupHandler; import org.dolphinemu.dolphinemu.viewholders.TvGameViewHolder; -public final class TvMainActivity extends Activity +public final class TvMainActivity extends Activity implements MainView { - protected BrowseFragment mBrowseFragment; + private MainPresenter mPresenter = new MainPresenter(this); + + private BrowseFragment mBrowseFragment; private ArrayObjectAdapter mRowsAdapter; @@ -56,6 +59,8 @@ public final class TvMainActivity extends Activity buildRowsAdapter(); + mPresenter.onCreate(); + mBrowseFragment.setOnItemViewClickedListener( new OnItemViewClickedListener() { @@ -66,34 +71,7 @@ public final class TvMainActivity extends Activity if (item instanceof TvSettingsItem) { TvSettingsItem settingsItem = (TvSettingsItem) item; - - switch (settingsItem.getItemId()) - { - case R.id.menu_refresh: - getContentResolver().insert(GameProvider.URI_REFRESH, null); - - // TODO Let the Activity know the data is refreshed in some other, better way. - recreate(); - break; - - case R.id.menu_settings: - // Launch the Settings Actvity. - Intent settings = new Intent(TvMainActivity.this, SettingsActivity.class); - startActivity(settings); - break; - - case R.id.button_add_directory: - Intent fileChooser = new Intent(TvMainActivity.this, AddDirectoryActivity.class); - - // The second argument to this method is read below in onActivityResult(). - startActivityForResult(fileChooser, MainPresenter.REQUEST_ADD_DIRECTORY); - - break; - - default: - Toast.makeText(TvMainActivity.this, "Unimplemented menu option.", Toast.LENGTH_SHORT).show(); - break; - } + mPresenter.handleOptionSelection(settingsItem.getItemId()); } else { @@ -120,6 +98,56 @@ public final class TvMainActivity extends Activity StartupHandler.HandleInit(this); } + /** + * MainView + */ + + @Override + public void setSubtitle(String subtitle) + { + // No-op + } + + @Override + public void refresh() + { + recreate(); + } + + @Override + public void refreshFragmentScreenshot(int fragmentPosition) + { + // No-op (For now) + } + + @Override + public void launchSettingsActivity() + { + Intent settings = new Intent(this, SettingsActivity.class); + startActivity(settings); + } + + @Override + public void launchFileListActivity() + { + Intent fileChooser = new Intent(this, AddDirectoryActivity.class); + + // The second argument to this method is read below in onActivityResult(). + startActivityForResult(fileChooser, MainPresenter.REQUEST_ADD_DIRECTORY); + } + + @Override + public void showGames(int platformIndex, Cursor games) + { + ListRow row = buildGamesRow(platformIndex, games); + + // Add row to the adapter only if it is not empty. + if (row != null) + { + mRowsAdapter.add(row); + } + } + /** * Callback from AddDirectoryActivity. Applies any changes necessary to the GameGridActivity. * @@ -130,22 +158,7 @@ public final class TvMainActivity extends Activity @Override protected void onActivityResult(int requestCode, int resultCode, Intent result) { - switch (requestCode) - { - case MainPresenter.REQUEST_ADD_DIRECTORY: - // If the user picked a file, as opposed to just backing out. - if (resultCode == RESULT_OK) - { - // Sanity check to make sure the Activity that just returned was the AddDirectoryActivity; - // other activities might use this callback in the future (don't forget to change Javadoc!) - if (requestCode == MainPresenter.REQUEST_ADD_DIRECTORY) - { - // TODO Let the Activity know the data is refreshed in some other, better way. - recreate(); - } - } - break; - } + mPresenter.handleActivityResult(requestCode, resultCode); } private void buildRowsAdapter() @@ -155,50 +168,19 @@ public final class TvMainActivity extends Activity // For each platform for (int platformIndex = 0; platformIndex <= Game.PLATFORM_ALL; ++platformIndex) { - ListRow row = buildGamesRow(platformIndex); - - // Add row to the adapter only if it is not empty. - if (row != null) - { - mRowsAdapter.add(row); - } + mPresenter.loadGames(platformIndex); } - ListRow settingsRow = buildSettingsRow(); - mRowsAdapter.add(settingsRow); + mRowsAdapter.add(buildSettingsRow()); mBrowseFragment.setAdapter(mRowsAdapter); } - private ListRow buildGamesRow(int platform) + private ListRow buildGamesRow(int platform, Cursor games) { // Create an adapter for this row. CursorObjectAdapter row = new CursorObjectAdapter(new GameRowPresenter()); - Cursor games; - if (platform == Game.PLATFORM_ALL) - { - // Get all games. - games = getContentResolver().query( - GameProvider.URI_GAME, // URI of table to query - null, // Return all columns - null, // Return all games - null, // Return all games - GameDatabase.KEY_GAME_TITLE + " asc" // Sort by game name, ascending order - ); - } - else - { - // Get games for this particular platform. - games = getContentResolver().query( - GameProvider.URI_GAME, // URI of table to query - null, // Return all columns - GameDatabase.KEY_GAME_PLATFORM + " = ?", // Select by platform - new String[]{Integer.toString(platform)}, // Platform id - GameDatabase.KEY_GAME_TITLE + " asc" // Sort by game name, ascending order - ); - } - // If cursor is empty, don't return a Row. if (!games.moveToFirst()) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java index ac2bfe5258..1044266acf 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java @@ -1,6 +1,7 @@ package org.dolphinemu.dolphinemu.ui.main; import android.content.Intent; +import android.database.Cursor; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; @@ -124,12 +125,18 @@ public final class MainActivity extends AppCompatActivity implements MainView @Override public void launchFileListActivity() { - Intent fileChooser = new Intent(MainActivity.this, AddDirectoryActivity.class); + Intent fileChooser = new Intent(this, AddDirectoryActivity.class); // The second argument to this method is read below in onActivityResult(). startActivityForResult(fileChooser, MainPresenter.REQUEST_ADD_DIRECTORY); } + @Override + public void showGames(int platformIndex, Cursor games) + { + // no-op. Handled by PlatformGamesFragment. + } + /** * Callback from AddDirectoryActivity. Applies any changes necessary to the GameGridActivity. * diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java index 992b242d88..d744d06f1b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java @@ -2,14 +2,23 @@ package org.dolphinemu.dolphinemu.ui.main; import android.content.Intent; +import android.database.Cursor; +import android.util.Log; +import org.dolphinemu.dolphinemu.DolphinApplication; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.activities.AddDirectoryActivity; import org.dolphinemu.dolphinemu.activities.SettingsActivity; import org.dolphinemu.dolphinemu.fragments.PlatformGamesFragment; +import org.dolphinemu.dolphinemu.model.GameDatabase; import org.dolphinemu.dolphinemu.model.GameProvider; import org.dolphinemu.dolphinemu.ui.main.MainView; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.schedulers.Schedulers; + public class MainPresenter { public static final int REQUEST_ADD_DIRECTORY = 1; @@ -44,6 +53,10 @@ public class MainPresenter case R.id.menu_refresh: mView.refresh(); return true; + + case R.id.button_add_directory: + mView.launchFileListActivity(); + return true; } return false; @@ -65,4 +78,22 @@ public class MainPresenter break; } } + + public void loadGames(final int platformIndex) + { + GameDatabase databaseHelper = DolphinApplication.databaseHelper; + + databaseHelper.getGamesForPlatform(platformIndex) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() + { + @Override + public void call(Cursor games) + { + mView.showGames(platformIndex, games); + } + } + ); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainView.java index 4c8b26f306..a29150f207 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainView.java @@ -1,6 +1,8 @@ package org.dolphinemu.dolphinemu.ui.main; +import android.database.Cursor; + public interface MainView { void setSubtitle(String subtitle); @@ -12,4 +14,6 @@ public interface MainView void launchSettingsActivity(); void launchFileListActivity(); + + void showGames(int platformIndex, Cursor games); }