diff --git a/android/app/build.gradle b/android/app/build.gradle index 70b0c82..10c753b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -56,14 +56,14 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.preference:preference:1.1.0' - implementation 'com.google.android.material:material:1.1.0-alpha10' + implementation 'com.google.android.material:material:1.1.0-beta01' implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0' implementation 'androidx.lifecycle:lifecycle-reactivestreams:2.1.0' implementation "io.reactivex.rxjava2:rxjava:2.2.12" implementation "io.reactivex.rxjava2:rxkotlin:2.4.0" implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' - def room_version = "2.2.0-rc01" + def room_version = "2.2.1" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version" diff --git a/android/app/src/main/cpp/chiaki-jni.c b/android/app/src/main/cpp/chiaki-jni.c index defbeba..f25e438 100644 --- a/android/app/src/main/cpp/chiaki-jni.c +++ b/android/app/src/main/cpp/chiaki-jni.c @@ -639,6 +639,16 @@ JNIEXPORT void JNICALL JNI_FCN(discoveryServiceFree)(JNIEnv *env, jobject obj, j free(service); } +JNIEXPORT jint JNICALL JNI_FCN(discoveryServiceWakeup)(JNIEnv *env, jobject obj, jlong ptr, jstring host_string, jlong user_credential) +{ + AndroidDiscoveryService *service = (AndroidDiscoveryService *)ptr; + const char *host = E->GetStringUTFChars(env, host_string, NULL); + ChiakiErrorCode r = chiaki_discovery_wakeup(&global_log, service ? &service->service.discovery : NULL, host, (uint64_t)user_credential); + E->ReleaseStringUTFChars(env, host_string, host); + return r; +} + + typedef struct android_chiaki_regist_t { AndroidChiakiLog log; diff --git a/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt b/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt index 51637fc..6446a54 100644 --- a/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt +++ b/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt @@ -27,7 +27,10 @@ import com.metallic.chiaki.lib.DiscoveryServiceOptions import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject import io.reactivex.subjects.Subject +import java.lang.NumberFormatException import java.net.InetSocketAddress +import java.nio.charset.Charset +import java.nio.charset.StandardCharsets val DiscoveryHost.ps4Mac get() = this.hostId?.hexToByteArray()?.let { if(it.size == MacAddress.LENGTH) @@ -81,6 +84,16 @@ class DiscoveryManager active = false } + fun sendWakeup(host: String, registKey: ByteArray) + { + val registKeyString = registKey.indexOfFirst { it == 0.toByte() }.let { end -> registKey.copyOfRange(0, if(end >= 0) end else registKey.size) }.toString(StandardCharsets.UTF_8) + val credential = try { registKeyString.toULong(16) } catch(e: NumberFormatException) { + Log.e("DiscoveryManager", "Failed to convert registKey to int", e) + return + } + DiscoveryService.wakeup(discoveryService, host, credential) + } + private fun updateService() { if(active && !paused && discoveryService == null) diff --git a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt index cd84d83..54a9621 100644 --- a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt +++ b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt @@ -68,6 +68,7 @@ private class ChiakiNative @JvmStatic external fun sessionSetLoginPin(ptr: Long, pin: String) @JvmStatic external fun discoveryServiceCreate(result: CreateResult, options: DiscoveryServiceOptions, javaService: DiscoveryService) @JvmStatic external fun discoveryServiceFree(ptr: Long) + @JvmStatic external fun discoveryServiceWakeup(ptr: Long, host: String, userCredential: Long) @JvmStatic external fun registStart(result: CreateResult, registInfo: RegistInfo, javaLog: ChiakiLog, javaRegist: Regist) @JvmStatic external fun registStop(ptr: Long) @JvmStatic external fun registFree(ptr: Long) @@ -278,6 +279,12 @@ class DiscoveryService( options: DiscoveryServiceOptions, val callback: ((hosts: List) -> Unit)?) { + companion object + { + fun wakeup(service: DiscoveryService?, host: String, userCredential: ULong) = + ChiakiNative.discoveryServiceWakeup(service?.nativePtr ?: 0, host, userCredential.toLong()) + } + private var nativePtr: Long init diff --git a/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt b/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt index 9c8b110..b107e0a 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt @@ -30,6 +30,7 @@ import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import com.metallic.chiaki.R import com.metallic.chiaki.TestStartActivity +import com.metallic.chiaki.common.DiscoveredDisplayHost import com.metallic.chiaki.common.DisplayHost import com.metallic.chiaki.common.Preferences import com.metallic.chiaki.common.ext.RevealActivity @@ -37,6 +38,7 @@ import com.metallic.chiaki.common.ext.putRevealExtra import com.metallic.chiaki.common.getDatabase import com.metallic.chiaki.common.ext.viewModelFactory import com.metallic.chiaki.lib.ConnectInfo +import com.metallic.chiaki.lib.DiscoveryHost import com.metallic.chiaki.regist.RegistActivity import com.metallic.chiaki.settings.SettingsActivity import com.metallic.chiaki.stream.StreamActivity @@ -171,12 +173,18 @@ class MainActivity : AppCompatActivity() val registeredHost = host.registeredHost if(registeredHost != null) { - // TODO: check standby - - val connectInfo = ConnectInfo(host.host, registeredHost.rpRegistKey, registeredHost.rpKey, Preferences(this).videoProfile) - Intent(this, StreamActivity::class.java).let { - it.putExtra(StreamActivity.EXTRA_CONNECT_INFO, connectInfo) - startActivity(it) + if(host is DiscoveredDisplayHost && host.discoveredHost.state == DiscoveryHost.State.STANDBY) + { + // TODO: show AlertDialog + viewModel.discoveryManager.sendWakeup(host.host, registeredHost.rpRegistKey) + } + else + { + val connectInfo = ConnectInfo(host.host, registeredHost.rpRegistKey, registeredHost.rpKey, Preferences(this).videoProfile) + Intent(this, StreamActivity::class.java).let { + it.putExtra(StreamActivity.EXTRA_CONNECT_INFO, connectInfo) + startActivity(it) + } } } else diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index de50def..568a70f 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ Chiaki Chiaki 千秋 Settings + The Console is currently in standby mode. Do you want to send a Wakeup packet instead of trying to connect immediately? Session has quit: %s Failed to create Session: %s Login PIN: