Convert platform ints to a proper enum Platform.

This is good practice (see Effective Java chapter 6), and adds
compile-time checks.
This commit is contained in:
Mike Harris 2017-09-25 09:32:25 -07:00
parent 487591c760
commit cc77a4963f
12 changed files with 100 additions and 72 deletions

View file

@ -41,6 +41,7 @@ import org.dolphinemu.dolphinemu.fragments.LoadStateFragment;
import org.dolphinemu.dolphinemu.fragments.MenuFragment;
import org.dolphinemu.dolphinemu.fragments.SaveStateFragment;
import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
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;
@ -298,7 +299,7 @@ public final class EmulationActivity extends AppCompatActivity
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
mIsGameCubeGame = (NativeLibrary.GetPlatform(path) == 0);
mIsGameCubeGame = Platform.fromNativeInt(NativeLibrary.GetPlatform(path)) == Platform.GAMECUBE;
}
@Override

View file

@ -63,13 +63,13 @@ public final class GameRowPresenter extends Presenter
int backgroundId;
switch (game.getPlatform())
{
case Game.PLATFORM_GC:
case GAMECUBE:
backgroundId = R.drawable.tv_card_background_gamecube;
break;
case Game.PLATFORM_WII:
case WII:
backgroundId = R.drawable.tv_card_background_wii;
break;
case Game.PLATFORM_WII_WARE:
case WIIWARE:
default: // This shouldn't happen, but set the default to WiiWare colors.
backgroundId = R.drawable.tv_card_background_wiiware;
break;

View file

@ -10,6 +10,7 @@ import android.text.SpannableString;
import android.text.style.ImageSpan;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.ui.platform.PlatformGamesFragment;
public class PlatformPagerAdapter extends FragmentPagerAdapter
@ -32,7 +33,7 @@ public class PlatformPagerAdapter extends FragmentPagerAdapter
@Override
public Fragment getItem(int position)
{
return PlatformGamesFragment.newInstance(position);
return PlatformGamesFragment.newInstance(Platform.fromPosition(position));
}
@Override

View file

@ -4,13 +4,10 @@ import android.content.ContentValues;
import android.database.Cursor;
import android.os.Environment;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
public final class Game
{
public static final int PLATFORM_GC = 0;
public static final int PLATFORM_WII = 1;
public static final int PLATFORM_WII_WARE = 2;
public static final int PLATFORM_ALL = 3;
// Copied from IVolume::ECountry. Update these if that is ever modified.
public static final int COUNTRY_EUROPE = 0;
public static final int COUNTRY_JAPAN = 1;
@ -36,10 +33,10 @@ public final class Game
private String mScreenshotPath;
private String mCompany;
private int mPlatform;
private Platform mPlatform;
private int mCountry;
public Game(int platform, String title, String description, int country, String path, String gameId, String company, String screenshotPath)
public Game(Platform platform, String title, String description, int country, String path, String gameId, String company, String screenshotPath)
{
mPlatform = platform;
mTitle = title;
@ -51,7 +48,7 @@ public final class Game
mScreenshotPath = screenshotPath;
}
public int getPlatform()
public Platform getPlatform()
{
return mPlatform;
}
@ -91,13 +88,13 @@ public final class Game
return mScreenshotPath;
}
public static ContentValues asContentValues(int platform, String title, String description, int country, String path, String gameId, String company)
public static ContentValues asContentValues(Platform platform, String title, String description, int country, String path, String gameId, String company)
{
ContentValues values = new ContentValues();
String screenPath = PATH_SCREENSHOT_FOLDER + gameId + "/" + gameId + "-1.png";
values.put(GameDatabase.KEY_GAME_PLATFORM, platform);
values.put(GameDatabase.KEY_GAME_PLATFORM, platform.toInt());
values.put(GameDatabase.KEY_GAME_TITLE, title);
values.put(GameDatabase.KEY_GAME_DESCRIPTION, description);
values.put(GameDatabase.KEY_GAME_COUNTRY, company);
@ -111,7 +108,7 @@ public final class Game
public static Game fromCursor(Cursor cursor)
{
return new Game(cursor.getInt(GameDatabase.GAME_COLUMN_PLATFORM),
return new Game(Platform.fromInt(cursor.getInt(GameDatabase.GAME_COLUMN_PLATFORM)),
cursor.getString(GameDatabase.GAME_COLUMN_TITLE),
cursor.getString(GameDatabase.GAME_COLUMN_DESCRIPTION),
cursor.getInt(GameDatabase.GAME_COLUMN_COUNTRY),

View file

@ -7,6 +7,7 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.utils.Log;
import java.io.File;
@ -200,12 +201,7 @@ public final class GameDatabase extends SQLiteOpenHelper
gameId = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.lastIndexOf("."));
}
// If the game's platform field is empty, file under Wiiware. // TODO Something less dum
int platform = NativeLibrary.GetPlatform(filePath);
if (platform == -1)
{
platform = Game.PLATFORM_WII_WARE;
}
Platform platform = Platform.fromNativeInt(NativeLibrary.GetPlatform(filePath));
ContentValues game = Game.asContentValues(platform,
name,
@ -257,7 +253,7 @@ public final class GameDatabase extends SQLiteOpenHelper
database.close();
}
public Observable<Cursor> getGamesForPlatform(final int platform)
public Observable<Cursor> getGamesForPlatform(final Platform platform)
{
return Observable.create(new Observable.OnSubscribe<Cursor>()
{
@ -266,18 +262,17 @@ public final class GameDatabase extends SQLiteOpenHelper
{
Log.info("[GameDatabase] Reading games list...");
// Only add a WHERE clause if we have a specific platform
String whereClause = null;
String[] whereArgs = null;
// If -1 passed in, return all games. Else, return games for one platform only.
if (platform >= 0)
if (platform != Platform.ALL)
{
whereClause = KEY_GAME_PLATFORM + " = ?";
whereArgs = new String[]{Integer.toString(platform)};
whereArgs = new String[]{Integer.toString(platform.toInt())};
}
SQLiteDatabase database = getReadableDatabase();
Cursor resultCursor = database.query(
TABLE_NAME_GAMES,
null,

View file

@ -20,6 +20,7 @@ import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.AddDirectoryActivity;
import org.dolphinemu.dolphinemu.adapters.PlatformPagerAdapter;
import org.dolphinemu.dolphinemu.model.GameProvider;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.ui.platform.PlatformGamesView;
import org.dolphinemu.dolphinemu.ui.settings.SettingsActivity;
import org.dolphinemu.dolphinemu.utils.PermissionsHandler;
@ -114,7 +115,8 @@ public final class MainActivity extends AppCompatActivity implements MainView
public void refreshFragmentScreenshot(int fragmentPosition)
{
// Invalidate Picasso image so that the new screenshot is animated in.
PlatformGamesView fragment = getPlatformGamesView(mViewPager.getCurrentItem());
Platform platform = Platform.fromPosition(mViewPager.getCurrentItem());
PlatformGamesView fragment = getPlatformGamesView(platform);
if (fragment != null)
{
@ -135,7 +137,7 @@ public final class MainActivity extends AppCompatActivity implements MainView
}
@Override
public void showGames(int platformIndex, Cursor games)
public void showGames(Platform platform, Cursor games)
{
// no-op. Handled by PlatformGamesFragment.
}
@ -189,7 +191,9 @@ public final class MainActivity extends AppCompatActivity implements MainView
private void refreshFragment()
{
PlatformGamesView fragment = getPlatformGamesView(mViewPager.getCurrentItem());
Platform platform = Platform.fromPosition(mViewPager.getCurrentItem());
PlatformGamesView fragment = getPlatformGamesView(platform);
if (fragment != null)
{
fragment.refresh();
@ -197,7 +201,7 @@ public final class MainActivity extends AppCompatActivity implements MainView
}
@Nullable
private PlatformGamesView getPlatformGamesView(int platform)
private PlatformGamesView getPlatformGamesView(Platform platform)
{
String fragmentTag = "android:switcher:" + mViewPager.getId() + ":" + platform;

View file

@ -2,10 +2,12 @@ package org.dolphinemu.dolphinemu.ui.main;
import android.database.Cursor;
import org.dolphinemu.dolphinemu.BuildConfig;
import org.dolphinemu.dolphinemu.DolphinApplication;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.GameDatabase;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.utils.SettingsFile;
import rx.android.schedulers.AndroidSchedulers;
@ -87,11 +89,11 @@ public final class MainPresenter
}
}
public void loadGames(final int platformIndex)
public void loadGames(final Platform platform)
{
GameDatabase databaseHelper = DolphinApplication.databaseHelper;
databaseHelper.getGamesForPlatform(platformIndex)
databaseHelper.getGamesForPlatform(platform)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Cursor>()
@ -99,7 +101,7 @@ public final class MainPresenter
@Override
public void call(Cursor games)
{
mView.showGames(platformIndex, games);
mView.showGames(platform, games);
}
}
);

View file

@ -2,6 +2,8 @@ package org.dolphinemu.dolphinemu.ui.main;
import android.database.Cursor;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
/**
* Abstraction for the screen that shows on application launch.
* Implementations will differ primarily to target touch-screen
@ -39,8 +41,8 @@ public interface MainView
* To be called when an asynchronous database read completes. Passes the
* result, in this case a {@link Cursor} to the view.
*
* @param platformIndex Which platform contains these games.
* @param platform Which platform to show games for.
* @param games A Cursor containing the games read from the database.
*/
void showGames(int platformIndex, Cursor games);
void showGames(Platform platform, Cursor games);
}

View file

@ -27,6 +27,7 @@ import org.dolphinemu.dolphinemu.adapters.GameRowPresenter;
import org.dolphinemu.dolphinemu.adapters.SettingsRowPresenter;
import org.dolphinemu.dolphinemu.model.Game;
import org.dolphinemu.dolphinemu.model.TvSettingsItem;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.ui.settings.SettingsActivity;
import org.dolphinemu.dolphinemu.utils.PermissionsHandler;
import org.dolphinemu.dolphinemu.utils.StartupHandler;
@ -130,9 +131,9 @@ public final class TvMainActivity extends Activity implements MainView
}
@Override
public void showGames(int platformIndex, Cursor games)
public void showGames(Platform platform, Cursor games)
{
ListRow row = buildGamesRow(platformIndex, games);
ListRow row = buildGamesRow(platform, games);
// Add row to the adapter only if it is not empty.
if (row != null)
@ -187,13 +188,12 @@ public final class TvMainActivity extends Activity implements MainView
}
private void loadGames() {
// For each platform
for (int platformIndex = 0; platformIndex <= Game.PLATFORM_ALL; ++platformIndex) {
mPresenter.loadGames(platformIndex);
for (Platform platform : Platform.values()) {
mPresenter.loadGames(platform);
}
}
private ListRow buildGamesRow(int platform, Cursor games)
private ListRow buildGamesRow(Platform platform, Cursor games)
{
// Create an adapter for this row.
CursorObjectAdapter row = new CursorObjectAdapter(new GameRowPresenter());
@ -220,32 +220,10 @@ public final class TvMainActivity extends Activity implements MainView
}
});
String headerName;
switch (platform)
{
case Game.PLATFORM_GC:
headerName = "GameCube Games";
break;
case Game.PLATFORM_WII:
headerName = "Wii Games";
break;
case Game.PLATFORM_WII_WARE:
headerName = "WiiWare";
break;
case Game.PLATFORM_ALL:
headerName = "All Games";
break;
default:
headerName = "Error";
break;
}
String headerName = platform.getHeaderName();
// Create a header for this row.
HeaderItem header = new HeaderItem(platform, headerName);
HeaderItem header = new HeaderItem(platform.toInt(), platform.getHeaderName());
// Create the row, passing it the filled adapter and the header, and give it to the master adapter.
return new ListRow(header, row);

View file

@ -0,0 +1,48 @@
package org.dolphinemu.dolphinemu.ui.platform;
/** Enum to represent platform (eg GameCube, Wii). */
public enum Platform
{
GAMECUBE(0, "GameCube Games"),
WII(1, "Wii Games"),
WIIWARE(2, "WiiWare Games"),
ALL(3, "All Games");
private final int value;
private final String headerName;
Platform(int value, String headerName)
{
this.value = value;
this.headerName = headerName;
}
public static Platform fromInt(int i)
{
return values()[i];
}
public static Platform fromNativeInt(int i)
{
// If the game's platform field is empty, file under Wiiware. // TODO Something less dum
if (i == -1) {
return Platform.WIIWARE;
}
return values()[i];
}
public static Platform fromPosition(int position)
{
return values()[position];
}
public int toInt()
{
return value;
}
public String getHeaderName()
{
return headerName;
}
}

View file

@ -22,12 +22,12 @@ public final class PlatformGamesFragment extends Fragment implements PlatformGam
private GameAdapter mAdapter;
private RecyclerView mRecyclerView;
public static PlatformGamesFragment newInstance(int platform)
public static PlatformGamesFragment newInstance(Platform platform)
{
PlatformGamesFragment fragment = new PlatformGamesFragment();
Bundle args = new Bundle();
args.putInt(ARG_PLATFORM, platform);
args.putSerializable(ARG_PLATFORM, platform);
fragment.setArguments(args);
return fragment;
@ -38,7 +38,7 @@ public final class PlatformGamesFragment extends Fragment implements PlatformGam
{
super.onCreate(savedInstanceState);
mPresenter.onCreate(getArguments().getInt(ARG_PLATFORM));
mPresenter.onCreate((Platform) getArguments().getSerializable(ARG_PLATFORM));
}
@Nullable

View file

@ -15,14 +15,14 @@ public final class PlatformGamesPresenter
{
private final PlatformGamesView mView;
private int mPlatform;
private Platform mPlatform;
public PlatformGamesPresenter(PlatformGamesView view)
{
mView = view;
}
public void onCreate(int platform)
public void onCreate(Platform platform)
{
mPlatform = platform;
}