Skip to content

Commit

Permalink
Android: MainActivity now contains a tab switcher separating games by…
Browse files Browse the repository at this point in the history
… platform.
  • Loading branch information
sigmabeta committed Jun 22, 2015
1 parent 1d9a5ad commit 104d85f
Show file tree
Hide file tree
Showing 7 changed files with 326 additions and 43 deletions.
Expand Up @@ -8,10 +8,11 @@
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
Expand All @@ -21,7 +22,9 @@

import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.adapters.GameAdapter;
import org.dolphinemu.dolphinemu.adapters.PlatformPagerAdapter;
import org.dolphinemu.dolphinemu.fragments.PlatformGamesFragment;
import org.dolphinemu.dolphinemu.model.Game;
import org.dolphinemu.dolphinemu.model.GameDatabase;
import org.dolphinemu.dolphinemu.model.GameProvider;
import org.dolphinemu.dolphinemu.services.AssetCopyService;
Expand All @@ -34,40 +37,44 @@ public final class MainActivity extends AppCompatActivity implements LoaderManag
{
private static final int REQUEST_ADD_DIRECTORY = 1;

private static final int LOADER_ID_GAMES = 1;
// TODO When each platform has its own tab, there should be a LOADER_ID for each platform.
/**
* It is important to keep track of loader ID separately from platform ID (see Game.java)
* because we could potentially have Loaders that load things other than Games.
*/
public static final int LOADER_ID_ALL = 100; // TODO
public static final int LOADER_ID_GAMECUBE = 0;
public static final int LOADER_ID_WII = 1;
public static final int LOADER_ID_WIIWARE = 2;

private GameAdapter mAdapter;
private ViewPager mViewPager;
private PlatformPagerAdapter mPlatformPagerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Set up the Toolbar.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_main);
setSupportActionBar(toolbar);

FloatingActionButton buttonAddDirectory = (FloatingActionButton) findViewById(R.id.button_add_directory);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.grid_games);

// TODO Rather than calling into native code, this should use the commented line below.
// String versionName = BuildConfig.VERSION_NAME;
String versionName = NativeLibrary.GetVersionString();
toolbar.setSubtitle(versionName);

// Specifying the LayoutManager determines how the RecyclerView arranges views.
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,
getResources().getInteger(R.integer.game_grid_columns));
recyclerView.setLayoutManager(layoutManager);
// Set up the Tab bar.
mViewPager = (ViewPager) findViewById(R.id.pager_platforms);

recyclerView.addItemDecoration(new GameAdapter.SpacesItemDecoration(8));
mPlatformPagerAdapter = new PlatformPagerAdapter(getFragmentManager(), this);
mViewPager.setAdapter(mPlatformPagerAdapter);

// Create an adapter that will relate the dataset to the views on-screen.
getLoaderManager().initLoader(LOADER_ID_GAMES, null, this);
mAdapter = new GameAdapter();
recyclerView.setAdapter(mAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs_platforms);
tabLayout.setupWithViewPager(mViewPager);

// Set up the FAB.
FloatingActionButton buttonAddDirectory = (FloatingActionButton) findViewById(R.id.button_add_directory);
buttonAddDirectory.setOnClickListener(new View.OnClickListener()
{
@Override
Expand Down Expand Up @@ -115,7 +122,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent result)
// other activities might use this callback in the future (don't forget to change Javadoc!)
if (requestCode == REQUEST_ADD_DIRECTORY)
{
getLoaderManager().restartLoader(LOADER_ID_GAMES, null, this);
refreshFragment();
}
}
}
Expand Down Expand Up @@ -147,14 +154,23 @@ public boolean onOptionsItemSelected(MenuItem item)

case R.id.menu_refresh:
getContentResolver().insert(GameProvider.URI_REFRESH, null);
getLoaderManager().restartLoader(LOADER_ID_GAMES, null, this);
refreshFragment();

return true;
}

return false;
}

public void refreshFragment()
{
PlatformGamesFragment fragment = getPlatformFragment(mViewPager.getCurrentItem());
if (fragment != null)
{
fragment.refresh();
}
}


