Add StreamViewModel

This commit is contained in:
Florian Märkl 2019-09-15 17:10:10 +02:00
commit ad7f46d783
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
8 changed files with 124 additions and 67 deletions

View file

@ -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"
}

View file

@ -20,7 +20,7 @@
</intent-filter>
</activity>
<activity android:name=".StreamActivity" />
<activity android:name=".stream.StreamActivity" />
</application>
</manifest>

View file

@ -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);
}

View file

@ -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()

View file

@ -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()
}
}

View file

@ -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"
})
}
}

View file

@ -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()
}
}

View file

@ -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>