Skip to content

Commit

Permalink
Merge pull request #89 from ricohapi/dev/1.10.2
Browse files Browse the repository at this point in the history
Dev/1.10.2
  • Loading branch information
LassicYM authored Sep 5, 2024
2 parents 8df2f13 + 9867a2b commit 8b9a7af
Show file tree
Hide file tree
Showing 15 changed files with 59 additions and 46 deletions.
2 changes: 1 addition & 1 deletion demos/demo-android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ dependencies {
implementation 'com.jakewharton.timber:timber:5.0.1'
implementation 'io.coil-kt:coil-compose:2.2.2'
implementation "io.ktor:ktor-client-cio:2.3.9"
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"

testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
Expand Down
2 changes: 1 addition & 1 deletion demos/demo-ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ target 'SdkSample' do
use_frameworks!

# Pods for SdkSample
pod 'THETAClient', '1.10.1'
pod 'THETAClient', '1.10.2'
end
2 changes: 1 addition & 1 deletion demos/demo-react-native/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"dependencies": {
"@react-navigation/native": "^6.1.0",
"@react-navigation/native-stack": "^6.9.5",
"theta-client-react-native": "1.10.1",
"theta-client-react-native": "1.10.2",
"react": "18.2.0",
"react-native": "0.71.14",
"react-native-safe-area-context": "^4.4.1",
Expand Down
2 changes: 1 addition & 1 deletion docs/tutorial-android.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

- モジュールの`build.gradle``dependencies`に次を追加します。
```
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"
```
- 本 SDK を使用したアプリケーションが動作するスマートフォンと THETA を無線 LAN 接続しておきます。

Expand Down
2 changes: 1 addition & 1 deletion docs/tutorial-android.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
- Add following descriptions to the `dependencies` of your module's `build.gradle`.

```
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"
```

- Connect the wireless LAN between THETA and the smartphone that runs on the application using this SDK.
Expand Down
2 changes: 1 addition & 1 deletion flutter/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,5 @@ dependencies {
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.9")
implementation("com.soywiz.korlibs.krypto:krypto:4.0.10")

implementation("com.ricoh360.thetaclient:theta-client:1.10.1")
implementation("com.ricoh360.thetaclient:theta-client:1.10.2")
}
4 changes: 2 additions & 2 deletions flutter/ios/theta_client_flutter.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
Pod::Spec.new do |s|
s.name = 'theta_client_flutter'
s.version = '1.10.1'
s.version = '1.10.2'
s.summary = 'theta-client plugin project.'
s.description = <<-DESC
theta-client Flutter plugin project.
Expand All @@ -17,7 +17,7 @@ Pod::Spec.new do |s|
s.dependency 'Flutter'
s.platform = :ios, '15.0'

s.dependency 'THETAClient', '1.10.1'
s.dependency 'THETAClient', '1.10.2'

# Flutter.framework does not contain a i386 slice.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
Expand Down
2 changes: 1 addition & 1 deletion flutter/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: theta_client_flutter
description: THETA Client Flutter plugin project.
version: 1.10.1
version: 1.10.2
homepage:

environment:
Expand Down
2 changes: 1 addition & 1 deletion kotlin-multiplatform/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencies {
dokkaPlugin("org.jetbrains.dokka:versioning-plugin:1.9.10")
}

val thetaClientVersion = "1.10.1"
val thetaClientVersion = "1.10.2"
group = "com.ricoh360.thetaclient"
version = thetaClientVersion

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@ import io.ktor.client.statement.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.utils.io.*
import io.ktor.utils.io.core.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Semaphore
import kotlinx.io.files.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
Expand All @@ -30,7 +32,7 @@ internal const val ALLOWED_CAPTURE_INTERVAL = 1000
/**
* Http client using [Ktor](https://jp.ktor.work/clients/index.html)
*/
@OptIn(ExperimentalSerializationApi::class) // explicitNulls
@OptIn(ExperimentalSerializationApi::class, ExperimentalCoroutinesApi::class) // explicitNulls
internal object ThetaApi {
val httpClient: HttpClient // for commands other than getLivePreview command
get() = getHttpClient()
Expand All @@ -41,7 +43,7 @@ internal object ThetaApi {
val multipartPostClient: MultipartPostClient // just for updateFirmware protcol
get() = getMultipartPostClient()

val requestSemaphore = Semaphore(1)
val requestScope = CoroutineScope(Dispatchers.Default.limitedParallelism(1))
var lastSetTimeConsumingOptionTime: Long = 0
var currentOptions = Options()

Expand All @@ -65,7 +67,7 @@ internal object ThetaApi {
suspend fun callInfoApi(
endpoint: String,
): InfoApiResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.get(getApiUrl(endpoint, InfoApi.PATH)).body()
}
}
Expand All @@ -84,7 +86,7 @@ internal object ThetaApi {
suspend fun callLicenseApi(
endpoint: String,
): HttpResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.get(getApiUrl(endpoint, LicenseApi.PATH))
}
}
Expand All @@ -103,7 +105,7 @@ internal object ThetaApi {
suspend fun callStateApi(
endpoint: String,
): StateApiResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.post(getApiUrl(endpoint, StateApi.PATH)).body()
}
}
Expand All @@ -126,7 +128,7 @@ internal object ThetaApi {
endpoint: String,
params: StatusApiParams,
): CommandApiResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
val request = StatusApiRequest(name = params.name, id = params.id)
val response = httpClient.post(getApiUrl(endpoint, StatusApi.PATH)) {
headers {
Expand Down Expand Up @@ -898,7 +900,7 @@ internal object ThetaApi {
endpoint: String,
body: T,
): HttpResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.post(getApiUrl(endpoint, CommandApi.PATH)) {
headers {
append("Content-Type", "application/json; charset=utf-8")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.ricoh360.thetaclient

import korlibs.crypto.md5
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout

internal const val HEX_CHARACTERS = "0123456789abcdef"
Expand All @@ -24,22 +27,22 @@ internal fun md5(data: String): String {
}

internal suspend fun <T> syncExecutor(
semaphore: Semaphore,
scope: CoroutineScope,
timeout: Long,
run: suspend () -> T,
): T {
try {
withTimeout(timeout) {
semaphore.acquire()
val deferred = CompletableDeferred<T>()
scope.launch {
runBlocking {
try {
withTimeout(timeout) {
val result = run()
deferred.complete(result)
}
} catch (e: Throwable) {
deferred.completeExceptionally(e)
}
}
} catch (e: Throwable) {
println("timeout acquire")
throw e
}
try {
val result = run()
return result
} finally {
semaphore.release()
}
return deferred.await()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ import com.ricoh360.thetaclient.MockApiClient
import com.ricoh360.thetaclient.ThetaRepository
import io.ktor.http.*
import io.ktor.utils.io.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import kotlin.test.*

@OptIn(ExperimentalCoroutinesApi::class)
class ThetaRepositoryTest {
private val endpoint = "http://192.168.1.1:80/"

Expand Down Expand Up @@ -793,15 +791,20 @@ class ThetaRepositoryTest {

@Test
fun callSingleRequestTimeoutTest() = runBlocking {
var counter = 0
val jsonString = Resource("src/commonTest/resources/info/info_z1.json").readText()
MockApiClient.onRequest = { _ ->
counter += 1
runBlocking {
delay(500)
val jsonInfo = Resource("src/commonTest/resources/info/info_z1.json").readText()
val jsonState = Resource("src/commonTest/resources/state/state_z1.json").readText()
MockApiClient.onRequest = { request ->
when (request.url.encodedPath) {
"/osc/info" -> ByteReadChannel(jsonInfo)
"/osc/state" -> {
runBlocking {
delay(500)
}
ByteReadChannel(jsonState)
}

else -> throw Exception("Error")
}
counter -= 1
ByteReadChannel(jsonString)
}

val timeout = ThetaRepository.Timeout(
Expand All @@ -812,10 +815,15 @@ class ThetaRepositoryTest {
val apiJobsList = listOf(
launch {
thetaRepository.getThetaInfo()
try {
thetaRepository.getThetaInfo()
} catch (e: ThetaRepository.NotConnectedException) {
assertTrue(false)
}
},
launch {
try {
thetaRepository.getThetaInfo()
thetaRepository.getThetaState()
assertTrue(false)
} catch (e: ThetaRepository.NotConnectedException) {
assertTrue((e.message?.indexOf("time", 0, true) ?: -1) >= 0, "timeout error")
Expand Down
2 changes: 1 addition & 1 deletion react-native/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ dependencies {
implementation "com.facebook.react:react-native:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3"
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"

// From node_modules
}
Expand Down
2 changes: 1 addition & 1 deletion react-native/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "theta-client-react-native",
"version": "1.10.1",
"version": "1.10.2",
"description": "This library provides a way to control RICOH THETA using.",
"main": "lib/commonjs/index",
"module": "lib/module/index",
Expand Down
2 changes: 1 addition & 1 deletion react-native/theta-client-react-native.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Pod::Spec.new do |s|
s.source_files = "ios/**/*.{h,m,mm,swift}"

s.dependency "React-Core"
s.dependency "THETAClient", "1.10.1"
s.dependency "THETAClient", "1.10.2"

# Don't install the dependencies when we run `pod install` in the old architecture.
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
Expand Down

0 comments on commit 8b9a7af

Please sign in to comment.