Merge pull request #2375 from sigmabeta/lollipop-ui-update
Implement first few screens of Android 5.0-based UI.
@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 21
|
compileSdkVersion 21
|
||||||
buildToolsVersion "20.0.0"
|
buildToolsVersion "20.0.0"
|
||||||
|
|
||||||
lintOptions {
|
lintOptions {
|
||||||
// This is important as it will run lint but not abort on error
|
// This is important as it will run lint but not abort on error
|
||||||
@ -47,6 +47,14 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
compile 'com.android.support:support-v4:22.0.0'
|
compile 'com.android.support:support-v4:22.1.1'
|
||||||
compile 'com.android.support:support-v13:22.0.0'
|
compile 'com.android.support:support-v13:22.0.0'
|
||||||
|
compile 'com.android.support:cardview-v7:21.0.3'
|
||||||
|
compile 'com.android.support:recyclerview-v7:21.0.3'
|
||||||
|
|
||||||
|
// For showing the banner as a circle a-la Material Design Guidelines
|
||||||
|
compile 'de.hdodenhof:circleimageview:1.2.2'
|
||||||
|
|
||||||
|
// For loading huge screenshots from the disk.
|
||||||
|
compile "com.squareup.picasso:picasso:2.4.0"
|
||||||
}
|
}
|
||||||
|
@ -9,15 +9,28 @@
|
|||||||
|
|
||||||
<application
|
<application
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
android:label="@string/app_name"
|
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:supportsRtl="true">
|
android:supportsRtl="true">
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activities.GameGridActivity"
|
||||||
|
android:label="Dolphin New UI"
|
||||||
|
android:theme="@style/DolphinWii">
|
||||||
|
|
||||||
|
<!-- This intentfilter marks this Activity as the one that gets launched from Home screen. -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.dolphinemu.dolphinemu.gamelist.GameListActivity"
|
android:name="org.dolphinemu.dolphinemu.gamelist.GameListActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@android:style/Theme.Holo.Light" >
|
android:theme="@android:style/Theme.Holo.Light" >
|
||||||
|
|
||||||
<!-- This intentfilter marks this Activity as the one that gets launched from Home screen. -->
|
<!-- Having a second activity with this intent-filter means we have two choices from the home screen. -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
@ -130,6 +130,12 @@ public final class NativeLibrary
|
|||||||
*/
|
*/
|
||||||
public static native String GetTitle(String filename);
|
public static native String GetTitle(String filename);
|
||||||
|
|
||||||
|
public static native String GetDescription(String filename);
|
||||||
|
public static native String GetGameId(String filename);
|
||||||
|
public static native String GetDate(String filename);
|
||||||
|
public static native long GetFilesize(String filename);
|
||||||
|
public static native boolean IsWiiTitle(String filename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the Dolphin version string.
|
* Gets the Dolphin version string.
|
||||||
*
|
*
|
||||||
|
@ -0,0 +1,131 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.activities;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.support.v7.widget.GridLayoutManager;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
|
import org.dolphinemu.dolphinemu.AssetCopyService;
|
||||||
|
import org.dolphinemu.dolphinemu.NativeLibrary;
|
||||||
|
import org.dolphinemu.dolphinemu.R;
|
||||||
|
import org.dolphinemu.dolphinemu.adapters.GameAdapter;
|
||||||
|
import org.dolphinemu.dolphinemu.model.Game;
|
||||||
|
import org.dolphinemu.dolphinemu.model.GcGame;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class GameGridActivity extends Activity
|
||||||
|
{
|
||||||
|
private RecyclerView mRecyclerView;
|
||||||
|
private RecyclerView.Adapter mAdapter;
|
||||||
|
private RecyclerView.LayoutManager mLayoutManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_game_grid);
|
||||||
|
|
||||||
|
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_game_list);
|
||||||
|
setActionBar(toolbar);
|
||||||
|
|
||||||
|
mRecyclerView = (RecyclerView) findViewById(R.id.grid_games);
|
||||||
|
|
||||||
|
// use this setting to improve performance if you know that changes
|
||||||
|
// in content do not change the layout size of the RecyclerView
|
||||||
|
//mRecyclerView.setHasFixedSize(true);
|
||||||
|
|
||||||
|
// Specifying the LayoutManager determines how the RecyclerView arranges views.
|
||||||
|
mLayoutManager = new GridLayoutManager(this, 4);
|
||||||
|
mRecyclerView.setLayoutManager(mLayoutManager);
|
||||||
|
|
||||||
|
mRecyclerView.addItemDecoration(new GameAdapter.SpacesItemDecoration(8));
|
||||||
|
|
||||||
|
// Create an adapter that will relate the dataset to the views on-screen.
|
||||||
|
mAdapter = new GameAdapter(getGameList());
|
||||||
|
mRecyclerView.setAdapter(mAdapter);
|
||||||
|
|
||||||
|
// Stuff in this block only happens when this activity is newly created (i.e. not a rotation)
|
||||||
|
if (savedInstanceState == null)
|
||||||
|
{
|
||||||
|
// Copy assets into appropriate locations.
|
||||||
|
Intent copyAssets = new Intent(this, AssetCopyService.class);
|
||||||
|
startService(copyAssets);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu)
|
||||||
|
{
|
||||||
|
MenuInflater inflater = getMenuInflater();
|
||||||
|
inflater.inflate(R.menu.gamelist_menu, menu);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Replace all of this with a SQLite database
|
||||||
|
private ArrayList<Game> getGameList()
|
||||||
|
{
|
||||||
|
ArrayList<Game> gameList = new ArrayList<Game>();
|
||||||
|
|
||||||
|
final String DefaultDir = Environment.getExternalStorageDirectory() + File.separator + "dolphin-emu";
|
||||||
|
|
||||||
|
NativeLibrary.SetUserDirectory(DefaultDir);
|
||||||
|
|
||||||
|
String Directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPaths", "0");
|
||||||
|
Log.v("DolphinEmu", "Directories: " + Directories);
|
||||||
|
int intDirectories = Integer.parseInt(Directories);
|
||||||
|
|
||||||
|
// Extensions to filter by.
|
||||||
|
Set<String> exts = new HashSet<String>(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs"));
|
||||||
|
|
||||||
|
for (int a = 0; a < intDirectories; ++a)
|
||||||
|
{
|
||||||
|
String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "ISOPath" + a, "");
|
||||||
|
Log.v("DolphinEmu", "Directory " + a + ": " + BrowseDir);
|
||||||
|
|
||||||
|
File currentDir = new File(BrowseDir);
|
||||||
|
File[] dirs = currentDir.listFiles();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for (File entry : dirs)
|
||||||
|
{
|
||||||
|
if (!entry.isHidden() && !entry.isDirectory())
|
||||||
|
{
|
||||||
|
String entryName = entry.getName();
|
||||||
|
|
||||||
|
// Check that the file has an appropriate extension before trying to read out of it.
|
||||||
|
if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
|
||||||
|
{
|
||||||
|
GcGame game = new GcGame(NativeLibrary.GetTitle(entry.getAbsolutePath()),
|
||||||
|
NativeLibrary.GetDescription(entry.getAbsolutePath()).replace("\n", " "),
|
||||||
|
// TODO Some games might actually not be from this region, believe it or not.
|
||||||
|
"United States",
|
||||||
|
entry.getAbsolutePath(),
|
||||||
|
NativeLibrary.GetGameId(entry.getAbsolutePath()),
|
||||||
|
NativeLibrary.GetDate(entry.getAbsolutePath()));
|
||||||
|
|
||||||
|
gameList.add(game);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (Exception ignored)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return gameList;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.adapters;
|
||||||
|
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
|
import org.dolphinemu.dolphinemu.R;
|
||||||
|
import org.dolphinemu.dolphinemu.model.Game;
|
||||||
|
import org.dolphinemu.dolphinemu.viewholders.GameViewHolder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class GameAdapter extends RecyclerView.Adapter<GameViewHolder>
|
||||||
|
{
|
||||||
|
private ArrayList<Game> mGameList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mostly just initializes the dataset to be displayed.
|
||||||
|
*
|
||||||
|
* @param gameList
|
||||||
|
*/
|
||||||
|
public GameAdapter(ArrayList<Game> gameList)
|
||||||
|
{
|
||||||
|
mGameList = gameList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the LayoutManager when it is necessary to create a new view.
|
||||||
|
*
|
||||||
|
* @param parent The RecyclerView (I think?) the created view will be thrown into.
|
||||||
|
* @param viewType Not used here, but useful when more than one type of child will be used in the RecyclerView.
|
||||||
|
* @return The created ViewHolder with references to all the child view's members.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public GameViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
|
||||||
|
{
|
||||||
|
// Create a new view.
|
||||||
|
View gameCard = LayoutInflater.from(parent.getContext())
|
||||||
|
.inflate(R.layout.card_game, parent, false);
|
||||||
|
|
||||||
|
// Use that view to create a ViewHolder.
|
||||||
|
GameViewHolder holder = new GameViewHolder(gameCard);
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the LayoutManager when a new view is not necessary because we can recycle
|
||||||
|
* an existing one (for example, if a view just scrolled onto the screen from the bottom, we
|
||||||
|
* can use the view that just scrolled off the top instead of inflating a new one.)
|
||||||
|
*
|
||||||
|
* @param holder A ViewHolder representing the view we're recycling.
|
||||||
|
* @param position The position of the 'new' view in the dataset.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(GameViewHolder holder, int position)
|
||||||
|
{
|
||||||
|
// Get a reference to the item from the dataset; we'll use this to fill in the view contents.
|
||||||
|
final Game game = mGameList.get(position);
|
||||||
|
|
||||||
|
// Fill in the view contents.
|
||||||
|
Picasso.with(holder.imageScreenshot.getContext())
|
||||||
|
.load(game.getScreenPath())
|
||||||
|
.error(R.drawable.no_banner)
|
||||||
|
.into(holder.imageScreenshot);
|
||||||
|
|
||||||
|
holder.textGameTitle.setText(game.getTitle());
|
||||||
|
if (game.getDescription() != null)
|
||||||
|
{
|
||||||
|
holder.textDescription.setText(game.getDescription());
|
||||||
|
}
|
||||||
|
holder.buttonDetails.setTag(game.getGameId());
|
||||||
|
|
||||||
|
holder.path = game.getPath();
|
||||||
|
holder.screenshotPath = game.getScreenPath();
|
||||||
|
holder.game = game;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the LayoutManager to find out how much data we have.
|
||||||
|
*
|
||||||
|
* @return Size of the dataset.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int getItemCount()
|
||||||
|
{
|
||||||
|
return mGameList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SpacesItemDecoration extends RecyclerView.ItemDecoration
|
||||||
|
{
|
||||||
|
private int space;
|
||||||
|
|
||||||
|
public SpacesItemDecoration(int space)
|
||||||
|
{
|
||||||
|
this.space = space;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
|
||||||
|
{
|
||||||
|
outRect.left = space;
|
||||||
|
outRect.right = space;
|
||||||
|
outRect.bottom = space;
|
||||||
|
outRect.top = space;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.dialogs;
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.DialogFragment;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
|
import org.dolphinemu.dolphinemu.BuildConfig;
|
||||||
|
import org.dolphinemu.dolphinemu.R;
|
||||||
|
import org.dolphinemu.dolphinemu.emulation.EmulationActivity;
|
||||||
|
import org.dolphinemu.dolphinemu.model.Game;
|
||||||
|
|
||||||
|
import de.hdodenhof.circleimageview.CircleImageView;
|
||||||
|
|
||||||
|
public class GameDetailsDialog extends DialogFragment
|
||||||
|
{
|
||||||
|
public static final String ARGUMENT_GAME_TITLE = BuildConfig.APPLICATION_ID + ".game_title";
|
||||||
|
public static final String ARGUMENT_GAME_DESCRIPTION = BuildConfig.APPLICATION_ID + ".game_description";
|
||||||
|
public static final String ARGUMENT_GAME_COUNTRY = BuildConfig.APPLICATION_ID + ".game_country";
|
||||||
|
public static final String ARGUMENT_GAME_DATE = BuildConfig.APPLICATION_ID + ".game_date";
|
||||||
|
public static final String ARGUMENT_GAME_PATH = BuildConfig.APPLICATION_ID + ".game_path";
|
||||||
|
public static final String ARGUMENT_GAME_SCREENSHOT_PATH = BuildConfig.APPLICATION_ID + ".game_screenshot_path";
|
||||||
|
|
||||||
|
|
||||||
|
public static GameDetailsDialog newInstance(Game game)
|
||||||
|
{
|
||||||
|
GameDetailsDialog fragment = new GameDetailsDialog();
|
||||||
|
|
||||||
|
Bundle arguments = new Bundle();
|
||||||
|
arguments.putString(ARGUMENT_GAME_TITLE, game.getTitle());
|
||||||
|
arguments.putString(ARGUMENT_GAME_DESCRIPTION, game.getDescription());
|
||||||
|
arguments.putString(ARGUMENT_GAME_COUNTRY, game.getCountry());
|
||||||
|
arguments.putString(ARGUMENT_GAME_DATE, game.getDate());
|
||||||
|
arguments.putString(ARGUMENT_GAME_PATH, game.getPath());
|
||||||
|
arguments.putString(ARGUMENT_GAME_SCREENSHOT_PATH, game.getScreenPath());
|
||||||
|
fragment.setArguments(arguments);
|
||||||
|
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
ViewGroup contents = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.dialog_game_details, null);
|
||||||
|
|
||||||
|
final ImageView imageGameScreen = (ImageView) contents.findViewById(R.id.image_game_screen);
|
||||||
|
CircleImageView circleBanner = (CircleImageView) contents.findViewById(R.id.circle_banner);
|
||||||
|
|
||||||
|
TextView textTitle = (TextView) contents.findViewById(R.id.text_game_title);
|
||||||
|
TextView textDescription = (TextView) contents.findViewById(R.id.text_game_description);
|
||||||
|
|
||||||
|
TextView textCountry = (TextView) contents.findViewById(R.id.text_country);
|
||||||
|
TextView textDate = (TextView) contents.findViewById(R.id.text_date);
|
||||||
|
|
||||||
|
ImageButton buttonLaunch = (ImageButton) contents.findViewById(R.id.button_launch);
|
||||||
|
|
||||||
|
textTitle.setText(getArguments().getString(ARGUMENT_GAME_TITLE));
|
||||||
|
textDescription.setText(getArguments().getString(ARGUMENT_GAME_DESCRIPTION));
|
||||||
|
textCountry.setText(getArguments().getString(ARGUMENT_GAME_COUNTRY));
|
||||||
|
textDate.setText(getArguments().getString(ARGUMENT_GAME_DATE));
|
||||||
|
buttonLaunch.setOnClickListener(new View.OnClickListener()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onClick(View view)
|
||||||
|
{
|
||||||
|
// Start the emulation activity and send the path of the clicked ROM to it.
|
||||||
|
Intent intent = new Intent(view.getContext(), EmulationActivity.class);
|
||||||
|
|
||||||
|
intent.putExtra("SelectedGame", getArguments().getString(ARGUMENT_GAME_PATH));
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fill in the view contents.
|
||||||
|
Picasso.with(imageGameScreen.getContext())
|
||||||
|
.load(getArguments().getString(ARGUMENT_GAME_SCREENSHOT_PATH))
|
||||||
|
.noFade()
|
||||||
|
.noPlaceholder()
|
||||||
|
.into(imageGameScreen);
|
||||||
|
|
||||||
|
circleBanner.setImageResource(R.drawable.no_banner);
|
||||||
|
|
||||||
|
builder.setView(contents);
|
||||||
|
return builder.create();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.model;
|
||||||
|
|
||||||
|
public interface Game
|
||||||
|
{
|
||||||
|
public static final int PLATFORM_GC = 0;
|
||||||
|
public static final int PLATFORM_WII = 1;
|
||||||
|
|
||||||
|
public int getPlatform();
|
||||||
|
|
||||||
|
public String getDate();
|
||||||
|
|
||||||
|
public String getTitle();
|
||||||
|
|
||||||
|
public String getDescription();
|
||||||
|
|
||||||
|
public String getCountry();
|
||||||
|
|
||||||
|
public String getPath();
|
||||||
|
|
||||||
|
public String getGameId();
|
||||||
|
|
||||||
|
public String getScreenPath();
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.model;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public final class GcGame implements Game
|
||||||
|
{
|
||||||
|
private String mTitle;
|
||||||
|
private String mDescription;
|
||||||
|
private String mCountry;
|
||||||
|
private String mPath;
|
||||||
|
private String mGameId;
|
||||||
|
|
||||||
|
private String mScreenshotFolderPath;
|
||||||
|
|
||||||
|
private String mDate;
|
||||||
|
private int mPlatform = PLATFORM_GC;
|
||||||
|
|
||||||
|
private static final String PATH_SCREENSHOT_FOLDER = "file:///sdcard/dolphin-emu/ScreenShots/";
|
||||||
|
|
||||||
|
public GcGame(String title, String description, String country, String path, String gameId, String date)
|
||||||
|
{
|
||||||
|
mTitle = title;
|
||||||
|
mDescription = description;
|
||||||
|
mCountry = country;
|
||||||
|
mPath = path;
|
||||||
|
mGameId = gameId;
|
||||||
|
mDate = date;
|
||||||
|
mScreenshotFolderPath = PATH_SCREENSHOT_FOLDER + getGameId() + "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPlatform()
|
||||||
|
{
|
||||||
|
return mPlatform;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTitle()
|
||||||
|
{
|
||||||
|
return mTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return mDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDate()
|
||||||
|
{
|
||||||
|
return mDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCountry()
|
||||||
|
{
|
||||||
|
return mCountry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPath()
|
||||||
|
{
|
||||||
|
return mPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGameId()
|
||||||
|
{
|
||||||
|
return mGameId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getScreenshotFolderPath()
|
||||||
|
{
|
||||||
|
return mScreenshotFolderPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getScreenPath()
|
||||||
|
{
|
||||||
|
// Count how many screenshots are available, so we can use the most recent one.
|
||||||
|
File screenshotFolder = new File(mScreenshotFolderPath.substring(mScreenshotFolderPath.indexOf('s') - 1));
|
||||||
|
int screenCount = 0;
|
||||||
|
|
||||||
|
if (screenshotFolder.isDirectory())
|
||||||
|
{
|
||||||
|
screenCount = screenshotFolder.list().length;
|
||||||
|
}
|
||||||
|
|
||||||
|
String screenPath = mScreenshotFolderPath
|
||||||
|
+ getGameId() + "-"
|
||||||
|
+ screenCount + ".png";
|
||||||
|
|
||||||
|
return screenPath;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.model;
|
||||||
|
|
||||||
|
|
||||||
|
public final class WiiGame implements Game
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public int getPlatform()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDate()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTitle()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCountry()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPath()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getGameId()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getScreenPath()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.viewholders;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.dolphinemu.dolphinemu.R;
|
||||||
|
import org.dolphinemu.dolphinemu.dialogs.GameDetailsDialog;
|
||||||
|
import org.dolphinemu.dolphinemu.emulation.EmulationActivity;
|
||||||
|
import org.dolphinemu.dolphinemu.model.Game;
|
||||||
|
|
||||||
|
|
||||||
|
public class GameViewHolder extends RecyclerView.ViewHolder
|
||||||
|
{
|
||||||
|
public ImageView imageScreenshot;
|
||||||
|
public TextView textGameTitle;
|
||||||
|
public TextView textDescription;
|
||||||
|
public ImageButton buttonDetails;
|
||||||
|
|
||||||
|
// Used to handle onClick(). Set this in onBindViewHolder().
|
||||||
|
public String path;
|
||||||
|
public String screenshotPath;
|
||||||
|
public Game game;
|
||||||
|
|
||||||
|
public GameViewHolder(View itemView)
|
||||||
|
{
|
||||||
|
super(itemView);
|
||||||
|
|
||||||
|
itemView.setOnClickListener(mCardClickListener);
|
||||||
|
|
||||||
|
imageScreenshot = (ImageView) itemView.findViewById(R.id.image_game_screen);
|
||||||
|
textGameTitle = (TextView) itemView.findViewById(R.id.text_game_title);
|
||||||
|
textDescription = (TextView) itemView.findViewById(R.id.text_game_description);
|
||||||
|
buttonDetails = (ImageButton) itemView.findViewById(R.id.button_details);
|
||||||
|
|
||||||
|
buttonDetails.setOnClickListener(mDetailsButtonListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
private View.OnClickListener mCardClickListener = new View.OnClickListener()
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Launches the game that was clicked on.
|
||||||
|
*
|
||||||
|
* @param view The card representing the game the user wants to play.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onClick(View view)
|
||||||
|
{
|
||||||
|
// Start the emulation activity and send the path of the clicked ROM to it.
|
||||||
|
Intent intent = new Intent(view.getContext(), EmulationActivity.class);
|
||||||
|
|
||||||
|
intent.putExtra("SelectedGame", path);
|
||||||
|
|
||||||
|
view.getContext().startActivity(intent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private View.OnClickListener mDetailsButtonListener = new View.OnClickListener()
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches the details activity for this Game, using an ID stored in the
|
||||||
|
* details button's Tag.
|
||||||
|
*
|
||||||
|
* @param view The Details button that was clicked on.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onClick(View view)
|
||||||
|
{
|
||||||
|
// Get the ID of the game we want to look at.
|
||||||
|
// TODO This should be all we need to pass in, eventually.
|
||||||
|
// String gameId = (String) view.getTag();
|
||||||
|
|
||||||
|
Activity activity = (Activity) view.getContext();
|
||||||
|
GameDetailsDialog.newInstance(game).show(activity.getFragmentManager(), "game_details");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
19
Source/Android/app/src/main/res/anim/button_elevation.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!-- res/anim/button_elevation.xml -->
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_pressed="true">
|
||||||
|
<objectAnimator
|
||||||
|
android:propertyName="translationZ"
|
||||||
|
android:duration="@android:integer/config_shortAnimTime"
|
||||||
|
android:valueFrom="@dimen/elevation_low"
|
||||||
|
android:valueTo="@dimen/elevation_high"
|
||||||
|
android:valueType="floatType"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<objectAnimator
|
||||||
|
android:propertyName="translationZ"
|
||||||
|
android:duration="@android:integer/config_shortAnimTime"
|
||||||
|
android:valueFrom="@dimen/elevation_high"
|
||||||
|
android:valueTo="@dimen/elevation_low"
|
||||||
|
android:valueType="floatType"/>
|
||||||
|
</item>
|
||||||
|
</selector>
|
BIN
Source/Android/app/src/main/res/drawable-hdpi/ic_country.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
Source/Android/app/src/main/res/drawable-hdpi/ic_date.png
Normal file
After Width: | Height: | Size: 917 B |
BIN
Source/Android/app/src/main/res/drawable-hdpi/ic_play.png
Normal file
After Width: | Height: | Size: 282 B |
BIN
Source/Android/app/src/main/res/drawable-ldpi/ic_date.png
Normal file
After Width: | Height: | Size: 346 B |
After Width: | Height: | Size: 197 B |
BIN
Source/Android/app/src/main/res/drawable-mdpi/ic_country.png
Normal file
After Width: | Height: | Size: 743 B |
BIN
Source/Android/app/src/main/res/drawable-mdpi/ic_date.png
Normal file
After Width: | Height: | Size: 717 B |
BIN
Source/Android/app/src/main/res/drawable-mdpi/ic_play.png
Normal file
After Width: | Height: | Size: 257 B |
After Width: | Height: | Size: 267 B |
BIN
Source/Android/app/src/main/res/drawable-xhdpi/ic_country.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
Source/Android/app/src/main/res/drawable-xhdpi/ic_date.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
Source/Android/app/src/main/res/drawable-xhdpi/ic_play.png
Normal file
After Width: | Height: | Size: 318 B |
After Width: | Height: | Size: 264 B |
BIN
Source/Android/app/src/main/res/drawable-xxhdpi/ic_country.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
Source/Android/app/src/main/res/drawable-xxhdpi/ic_date.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
Source/Android/app/src/main/res/drawable-xxhdpi/ic_play.png
Normal file
After Width: | Height: | Size: 399 B |
BIN
Source/Android/app/src/main/res/drawable-xxxhdpi/ic_country.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
Source/Android/app/src/main/res/drawable-xxxhdpi/ic_play.png
Normal file
After Width: | Height: | Size: 477 B |
9
Source/Android/app/src/main/res/drawable/oval_ripple.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<!-- res/drawable/oval_ripple.xml -->
|
||||||
|
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:color="?android:colorControlHighlight">
|
||||||
|
<item>
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<solid android:color="@color/dolphin_wii"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</ripple>
|
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<Toolbar
|
||||||
|
android:id="@+id/toolbar_game_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/dolphin_wii"
|
||||||
|
android:minHeight="?android:attr/actionBarSize"
|
||||||
|
android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar"/>
|
||||||
|
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
|
android:id="@+id/grid_games"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:listitem="@layout/grid_card_game"
|
||||||
|
android:layout_marginLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginRight="@dimen/activity_horizontal_margin"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
71
Source/Android/app/src/main/res/layout/card_game.xml
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="250dp"
|
||||||
|
android:transitionName="card_game">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image_game_screen"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
android:transitionName="image_game_screen"
|
||||||
|
android:layout_weight="1"
|
||||||
|
tools:src="@drawable/placeholder_screenshot"/>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="72dp">
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_game_title"
|
||||||
|
style="@android:style/TextAppearance.Material.Subhead"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_below="@+id/image_game_screen"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_toStartOf="@+id/button_details"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
tools:text="Rhythm Heaven Fever"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_game_description"
|
||||||
|
style="@android:style/TextAppearance.Material.Caption"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignEnd="@+id/text_game_title"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_alignStart="@+id/text_game_title"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_toStartOf="@+id/button_details"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sed odio vel quam auctor euismod. Pellentesque odio nibh, fermentum ut hendrerit id, ultrices et justo. "
|
||||||
|
tools:text="Zany rhythm action!"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/button_details"
|
||||||
|
style="@android:style/Widget.Material.Light.Button.Borderless.Small"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignTop="@+id/text_game_title"
|
||||||
|
android:src="@drawable/ic_action_overflow"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</android.support.v7.widget.CardView>
|
||||||
|
|
135
Source/Android/app/src/main/res/layout/dialog_game_details.xml
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:transitionName="card_game">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="480dp"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<de.hdodenhof.circleimageview.CircleImageView
|
||||||
|
android:id="@+id/circle_banner"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_below="@+id/image_game_screen"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
tools:src="@drawable/placeholder_banner"
|
||||||
|
app:border_color="#ffcccccc"
|
||||||
|
app:border_width="2dp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image_game_screen"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="320dp"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
android:transitionName="image_game_screen"
|
||||||
|
tools:src="@drawable/placeholder_screenshot"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_game_title"
|
||||||
|
style="@android:style/TextAppearance.Material.Headline"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_below="@+id/image_game_screen"
|
||||||
|
android:layout_marginLeft="36dp"
|
||||||
|
android:layout_marginRight="36dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:layout_toEndOf="@+id/circle_banner"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
tools:text="Rhythm Heaven Fever"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_game_description"
|
||||||
|
style="@android:style/TextAppearance.Material.Caption"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignEnd="@+id/text_game_title"
|
||||||
|
android:layout_alignStart="@+id/text_game_title"
|
||||||
|
android:layout_below="@+id/text_game_title"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sed odio vel quam auctor euismod. Pellentesque odio nibh, fermentum ut hendrerit id, ultrices et justo. "
|
||||||
|
tools:text="Zany rhythm action!"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/divider"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_below="@+id/text_game_description"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
|
||||||
|
android:background="#1F000000"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/icon_country"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_alignStart="@+id/circle_banner"
|
||||||
|
android:layout_alignTop="@+id/divider"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:src="@drawable/ic_country"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/icon_year"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_alignStart="@+id/icon_country"
|
||||||
|
android:layout_below="@+id/icon_country"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:src="@drawable/ic_date"
|
||||||
|
android:layout_marginBottom="16dp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_country"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignBottom="@+id/icon_country"
|
||||||
|
android:layout_alignStart="@+id/text_game_description"
|
||||||
|
android:layout_alignTop="@+id/icon_country"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:text="United States"
|
||||||
|
tools:text="United States"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_date"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignBottom="@+id/icon_year"
|
||||||
|
android:layout_alignStart="@+id/text_country"
|
||||||
|
android:layout_alignTop="@+id/icon_year"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:text="2010"
|
||||||
|
tools:text="2010"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/button_launch"
|
||||||
|
android:layout_width="56dp"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_alignBottom="@+id/image_game_screen"
|
||||||
|
android:layout_alignEnd="@+id/text_game_title"
|
||||||
|
android:layout_marginBottom="-28dp"
|
||||||
|
android:background="@drawable/oval_ripple"
|
||||||
|
android:src="@drawable/ic_play"
|
||||||
|
android:stateListAnimator="@anim/button_elevation"
|
||||||
|
android:elevation="4dp"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</FrameLayout>
|
6
Source/Android/app/src/main/res/values-w820dp/dimens.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
|
||||||
|
(such as screen margins) for screens with more than 820dp of available width. This
|
||||||
|
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
|
||||||
|
<dimen name="activity_horizontal_margin">64dp</dimen>
|
||||||
|
</resources>
|
8
Source/Android/app/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="dolphin_wii">#5bc0de</color>
|
||||||
|
<color name="dolphin_wii_dark">#428bca</color>
|
||||||
|
|
||||||
|
<color name="dolphin_gamecube">#663399</color>
|
||||||
|
<color name="dolphin_gamecube_dark">#311b92</color>
|
||||||
|
</resources>
|
10
Source/Android/app/src/main/res/values/dimens.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
|
||||||
|
<dimen name="diameter">48dp</dimen>
|
||||||
|
<dimen name="elevation_low">1dp</dimen>
|
||||||
|
<dimen name="elevation_high">4dp</dimen>
|
||||||
|
<dimen name="add_button_margin">16dp</dimen>
|
||||||
|
</resources>
|
27
Source/Android/app/src/main/res/values/styles.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- inherit from the material theme -->
|
||||||
|
<style name="DolphinWii" parent="android:Theme.Material.Light.NoActionBar">
|
||||||
|
<!-- Main theme colors -->
|
||||||
|
<!-- your app branding color for the app bar -->
|
||||||
|
<item name="android:colorPrimary">@color/dolphin_wii</item>
|
||||||
|
<!-- darker variant for the status bar and contextual app bars -->
|
||||||
|
<item name="android:colorPrimaryDark">@color/dolphin_wii_dark</item>
|
||||||
|
<!-- theme UI controls like checkboxes and text fields -->
|
||||||
|
<item name="android:colorAccent">@color/dolphin_gamecube</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="DolphinGamecube" parent="android:Theme.Material.Light.NoActionBar">
|
||||||
|
<item name="android:colorPrimary">@color/dolphin_gamecube</item>
|
||||||
|
<item name="android:colorPrimaryDark">@color/dolphin_gamecube_dark</item>
|
||||||
|
<item name="android:colorAccent">@color/dolphin_wii</item>
|
||||||
|
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
<item name="android:windowActionBar">false</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="DolphinWiiTransparent" parent="android:Theme.Material.Light.NoActionBar.TranslucentDecor">
|
||||||
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
@ -5,7 +5,7 @@ buildscript {
|
|||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:1.2.0'
|
classpath 'com.android.tools.build:gradle:1.2.3'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
@ -48,7 +48,7 @@ ANativeWindow* surf;
|
|||||||
std::string g_filename;
|
std::string g_filename;
|
||||||
std::string g_set_userpath = "";
|
std::string g_set_userpath = "";
|
||||||
|
|
||||||
#define DOLPHIN_TAG "Dolphinemu"
|
#define DOLPHIN_TAG "DolphinEmuNative"
|
||||||
|
|
||||||
void Host_NotifyMapLoaded() {}
|
void Host_NotifyMapLoaded() {}
|
||||||
void Host_RefreshDSPDebuggerWindow() {}
|
void Host_RefreshDSPDebuggerWindow() {}
|
||||||
@ -111,8 +111,6 @@ static bool MsgAlert(const char* caption, const char* text, bool /*yes_no*/, int
|
|||||||
|
|
||||||
#define DVD_BANNER_WIDTH 96
|
#define DVD_BANNER_WIDTH 96
|
||||||
#define DVD_BANNER_HEIGHT 32
|
#define DVD_BANNER_HEIGHT 32
|
||||||
std::map<DiscIO::IVolume::ELanguage, std::string> m_names;
|
|
||||||
bool m_is_wii_title;
|
|
||||||
|
|
||||||
static inline u32 Average32(u32 a, u32 b) {
|
static inline u32 Average32(u32 a, u32 b) {
|
||||||
return ((a >> 1) & 0x7f7f7f7f) + ((b >> 1) & 0x7f7f7f7f);
|
return ((a >> 1) & 0x7f7f7f7f) + ((b >> 1) & 0x7f7f7f7f);
|
||||||
@ -131,9 +129,6 @@ static bool LoadBanner(std::string filename, u32 *Banner)
|
|||||||
|
|
||||||
if (pVolume != nullptr)
|
if (pVolume != nullptr)
|
||||||
{
|
{
|
||||||
m_names = pVolume->GetNames();
|
|
||||||
m_is_wii_title = pVolume->IsWiiDisc() || pVolume->IsWadFile();
|
|
||||||
|
|
||||||
int Width, Height;
|
int Width, Height;
|
||||||
std::vector<u32> BannerVec = pVolume->GetBanner(&Width, &Height);
|
std::vector<u32> BannerVec = pVolume->GetBanner(&Width, &Height);
|
||||||
// This code (along with above inlines) is moved from
|
// This code (along with above inlines) is moved from
|
||||||
@ -166,31 +161,148 @@ static bool LoadBanner(std::string filename, u32 *Banner)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string GetName(std::string filename)
|
static bool IsWiiTitle(std::string filename)
|
||||||
{
|
{
|
||||||
DiscIO::IVolume::ELanguage language = SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_is_wii_title);
|
std::unique_ptr<DiscIO::IVolume> pVolume(DiscIO::CreateVolumeFromFilename(filename));
|
||||||
|
|
||||||
auto end = m_names.end();
|
if (pVolume != nullptr)
|
||||||
auto it = m_names.find(language);
|
|
||||||
if (it != end)
|
|
||||||
return it->second;
|
|
||||||
|
|
||||||
// English tends to be a good fallback when the requested language isn't available
|
|
||||||
if (language != IVolume::ELanguage::LANGUAGE_ENGLISH)
|
|
||||||
{
|
{
|
||||||
it = m_names.find(IVolume::ELanguage::LANGUAGE_ENGLISH);
|
bool is_wii_title = pVolume->IsWiiDisc() || pVolume->IsWadFile();
|
||||||
if (it != end)
|
|
||||||
return it->second;
|
__android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Is %s a Wii Disc: %s", filename.c_str(), is_wii_title ? "Yes" : "No" );
|
||||||
|
|
||||||
|
return is_wii_title;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If English isn't available either, just pick something
|
// Technically correct.
|
||||||
if (!m_names.empty())
|
return false;
|
||||||
return m_names.cbegin()->second;
|
}
|
||||||
|
|
||||||
// No usable name, return filename (better than nothing)
|
static std::string GetTitle(std::string filename)
|
||||||
std::string name;
|
{
|
||||||
SplitPath(filename, nullptr, &name, nullptr);
|
__android_log_print(ANDROID_LOG_WARN, DOLPHIN_TAG, "Getting Title for file: %s", filename.c_str());
|
||||||
return name;
|
|
||||||
|
std::unique_ptr<DiscIO::IVolume> pVolume(DiscIO::CreateVolumeFromFilename(filename));
|
||||||
|
|
||||||
|
if (pVolume != nullptr) {
|
||||||
|
std::map <DiscIO::IVolume::ELanguage, std::string> titles = pVolume->GetNames();
|
||||||
|
|
||||||
|
|
||||||
|
/*bool is_wii_title = IsWiiTitle(filename);
|
||||||
|
|
||||||
|
DiscIO::IVolume::ELanguage language = SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(
|
||||||
|
is_wii_title);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto it = titles.find(language);
|
||||||
|
if (it != end)
|
||||||
|
return it->second;*/
|
||||||
|
|
||||||
|
auto end = titles.end();
|
||||||
|
|
||||||
|
// English tends to be a good fallback when the requested language isn't available
|
||||||
|
//if (language != IVolume::ELanguage::LANGUAGE_ENGLISH) {
|
||||||
|
auto it = titles.find(IVolume::ELanguage::LANGUAGE_ENGLISH);
|
||||||
|
if (it != end)
|
||||||
|
return it->second;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
// If English isn't available either, just pick something
|
||||||
|
if (!titles.empty())
|
||||||
|
return titles.cbegin()->second;
|
||||||
|
|
||||||
|
// No usable name, return filename (better than nothing)
|
||||||
|
std::string name;
|
||||||
|
SplitPath(filename, nullptr, &name, nullptr);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string ("Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string GetDescription(std::string filename)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_WARN, DOLPHIN_TAG, "Getting Description for file: %s", filename.c_str());
|
||||||
|
|
||||||
|
DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(filename);
|
||||||
|
|
||||||
|
if (pVolume != nullptr)
|
||||||
|
{
|
||||||
|
std::map <DiscIO::IVolume::ELanguage, std::string> descriptions = pVolume->GetDescriptions();
|
||||||
|
|
||||||
|
/*
|
||||||
|
bool is_wii_title = IsWiiTitle(filename);
|
||||||
|
|
||||||
|
DiscIO::IVolume::ELanguage language = SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(
|
||||||
|
is_wii_title);
|
||||||
|
|
||||||
|
auto it = descriptions.find(language);
|
||||||
|
if (it != end)
|
||||||
|
return it->second;*/
|
||||||
|
|
||||||
|
auto end = descriptions.end();
|
||||||
|
|
||||||
|
// English tends to be a good fallback when the requested language isn't available
|
||||||
|
//if (language != IVolume::ELanguage::LANGUAGE_ENGLISH) {
|
||||||
|
auto it = descriptions.find(IVolume::ELanguage::LANGUAGE_ENGLISH);
|
||||||
|
if (it != end)
|
||||||
|
return it->second;
|
||||||
|
//}
|
||||||
|
|
||||||
|
// If English isn't available either, just pick something
|
||||||
|
if (!descriptions.empty())
|
||||||
|
return descriptions.cbegin()->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string ("Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string GetGameId(std::string filename)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_WARN, DOLPHIN_TAG, "Getting ID for file: %s", filename.c_str());
|
||||||
|
|
||||||
|
DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(filename);
|
||||||
|
if (pVolume != nullptr)
|
||||||
|
{
|
||||||
|
std::string id = pVolume->GetUniqueID();
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Game ID: %s", id.c_str());
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
return std::string ("Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string GetApploaderDate(std::string filename)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_WARN, DOLPHIN_TAG, "Getting Date for file: %s", filename.c_str());
|
||||||
|
|
||||||
|
DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(filename);
|
||||||
|
if (pVolume != nullptr)
|
||||||
|
{
|
||||||
|
std::string date = pVolume->GetApploaderDate();
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Date: %s", date.c_str());
|
||||||
|
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
return std::string ("Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
static u64 GetFileSize(std::string filename)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_WARN, DOLPHIN_TAG, "Getting size of file: %s", filename.c_str());
|
||||||
|
|
||||||
|
DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(filename);
|
||||||
|
if (pVolume != nullptr)
|
||||||
|
{
|
||||||
|
u64 size = pVolume->GetSize();
|
||||||
|
__android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Size: %lu", size);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string GetJString(JNIEnv *env, jstring jstr)
|
static std::string GetJString(JNIEnv *env, jstring jstr)
|
||||||
@ -215,8 +327,12 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulati
|
|||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj);
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj);
|
||||||
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Button, jint Action);
|
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Button, jint Action);
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Axis, jfloat Value);
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Axis, jfloat Value);
|
||||||
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBanner(JNIEnv *env, jobject obj, jstring jFile);
|
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBanner(JNIEnv *env, jobject obj, jstring jFile);JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle(JNIEnv *env, jobject obj, jstring jFilename);
|
||||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle(JNIEnv *env, jobject obj, jstring jFile);
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetDescription(JNIEnv *env, jobject obj, jstring jFilename);
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetGameId(JNIEnv *env, jobject obj, jstring jFilename);
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetDate(JNIEnv *env, jobject obj, jstring jFilename);
|
||||||
|
JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetFilesize(JNIEnv *env, jobject obj, jstring jFilename);
|
||||||
|
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_IsWiiTitle(JNIEnv *env, jobject obj, jstring jFilename);
|
||||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv *env, jobject obj);
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv *env, jobject obj);
|
||||||
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SupportsNEON(JNIEnv *env, jobject obj);
|
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SupportsNEON(JNIEnv *env, jobject obj);
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveScreenShot(JNIEnv *env, jobject obj);
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveScreenShot(JNIEnv *env, jobject obj);
|
||||||
@ -233,17 +349,17 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmulation(JNIEnv *env, jobject obj)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmulation(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
PowerPC::Start();
|
PowerPC::Start();
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulation(JNIEnv *env, jobject obj)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulation(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
PowerPC::Pause();
|
PowerPC::Pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
Core::Stop();
|
Core::Stop();
|
||||||
updateMainFrameEvent.Set(); // Kick the waiting event
|
updateMainFrameEvent.Set(); // Kick the waiting event
|
||||||
}
|
}
|
||||||
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Button, jint Action)
|
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Button, jint Action)
|
||||||
{
|
{
|
||||||
@ -251,7 +367,7 @@ JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePa
|
|||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Axis, jfloat Value)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Axis, jfloat Value)
|
||||||
{
|
{
|
||||||
ButtonManager::GamepadAxisEvent(GetJString(env, jDevice), Axis, Value);
|
ButtonManager::GamepadAxisEvent(GetJString(env, jDevice), Axis, Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBanner(JNIEnv *env, jobject obj, jstring jFile)
|
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBanner(JNIEnv *env, jobject obj, jstring jFile)
|
||||||
@ -266,15 +382,49 @@ JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBann
|
|||||||
}
|
}
|
||||||
return Banner;
|
return Banner;
|
||||||
}
|
}
|
||||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle(JNIEnv *env, jobject obj, jstring jFile)
|
|
||||||
{
|
|
||||||
std::string file = GetJString(env, jFile);
|
|
||||||
std::string name = GetName(file);
|
|
||||||
m_names.clear();
|
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle(JNIEnv *env, jobject obj, jstring jFilename)
|
||||||
|
{
|
||||||
|
std::string filename = GetJString(env, jFilename);
|
||||||
|
std::string name = GetTitle(filename);
|
||||||
return env->NewStringUTF(name.c_str());
|
return env->NewStringUTF(name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetDescription(JNIEnv *env, jobject obj, jstring jFilename)
|
||||||
|
{
|
||||||
|
std::string filename = GetJString(env, jFilename);
|
||||||
|
std::string description = GetDescription(filename);
|
||||||
|
return env->NewStringUTF(description.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetGameId(JNIEnv *env, jobject obj, jstring jFilename)
|
||||||
|
{
|
||||||
|
std::string filename = GetJString(env, jFilename);
|
||||||
|
std::string id = GetGameId(filename);
|
||||||
|
return env->NewStringUTF(id.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetDate(JNIEnv *env, jobject obj, jstring jFilename)
|
||||||
|
{
|
||||||
|
std::string filename = GetJString(env, jFilename);
|
||||||
|
std::string date = GetApploaderDate(filename);
|
||||||
|
return env->NewStringUTF(date.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetFilesize(JNIEnv *env, jobject obj, jstring jFilename)
|
||||||
|
{
|
||||||
|
std::string filename = GetJString(env, jFilename);
|
||||||
|
u64 size = GetFileSize(filename);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_IsWiiTitle(JNIEnv *env, jobject obj, jstring jFilename)
|
||||||
|
{
|
||||||
|
std::string filename = GetJString(env, jFilename);
|
||||||
|
bool wiiDisc = IsWiiTitle(filename);
|
||||||
|
return wiiDisc;
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv *env, jobject obj)
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
return env->NewStringUTF(scm_rev_str);
|
return env->NewStringUTF(scm_rev_str);
|
||||||
@ -287,12 +437,12 @@ JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Supports
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveScreenShot(JNIEnv *env, jobject obj)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveScreenShot(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
Core::SaveScreenShot();
|
Core::SaveScreenShot();
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_eglBindAPI(JNIEnv *env, jobject obj, jint api)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_eglBindAPI(JNIEnv *env, jobject obj, jint api)
|
||||||
{
|
{
|
||||||
eglBindAPI(api);
|
eglBindAPI(api);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jSection, jstring jKey, jstring jDefault)
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jSection, jstring jKey, jstring jDefault)
|
||||||
@ -313,56 +463,56 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig
|
|||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jSection, jstring jKey,
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jSection, jstring jKey,
|
||||||
jstring jValue)
|
jstring jValue)
|
||||||
{
|
{
|
||||||
IniFile ini;
|
IniFile ini;
|
||||||
std::string file = GetJString(env, jFile);
|
std::string file = GetJString(env, jFile);
|
||||||
std::string section = GetJString(env, jSection);
|
std::string section = GetJString(env, jSection);
|
||||||
std::string key = GetJString(env, jKey);
|
std::string key = GetJString(env, jKey);
|
||||||
std::string value = GetJString(env, jValue);
|
std::string value = GetJString(env, jValue);
|
||||||
|
|
||||||
ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(file));
|
ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(file));
|
||||||
|
|
||||||
ini.GetOrCreateSection(section)->Set(key, value);
|
ini.GetOrCreateSection(section)->Set(key, value);
|
||||||
ini.Save(File::GetUserPath(D_CONFIG_IDX) + std::string(file));
|
ini.Save(File::GetUserPath(D_CONFIG_IDX) + std::string(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetFilename(JNIEnv *env, jobject obj, jstring jFile)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetFilename(JNIEnv *env, jobject obj, jstring jFile)
|
||||||
{
|
{
|
||||||
g_filename = GetJString(env, jFile);
|
g_filename = GetJString(env, jFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveState(JNIEnv *env, jobject obj, jint slot)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveState(JNIEnv *env, jobject obj, jint slot)
|
||||||
{
|
{
|
||||||
State::Save(slot);
|
State::Save(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_LoadState(JNIEnv *env, jobject obj, jint slot)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_LoadState(JNIEnv *env, jobject obj, jint slot)
|
||||||
{
|
{
|
||||||
State::Load(slot);
|
State::Load(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CreateUserFolders(JNIEnv *env, jobject obj)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CreateUserFolders(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
File::CreateFullPath(File::GetUserPath(D_CONFIG_IDX));
|
File::CreateFullPath(File::GetUserPath(D_CONFIG_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX));
|
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_WIIUSER_IDX));
|
File::CreateFullPath(File::GetUserPath(D_WIIUSER_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_CACHE_IDX));
|
File::CreateFullPath(File::GetUserPath(D_CACHE_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_DUMPDSP_IDX));
|
File::CreateFullPath(File::GetUserPath(D_DUMPDSP_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_DUMPTEXTURES_IDX));
|
File::CreateFullPath(File::GetUserPath(D_DUMPTEXTURES_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_HIRESTEXTURES_IDX));
|
File::CreateFullPath(File::GetUserPath(D_HIRESTEXTURES_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_SCREENSHOTS_IDX));
|
File::CreateFullPath(File::GetUserPath(D_SCREENSHOTS_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_STATESAVES_IDX));
|
File::CreateFullPath(File::GetUserPath(D_STATESAVES_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_MAILLOGS_IDX));
|
File::CreateFullPath(File::GetUserPath(D_MAILLOGS_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_SHADERS_IDX));
|
File::CreateFullPath(File::GetUserPath(D_SHADERS_IDX));
|
||||||
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + USA_DIR DIR_SEP);
|
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + USA_DIR DIR_SEP);
|
||||||
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + EUR_DIR DIR_SEP);
|
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + EUR_DIR DIR_SEP);
|
||||||
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + JAP_DIR DIR_SEP);
|
File::CreateFullPath(File::GetUserPath(D_GCUSER_IDX) + JAP_DIR DIR_SEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserDirectory(JNIEnv *env, jobject obj, jstring jDirectory)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserDirectory(JNIEnv *env, jobject obj, jstring jDirectory)
|
||||||
{
|
{
|
||||||
std::string directory = GetJString(env, jDirectory);
|
std::string directory = GetJString(env, jDirectory);
|
||||||
g_set_userpath = directory;
|
g_set_userpath = directory;
|
||||||
UICommon::SetUserDirectory(directory);
|
UICommon::SetUserDirectory(directory);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDirectory(JNIEnv *env, jobject obj)
|
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDirectory(JNIEnv *env, jobject obj)
|
||||||
@ -372,24 +522,24 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDi
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jobject _surf)
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jobject _surf)
|
||||||
{
|
{
|
||||||
surf = ANativeWindow_fromSurface(env, _surf);
|
surf = ANativeWindow_fromSurface(env, _surf);
|
||||||
|
|
||||||
// Install our callbacks
|
// Install our callbacks
|
||||||
OSD::AddCallback(OSD::OSD_INIT, ButtonManager::Init);
|
OSD::AddCallback(OSD::OSD_INIT, ButtonManager::Init);
|
||||||
OSD::AddCallback(OSD::OSD_SHUTDOWN, ButtonManager::Shutdown);
|
OSD::AddCallback(OSD::OSD_SHUTDOWN, ButtonManager::Shutdown);
|
||||||
|
|
||||||
RegisterMsgAlertHandler(&MsgAlert);
|
RegisterMsgAlertHandler(&MsgAlert);
|
||||||
|
|
||||||
UICommon::SetUserDirectory(g_set_userpath);
|
UICommon::SetUserDirectory(g_set_userpath);
|
||||||
UICommon::Init();
|
UICommon::Init();
|
||||||
|
|
||||||
// No use running the loop when booting fails
|
// No use running the loop when booting fails
|
||||||
if ( BootManager::BootCore( g_filename.c_str() ) )
|
if ( BootManager::BootCore( g_filename.c_str() ) )
|
||||||
while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN)
|
while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN)
|
||||||
updateMainFrameEvent.Wait();
|
updateMainFrameEvent.Wait();
|
||||||
|
|
||||||
UICommon::Shutdown();
|
UICommon::Shutdown();
|
||||||
ANativeWindow_release(surf);
|
ANativeWindow_release(surf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|