From 367701b325ce09ddb7e1b9ab8169dcf525e7ff0d Mon Sep 17 00:00:00 2001 From: gabriel Date: Sat, 25 Nov 2023 17:51:17 -0400 Subject: [PATCH] - Fix MainActivity.java crash on start. - Separate MainActivity.java into two Classes: MainActivity.java and GameActivity - Implement post callback in GLRenderer. --- src/pandroid/app/src/main/AndroidManifest.xml | 14 ++++-- .../main/java/com/panda3ds/pandroid/C.java | 6 +++ .../panda3ds/pandroid/app/BaseActivity.java | 6 +++ .../panda3ds/pandroid/app/GameActivity.java | 39 +++++++++++++++ .../pandroid/{ => app}/MainActivity.java | 49 +++++++------------ .../pandroid/{ => utils}/PathUtils.java | 2 +- .../pandroid/{ => view}/PandaGlRenderer.java | 23 +++++++-- .../{ => view}/PandaGlSurfaceView.java | 10 ++-- .../app/src/main/res/layout/activity_main.xml | 26 +++++----- .../app/src/main/res/values/strings.xml | 1 + 10 files changed, 123 insertions(+), 53 deletions(-) create mode 100644 src/pandroid/app/src/main/java/com/panda3ds/pandroid/C.java create mode 100644 src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java create mode 100644 src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/GameActivity.java rename src/pandroid/app/src/main/java/com/panda3ds/pandroid/{ => app}/MainActivity.java (52%) rename src/pandroid/app/src/main/java/com/panda3ds/pandroid/{ => utils}/PathUtils.java (99%) rename src/pandroid/app/src/main/java/com/panda3ds/pandroid/{ => view}/PandaGlRenderer.java (86%) rename src/pandroid/app/src/main/java/com/panda3ds/pandroid/{ => view}/PandaGlSurfaceView.java (71%) diff --git a/src/pandroid/app/src/main/AndroidManifest.xml b/src/pandroid/app/src/main/AndroidManifest.xml index 0effd35f..2d318370 100644 --- a/src/pandroid/app/src/main/AndroidManifest.xml +++ b/src/pandroid/app/src/main/AndroidManifest.xml @@ -2,6 +2,12 @@ + + + + - + + - \ No newline at end of file diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/C.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/C.java new file mode 100644 index 00000000..722a7235 --- /dev/null +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/C.java @@ -0,0 +1,6 @@ +package com.panda3ds.pandroid; + +public class C { + public static final String EXTRA_PATH = "path"; + public static final String LOG_TAG = "Alber"; +} 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 new file mode 100644 index 00000000..597d664b --- /dev/null +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/BaseActivity.java @@ -0,0 +1,6 @@ +package com.panda3ds.pandroid.app; + +import androidx.appcompat.app.AppCompatActivity; + +public class BaseActivity extends AppCompatActivity { +} 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 new file mode 100644 index 00000000..a82f4bf8 --- /dev/null +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/GameActivity.java @@ -0,0 +1,39 @@ +package com.panda3ds.pandroid.app; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import com.panda3ds.pandroid.AlberDriver; +import com.panda3ds.pandroid.C; +import com.panda3ds.pandroid.app.BaseActivity; +import com.panda3ds.pandroid.view.PandaGlSurfaceView; + +public class GameActivity extends BaseActivity { + private PandaGlSurfaceView pandaSurface; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + pandaSurface = new PandaGlSurfaceView(this);; + setContentView(pandaSurface); + + Intent intent = getIntent(); + if(!intent.hasExtra(C.EXTRA_PATH)){ + Toast.makeText(this, "INVALID ROM PATH", Toast.LENGTH_LONG).show(); + finish(); + return; + } + + pandaSurface.getRenderer().postDrawEvent(()->{ + String path = intent.getStringExtra(C.EXTRA_PATH); + Log.i(C.LOG_TAG,"Try load ROM: "+path); + AlberDriver.LoadRom(path); + }); + } +} diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/MainActivity.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java similarity index 52% rename from src/pandroid/app/src/main/java/com/panda3ds/pandroid/MainActivity.java rename to src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java index b7b3726d..6acce7fd 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/MainActivity.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/app/MainActivity.java @@ -1,24 +1,20 @@ -package com.panda3ds.pandroid; +package com.panda3ds.pandroid.app; -import androidx.appcompat.app.AppCompatActivity; import static android.provider.Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION; import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.view.WindowInsets; -import android.view.View; import android.os.Environment; import android.widget.Toast; -import android.widget.FrameLayout; -import com.panda3ds.pandroid.PathUtils; -import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.appcompat.app.AppCompatActivity; + +import com.panda3ds.pandroid.C; +import com.panda3ds.pandroid.R; +import com.panda3ds.pandroid.utils.PathUtils; public class MainActivity extends AppCompatActivity { - - PandaGlSurfaceView glView; - private static final int PICK_3DS_ROM = 2; private void openFile() { @@ -31,22 +27,18 @@ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!Environment.isExternalStorageManager()) { - Intent intent = new Intent(ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); - startActivity(intent); - } - - glView = new PandaGlSurfaceView(this); - setContentView(glView); - FloatingActionButton fab = new FloatingActionButton(this); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - openFile(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + Intent intent = new Intent(ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); + startActivity(intent); } + } + + setContentView(R.layout.activity_main); + + findViewById(R.id.load_rom).setOnClickListener(v->{ + openFile(); }); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(200, 200); - addContentView(fab, params); } @Override @@ -55,13 +47,10 @@ public class MainActivity extends AppCompatActivity { if (resultCode == RESULT_OK) { String path = PathUtils.getPath(getApplicationContext(), data.getData()); Toast.makeText(getApplicationContext(), "pandroid opening " + path, Toast.LENGTH_LONG).show(); - glView.queueEvent(new Runnable() { - @Override - public void run() { - AlberDriver.LoadRom(path); - } - }); + startActivity(new Intent(this, GameActivity.class) + .putExtra(C.EXTRA_PATH, path)); } + super.onActivityResult(requestCode, resultCode, data); } } } \ No newline at end of file diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/PathUtils.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/PathUtils.java similarity index 99% rename from src/pandroid/app/src/main/java/com/panda3ds/pandroid/PathUtils.java rename to src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/PathUtils.java index 740223eb..0a24603c 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/PathUtils.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/utils/PathUtils.java @@ -1,4 +1,4 @@ -package com.panda3ds.pandroid; +package com.panda3ds.pandroid.utils; import android.content.ContentUris; import android.content.Context; diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/PandaGlRenderer.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/PandaGlRenderer.java similarity index 86% rename from src/pandroid/app/src/main/java/com/panda3ds/pandroid/PandaGlRenderer.java rename to src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/PandaGlRenderer.java index cb6f90da..9ad8e34e 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/PandaGlRenderer.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/PandaGlRenderer.java @@ -1,4 +1,4 @@ -package com.panda3ds.pandroid; +package com.panda3ds.pandroid.view; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; @@ -10,11 +10,16 @@ import android.opengl.GLSurfaceView; import android.util.DisplayMetrics; import android.util.Log; +import com.panda3ds.pandroid.AlberDriver; + import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; +import java.util.ArrayList; public class PandaGlRenderer implements GLSurfaceView.Renderer { + + private final ArrayList events = new ArrayList<>(); int screenWidth, screenHeight; int screenTexture; public int screenFbo; @@ -23,6 +28,7 @@ public class PandaGlRenderer implements GLSurfaceView.Renderer { super(); } + @Override protected void finalize() throws Throwable { if (screenTexture != 0) { @@ -33,7 +39,7 @@ public class PandaGlRenderer implements GLSurfaceView.Renderer { } super.finalize(); } - + public void onSurfaceCreated(GL10 unused, EGLConfig config) { Log.i("pandroid", glGetString(GL_EXTENSIONS)); Log.w("pandroid", glGetString(GL_VERSION)); @@ -61,6 +67,10 @@ public class PandaGlRenderer implements GLSurfaceView.Renderer { AlberDriver.Initialize(); } + public void postDrawEvent(Runnable callback){ + events.add(callback); + } + public void onDrawFrame(GL10 unused) { if (AlberDriver.HasRomLoaded()) { AlberDriver.RunFrame(screenFbo); @@ -68,6 +78,13 @@ public class PandaGlRenderer implements GLSurfaceView.Renderer { glBindFramebuffer(GL_READ_FRAMEBUFFER, screenFbo); glBlitFramebuffer(0, 0, 400, 480, 0, 0, screenWidth, screenHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); } + + int count = events.size(); + while (count > 0){ + events.get(0).run(); + events.remove(0); + count--; + } } public void onSurfaceChanged(GL10 unused, int width, int height) { @@ -76,4 +93,4 @@ public class PandaGlRenderer implements GLSurfaceView.Renderer { screenHeight = height; glDisable(GL_SCISSOR_TEST); } -} +} \ No newline at end of file diff --git a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/PandaGlSurfaceView.java b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/PandaGlSurfaceView.java similarity index 71% rename from src/pandroid/app/src/main/java/com/panda3ds/pandroid/PandaGlSurfaceView.java rename to src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/PandaGlSurfaceView.java index 657b327c..a26b3d2f 100644 --- a/src/pandroid/app/src/main/java/com/panda3ds/pandroid/PandaGlSurfaceView.java +++ b/src/pandroid/app/src/main/java/com/panda3ds/pandroid/view/PandaGlSurfaceView.java @@ -1,11 +1,7 @@ -package com.panda3ds.pandroid; +package com.panda3ds.pandroid.view; -import android.app.Activity; import android.content.Context; import android.opengl.GLSurfaceView; -import android.util.DisplayMetrics; - -import com.panda3ds.pandroid.PandaGlRenderer; public class PandaGlSurfaceView extends GLSurfaceView { final PandaGlRenderer renderer; @@ -16,4 +12,8 @@ public class PandaGlSurfaceView extends GLSurfaceView { renderer = new PandaGlRenderer(); setRenderer(renderer); } + + public PandaGlRenderer getRenderer() { + return renderer; + } } \ No newline at end of file diff --git a/src/pandroid/app/src/main/res/layout/activity_main.xml b/src/pandroid/app/src/main/res/layout/activity_main.xml index 17eab17b..89a17ce9 100644 --- a/src/pandroid/app/src/main/res/layout/activity_main.xml +++ b/src/pandroid/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,22 @@ - + tools:context=".app.MainActivity"> - + +