/**
* Callback that's invoked when the system has initialized the Loader and
Expand All @@ -173,16 +189,30 @@ public Loader<Cursor> onCreateLoader(int id, Bundle args)
// Take action based on the ID of the Loader that's being created.
switch (id)
{
case LOADER_ID_GAMES:
case LOADER_ID_ALL:
// TODO Play some sort of load-starting animation; maybe fade the list out.

return new CursorLoader(
this, // Parent activity context
GameProvider.URI_GAME, // URI of table to query
null, // Return all columns
null, // No selection clause
null, // No selection arguments
GameDatabase.KEY_GAME_TITLE + " asc" // Sort by game name, ascending order
);

case LOADER_ID_GAMECUBE:
case LOADER_ID_WII:
case LOADER_ID_WIIWARE:
// TODO Play some sort of load-starting animation; maybe fade the list out.

return new CursorLoader(
this, // Parent activity context
GameProvider.URI_GAME, // URI of table to query
null, // Return all columns
null, // No selection clause
null, // No selection arguments
GameDatabase.KEY_GAME_TITLE + " asc" // Sort by game name, ascending order
this, // Parent activity context
GameProvider.URI_GAME, // URI of table to query
null, // Return all columns
GameDatabase.KEY_GAME_PLATFORM + " = ?", // Select by platform
new String[]{Integer.toString(id)}, // Platform id is Loader id minus 1
GameDatabase.KEY_GAME_TITLE + " asc" // Sort by game name, ascending order
);

default:
Expand All @@ -205,25 +235,73 @@ public void onLoadFinished(Loader<Cursor> loader, Cursor data)
int id = loader.getId();
Log.d("DolphinEmu", "Loader finished with id: " + id);

// TODO When each platform has its own tab, this should just call into those tabs instead.
PlatformGamesFragment fragment = null;
switch (id)
{
case LOADER_ID_GAMES:
mAdapter.swapCursor(data);
// TODO Play some sort of load-finished animation; maybe fade the list in.
case LOADER_ID_GAMECUBE:
fragment = getPlatformFragment(Game.PLATFORM_GC);
break;

case LOADER_ID_WII:
fragment = getPlatformFragment(Game.PLATFORM_WII);
break;

case LOADER_ID_WIIWARE:
fragment = getPlatformFragment(Game.PLATFORM_WII_WARE);
break;

// TODO case LOADER_ID_ALL:

default:
Log.e("DolphinEmu", "Bad ID passed in.");
break;
}

if (fragment != null)
{
fragment.onLoadFinished(loader, data);
}
}

@Override
public void onLoaderReset(Loader<Cursor> loader)
{
Log.d("DolphinEmu", "Loader resetting.");
int id = loader.getId();
Log.e("DolphinEmu", "Loader resetting with id: " + id);

PlatformGamesFragment fragment = null;
switch (id)
{
case LOADER_ID_GAMECUBE:
fragment = getPlatformFragment(Game.PLATFORM_GC);
break;

case LOADER_ID_WII:
fragment = getPlatformFragment(Game.PLATFORM_WII);
break;

case LOADER_ID_WIIWARE:
fragment = getPlatformFragment(Game.PLATFORM_WII_WARE);
break;

// TODO case LOADER_ID_ALL:

default:
Log.e("DolphinEmu", "Bad ID passed in.");
break;
}

if (fragment != null)
{
fragment.onLoaderReset();
}
}

@Nullable
public PlatformGamesFragment getPlatformFragment(int platform)
{
String fragmentTag = "android:switcher:" + mViewPager.getId() + ":" + platform;

// TODO ¯\_(ツ)_/¯
return (PlatformGamesFragment) getFragmentManager().findFragmentByTag(fragmentTag);
}
}
@@ -0,0 +1,61 @@
package org.dolphinemu.dolphinemu.adapters;


import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.v13.app.FragmentPagerAdapter;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;

import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.fragments.PlatformGamesFragment;

public class PlatformPagerAdapter extends FragmentPagerAdapter
{
private Context mContext;

private final static int[] TAB_ICONS = {
R.drawable.ic_gamecube,
R.drawable.ic_wii,
R.drawable.ic_folder// wiiware TODO Have an icon here.
};

public PlatformPagerAdapter(FragmentManager fm, Context context)
{
super(fm);
mContext = context;
}

@Override
public Fragment getItem(int position)
{
return PlatformGamesFragment.newInstance(position);
}

@Override
public int getCount()
{
return TAB_ICONS.length;
}

@Override
public CharSequence getPageTitle(int position)
{
// Hax from https://guides.codepath.com/android/Google-Play-Style-Tabs-using-TabLayout#design-support-library
// Apparently a workaround for TabLayout not supporting icons.
// TODO This workaround will eventually not be necessary; switch to more legit methods when that is the case
// TODO Also remove additional hax from styles.xml
Drawable drawable = mContext.getResources().getDrawable(TAB_ICONS[position]);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);

SpannableString sb = new SpannableString(" ");
sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

return sb;
}
}

0 comments on commit 104d85f

Please sign in to comment.