summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorzackhow <zackhow@gmail.com>2018-08-05 16:11:33 -0400
committerzackhow <zackhow@gmail.com>2018-08-13 08:24:52 -0400
commit3f21975d2ab185e29e635a40af3645267aae6027 (patch)
tree577d321ac36f68aaa26adea1b5a87327ebae1281 /Source/Android/app/src/main/java
parent84c24516b13d23900273d6010737e0486caef421 (diff)
Android: Update mobile and TV to use game covers
Using covers should give a consistent look to dolphin's library.
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java2
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java1
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java16
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java2
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java1
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java5
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java81
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/GameBannerRequestHandler.java36
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/PicassoUtils.java126
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/TvUtil.java41
10 files changed, 207 insertions, 104 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java
index 75a908dac0..88b2e3855b 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java
@@ -37,7 +37,7 @@ public final class GameRowPresenter extends Presenter
ImageCardView gameCard = new ImageCardView(parent.getContext());
gameCard.setMainImageAdjustViewBounds(true);
- gameCard.setMainImageDimensions(480, 320);
+ gameCard.setMainImageDimensions(240, 336);
gameCard.setMainImageScaleType(ImageView.ScaleType.CENTER_CROP);
gameCard.setFocusable(true);
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
index cd9fdf9598..fbdaf8ad92 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
@@ -199,6 +199,7 @@ public final class SettingsFragmentPresenter
sl.add(new SubmenuSetting(null, null, R.string.gamecube_submenu, 0, MenuTag.CONFIG_GAME_CUBE));
sl.add(new SubmenuSetting(null, null, R.string.wii_submenu, 0, MenuTag.CONFIG_WII));
+ sl.add(new HeaderSetting(null, null, R.string.gametdb_thanks, 0));
}
private void addGeneralSettings(ArrayList<SettingsItem> sl)
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java
index 7e8628d4d2..b353a8126f 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java
@@ -1,7 +1,11 @@
package org.dolphinemu.dolphinemu.model;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Environment;
+import org.dolphinemu.dolphinemu.utils.CoverHelper;
+
public class GameFile
{
private long mPointer; // Do not rename or move without editing the native code
@@ -19,12 +23,24 @@ public class GameFile
public native String getDescription();
public native String getCompany();
public native int getCountry();
+ public native int getRegion();
public native String getPath();
public native String getGameId();
public native int[] getBanner();
public native int getBannerWidth();
public native int getBannerHeight();
+ public String getCoverPath()
+ {
+ return Environment.getExternalStorageDirectory().getPath() +
+ "/dolphin-emu/Cache/GameCovers/" + getGameId() + ".png";
+ }
+
+ public String getCustomCoverPath()
+ {
+ return getPath().substring(0, getPath().lastIndexOf(".")) + ".cover.png";
+ }
+
public String getScreenshotPath()
{
String gameId = getGameId();
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java
index 8333246f62..c51a8161be 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java
@@ -12,8 +12,6 @@ import org.dolphinemu.dolphinemu.ui.platform.Platform;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java
index 63330653b5..5df317019a 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java
@@ -154,6 +154,7 @@ public class SyncProgramsJobService extends JobService
.setTitle(game.getTitle())
.setDescription(game.getDescription())
.setPosterArtUri(banner)
+ .setPosterArtAspectRatio(TvContractCompat.PreviewPrograms.ASPECT_RATIO_2_3)
.setIntentUri(appLinkUri);
return builder.build();
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java
index feb8827eef..1e3fb5ba8d 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java
@@ -2,7 +2,6 @@ package org.dolphinemu.dolphinemu.ui.main;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.os.Build;
import android.os.Bundle;
import android.support.v17.leanback.app.BrowseFragment;
import android.support.v17.leanback.app.BrowseSupportFragment;
@@ -197,8 +196,6 @@ public final class TvMainActivity extends FragmentActivity implements MainView
GameFileCacheService.startLoad(this);
}
- mRowsAdapter.add(buildSettingsRow());
-
for (Platform platform : Platform.values())
{
ListRow row = buildGamesRow(platform, GameFileCacheService.getGameFilesForPlatform(platform));
@@ -210,6 +207,8 @@ public final class TvMainActivity extends FragmentActivity implements MainView
}
}
+ mRowsAdapter.add(buildSettingsRow());
+
mBrowseFragment.setAdapter(mRowsAdapter);
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java
new file mode 100644
index 0000000000..9e95409ee7
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java
@@ -0,0 +1,81 @@
+package org.dolphinemu.dolphinemu.utils;
+
+import android.graphics.Bitmap;
+
+import org.dolphinemu.dolphinemu.model.GameFile;
+import org.dolphinemu.dolphinemu.ui.platform.Platform;
+
+import java.io.FileOutputStream;
+
+public final class CoverHelper
+{
+ private static String baseUrl = "https://art.gametdb.com/wii/cover/%s/%s.png";
+
+ public static String buildGameTDBUrl(GameFile game, String region)
+ {
+ String gameId = game.getGameId();
+ if(game.getPlatform() == 2) // WiiWare
+ gameId = gameId.substring(0,4);
+ return String.format(baseUrl, region, gameId);
+ }
+
+ public static String getRegion(GameFile game)
+ {
+ String region;
+ switch(game.getRegion())
+ {
+ case 0: // NTSC_J
+ region = "JA";
+ break;
+ case 1: // NTSC_U
+ region = "US";
+ break;
+ case 4: // NTSC_K
+ region = "KO";
+ break;
+ case 2: // PAL
+ switch (game.getCountry())
+ {
+ case 2: // German
+ region = "DE";
+ break;
+ case 3: // French
+ region = "FR";
+ break;
+ case 4: // Spanish
+ region = "ES";
+ break;
+ case 5: // Italian
+ region = "IT";
+ break;
+ case 6: // Dutch
+ region = "NL";
+ break;
+ case 1: // English
+ default:
+ region = "EN";
+ break;
+ }
+ break;
+ case 3: // Unknown
+ default:
+ region = "EN";
+ break;
+ }
+ return region;
+ }
+
+ public static void saveCover(Bitmap cover, String path)
+ {
+ try
+ {
+ FileOutputStream out = new FileOutputStream(path);
+ cover.compress(Bitmap.CompressFormat.PNG, 100, out);
+ out.close();
+ }
+ catch (Exception e)
+ {
+ // Do nothing
+ }
+ }
+} \ No newline at end of file
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/GameBannerRequestHandler.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/GameBannerRequestHandler.java
deleted file mode 100644
index b8afcf6a52..0000000000
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/GameBannerRequestHandler.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.dolphinemu.dolphinemu.utils;
-
-import android.graphics.Bitmap;
-
-import com.squareup.picasso.Picasso;
-import com.squareup.picasso.Request;
-import com.squareup.picasso.RequestHandler;
-
-import org.dolphinemu.dolphinemu.NativeLibrary;
-import org.dolphinemu.dolphinemu.model.GameFile;
-
-import java.io.IOException;
-import java.nio.IntBuffer;
-
-public class GameBannerRequestHandler extends RequestHandler {
- GameFile mGameFile;
-
- public GameBannerRequestHandler(GameFile gameFile)
- {
- mGameFile = gameFile;
- }
- @Override
- public boolean canHandleRequest(Request data) {
- return true;
- }
-
- @Override
- public Result load(Request request, int networkPolicy) {
- int[] vector = mGameFile.getBanner();
- int width = mGameFile.getBannerWidth();
- int height = mGameFile.getBannerHeight();
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- bitmap.setPixels(vector, 0, width, 0, 0, width, height);
- return new Result(bitmap, Picasso.LoadedFrom.DISK);
- }
-}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/PicassoUtils.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/PicassoUtils.java
index 4630a3cddc..06f03f2154 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/PicassoUtils.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/PicassoUtils.java
@@ -1,46 +1,114 @@
package org.dolphinemu.dolphinemu.utils;
import android.graphics.Bitmap;
-import android.net.Uri;
+import android.graphics.drawable.BitmapDrawable;
import android.widget.ImageView;
+import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.GameFile;
import java.io.File;
-import java.net.URI;
public class PicassoUtils {
- public static void loadGameBanner(ImageView imageView, GameFile gameFile) {
- File screenshotFile = new File(URI.create(gameFile.getScreenshotPath()));
- if (screenshotFile.exists()) {
- // Fill in the view contents.
+ public static void loadGameBanner(ImageView imageView, GameFile gameFile)
+ {
+ File cover = new File(gameFile.getCustomCoverPath());
+ if (cover.exists())
+ {
Picasso.with(imageView.getContext())
- .load(gameFile.getScreenshotPath())
- .fit()
- .centerCrop()
- .noFade()
- .noPlaceholder()
- .config(Bitmap.Config.RGB_565)
- .error(R.drawable.no_banner)
- .into(imageView);
- } else {
- Picasso picassoInstance = new Picasso.Builder(imageView.getContext())
- .addRequestHandler(new GameBannerRequestHandler(gameFile))
- .build();
-
- picassoInstance
- .load(Uri.parse("iso:/" + gameFile.getPath()))
- .fit()
- .noFade()
- .noPlaceholder()
- .config(Bitmap.Config.RGB_565)
- .error(R.drawable.no_banner)
- .into(imageView);
+ .load(cover)
+ .fit()
+ .centerCrop()
+ .noFade()
+ .noPlaceholder()
+ .config(Bitmap.Config.ARGB_8888)
+ .error(R.drawable.no_banner)
+ .into(imageView);
+ }
+ else if ((cover = new File(gameFile.getCoverPath())).exists())
+ {
+ Picasso.with(imageView.getContext())
+ .load(cover)
+ .fit()
+ .centerCrop()
+ .noFade()
+ .noPlaceholder()
+ .config(Bitmap.Config.ARGB_8888)
+ .error(R.drawable.no_banner)
+ .into(imageView);
+ }
+ /**
+ * GameTDB has a pretty close to complete collection for US/EN covers. First pass at getting
+ * the cover will be by the disk's region, second will be the US cover, and third EN.
+ */
+ else
+ {
+ Picasso.with(imageView.getContext())
+ .load(CoverHelper.buildGameTDBUrl(gameFile, CoverHelper.getRegion(gameFile)))
+ .fit()
+ .centerCrop()
+ .noFade()
+ .noPlaceholder()
+ .config(Bitmap.Config.ARGB_8888)
+ .error(R.drawable.no_banner)
+ .into(imageView, new Callback()
+ {
+ @Override
+ public void onSuccess()
+ {
+ CoverHelper.saveCover(((BitmapDrawable) imageView.getDrawable()).getBitmap(),
+ gameFile.getCoverPath());
+ }
+ @Override
+ public void onError() // Second pass using US region
+ {
+ Picasso.with(imageView.getContext())
+ .load(CoverHelper.buildGameTDBUrl(gameFile, "US"))
+ .fit()
+ .centerCrop()
+ .noFade()
+ .noPlaceholder()
+ .config(Bitmap.Config.ARGB_8888)
+ .error(R.drawable.no_banner)
+ .into(imageView, new Callback()
+ {
+ @Override
+ public void onSuccess()
+ {
+ CoverHelper.saveCover(((BitmapDrawable) imageView.getDrawable()).getBitmap(),
+ gameFile.getCoverPath());
+ }
+ @Override
+ public void onError() // Third and last pass using EN region
+ {
+ Picasso.with(imageView.getContext())
+ .load(CoverHelper.buildGameTDBUrl(gameFile, "EN"))
+ .fit()
+ .centerCrop()
+ .noFade()
+ .noPlaceholder()
+ .config(Bitmap.Config.ARGB_8888)
+ .error(R.drawable.no_banner)
+ .into(imageView, new Callback()
+ {
+ @Override
+ public void onSuccess()
+ {
+ CoverHelper.saveCover(((BitmapDrawable) imageView.getDrawable()).getBitmap(),
+ gameFile.getCoverPath());
+ }
+ @Override
+ public void onError()
+ {
+ }
+ });
+ }
+ });
+ }
+ });
}
-
-
}
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/TvUtil.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/TvUtil.java
index a07b00e456..7597871e83 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/TvUtil.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/TvUtil.java
@@ -154,8 +154,8 @@ public class TvUtil
}
/**
- * Leanback lanucher requires a uri for poster art, so we take the banner vector,
- * make a bitmap, save that bitmap, then return the file provider uri.
+ * Leanback lanucher requires a uri for poster art so we create a contentUri and
+ * pass that to LEANBACK_PACKAGE
*/
public static Uri buildBanner(GameFile game, Context context)
{
@@ -163,33 +163,14 @@ public class TvUtil
try
{
- //Substring needed to strip "file:" from the path beginning
- File screenshotFile = new File(game.getScreenshotPath().substring(5));
- if (screenshotFile.exists())
+ File cover = new File(game.getCustomCoverPath());
+ if(cover.exists())
{
- contentUri = getUriForFile(context, getFilePrivider(context), screenshotFile);
+ contentUri = getUriForFile(context, getFileProvider(context), cover);
}
- else
+ else if ((cover = new File(game.getCoverPath())).exists())
{
- File file = new File(buildBannerFilename(game.getGameId()));
- if (!file.exists())
- {
- int[] vector = game.getBanner();
- int width = game.getBannerWidth();
- int height = game.getBannerHeight();
-
- if (vector.length > 0 || width > 0 || height > 0)
- {
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- bitmap.setPixels(vector, 0, width, 0, 0, width, height);
- FileOutputStream out = new FileOutputStream(file);
- bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
- out.close();
- }
- else
- return null;
- }
- contentUri = getUriForFile(context, getFilePrivider(context), file);
+ contentUri = getUriForFile(context, getFileProvider(context), cover);
}
context.grantUriPermission(LEANBACK_PACKAGE, contentUri,
FLAG_GRANT_READ_URI_PERMISSION);
@@ -203,16 +184,10 @@ public class TvUtil
return contentUri;
}
- private static String buildBannerFilename(String gameId)
- {
- return Environment.getExternalStorageDirectory().getPath() +
- "/dolphin-emu/Cache/" + gameId + "_banner.png";
- }
-
/**
* Needed since debug builds append '.debug' to the end of the package
*/
- private static String getFilePrivider(Context context)
+ private static String getFileProvider(Context context)
{
return context.getPackageName() + ".filesprovider";
}