mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-19 21:13:12 -07:00
Add StreamViewModel
This commit is contained in:
parent
ba3339bd6c
commit
ad7f46d783
8 changed files with 124 additions and 67 deletions
|
@ -50,4 +50,7 @@ dependencies {
|
||||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||||
implementation 'androidx.core:core-ktx:1.1.0'
|
implementation 'androidx.core:core-ktx:1.1.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||||
|
|
||||||
|
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
|
||||||
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".StreamActivity" />
|
<activity android:name=".stream.StreamActivity" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
|
@ -215,27 +215,31 @@ JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionCreate(J
|
||||||
JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionFree(JNIEnv *env, jobject obj, jlong ptr)
|
JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionFree(JNIEnv *env, jobject obj, jlong ptr)
|
||||||
{
|
{
|
||||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||||
|
CHIAKI_LOGI(&global_log, "Free JNI Session");
|
||||||
if(!session)
|
if(!session)
|
||||||
return;
|
return;
|
||||||
E->DeleteGlobalRef(env, session->java_session);
|
|
||||||
chiaki_session_fini(&session->session);
|
chiaki_session_fini(&session->session);
|
||||||
free(session);
|
free(session);
|
||||||
|
E->DeleteGlobalRef(env, session->java_session);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStart(JNIEnv *env, jobject obj, jlong ptr)
|
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStart(JNIEnv *env, jobject obj, jlong ptr)
|
||||||
{
|
{
|
||||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||||
|
CHIAKI_LOGI(&global_log, "Start JNI Session");
|
||||||
return chiaki_session_start(&session->session);
|
return chiaki_session_start(&session->session);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStop(JNIEnv *env, jobject obj, jlong ptr)
|
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStop(JNIEnv *env, jobject obj, jlong ptr)
|
||||||
{
|
{
|
||||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||||
|
CHIAKI_LOGI(&global_log, "Stop JNI Session");
|
||||||
return chiaki_session_stop(&session->session);
|
return chiaki_session_stop(&session->session);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionJoin(JNIEnv *env, jobject obj, jlong ptr)
|
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionJoin(JNIEnv *env, jobject obj, jlong ptr)
|
||||||
{
|
{
|
||||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||||
|
CHIAKI_LOGI(&global_log, "Join JNI Session");
|
||||||
return chiaki_session_join(&session->session);
|
return chiaki_session_join(&session->session);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import android.util.Base64
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import androidx.core.widget.addTextChangedListener
|
import androidx.core.widget.addTextChangedListener
|
||||||
import com.metallic.chiaki.lib.*
|
import com.metallic.chiaki.lib.*
|
||||||
|
import com.metallic.chiaki.stream.StreamActivity
|
||||||
import kotlinx.android.synthetic.main.activity_main.*
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity()
|
class MainActivity : AppCompatActivity()
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
package com.metallic.chiaki
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import com.metallic.chiaki.lib.ConnectInfo
|
|
||||||
import com.metallic.chiaki.lib.Event
|
|
||||||
import com.metallic.chiaki.lib.Session
|
|
||||||
import com.metallic.chiaki.lib.SessionCreateError
|
|
||||||
import kotlinx.android.synthetic.main.activity_stream.*
|
|
||||||
|
|
||||||
class StreamActivity : AppCompatActivity()
|
|
||||||
{
|
|
||||||
companion object
|
|
||||||
{
|
|
||||||
const val EXTRA_CONNECT_INFO = "connect_info"
|
|
||||||
}
|
|
||||||
|
|
||||||
private var session: Session? = null
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?)
|
|
||||||
{
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setContentView(R.layout.activity_stream)
|
|
||||||
|
|
||||||
val connectInfo = intent.getParcelableExtra<ConnectInfo>(EXTRA_CONNECT_INFO)
|
|
||||||
if(connectInfo == null)
|
|
||||||
{
|
|
||||||
finish()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
val session = Session(connectInfo)
|
|
||||||
session.eventCallback = {
|
|
||||||
Log.i("StreamActivity", "Got Event $it")
|
|
||||||
}
|
|
||||||
|
|
||||||
session.start()
|
|
||||||
this.session = session
|
|
||||||
}
|
|
||||||
catch(e: SessionCreateError)
|
|
||||||
{
|
|
||||||
// TODO: handle error
|
|
||||||
}
|
|
||||||
|
|
||||||
testTextView.text = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy()
|
|
||||||
{
|
|
||||||
super.onDestroy()
|
|
||||||
session?.stop()
|
|
||||||
session?.dispose()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.metallic.chiaki.stream
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.ViewModelProviders
|
||||||
|
import com.metallic.chiaki.R
|
||||||
|
import com.metallic.chiaki.lib.ConnectInfo
|
||||||
|
import com.metallic.chiaki.lib.Session
|
||||||
|
import com.metallic.chiaki.lib.SessionCreateError
|
||||||
|
import kotlinx.android.synthetic.main.activity_stream.*
|
||||||
|
|
||||||
|
class StreamActivity : AppCompatActivity()
|
||||||
|
{
|
||||||
|
companion object
|
||||||
|
{
|
||||||
|
const val EXTRA_CONNECT_INFO = "connect_info"
|
||||||
|
}
|
||||||
|
|
||||||
|
private lateinit var viewModel: StreamViewModel
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?)
|
||||||
|
{
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_stream)
|
||||||
|
|
||||||
|
viewModel = ViewModelProviders.of(this)[StreamViewModel::class.java]
|
||||||
|
if(!viewModel.isInitialized)
|
||||||
|
{
|
||||||
|
val connectInfo = intent.getParcelableExtra<ConnectInfo>(EXTRA_CONNECT_INFO)
|
||||||
|
if(connectInfo == null)
|
||||||
|
{
|
||||||
|
finish()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
viewModel.init(connectInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.state.observe(this, Observer {
|
||||||
|
stateTextView.text = "$it"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package com.metallic.chiaki.stream
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import com.metallic.chiaki.lib.*
|
||||||
|
|
||||||
|
sealed class StreamState
|
||||||
|
object StreamStateIdle: StreamState()
|
||||||
|
data class StreamStateCreateError(val error: SessionCreateError): StreamState()
|
||||||
|
data class StreamStateQuit(val reason: QuitReason, val reasonString: String?): StreamState()
|
||||||
|
data class StreamStateLoginPinRequest(val pinIncorrect: Boolean): StreamState()
|
||||||
|
|
||||||
|
class StreamViewModel: ViewModel()
|
||||||
|
{
|
||||||
|
var isInitialized = false
|
||||||
|
private set(value) { field = value}
|
||||||
|
|
||||||
|
private var session: Session? = null
|
||||||
|
|
||||||
|
private val _state = MutableLiveData<StreamState>(StreamStateIdle)
|
||||||
|
val state: LiveData<StreamState> get() = _state
|
||||||
|
|
||||||
|
fun init(connectInfo: ConnectInfo)
|
||||||
|
{
|
||||||
|
if(isInitialized)
|
||||||
|
return
|
||||||
|
isInitialized = true
|
||||||
|
try
|
||||||
|
{
|
||||||
|
val session = Session(connectInfo)
|
||||||
|
session.eventCallback = this::eventCallback
|
||||||
|
session.start()
|
||||||
|
this.session = session
|
||||||
|
}
|
||||||
|
catch(e: SessionCreateError)
|
||||||
|
{
|
||||||
|
_state.value = StreamStateCreateError(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun eventCallback(event: Event)
|
||||||
|
{
|
||||||
|
when(event)
|
||||||
|
{
|
||||||
|
is QuitEvent -> _state.postValue(StreamStateQuit(event.reason, event.reasonString))
|
||||||
|
is LoginPinRequestEvent -> _state.postValue(StreamStateLoginPinRequest(event.pinIncorrect))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCleared()
|
||||||
|
{
|
||||||
|
super.onCleared()
|
||||||
|
session?.stop()
|
||||||
|
session?.dispose()
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,16 +4,20 @@
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".MainActivity">
|
tools:context=".stream.StreamActivity">
|
||||||
|
|
||||||
<TextView
|
<SurfaceView
|
||||||
android:id="@+id/testTextView"
|
android:id="@+id/surfaceView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="0dp"
|
||||||
android:text="Hello World!"
|
app:layout_constraintBottom_toTopOf="@id/stateTextView"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"/>
|
app:layout_constraintTop_toTopOf="parent"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stateTextView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/surfaceView"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
Loading…
Add table
Add a link
Reference in a new issue