Skip to content

Commit 4ce4b5f

Browse files
committed
ANDROID: Implemented "android.request"
1 parent 4a4fc7f commit 4ce4b5f

File tree

3 files changed

+56
-30
lines changed

3 files changed

+56
-30
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2024-04-07 (12.27)
2+
ANDROID: Implemented "android.request"
3+
14
2024-01-06 (12.27)
25
COMMON: Allow modules to return objects with methods that take arguments
36

src/platform/android/app/src/main/java/net/sourceforge/smallbasic/MainActivity.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import android.view.inputmethod.InputMethodManager;
3939
import android.widget.Toast;
4040

41+
import androidx.annotation.NonNull;
4142
import androidx.core.app.ActivityCompat;
4243
import androidx.core.content.ContextCompat;
4344
import androidx.core.content.FileProvider;
@@ -118,6 +119,7 @@ public class MainActivity extends NativeActivity {
118119
System.loadLibrary("smallbasic");
119120
}
120121

122+
public static native void consoleLog(String value);
121123
public static native boolean libraryMode();
122124
public static native void onActivityPaused(boolean paused);
123125
public static native void onResize(int width, int height);
@@ -380,10 +382,10 @@ public boolean loadModules() {
380382
System.loadLibrary("ioio");
381383
Class.forName("ioio.smallbasic.android.ModuleLoader")
382384
.getDeclaredConstructor(Long.class, Context.class).newInstance(getActivity(), this);
383-
Log.e(TAG, "loadModules - success");
385+
consoleLog("loadModules - success");
384386
result = true;
385387
} catch (Exception | UnsatisfiedLinkError e) {
386-
Log.e(TAG, "loadModules", e);
388+
consoleLog(e.toString());
387389
result = false;
388390
}
389391
return result;
@@ -508,23 +510,17 @@ public boolean removeLocationUpdates() {
508510
}
509511

510512
public String request(String endPoint, String method, String data, String apiKey) throws IOException {
511-
String result = null;
513+
String result;
512514
try {
513-
URL url = new URL(endPoint);
514-
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
515-
conn.setRequestMethod(method == null || method.isEmpty() ? "POST" : method);
516-
if (apiKey != null && !apiKey.isEmpty()) {
517-
conn.setRequestProperty("Content-Type", "application/json");
518-
conn.setRequestProperty("Authorization", "Bearer " + apiKey);
519-
}
520-
conn.setDoOutput(true);
515+
HttpURLConnection conn = getHttpURLConnection(endPoint, method, apiKey);
521516
if (data != null && !data.isEmpty()) {
522517
OutputStream os = conn.getOutputStream();
523518
os.write(data.getBytes(StandardCharsets.UTF_8));
524519
os.flush();
525520
os.close();
526521
}
527-
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
522+
int responseCode = conn.getResponseCode();
523+
if (responseCode == HttpURLConnection.HTTP_OK) {
528524
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
529525
String inputLine;
530526
StringBuilder response = new StringBuilder();
@@ -533,9 +529,11 @@ public String request(String endPoint, String method, String data, String apiKey
533529
}
534530
in.close();
535531
result = response.toString();
532+
} else {
533+
result = "[error:" + responseCode + "]";
536534
}
537535
} catch (Exception e) {
538-
Log.d(TAG, e.toString());
536+
result = "[error:" + e + "]";
539537
}
540538
return result;
541539
}
@@ -799,6 +797,24 @@ private void execStream(InputStream inputStream) throws IOException {
799797
runFile(outputFile.getAbsolutePath());
800798
}
801799

