diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java index 67a606f6..6bbb2012 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java @@ -30,7 +30,8 @@ public class BaseActivity extends AppCompatActivity { private void applyTheme() { currentTheme = PandroidApplication.getThemeId(); setTheme(currentTheme); - if (GlobalConfig.get(GlobalConfig.KEY_APP_THEME) == GlobalConfig.THEME_ANDROID){ + + if (GlobalConfig.get(GlobalConfig.KEY_APP_THEME) == GlobalConfig.THEME_ANDROID) { DynamicColors.applyToActivityIfAvailable(this); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/GameActivity.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/GameActivity.java index 700b00f0..59a9a3a9 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/GameActivity.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/GameActivity.java @@ -76,7 +76,7 @@ public class GameActivity extends BaseActivity implements EmulatorCallback { swapScreens(GlobalConfig.get(GlobalConfig.KEY_CURRENT_DS_LAYOUT)); } - private void changeOverlayVisibility(boolean visible){ + private void changeOverlayVisibility(boolean visible) { findViewById(R.id.overlay_controller).setVisibility(visible ? View.VISIBLE : View.GONE); findViewById(R.id.overlay_controller).invalidate(); findViewById(R.id.overlay_controller).requestLayout(); @@ -95,13 +95,14 @@ public class GameActivity extends BaseActivity implements EmulatorCallback { } } - private void goToPictureInPicture() { + private void enablePIP() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(true); builder.setSeamlessResizeEnabled(true); } + builder.setAspectRatio(new Rational(10, 14)); enterPictureInPictureMode(builder.build()); } @@ -114,7 +115,7 @@ public class GameActivity extends BaseActivity implements EmulatorCallback { InputHandler.reset(); if (GlobalConfig.get(GlobalConfig.KEY_PICTURE_IN_PICTURE)) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { - goToPictureInPicture(); + enablePIP(); } } else { drawerFragment.open(); @@ -142,7 +143,7 @@ public class GameActivity extends BaseActivity implements EmulatorCallback { @Override public void swapScreens(int index) { currentDsLayout = index; - GlobalConfig.set(GlobalConfig.KEY_CURRENT_DS_LAYOUT,index); + GlobalConfig.set(GlobalConfig.KEY_CURRENT_DS_LAYOUT, index); renderer.setLayout(DsLayoutManager.createLayout(currentDsLayout)); } @@ -158,11 +159,13 @@ public class GameActivity extends BaseActivity implements EmulatorCallback { @Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { super.onPictureInPictureModeChanged(isInPictureInPictureMode); + changeOverlayVisibility(!isInPictureInPictureMode && GlobalConfig.get(GlobalConfig.KEY_SCREEN_GAMEPAD_VISIBLE)); findViewById(R.id.hide_screen_controller).setVisibility(isInPictureInPictureMode ? View.INVISIBLE : View.VISIBLE); - if (isInPictureInPictureMode){ + + if (isInPictureInPictureMode) { getWindow().getDecorView().postDelayed(drawerFragment::close, 250); - } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S){ + } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { ActivityManager manager = ((ActivityManager) getSystemService(ACTIVITY_SERVICE)); manager.getAppTasks().forEach(ActivityManager.AppTask::moveToFront); } @@ -173,6 +176,7 @@ public class GameActivity extends BaseActivity implements EmulatorCallback { if (AlberDriver.HasRomLoaded()) { AlberDriver.Finalize(); } + super.onDestroy(); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java index 8f677c3e..1d57cdc5 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java @@ -31,11 +31,11 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt @Override public void onBackPressed() { - if (navigationBar.getSelectedItemId() != R.id.games){ + if (navigationBar.getSelectedItemId() != R.id.games) { navigationBar.setSelectedItemId(R.id.games); - return; - } - super.onBackPressed(); + } else { + super.onBackPressed(); + } } @Override diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BasePreferenceFragment.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BasePreferenceFragment.java index 3f6c72f1..9426c098 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BasePreferenceFragment.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BasePreferenceFragment.java @@ -22,7 +22,7 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat { }); } - protected void setSwitchValue(String id, boolean value){ + protected void setSwitchValue(String id, boolean value) { ((SwitchPreferenceCompat)findPreference(id)).setChecked(value); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BaseSheetDialog.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BaseSheetDialog.java index d905b844..76e5208b 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BaseSheetDialog.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/BaseSheetDialog.java @@ -18,11 +18,15 @@ public class BaseSheetDialog extends BottomSheetDialog { private final LinearLayout contentView; public BaseSheetDialog(@NonNull Context context) { super(CompatUtils.findActivity(context)); + int width = CompatUtils.findActivity(context).getWindow().getDecorView().getMeasuredWidth(); int height = CompatUtils.findActivity(context).getWindow().getDecorView().getMeasuredHeight(); - getBehavior().setPeekHeight((int) (height*0.87)); + float heightScale = 0.87f; // What percentage of the screen's height to use up + + getBehavior().setPeekHeight((int) (height * heightScale)); + getBehavior().setMaxHeight((int) (height * heightScale)); getBehavior().setMaxWidth(width); - getBehavior().setMaxHeight((int) (height*0.87)); + super.setContentView(R.layout.dialog_bottom_sheet); contentView = super.findViewById(R.id.content); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/GameAboutDialog.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/GameAboutDialog.java index e08bc07d..7fd6ed36 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/GameAboutDialog.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/GameAboutDialog.java @@ -61,14 +61,16 @@ public class GameAboutDialog extends BaseSheetDialog { } } + // Make a shortcut for a specific game private void makeShortcut() { Context context = CompatUtils.findActivity(getContext()); ShortcutInfoCompat.Builder shortcut = new ShortcutInfoCompat.Builder(context, game.getId()); - if (game.getIcon() != null){ + if (game.getIcon() != null) { shortcut.setIcon(IconCompat.createWithAdaptiveBitmap(game.getIcon())); } else { shortcut.setIcon(IconCompat.createWithResource(getContext(), R.mipmap.ic_launcher)); } + shortcut.setActivity(new ComponentName(context, GameLauncher.class)); shortcut.setLongLabel(game.getTitle()); shortcut.setShortLabel(game.getTitle()); @@ -76,6 +78,6 @@ public class GameAboutDialog extends BaseSheetDialog { intent.setAction(Intent.ACTION_VIEW); intent.setData(new Uri.Builder().scheme("pandroid-game").authority(game.getId()).build()); shortcut.setIntent(intent); - ShortcutManagerCompat.requestPinShortcut(context,shortcut.build(),null); + ShortcutManagerCompat.requestPinShortcut(context, shortcut.build(), null); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/LoadingAlertDialog.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/LoadingAlertDialog.java index 61887fb9..881d12cf 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/LoadingAlertDialog.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/base/LoadingAlertDialog.java @@ -13,7 +13,7 @@ import com.panda3ds.pandroid.R; public class LoadingAlertDialog extends BottomAlertDialog { public LoadingAlertDialog(@NonNull Context context, @StringRes int title) { super(context); - View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading,null, false); + View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null, false); setView(view); setCancelable(false); ((AppCompatTextView)view.findViewById(R.id.title)) diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/AlberInputListener.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/AlberInputListener.java index 4777989d..ca63f7ba 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/AlberInputListener.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/AlberInputListener.java @@ -49,7 +49,7 @@ public class AlberInputListener implements Function { axisChanged = true; break; case CHANGE_DS_LAYOUT: - if (!event.isDown()){ + if (!event.isDown()) { emulator.swapScreens(); } break; diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/DrawerFragment.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/DrawerFragment.java index 79369093..736a2cdc 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/DrawerFragment.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/DrawerFragment.java @@ -52,7 +52,7 @@ public class DrawerFragment extends Fragment implements DrawerLayout.DrawerListe refresh(); } - private void refresh(){ + private void refresh() { game = GameUtils.getCurrentGame(); if (game.getIcon() != null && !game.getIcon().isRecycled()) { ((GameIconView) drawerLayout.findViewById(R.id.game_icon)).setImageBitmap(game.getIcon()); @@ -61,7 +61,6 @@ public class DrawerFragment extends Fragment implements DrawerLayout.DrawerListe } ((AppCompatTextView)drawerLayout.findViewById(R.id.game_title)).setText(game.getTitle()); ((AppCompatTextView)drawerLayout.findViewById(R.id.game_publisher)).setText(game.getPublisher()); - } @Override diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/EmulatorCallback.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/EmulatorCallback.java index 399b3145..b2f57baf 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/EmulatorCallback.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/EmulatorCallback.java @@ -5,7 +5,8 @@ import com.panda3ds.pandroid.data.config.GlobalConfig; public interface EmulatorCallback { void onBackPressed(); void swapScreens(int index); + default void swapScreens() { - swapScreens(GlobalConfig.get(GlobalConfig.KEY_CURRENT_DS_LAYOUT)+1); + swapScreens(GlobalConfig.get(GlobalConfig.KEY_CURRENT_DS_LAYOUT) + 1); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/GameLauncher.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/GameLauncher.java index 6ad820b0..63fe99c4 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/GameLauncher.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/game/GameLauncher.java @@ -21,17 +21,19 @@ public class GameLauncher extends BaseActivity { super.onCreate(savedInstanceState); setContentView(new TextView(this)); Uri uri = getIntent().getData(); - if(uri != null && uri.getScheme().equals("pandroid-game")){ + if (uri != null && uri.getScheme().equals("pandroid-game")) { String gameId = uri.getAuthority(); GameMetadata game = GameUtils.findGameById(gameId); - if (game != null){ + + if (game != null) { GameUtils.launch(this, game); } else { - Toast.makeText(this, R.string.invalid_game,Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.invalid_game, Toast.LENGTH_LONG).show(); ShortcutManagerCompat.removeDynamicShortcuts(this, Arrays.asList(gameId)); ShortcutManagerCompat.removeLongLivedShortcuts(this, Arrays.asList(gameId)); } } + finish(); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java index e49eb2b4..fe35bad0 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/main/SettingsFragment.java @@ -27,8 +27,8 @@ public class SettingsFragment extends BasePreferenceFragment { try { Context context = PandroidApplication.getAppContext(); return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; - } catch (Exception e){ - return "???"; + } catch (Exception e) { + return "Error: Unknown version"; } } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GamesFoldersPreferences.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GamesFoldersPreferences.java index c7b32338..ec162c56 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GamesFoldersPreferences.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GamesFoldersPreferences.java @@ -51,14 +51,14 @@ public class GamesFoldersPreferences extends BasePreferenceFragment implements A screen.addPreference(preference); } - Preference add = new Preference(screen.getContext()); - add.setTitle(R.string.import_folder); - add.setIcon(R.drawable.ic_add); - add.setOnPreferenceClickListener(preference -> { + Preference pref = new Preference(screen.getContext()); + pref.setTitle(R.string.import_folder); + pref.setIcon(R.drawable.ic_add); + pref.setOnPreferenceClickListener(preference -> { pickFolderRequest.launch(null); return false; }); - screen.addPreference(add); + screen.addPreference(pref); } private void showFolderInfo(GamesFolder folder) { @@ -83,6 +83,7 @@ public class GamesFoldersPreferences extends BasePreferenceFragment implements A @Override public void onDestroy() { super.onDestroy(); + if (pickFolderRequest != null) { pickFolderRequest.unregister(); pickFolderRequest = null; diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GeneralPreferences.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GeneralPreferences.java index 8a49964a..0b003db9 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GeneralPreferences.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/GeneralPreferences.java @@ -29,7 +29,7 @@ public class GeneralPreferences extends BasePreferenceFragment { refresh(); } - private void refresh(){ + private void refresh() { setSwitchValue("behavior.pictureInPicture", GlobalConfig.get(GlobalConfig.KEY_PICTURE_IN_PICTURE)); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputPreferences.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputPreferences.java index aa5d5eff..cc89accd 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputPreferences.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/InputPreferences.java @@ -80,7 +80,7 @@ public class InputPreferences extends BasePreferenceFragment { @SuppressLint("RestrictedApi") private void refreshScreenProfileList() { PreferenceCategory category = findPreference(ID_GAMEPAD_PROFILE_LIST); - Preference add = category.getPreference(category.getPreferenceCount() - 1); + Preference pref = category.getPreference(category.getPreferenceCount() - 1); category.removeAll(); category.setOrderingAsAdded(true); @@ -97,8 +97,8 @@ public class InputPreferences extends BasePreferenceFragment { category.addPreference(item); } - add.setOrder(category.getPreferenceCount()); - category.addPreference(add); + pref.setOrder(category.getPreferenceCount()); + category.addPreference(pref); } @Override diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/screen_editor/ScreenLayoutsPreference.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/screen_editor/ScreenLayoutsPreference.java index 7074b47b..ac3e1039 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/screen_editor/ScreenLayoutsPreference.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/preferences/screen_editor/ScreenLayoutsPreference.java @@ -20,13 +20,14 @@ public class ScreenLayoutsPreference extends BasePreferenceFragment { refresh(); } - public void refresh(){ + public void refresh() { PreferenceScreen screen = getPreferenceScreen(); screen.removeAll(); - for (int i = 0; i < DsLayoutManager.getLayoutCount(); i++){ + + for (int i = 0; i < DsLayoutManager.getLayoutCount(); i++) { Preference pref = new Preference(getPreferenceScreen().getContext()); pref.setIconSpaceReserved(false); - pref.setTitle("Layout "+(i+1)); + pref.setTitle("Layout "+ (i + 1)); pref.setSummary(R.string.click_to_change); pref.setIcon(R.drawable.ic_edit); pref.setKey(String.valueOf(i)); diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/provider/AppDataDocumentProvider.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/provider/AppDataDocumentProvider.java index 4c11485b..ca6fad90 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/provider/AppDataDocumentProvider.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/provider/AppDataDocumentProvider.java @@ -79,6 +79,7 @@ public class AppDataDocumentProvider extends DocumentsProvider { .add(Root.COLUMN_TITLE, context().getString(R.string.app_name)) .add(Root.COLUMN_MIME_TYPES, "*/*") .add(Root.COLUMN_ICON, R.mipmap.ic_launcher); + return cursor; } @@ -87,6 +88,7 @@ public class AppDataDocumentProvider extends DocumentsProvider { File file = obtainFile(documentId); MatrixCursor cursor = new MatrixCursor(projection == null ? DEFAULT_DOCUMENT_PROJECTION : projection); includeFile(cursor, file); + return cursor; } @@ -125,20 +127,20 @@ public class AppDataDocumentProvider extends DocumentsProvider { public String createDocument(String parentDocumentId, String mimeType, String displayName) throws FileNotFoundException { File parent = obtainFile(parentDocumentId); File file = new File(parent, displayName); - if (!parent.exists()){ - throw new FileNotFoundException("Parent don't exists"); + if (!parent.exists()) { + throw new FileNotFoundException("Parent doesn't exist"); } - if (Objects.equals(mimeType, Document.MIME_TYPE_DIR)){ - if (!file.mkdirs()){ - throw new FileNotFoundException("Error on create directory"); + if (Objects.equals(mimeType, Document.MIME_TYPE_DIR)) { + if (!file.mkdirs()) { + throw new FileNotFoundException("Error while creating directory"); } } else { try { - if (!file.createNewFile()){ - throw new Exception("Error on create file"); + if (!file.createNewFile()) { + throw new Exception("Error while creating file"); } - } catch (Exception e){ + } catch (Exception e) { throw new FileNotFoundException(e.getMessage()); } } @@ -148,7 +150,7 @@ public class AppDataDocumentProvider extends DocumentsProvider { @Override public void deleteDocument(String documentId) throws FileNotFoundException { File file = obtainFile(documentId); - if (file.exists()){ + if (file.exists()) { FileUtils.delete(file.getAbsolutePath()); } else { throw new FileNotFoundException("File not exists"); diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/GsonConfigParser.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/GsonConfigParser.java index eef15d3a..6da6860c 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/GsonConfigParser.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/GsonConfigParser.java @@ -33,7 +33,7 @@ public class GsonConfigParser { new Task(()->{ if (FileUtils.exists(getPath())) { String src = FileUtils.readTextFile(getPath()); - if(src != null && src.length() > 2){ + if (src != null && src.length() > 2) { content[0] = src; } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java index 3540bbd5..21645b7e 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/config/GlobalConfig.java @@ -60,17 +60,19 @@ public class GlobalConfig { writeChanges(); } - public static T getExtra(Key key, Class dataClass){ - if (data.extras.has(key.name)){ + public static T getExtra(Key key, Class dataClass) { + if (data.extras.has(key.name)) { return gson.fromJson(data.extras.getAsJsonObject(key.name), dataClass); } + return gson.fromJson("{}", dataClass); } - public static synchronized void putExtra(Key key, Object value){ - if (data.extras.has(key.name)){ + public static synchronized void putExtra(Key key, Object value) { + if (data.extras.has(key.name)) { data.extras.remove(key.name); } + data.extras.add(key.name, gson.toJsonTree(value)); writeChanges(); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java index 2c033171..50cc1992 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameMetadata.java @@ -83,9 +83,10 @@ public class GameMetadata { this.title = smdh.getTitle(); this.publisher = smdh.getPublisher(); this.icon = icon; - if (icon != null){ + if (icon != null) { GameUtils.setGameIcon(id, icon); } + this.regions = new GameRegion[]{smdh.getRegion()}; GameUtils.writeChanges(); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameRegion.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameRegion.java index 9e025163..e369319a 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameRegion.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GameRegion.java @@ -12,8 +12,8 @@ public enum GameRegion { Taiwan, None; - public int localizedName(){ - switch (this){ + public int localizedName() { + switch (this) { case NorthAmerican: return R.string.region_north_armerican; case Japan: diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GamesFolder.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GamesFolder.java index 78d454a1..fd486445 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GamesFolder.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/data/game/GamesFolder.java @@ -12,7 +12,6 @@ import java.util.HashMap; import java.util.UUID; public class GamesFolder { - private final String id = UUID.randomUUID().toString(); private final String path; private final HashMap games = new HashMap<>(); @@ -21,7 +20,7 @@ public class GamesFolder { this.path = path; } - public boolean isValid(){ + public boolean isValid() { return FileUtils.exists(path); } @@ -39,22 +38,24 @@ public class GamesFolder { public void refresh() { String[] gamesId = games.keySet().toArray(new String[0]); - for (String file: gamesId){ - if (!FileUtils.exists(path+"/"+file)){ + for (String file: gamesId) { + if (!FileUtils.exists(path + "/" + file)) { games.remove(file); } } + String unknown = PandroidApplication.getAppContext().getString(R.string.unknown); - for (String file: FileUtils.listFiles(path)){ + for (String file: FileUtils.listFiles(path)) { String path = FileUtils.getChild(this.path, file); - if (FileUtils.isDirectory(path) || games.containsKey(file)){ + if (FileUtils.isDirectory(path) || games.containsKey(file)) { continue; } + String ext = FileUtils.extension(path); - if (ext.equals("3ds") || ext.equals("3dsx")){ + if (ext.equals("3ds") || ext.equals("3dsx") || ext.equals("cci") || ext.equals("cxi") || ext.equals("app") || ext.equals("ncch")) { String name = FileUtils.getName(path).trim().split("\\.")[0]; - games.put(file, new GameMetadata(new Uri.Builder().path(file).authority(id).scheme("folder").build().toString(),name, unknown)); + games.put(file, new GameMetadata(new Uri.Builder().path(file).authority(id).scheme("folder").build().toString(), name, unknown)); } } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputHandler.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputHandler.java index 28edd426..c6440434 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputHandler.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/input/InputHandler.java @@ -110,13 +110,14 @@ public class InputHandler { } } String code = KeyEvent.keyCodeToString(event.getKeyCode()); - if (event.getAction() == KeyEvent.ACTION_UP){ + if (event.getAction() == KeyEvent.ACTION_UP) { keyDownEvents.remove(code); handleEvent(new InputEvent(code, 0.0f)); - } else if (!keyDownEvents.containsKey(code)){ + } else if (!keyDownEvents.containsKey(code)) { keyDownEvents.put(code, new InputEvent(code, 1.0f)); } - for (InputEvent env: keyDownEvents.values()){ + + for (InputEvent env: keyDownEvents.values()) { handleEvent(env); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/CompatUtils.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/CompatUtils.java index 8b1682f7..91a37f55 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/CompatUtils.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/CompatUtils.java @@ -19,21 +19,22 @@ public class CompatUtils { } else if ((context instanceof ContextWrapper)) { return findActivity(((ContextWrapper) context).getBaseContext()); } + return ((Activity) context); } - public static int resolveColor(Context context, @AttrRes int id){ + public static int resolveColor(Context context, @AttrRes int id) { try { TypedArray values = context.obtainStyledAttributes(new int[]{id}); int color = values.getColor(0, Color.RED); values.recycle(); return color; - } catch (Exception e){ + } catch (Exception e) { return Color.rgb(255,0,255); } } - public static float applyDimen(int unit, int size) { + public static float applyDimensions(int unit, int size) { return TypedValue.applyDimension(unit, size, PandroidApplication.getAppContext().getResources().getDisplayMetrics()); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java index 7455613a..85245454 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/FileUtils.java @@ -31,12 +31,13 @@ public class FileUtils { } Uri uri = Uri.parse(path); DocumentFile singleFile = DocumentFile.fromSingleUri(getContext(), uri); - if (singleFile.length() > 0 && singleFile.length() != 4096){ + if (singleFile.length() > 0 && singleFile.length() != 4096) { return singleFile; } - if (uri.getScheme().equals("content") && uri.getPath().startsWith("/"+TREE_URI)){ + if (uri.getScheme().equals("content") && uri.getPath().startsWith("/" + TREE_URI)) { return DocumentFile.fromTreeUri(getContext(), uri); } + return singleFile; } @@ -264,22 +265,26 @@ public class FileUtils { FileUtils.createFile(path, name); InputStream in = getInputStream(source); OutputStream out = getOutputStream(fullPath); - byte[] buffer = new byte[1024 * 128]; //128 KB + // Make a 128KB temp buffer used for copying in chunks + byte[] buffer = new byte[1024 * 128]; int length; + while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } + out.flush(); out.close(); in.close(); } catch (Exception e) { - Log.e(Constants.LOG_TAG, "ERROR ON COPY FILE", e); + Log.e(Constants.LOG_TAG, "Error while trying to copy file", e); return false; } + return true; } - public static String getChild(String path, String name){ + public static String getChild(String path, String name) { return parseFile(path).findFile(name).getUri().toString(); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/GameUtils.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/GameUtils.java index b3a40423..1d865880 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/GameUtils.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/GameUtils.java @@ -88,7 +88,7 @@ public class GameUtils { String[] keys = data.folders.keySet().toArray(new String[0]); for (String key : keys) { GamesFolder folder = data.folders.get(key); - if (!folder.isValid()){ + if (!folder.isValid()) { data.folders.remove(key); } else { folder.refresh(); @@ -100,7 +100,7 @@ public class GameUtils { public static ArrayList getGames() { ArrayList games = new ArrayList<>(); games.addAll(data.games); - for (GamesFolder folder: data.folders.values()){ + for (GamesFolder folder: data.folders.values()) { games.addAll(folder.getGames()); } return games; @@ -144,9 +144,9 @@ public class GameUtils { } public static void registerFolder(String path) { - if (!data.folders.containsKey(path)){ + if (!data.folders.containsKey(path)) { GamesFolder folder = new GamesFolder(path); - data.folders.put(folder.getId(),folder); + data.folders.put(folder.getId(), folder); folder.refresh(); writeChanges(); } @@ -158,11 +158,12 @@ public class GameUtils { } public static GameMetadata findGameById(String id) { - for (GameMetadata game: getGames()){ - if (game.getId().equals(id)){ + for (GameMetadata game: getGames()) { + if (game.getId().equals(id)) { return game; } } + return null; } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Bounds.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Bounds.java index 51f4d51f..fa6ef3c3 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Bounds.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Bounds.java @@ -8,24 +8,24 @@ class Bounds { public int top = 0; public int bottom = 0; - public void normalize(){ + public void normalize() { left = Math.abs(left); right = Math.abs(right); top = Math.abs(top); bottom = Math.abs(bottom); } - public void applyWithAspect(Rect rect, int width, double aspectRatio){ + public void applyWithAspect(Rect rect, int width, double aspectRatio) { normalize(); rect.set(left, top, width-right, (int) Math.round((width-right-left)*aspectRatio)+top); } - public void apply(Rect rect, int width, int height){ + public void apply(Rect rect, int width, int height) { normalize(); rect.set(left, top, width-right, height-bottom); } - public void move(int x, int y){ + public void move(int x, int y) { left += x; right -= x; @@ -35,12 +35,14 @@ class Bounds { } public void fixOverlay(int width, int height, int size) { - if (left > (width-right) - size){ - right = (width-left) - size; + if (left > (width - right) - size) { + right = (width - left) - size; } - if (top > (height - bottom) - size){ + + if (top > (height - bottom) - size) { bottom = (height - top) - size; } + normalize(); } } \ No newline at end of file diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsEditorView.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsEditorView.java index 7401a0a4..7ae0ec83 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsEditorView.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsEditorView.java @@ -51,13 +51,13 @@ public class DsEditorView extends FrameLayout { public DsEditorView(Context context, int index) { super(context); layout = (DsLayout) DsLayoutManager.createLayout(index); - SIZE_DP = CompatUtils.applyDimen(TypedValue.COMPLEX_UNIT_DIP, 1); + SIZE_DP = CompatUtils.applyDimensions(TypedValue.COMPLEX_UNIT_DIP, 1); int colorBottomSelection = CompatUtils.resolveColor(context, androidx.appcompat.R.attr.colorPrimary); int colorTopSelection = CompatUtils.resolveColor(context, com.google.android.material.R.attr.colorAccent); selectionPaint.setColor(colorTopSelection); selectionPaint.setStrokeWidth(SIZE_DP * 2); - selectionPaint.setPathEffect(new DashPathEffect(new float[]{SIZE_DP * 10, SIZE_DP * 10}, 0.0f)); + selectionPaint.setPathEffect(new DashPathEffect(new float[] { SIZE_DP * 10, SIZE_DP * 10 }, 0.0f)); selectionPaint.setStyle(Paint.Style.STROKE); layout.setTopDisplaySourceSize(Constants.N3DS_WIDTH, Constants.N3DS_HALF_HEIGHT); @@ -71,14 +71,17 @@ public class DsEditorView extends FrameLayout { layout.getCurrentModel().gravity = Gravity.TOP; refreshLayout(); }); + gravityAnchor.findViewById(R.id.center).setOnClickListener(v -> { layout.getCurrentModel().gravity = Gravity.CENTER; refreshLayout(); }); + gravityAnchor.findViewById(R.id.down).setOnClickListener(v -> { layout.getCurrentModel().gravity = Gravity.BOTTOM; refreshLayout(); }); + gravityAnchor.findViewById(R.id.revert).setOnClickListener(v -> { layout.getCurrentModel().reverse = !layout.getCurrentModel().reverse; refreshLayout(); @@ -87,7 +90,7 @@ public class DsEditorView extends FrameLayout { { modeSelectorLayout = (LinearLayout) inflater.inflate(R.layout.ds_editor_spinner, this, false); ArrayAdapter spinnerAdapter = new ArrayAdapter<>(getContext(), R.layout.ds_editor_spinner_label); - spinnerAdapter.addAll("SINGLE", "RELATIVE", "ABSOLUTE"); + spinnerAdapter.addAll("Single", "Relative", "Absolute"); modeSelector = modeSelectorLayout.findViewById(R.id.spinner); modeSelector.setAdapter(spinnerAdapter); modeSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @@ -149,6 +152,7 @@ public class DsEditorView extends FrameLayout { @Override public void draw(Canvas canvas) { super.draw(canvas); + if (this.width != getWidth() || this.height != getHeight()) { this.width = getWidth(); this.height = getHeight(); @@ -172,12 +176,12 @@ public class DsEditorView extends FrameLayout { spacePoint.setCenterPosition(primaryDisplay.width(), (int) (SIZE_DP * 15)); spacePoint.setText(String.valueOf((int) (data.space * 100))); } + + break; } - break; + case SINGLE: - case ABSOLUTE: { - } - break; + case ABSOLUTE: break; } this.topDisplay.setSize(topDisplay.width(), topDisplay.height()); @@ -212,18 +216,22 @@ public class DsEditorView extends FrameLayout { if (landscape) { addView(spacePoint); } + + break; } - break; + case ABSOLUTE: { addView(aspectRatioFixLayout, new LayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity.CENTER | Gravity.TOP)); addView(topDisplayResizer); addView(bottomDisplayResizer); + + break; } - break; + case SINGLE: { addView(aspectRatioFixLayout, new LayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity.CENTER | Gravity.TOP)); + break; } - break; } ((MaterialCheckBox) aspectRatioFixLayout.findViewById(R.id.checkbox)).setChecked(layout.getCurrentModel().lockAspect); @@ -233,7 +241,6 @@ public class DsEditorView extends FrameLayout { } private class PointView extends AppCompatTextView { - public PointView() { super(DsEditorView.this.getContext()); setLayoutParams(new FrameLayout.LayoutParams((int) (SIZE_DP * 30), (int) (SIZE_DP * 30))); @@ -302,6 +309,7 @@ public class DsEditorView extends FrameLayout { downEvent = new Vector2(event.getRawX(), event.getRawY()); return true; } + preferred.move((int) (event.getRawX() - downEvent.x), (int) (event.getRawY() - downEvent.y)); downEvent.set(event.getRawX(), event.getRawY()); refreshPoints(); @@ -330,6 +338,7 @@ public class DsEditorView extends FrameLayout { refreshPoints(); return true; } + return false; } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayout.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayout.java index 8e892315..f59a5b29 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayout.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayout.java @@ -102,12 +102,7 @@ class DsLayout implements ConsoleLayout { (data.onlyTop ? bottomDisplay : topDisplay).set(0, 0, 0, 0); } - - /*** - * RELATIVE LAYOUT: - * ORGANIZE SCREEN IN POSITION BASED IN GRAVITY - * AND SPACE, THE SPACE DETERMINE LANDSCAPE TOP SCREEN SIZE - */ + // Relative layout: Organize screen position based on gravity and space, the space determined by the top screen size in landscape mode private void relative(Model data) { int screenWidth = (int) screenSize.x; int screenHeight = (int) screenSize.y; @@ -144,13 +139,14 @@ class DsLayout implements ConsoleLayout { case Gravity.CENTER: { bottomDisplay.offset(0, (screenHeight - bottomDisplay.height()) / 2); topDisplay.offset(0, (screenHeight - topDisplay.height()) / 2); + break; } - break; + case Gravity.BOTTOM: { bottomDisplay.offset(0, (screenHeight - bottomDisplay.height())); topDisplay.offset(0, (screenHeight - topDisplay.height())); + break; } - break; } } else { diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayoutManager.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayoutManager.java index 6f41359e..6b044626 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayoutManager.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/DsLayoutManager.java @@ -10,7 +10,7 @@ public class DsLayoutManager { static { data = GlobalConfig.getExtra(GlobalConfig.KEY_DS_LAYOUTS, DataModel.class); - if (data.models.size() == 0){ + if (data.models.size() == 0) { setupBasicModels(); } } @@ -26,24 +26,24 @@ public class DsLayoutManager { model3.mode = Mode.SINGLE; model3.onlyTop = true; - data.models.add(new Model[]{model1, model1.clone()}); - data.models.add(new Model[]{model2, model2.clone()}); - data.models.add(new Model[]{model3, model3.clone()}); + data.models.add(new Model[] {model1, model1.clone()}); + data.models.add(new Model[] {model2, model2.clone()}); + data.models.add(new Model[] {model3, model3.clone()}); save(); } - public static synchronized void save(){ + public static synchronized void save() { GlobalConfig.putExtra(GlobalConfig.KEY_DS_LAYOUTS, data); } - public static int getLayoutCount(){ + public static int getLayoutCount() { return data.models.size(); } - public static ConsoleLayout createLayout(int index){ - index = Math.min(getLayoutCount()-1, index); - return new DsLayout(data.models.get(index)[0],data.models.get(index)[1]); + public static ConsoleLayout createLayout(int index) { + index = Math.min(getLayoutCount() - 1, index); + return new DsLayout(data.models.get(index)[0], data.models.get(index)[1]); } private static class DataModel { diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Model.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Model.java index aff03c21..84209ba4 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Model.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/ds/Model.java @@ -22,7 +22,7 @@ class Model implements Cloneable { public Model clone() { try { return (Model) super.clone(); - } catch (Exception e){ + } catch (Exception e) { Log.e(Constants.LOG_TAG, "Error on clone DsModel!", e); return new Model(); } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/GamesGridView.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/GamesGridView.java index 2e09d966..ddb192aa 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/GamesGridView.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/gamesgrid/GamesGridView.java @@ -41,7 +41,7 @@ public class GamesGridView extends RecyclerView { } private void onLongClickGame(GameMetadata game) { - if (longClickListener != null){ + if (longClickListener != null) { longClickListener.run(game); } } diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/renderer/layout/RelativeScreenLayout.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/renderer/layout/RelativeScreenLayout.java deleted file mode 100644 index 29b826e6..00000000 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/renderer/layout/RelativeScreenLayout.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.panda3ds.pandroid.view.renderer.layout; - -import android.graphics.Rect; -import android.view.Gravity; - -import com.panda3ds.pandroid.math.Vector2; - -public class RelativeScreenLayout implements ConsoleLayout { - private final Rect topDisplay = new Rect(); - private final Rect bottomDisplay = new Rect(); - - private final Vector2 screenSize = new Vector2(1.0f, 1.0f); - private final Vector2 topSourceSize = new Vector2(1.0f, 1.0f); - private final Vector2 bottomSourceSize = new Vector2(1.0f, 1.0f); - - private boolean landscapeReverse = false; - private boolean portraitReverse = false; - private float landscapeSpace = 0.6f; - private int landscapeGravity = Gravity.CENTER; - private int portraitGravity = Gravity.TOP; - - @Override - public void update(int screenWidth, int screenHeight) { - screenSize.set(screenWidth, screenHeight); - updateBounds(); - } - - @Override - public void setBottomDisplaySourceSize(int width, int height) { - bottomSourceSize.set(width, height); - updateBounds(); - } - @Override - public void setTopDisplaySourceSize(int width, int height) { - topSourceSize.set(width, height); - updateBounds(); - } - - public void setPortraitGravity(int portraitGravity) { - this.portraitGravity = portraitGravity; - } - - public void setLandscapeGravity(int landscapeGravity) { - this.landscapeGravity = landscapeGravity; - } - - public void setLandscapeSpace(float landscapeSpace) { - this.landscapeSpace = landscapeSpace; - } - - public void setLandscapeReverse(boolean landscapeReverse) { - this.landscapeReverse = landscapeReverse; - } - - public void setPortraitReverse(boolean portraitReverse) { - this.portraitReverse = portraitReverse; - } - - private void updateBounds() { - int screenWidth = (int) screenSize.x; - int screenHeight = (int) screenSize.y; - - Vector2 topSourceSize = this.topSourceSize; - Vector2 bottomSourceSize = this.bottomSourceSize; - - Rect topDisplay = this.topDisplay; - Rect bottomDisplay = this.bottomDisplay; - - if ((landscapeReverse && screenWidth > screenHeight) || (portraitReverse && screenWidth < screenHeight)){ - topSourceSize = this.bottomSourceSize; - bottomSourceSize = this.topSourceSize; - - topDisplay = this.bottomDisplay; - bottomDisplay = this.topDisplay; - } - - if (screenWidth > screenHeight) { - int topDisplayWidth = (int) ((screenHeight / topSourceSize.y) * topSourceSize.x); - int topDisplayHeight = screenHeight; - - if (topDisplayWidth > (screenWidth * landscapeSpace)) { - topDisplayWidth = (int) (screenWidth * landscapeSpace); - topDisplayHeight = (int) ((topDisplayWidth / topSourceSize.x) * topSourceSize.y); - } - - int bottomDisplayHeight = (int) (((screenWidth - topDisplayWidth) / bottomSourceSize.x) * bottomSourceSize.y); - - topDisplay.set(0, 0, topDisplayWidth, topDisplayHeight); - bottomDisplay.set(topDisplayWidth, 0, topDisplayWidth + (screenWidth - topDisplayWidth), bottomDisplayHeight); - adjustHorizontalGravity(); - } else { - int topScreenHeight = (int) ((screenWidth / topSourceSize.x) * topSourceSize.y); - topDisplay.set(0, 0, screenWidth, topScreenHeight); - - int bottomDisplayHeight = (int) ((screenWidth / bottomSourceSize.x) * bottomSourceSize.y); - int bottomDisplayWidth = screenWidth; - int bottomDisplayX = 0; - - if (topScreenHeight + bottomDisplayHeight > screenHeight) { - bottomDisplayHeight = (screenHeight - topScreenHeight); - bottomDisplayWidth = (int) ((bottomDisplayHeight / bottomSourceSize.y) * bottomSourceSize.x); - bottomDisplayX = (screenWidth - bottomDisplayX) / 2; - } - - topDisplay.set(0, 0, screenWidth, topScreenHeight); - bottomDisplay.set(bottomDisplayX, topScreenHeight, bottomDisplayX + bottomDisplayWidth, topScreenHeight + bottomDisplayHeight); - adjustVerticalGravity(); - } - } - - private void adjustHorizontalGravity(){ - int topOffset = 0; - int bottomOffset = 0; - switch (landscapeGravity){ - case Gravity.CENTER:{ - topOffset = (int) (screenSize.y - topDisplay.height())/2; - bottomOffset = (int) (screenSize.y - bottomDisplay.height())/2; - }break; - case Gravity.BOTTOM:{ - topOffset = (int) (screenSize.y - topDisplay.height()); - bottomOffset = (int) (screenSize.y - bottomDisplay.height()); - }break; - } - topDisplay.offset(0, topOffset); - bottomDisplay.offset(0, bottomOffset); - } - - private void adjustVerticalGravity(){ - int height = (topDisplay.height() + bottomDisplay.height()); - int space = 0; - switch (portraitGravity){ - case Gravity.CENTER:{ - space = (int) (screenSize.y - height)/2; - }break; - case Gravity.BOTTOM:{ - space = (int) (screenSize.y - height); - }break; - } - topDisplay.offset(0, space); - bottomDisplay.offset(0,space); - } - - @Override - public Rect getBottomDisplayBounds() { - return bottomDisplay; - } - - @Override - public Rect getTopDisplayBounds() { - return topDisplay; - } -} diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/renderer/layout/SingleScreenLayout.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/renderer/layout/SingleScreenLayout.java deleted file mode 100644 index 96be64bb..00000000 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/renderer/layout/SingleScreenLayout.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.panda3ds.pandroid.view.renderer.layout; - -import android.graphics.Rect; -import android.view.Gravity; - -import com.panda3ds.pandroid.math.Vector2; - -public class SingleScreenLayout implements ConsoleLayout { - private final Rect topDisplay = new Rect(); - private final Rect bottomDisplay = new Rect(); - private final Vector2 screenSize = new Vector2(1.0f, 1.0f); - private final Vector2 topSourceSize = new Vector2(1.0f, 1.0f); - private final Vector2 bottomSourceSize = new Vector2(1.0f, 1.0f); - private boolean top = true; - - @Override - public void update(int screenWidth, int screenHeight) { - screenSize.set(screenWidth, screenHeight); - updateBounds(); - } - - @Override - public void setBottomDisplaySourceSize(int width, int height) { - bottomSourceSize.set(width, height); - updateBounds(); - } - @Override - public void setTopDisplaySourceSize(int width, int height) { - topSourceSize.set(width, height); - updateBounds(); - } - - private void updateBounds() { - int screenWidth = (int) screenSize.x; - int screenHeight = (int) screenSize.y; - Vector2 source = top ? topSourceSize : bottomSourceSize; - Rect dest = top ? topDisplay : bottomDisplay; - - int width = Math.round((screenHeight / source.y) * source.x); - int height = screenHeight; - int y = 0; - int x = (screenWidth - width) / 2; - if (width > screenWidth){ - width = screenWidth; - height = Math.round((screenWidth / source.x) * source.y); - x = 0; - y = (screenHeight - height)/2; - } - dest.set(x, y, x + width, y+height); - - (top ? bottomDisplay : topDisplay).set(0,0,0,0); - } - - @Override - public Rect getBottomDisplayBounds() { - return bottomDisplay; - } - - @Override - public Rect getTopDisplayBounds() { - return topDisplay; - } -}