mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 18:57:07 -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.core:core-ktx:1.1.0'
|
||||
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>
|
||||
</activity>
|
||||
|
||||
<activity android:name=".StreamActivity" />
|
||||
<activity android:name=".stream.StreamActivity" />
|
||||
</application>
|
||||
|
||||
</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)
|
||||
{
|
||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||
CHIAKI_LOGI(&global_log, "Free JNI Session");
|
||||
if(!session)
|
||||
return;
|
||||
E->DeleteGlobalRef(env, session->java_session);
|
||||
chiaki_session_fini(&session->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)
|
||||
{
|
||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||
CHIAKI_LOGI(&global_log, "Start JNI Session");
|
||||
return chiaki_session_start(&session->session);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStop(JNIEnv *env, jobject obj, jlong ptr)
|
||||
{
|
||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||
CHIAKI_LOGI(&global_log, "Stop JNI Session");
|
||||
return chiaki_session_stop(&session->session);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionJoin(JNIEnv *env, jobject obj, jlong ptr)
|
||||
{
|
||||
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
|
||||
CHIAKI_LOGI(&global_log, "Join JNI Session");
|
||||
return chiaki_session_join(&session->session);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import android.util.Base64
|
|||
import androidx.core.content.edit
|
||||
import androidx.core.widget.addTextChangedListener
|
||||
import com.metallic.chiaki.lib.*
|
||||
import com.metallic.chiaki.stream.StreamActivity
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
|
||||
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"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity">
|
||||
tools:context=".stream.StreamActivity">
|
||||
|
||||
<SurfaceView
|
||||
android:id="@+id/surfaceView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintBottom_toTopOf="@id/stateTextView"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/testTextView"
|
||||
android:layout_width="wrap_content"
|
||||
android:id="@+id/stateTextView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Hello World!"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toBottomOf="@id/surfaceView"
|
||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
Loading…
Add table
Add a link
Reference in a new issue