800+
@NonNull
801+
private static HttpURLConnection getHttpURLConnection(String endPoint,
802+
String method,
803+
String apiKey) throws IOException {
804+
URL url = new URL(endPoint);
805+
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
806+
conn.setConnectTimeout(10000);
807+
conn.setRequestProperty("User-Agent", "SmallBASIC");
808+
conn.setRequestMethod(method == null || method.isEmpty() ? "POST" : method);
809+
conn.setInstanceFollowRedirects(true);
810+
if (apiKey != null && !apiKey.isEmpty()) {
811+
conn.setRequestProperty("Content-Type", "application/json");
812+
conn.setRequestProperty("Authorization", "Bearer " + apiKey);
813+
}
814+
conn.setDoOutput(true);
815+
return conn;
816+
}
817+
802818
private Uri getSharedFile(File file) {
803819
Uri result;
804820
try {

src/platform/android/jni/runtime.cpp

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,15 @@ extern "C" JNIEXPORT jlong JNICALL Java_net_sourceforge_smallbasic_MainActivity_
195195
return runtime->getActivity();
196196
}
197197

198+
extern "C" JNIEXPORT void JNICALL Java_net_sourceforge_smallbasic_MainActivity_consoleLog
199+
(JNIEnv *env, jclass clazz, jstring jstr) {
200+
if (jstr != nullptr) {
201+
const char *str = env->GetStringUTFChars(jstr, 0);
202+
runtime->systemLog(str);
203+
env->ReleaseStringUTFChars(jstr, str);
204+
}
205+
}
206+
198207
void onContentRectChanged(ANativeActivity *activity, const ARect *rect) {
199208
logEntered();
200209
runtime->onResize(rect->right, rect->bottom);
@@ -355,6 +364,7 @@ String Runtime::getString(const char *methodName) {
355364
const char *resultStr = env->GetStringUTFChars(resultObj, JNI_FALSE);
356365
String result = resultStr;
357366
env->ReleaseStringUTFChars(resultObj, resultStr);
367+
env->DeleteLocalRef(resultObj);
358368
env->DeleteLocalRef(clazz);
359369
_app->activity->vm->DetachCurrentThread();
360370
return result;
@@ -966,39 +976,35 @@ int Runtime::getFontId() {
966976

967977
int Runtime::invokeRequest(int argc, slib_par_t *params, var_t *retval) {
968978
int result = 0;
969-
if (argc >= 1 && argc < 5 &&
970-
v_is_type(params[0].var_p, V_STR) &&
971-
v_is_type(params[1].var_p, V_STR) &&
972-
v_is_type(params[2].var_p, V_STR) &&
973-
v_is_type(params[3].var_p, V_STR)) {
979+
if ((argc >= 1 && argc <= 4 && v_is_type(params[0].var_p, V_STR)) &&
980+
(argc < 2 || v_is_type(params[1].var_p, V_STR)) &&
981+
(argc < 3 || v_is_type(params[2].var_p, V_STR)) &&
982+
(argc < 4 || v_is_type(params[3].var_p, V_STR))) {
974983
JNIEnv *env;
975984
_app->activity->vm->AttachCurrentThread(&env, nullptr);
976985

977986
auto endPoint = env->NewStringUTF(v_getstr(params[0].var_p));
978-
auto method = env->NewStringUTF(v_getstr(params[1].var_p));
979-
auto data = env->NewStringUTF(v_getstr(params[2].var_p));
980-
auto apiKey = env->NewStringUTF(v_getstr(params[3].var_p));
987+
auto method = env->NewStringUTF(argc < 2 ? "POST" : v_getstr(params[1].var_p));
988+
auto data = env->NewStringUTF(argc < 3 ? "" : v_getstr(params[2].var_p));
989+
auto apiKey = env->NewStringUTF(argc < 4 ? "" : v_getstr(params[3].var_p));
981990

982991
jclass clazz = env->GetObjectClass(_app->activity->clazz);
983992
const char *signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;";
984993
jmethodID methodId = env->GetMethodID(clazz, "request", signature);
985-
jstring resultStr = (jstring)env->CallObjectMethod(_app->activity->clazz, methodId, endPoint, method, data, apiKey);
986-
const char *str = env->GetStringUTFChars(resultStr, JNI_FALSE);
987-
v_init(retval);
994+
jstring jstr = (jstring)env->CallObjectMethod(_app->activity->clazz, methodId, endPoint, method, data, apiKey);
995+
const char *str = env->GetStringUTFChars(jstr, JNI_FALSE);
988996
v_setstr(retval, str);
989-
result = 1;
990-
991-
env->ReleaseStringUTFChars(resultStr, str);
992-
env->DeleteLocalRef(resultStr);
997+
result = strncmp(str, "[error:", 7) == 0 ? 0 : 1;
998+
env->ReleaseStringUTFChars(jstr, str);
999+
env->DeleteLocalRef(jstr);
9931000
env->DeleteLocalRef(clazz);
9941001
env->DeleteLocalRef(endPoint);
9951002
env->DeleteLocalRef(method);
9961003
env->DeleteLocalRef(data);
9971004
env->DeleteLocalRef(apiKey);
9981005

9991006
_app->activity->vm->DetachCurrentThread();
1000-
}
1001-
if (!result) {
1007+
} else {
10021008
v_setstr(retval, "invalid arguments");
10031009
}
10041010
return result;
@@ -1493,3 +1499,4 @@ void sblib_close(void) {
14931499
runtime->getBoolean("closeLibHandlers");
14941500
runtime->disableSensor();
14951501
}
1502+

0 commit comments

Comments
 (0)