diff --git a/app/src/main/cpp/emu48-jni.c b/app/src/main/cpp/emu48-jni.c index 874ef24..4a3b86d 100644 --- a/app/src/main/cpp/emu48-jni.c +++ b/app/src/main/cpp/emu48-jni.c @@ -69,17 +69,32 @@ void mainViewResizeCallback(int x, int y) { } } -void fillNullCharacter(const OPENFILENAME *ofn) { - TCHAR * pos = ofn->lpstrFilter; +TCHAR * fillNullCharacter(TCHAR * fileFilter) { + TCHAR * pos = fileFilter; + int length = 0; if(pos) { - for (;;) { + for (;; pos++, length++) { if (*pos == 0) { - *pos = _T("|"); - if (*(pos + 1) = 0) + if (*(pos + 1) == 0) break; } } + TCHAR * newFileFilter = malloc(length + 1); + TCHAR * newPos = newFileFilter; + pos = fileFilter; + for (;; pos++, newPos++) { + if (*pos == 0) { + *newPos = _T('|'); + if (*(pos + 1) == 0) { + *(newPos + 1) = 0; + break; + } + } else + *newPos = *pos; + } + return newFileFilter; } + return NULL; } int mainViewGetOpenFileNameCallback(OPENFILENAME * ofn) { @@ -101,13 +116,15 @@ int mainViewGetOpenFileNameCallback(OPENFILENAME * ofn) { // // ofn->nMaxFile = ARRAYSIZEOF(szBuffer); // ofn->lpstrFile = szBuffer; - fillNullCharacter(ofn); - mainViewCallback(CALLBACK_TYPE_GETOPENFILENAME, ofn->nFilterIndex, ofn->Flags, ofn->lpstrFilter, ofn->lpstrDefExt); + TCHAR * lpstrFilter = fillNullCharacter(ofn->lpstrFilter); + mainViewCallback(CALLBACK_TYPE_GETOPENFILENAME, ofn->nFilterIndex, ofn->Flags, lpstrFilter, ofn->lpstrDefExt); + free(lpstrFilter); } int mainViewGetSaveFileNameCallback(OPENFILENAME * ofn) { - fillNullCharacter(ofn); - mainViewCallback(CALLBACK_TYPE_GETSAVEFILENAME, ofn->nFilterIndex, ofn->Flags, ofn->lpstrFilter, ofn->lpstrDefExt); + TCHAR * lpstrFilter = fillNullCharacter(ofn->lpstrFilter); + mainViewCallback(CALLBACK_TYPE_GETSAVEFILENAME, ofn->nFilterIndex, ofn->Flags, lpstrFilter, ofn->lpstrDefExt); + free(lpstrFilter); } @@ -129,7 +146,10 @@ int mainViewCallback(int type, int param1, int param2, const TCHAR * param3, con jclass viewToUpdateClass = (*jniEnv)->GetObjectClass(jniEnv, viewToUpdate); //jmethodID midStr = (*jniEnv)->GetMethodID(jniEnv, viewToUpdateClass, "updateCallback", "()V"); jmethodID midStr = (*jniEnv)->GetMethodID(jniEnv, viewToUpdateClass, "updateCallback", "(IIILjava/lang/String;Ljava/lang/String;)I"); - int result = (*jniEnv)->CallIntMethod(jniEnv, viewToUpdate, midStr, type, param1, param2, param3, param4); + jstring utfParam3 = (*jniEnv)->NewStringUTF(jniEnv, param3); + jstring utfParam4 = (*jniEnv)->NewStringUTF(jniEnv, param4); + int result = (*jniEnv)->CallIntMethod(jniEnv, viewToUpdate, midStr, type, param1, param2, utfParam3, utfParam4); + // if(needDetach) // ret = (*java_machine)->DetachCurrentThread(java_machine); return result; diff --git a/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java b/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java index f84213d..3bd0846 100644 --- a/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java +++ b/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java @@ -1,13 +1,17 @@ package com.regis.cosnier.emu48; +import android.app.Activity; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.MotionEvent; import android.view.ViewGroup; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.navigation.NavigationView; import com.google.android.material.snackbar.Snackbar; +import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -17,11 +21,16 @@ import androidx.drawerlayout.widget.DrawerLayout; import android.view.View; import android.view.Menu; import android.view.MenuItem; +import android.widget.Toast; + +import java.io.IOException; +import java.io.OutputStream; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private static final int INTENT_SETTINGS = 1; + private static final String TAG = "MainActivity"; private MainScreenView mainScreenView; @Override @@ -222,4 +231,25 @@ public class MainActivity extends AppCompatActivity super.onDestroy(); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + if(requestCode == MainScreenView.INTENT_GETSAVEFILENAME && resultCode == Activity.RESULT_OK) { + Uri uri = data.getData(); + + //just as an example, I am writing a String to the Uri I received from the user: + Log.d(TAG, "onActivityResult INTENT_GETSAVEFILENAME " + uri.toString()); + +// try { +// OutputStream output = getContentResolver().openOutputStream(uri); +// +// output.write(SOME_CONTENT.getBytes()); +// output.close(); +// } +// catch(IOException e) { +// Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show(); +// } + } + super.onActivityResult(requestCode, resultCode, data); + } } diff --git a/app/src/main/java/com/regis/cosnier/emu48/MainScreenView.java b/app/src/main/java/com/regis/cosnier/emu48/MainScreenView.java index f8eb982..5bb6952 100644 --- a/app/src/main/java/com/regis/cosnier/emu48/MainScreenView.java +++ b/app/src/main/java/com/regis/cosnier/emu48/MainScreenView.java @@ -243,7 +243,7 @@ public class MainScreenView extends SurfaceView { final int CALLBACK_TYPE_GETOPENFILENAME = 2; final int CALLBACK_TYPE_GETSAVEFILENAME = 3; - final int INTENT_GETSAVEFILENAME = 1; + public static int INTENT_GETSAVEFILENAME = 1; int updateCallback(int type, int param1, int param2, String param3, String param4) { switch (type) { case CALLBACK_TYPE_INVALIDATE: @@ -259,7 +259,7 @@ public class MainScreenView extends SurfaceView { case CALLBACK_TYPE_GETSAVEFILENAME: Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType("YOUR FILETYPE"); //not needed, but maybe usefull + //intent.setType("YOUR FILETYPE"); //not needed, but maybe usefull intent.putExtra(Intent.EXTRA_TITLE, "YOUR FILENAME"); //not needed, but maybe usefull ((Activity)getContext()).startActivityForResult(intent, INTENT_GETSAVEFILENAME); break;