mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-19 21:13:12 -07:00
Propagate Regist Events to Java
This commit is contained in:
parent
bbf744824b
commit
c1bbf89553
7 changed files with 110 additions and 11 deletions
|
@ -96,6 +96,23 @@ static jobject jnistr_from_ascii(JNIEnv *env, const char *str)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jobject get_kotlin_global_object(JNIEnv *env, const char *id)
|
||||||
|
{
|
||||||
|
size_t idlen = strlen(id);
|
||||||
|
char *sig = malloc(idlen + 3);
|
||||||
|
if(!sig)
|
||||||
|
return NULL;
|
||||||
|
sig[0] = 'L';
|
||||||
|
memcpy(sig + 1, id, idlen);
|
||||||
|
sig[1 + idlen] = ';';
|
||||||
|
sig[1 + idlen + 1] = '\0';
|
||||||
|
jclass cls = E->FindClass(env, id);
|
||||||
|
jfieldID field_id = E->GetStaticFieldID(env, cls, "INSTANCE", sig);
|
||||||
|
jobject r = E->GetStaticObjectField(env, cls, field_id);
|
||||||
|
free(sig);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static ChiakiLog global_log;
|
static ChiakiLog global_log;
|
||||||
static JavaVM *global_vm;
|
static JavaVM *global_vm;
|
||||||
|
|
||||||
|
@ -609,13 +626,52 @@ JNIEXPORT void JNICALL JNI_FCN(discoveryServiceFree)(JNIEnv *env, jobject obj, j
|
||||||
typedef struct android_chiaki_regist_t
|
typedef struct android_chiaki_regist_t
|
||||||
{
|
{
|
||||||
AndroidChiakiLog log;
|
AndroidChiakiLog log;
|
||||||
jobject java_regist;
|
|
||||||
ChiakiRegist regist;
|
ChiakiRegist regist;
|
||||||
|
|
||||||
|
jobject java_regist;
|
||||||
|
jmethodID java_regist_event_meth;
|
||||||
|
|
||||||
|
jobject java_regist_event_canceled;
|
||||||
|
jobject java_regist_event_failed;
|
||||||
|
jclass java_regist_event_success_class;
|
||||||
|
jmethodID java_regist_event_success_ctor;
|
||||||
} AndroidChiakiRegist;
|
} AndroidChiakiRegist;
|
||||||
|
|
||||||
static void android_chiaki_regist_cb(ChiakiRegistEvent *event, void *user)
|
static void android_chiaki_regist_cb(ChiakiRegistEvent *event, void *user)
|
||||||
{
|
{
|
||||||
// TODO
|
AndroidChiakiRegist *regist = user;
|
||||||
|
|
||||||
|
JNIEnv *env = attach_thread_jni();
|
||||||
|
if(!env)
|
||||||
|
return;
|
||||||
|
|
||||||
|
jobject java_event = NULL;
|
||||||
|
switch(event->type)
|
||||||
|
{
|
||||||
|
case CHIAKI_REGIST_EVENT_TYPE_FINISHED_CANCELED:
|
||||||
|
java_event = regist->java_regist_event_canceled;
|
||||||
|
break;
|
||||||
|
case CHIAKI_REGIST_EVENT_TYPE_FINISHED_FAILED:
|
||||||
|
java_event = regist->java_regist_event_failed;
|
||||||
|
break;
|
||||||
|
case CHIAKI_REGIST_EVENT_TYPE_FINISHED_SUCCESS:
|
||||||
|
java_event = E->NewObject(env, regist->java_regist_event_success_class, regist->java_regist_event_success_ctor, NULL /* TODO: RegistHost */);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(java_event)
|
||||||
|
E->CallVoidMethod(env, regist->java_regist, regist->java_regist_event_meth, java_event);
|
||||||
|
|
||||||
|
(*global_vm)->DetachCurrentThread(global_vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void android_chiaki_regist_fini_partial(JNIEnv *env, AndroidChiakiRegist *regist)
|
||||||
|
{
|
||||||
|
android_chiaki_log_fini(®ist->log, env);
|
||||||
|
E->DeleteGlobalRef(env, regist->java_regist);
|
||||||
|
E->DeleteGlobalRef(env, regist->java_regist_event_canceled);
|
||||||
|
E->DeleteGlobalRef(env, regist->java_regist_event_failed);
|
||||||
|
E->DeleteGlobalRef(env, regist->java_regist_event_success_class);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL JNI_FCN(registStart)(JNIEnv *env, jobject obj, jobject result, jobject regist_info_obj, jobject log_obj, jobject java_regist)
|
JNIEXPORT void JNICALL JNI_FCN(registStart)(JNIEnv *env, jobject obj, jobject result, jobject regist_info_obj, jobject log_obj, jobject java_regist)
|
||||||
|
@ -632,6 +688,12 @@ JNIEXPORT void JNICALL JNI_FCN(registStart)(JNIEnv *env, jobject obj, jobject re
|
||||||
android_chiaki_log_init(®ist->log, env, log_obj);
|
android_chiaki_log_init(®ist->log, env, log_obj);
|
||||||
|
|
||||||
regist->java_regist = E->NewGlobalRef(env, java_regist);
|
regist->java_regist = E->NewGlobalRef(env, java_regist);
|
||||||
|
regist->java_regist_event_meth = E->GetMethodID(env, E->GetObjectClass(env, regist->java_regist), "event", "(L"BASE_PACKAGE"/RegistEvent;)V");
|
||||||
|
|
||||||
|
regist->java_regist_event_canceled = E->NewGlobalRef(env, get_kotlin_global_object(env, BASE_PACKAGE"/RegistEventCanceled"));
|
||||||
|
regist->java_regist_event_failed = E->NewGlobalRef(env, get_kotlin_global_object(env, BASE_PACKAGE"/RegistEventFailed"));
|
||||||
|
regist->java_regist_event_success_class = E->NewGlobalRef(env, E->FindClass(env, BASE_PACKAGE"/RegistEventSuccess"));
|
||||||
|
regist->java_regist_event_success_ctor = E->GetMethodID(env, regist->java_regist_event_success_class, "<init>", "(L"BASE_PACKAGE"/RegistHost;)V");
|
||||||
|
|
||||||
jclass regist_info_class = E->GetObjectClass(env, regist_info_obj);
|
jclass regist_info_class = E->GetObjectClass(env, regist_info_obj);
|
||||||
jstring host_string = E->GetObjectField(env, regist_info_obj, E->GetFieldID(env, regist_info_class, "host", "Ljava/lang/String;"));
|
jstring host_string = E->GetObjectField(env, regist_info_obj, E->GetFieldID(env, regist_info_class, "host", "Ljava/lang/String;"));
|
||||||
|
@ -652,8 +714,7 @@ JNIEXPORT void JNICALL JNI_FCN(registStart)(JNIEnv *env, jobject obj, jobject re
|
||||||
|
|
||||||
if(err != CHIAKI_ERR_SUCCESS)
|
if(err != CHIAKI_ERR_SUCCESS)
|
||||||
{
|
{
|
||||||
android_chiaki_log_fini(®ist->log, env);
|
android_chiaki_regist_fini_partial(env, regist);
|
||||||
E->DeleteGlobalRef(env, regist->java_regist);
|
|
||||||
free(regist);
|
free(regist);
|
||||||
regist = NULL;
|
regist = NULL;
|
||||||
}
|
}
|
||||||
|
@ -673,7 +734,6 @@ JNIEXPORT void JNICALL JNI_FCN(registFree)(JNIEnv *env, jobject obj, jlong ptr)
|
||||||
{
|
{
|
||||||
AndroidChiakiRegist *regist = (AndroidChiakiRegist *)ptr;
|
AndroidChiakiRegist *regist = (AndroidChiakiRegist *)ptr;
|
||||||
chiaki_regist_fini(®ist->regist);
|
chiaki_regist_fini(®ist->regist);
|
||||||
android_chiaki_log_fini(®ist->log, env);
|
android_chiaki_regist_fini_partial(env, regist);
|
||||||
E->DeleteGlobalRef(env, regist->java_regist);
|
|
||||||
free(regist);
|
free(regist);
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,12 @@ class ChiakiLog(val levelMask: Int, val callback: (level: Int, text: String) ->
|
||||||
{
|
{
|
||||||
callback(level, text)
|
callback(level, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun d(text: String) = log(Level.DEBUG.value, text)
|
||||||
|
fun v(text: String) = log(Level.VERBOSE.value, text)
|
||||||
|
fun i(text: String) = log(Level.INFO.value, text)
|
||||||
|
fun w(text: String) = log(Level.WARNING.value, text)
|
||||||
|
fun e(text: String) = log(Level.ERROR.value, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun maxAbs(a: Short, b: Short) = if(abs(a.toInt()) > abs(b.toInt())) a else b
|
private fun maxAbs(a: Short, b: Short) = if(abs(a.toInt()) > abs(b.toInt())) a else b
|
||||||
|
|
|
@ -17,9 +17,10 @@
|
||||||
|
|
||||||
package com.metallic.chiaki.regist
|
package com.metallic.chiaki.regist
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.method.ScrollingMovementMethod
|
import android.text.method.ScrollingMovementMethod
|
||||||
import android.util.Log
|
import android.view.View
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.ViewModelProviders
|
import androidx.lifecycle.ViewModelProviders
|
||||||
|
@ -55,6 +56,33 @@ class RegistExecuteActivity: AppCompatActivity()
|
||||||
logTextView.scrollTo(0, max(scrollY, 0))
|
logTextView.scrollTo(0, max(scrollY, 0))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
viewModel.state.observe(this, Observer {
|
||||||
|
progressBar.visibility = if(it == RegistExecuteViewModel.State.RUNNING) View.VISIBLE else View.GONE
|
||||||
|
when(it)
|
||||||
|
{
|
||||||
|
RegistExecuteViewModel.State.FAILED ->
|
||||||
|
{
|
||||||
|
infoTextView.visibility = View.VISIBLE
|
||||||
|
infoTextView.setText(R.string.regist_info_failed)
|
||||||
|
}
|
||||||
|
RegistExecuteViewModel.State.SUCCESSFUL ->
|
||||||
|
{
|
||||||
|
infoTextView.visibility = View.VISIBLE
|
||||||
|
infoTextView.setText(R.string.regist_info_success)
|
||||||
|
}
|
||||||
|
else -> infoTextView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
shareLogButton.setOnClickListener {
|
||||||
|
val log = viewModel.logText.value ?: ""
|
||||||
|
Intent(Intent.ACTION_SEND).also {
|
||||||
|
it.type = "text/plain"
|
||||||
|
it.putExtra(Intent.EXTRA_TEXT, log)
|
||||||
|
startActivity(Intent.createChooser(it, resources.getString(R.string.action_share_log)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val registInfo = RegistInfo(
|
val registInfo = RegistInfo(
|
||||||
intent.getStringExtra(EXTRA_HOST) ?: return,
|
intent.getStringExtra(EXTRA_HOST) ?: return,
|
||||||
intent.getBooleanExtra(EXTRA_BROADCAST, false),
|
intent.getBooleanExtra(EXTRA_BROADCAST, false),
|
||||||
|
|
|
@ -53,7 +53,7 @@ class RegistExecuteViewModel: ViewModel()
|
||||||
}
|
}
|
||||||
catch(error: CreateError)
|
catch(error: CreateError)
|
||||||
{
|
{
|
||||||
// TODO: log about error
|
log.log.e("Failed to create Regist: ${error.errorCode}")
|
||||||
_state.value = State.FAILED
|
_state.value = State.FAILED
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,8 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="textNoSuggestions|textVisiblePassword"
|
android:inputType="textNoSuggestions|textVisiblePassword"
|
||||||
android:maxLines="1"/>
|
android:maxLines="1"
|
||||||
|
android:text="test"/>
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
@ -122,7 +123,8 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="number"
|
android:inputType="number"
|
||||||
android:maxLength="8" />
|
android:maxLength="8"
|
||||||
|
android:text="01234567"/>
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:padding="8dp">
|
android:padding="8dp"
|
||||||
|
tools:context=".regist.RegistExecuteActivity">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/iconImageView"
|
android:id="@+id/iconImageView"
|
||||||
|
|
|
@ -27,4 +27,6 @@
|
||||||
<string name="regist_psn_id_invalid">Please enter a valid PSN ID</string>
|
<string name="regist_psn_id_invalid">Please enter a valid PSN ID</string>
|
||||||
<string name="regist_pin_invalid">Please enter a valid %d-digit PIN</string>
|
<string name="regist_pin_invalid">Please enter a valid %d-digit PIN</string>
|
||||||
<string name="action_share_log">Share Log</string>
|
<string name="action_share_log">Share Log</string>
|
||||||
|
<string name="regist_info_success">Regist successful.</string>
|
||||||
|
<string name="regist_info_failed">Regist failed.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue