From 7e6df25b8902cf6038bfa2fe10e4e0838c3d0c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E5=B2=A1=E3=80=80=E4=BE=91=E5=87=9B?= <129148471+LassicYM@users.noreply.github.com> Date: Wed, 18 Feb 2026 15:46:41 +0900 Subject: [PATCH 1/2] add option _modeMemory --- .../theta_client_flutter/ConvertUtil.kt | 1 + flutter/ios/Classes/ConvertUtil.swift | 2 + flutter/lib/options/importer.dart | 1 + flutter/lib/options/mode_memory.dart | 39 ++++++ flutter/lib/theta_client_flutter.dart | 11 ++ flutter/lib/utils/convert_utils.dart | 5 + .../test/options/option_mode_memory_test.dart | 56 +++++++++ kotlin-multiplatform/build.gradle.kts | 1 + .../com/ricoh360/thetaclient/androidTest.kt | 6 +- .../ricoh360/thetaclient/ThetaRepository.kt | 61 +++++++++ .../transferred/setOptionsCommand.kt | 53 ++++++++ .../com/ricoh360/thetaclient/CheckRequest.kt | 5 + .../com/ricoh360/thetaclient/commonTest.kt | 9 +- .../repository/UpdateFirmwareTest.kt | 3 +- .../repository/options/ModeMemoryTest.kt | 118 ++++++++++++++++++ .../repository/options/OptionsTest.kt | 11 ++ .../options/option_mode_memory_on.json | 9 ++ .../options/option_mode_memory_unknown.json | 9 ++ .../com/ricoh360/thetaclient/Platform.kt | 2 +- .../com/ricoh360/thetaclient/iosTest.kt | 5 + .../thetaclientreactnative/Converter.kt | 2 + react-native/ios/ConvertUtil.swift | 5 + .../options/option-mode-memory.test.ts | 19 +++ .../src/theta-repository/options/index.ts | 1 + .../options/option-mode-memory.ts | 28 +++++ .../src/theta-repository/options/options.ts | 5 + .../screen/options-screen/options-screen.tsx | 20 +++ 27 files changed, 483 insertions(+), 4 deletions(-) create mode 100644 flutter/lib/options/mode_memory.dart create mode 100644 flutter/test/options/option_mode_memory_test.dart create mode 100644 kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/ModeMemoryTest.kt create mode 100644 kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_on.json create mode 100644 kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_unknown.json create mode 100644 react-native/src/__tests__/options/option-mode-memory.test.ts create mode 100644 react-native/src/theta-repository/options/option-mode-memory.ts diff --git a/flutter/android/src/main/kotlin/com/ricoh360/thetaclient/theta_client_flutter/ConvertUtil.kt b/flutter/android/src/main/kotlin/com/ricoh360/thetaclient/theta_client_flutter/ConvertUtil.kt index 7425e39298b..adda625fdbd 100644 --- a/flutter/android/src/main/kotlin/com/ricoh360/thetaclient/theta_client_flutter/ConvertUtil.kt +++ b/flutter/android/src/main/kotlin/com/ricoh360/thetaclient/theta_client_flutter/ConvertUtil.kt @@ -1040,6 +1040,7 @@ fun getOptionValueEnum(name: OptionNameEnum, valueName: String): Any? { OptionNameEnum.LatestEnabledExposureDelayTime -> ExposureDelayEnum.values().find { it.name == valueName } OptionNameEnum.MaxRecordableTime -> MaxRecordableTimeEnum.values().find { it.name == valueName } OptionNameEnum.MicrophoneNoiseReduction -> MicrophoneNoiseReductionEnum.values().find { it.name == valueName } + OptionNameEnum.ModeMemory -> ModeMemoryEnum.values().find { it.name == valueName } OptionNameEnum.NetworkType -> NetworkTypeEnum.values().find { it.name == valueName } OptionNameEnum.OffDelay -> OffDelayEnum.values().find { it.name == valueName } OptionNameEnum.OffDelayUsb -> OffDelayUsbEnum.values().find { it.name == valueName } diff --git a/flutter/ios/Classes/ConvertUtil.swift b/flutter/ios/Classes/ConvertUtil.swift index f560074310b..5516493be54 100644 --- a/flutter/ios/Classes/ConvertUtil.swift +++ b/flutter/ios/Classes/ConvertUtil.swift @@ -1197,6 +1197,8 @@ func setOptionsValue(options: ThetaRepository.Options, name: String, value: Any) options.maxRecordableTime = getEnumValue(values: ThetaRepository.MaxRecordableTimeEnum.values(), name: value as! String)! case ThetaRepository.OptionNameEnum.microphonenoisereduction.name: options.microphoneNoiseReduction = getEnumValue(values: ThetaRepository.MicrophoneNoiseReductionEnum.values(), name: value as! String)! + case ThetaRepository.OptionNameEnum.modememory.name: + options.modeMemory = getEnumValue(values: ThetaRepository.ModeMemoryEnum.values(), name: value as! String)! case ThetaRepository.OptionNameEnum.mobilenetworksetting.name: if let params = value as? [String: Any] { options.mobileNetworkSetting = toMobileNetworkSetting(params: params) diff --git a/flutter/lib/options/importer.dart b/flutter/lib/options/importer.dart index 120f0cda4ad..d765109ad16 100644 --- a/flutter/lib/options/importer.dart +++ b/flutter/lib/options/importer.dart @@ -16,6 +16,7 @@ export 'file_format.dart'; export 'gps_tag_recording.dart'; export 'max_recordable_time.dart'; export 'microphone_noise_reduction.dart'; +export 'mode_memory.dart'; export 'mobile_network_setting.dart'; export 'network_type.dart'; export 'off_delay.dart'; diff --git a/flutter/lib/options/mode_memory.dart b/flutter/lib/options/mode_memory.dart new file mode 100644 index 00000000000..9e6cd004b23 --- /dev/null +++ b/flutter/lib/options/mode_memory.dart @@ -0,0 +1,39 @@ +/// Mode Memory +/// +/// The default setting is "off", preserving the previous behavior. +/// When set to "on", the following shooting parameters will be retained even after power-off or sleep: +/// - Still image stitching process +/// - Exposure program / Aperture / Shutter speed / ISO sensitivity / Exposure compensation +/// - White balance mode / Color temperature setting +/// - Filters +/// - Interval shooting: number of shots / interval +/// - Multi-bracket shooting: number of shots / parameters +/// - Interval composite shooting: duration / intermediate saving +/// - Time-shift shooting settings (excluding shooting order) +/// - Burst shooting options +/// - Geotag data +enum ModeMemoryEnum { + /// Undefined value + unknown('UNKNOWN'), + + /// ON + on('ON'), + + /// OFF + off('OFF'); + + final String rawValue; + + const ModeMemoryEnum(this.rawValue); + + @override + String toString() { + return rawValue; + } + + static ModeMemoryEnum? getValue(String rawValue) { + return ModeMemoryEnum.values.cast().firstWhere( + (element) => element?.rawValue == rawValue, + orElse: () => null); + } +} diff --git a/flutter/lib/theta_client_flutter.dart b/flutter/lib/theta_client_flutter.dart index 03f78d2f9ac..acf1d4c9cdd 100644 --- a/flutter/lib/theta_client_flutter.dart +++ b/flutter/lib/theta_client_flutter.dart @@ -1434,6 +1434,9 @@ enum OptionNameEnum { microphoneNoiseReduction( 'MicrophoneNoiseReduction', MicrophoneNoiseReductionEnum), + /// Option name _modeMemory + modeMemory('ModeMemory', ModeMemoryEnum), + /// Option name _mobileNetworkSetting mobileNetworkSetting('MobileNetworkSetting', MobileNetworkSetting), @@ -3198,6 +3201,9 @@ class Options { /// see [MicrophoneNoiseReductionEnum] MicrophoneNoiseReductionEnum? microphoneNoiseReduction; + /// see [ModeMemoryEnum] + ModeMemoryEnum? modeMemory; + /// see [MobileNetworkSetting] MobileNetworkSetting? mobileNetworkSetting; @@ -3422,6 +3428,8 @@ class Options { return microphoneNoiseReduction as T; case OptionNameEnum.mobileNetworkSetting: return mobileNetworkSetting as T; + case OptionNameEnum.modeMemory: + return modeMemory as T; case OptionNameEnum.networkType: return networkType as T; case OptionNameEnum.offDelay: @@ -3643,6 +3651,9 @@ class Options { case OptionNameEnum.mobileNetworkSetting: mobileNetworkSetting = value; break; + case OptionNameEnum.modeMemory: + modeMemory = value; + break; case OptionNameEnum.networkType: networkType = value; break; diff --git a/flutter/lib/utils/convert_utils.dart b/flutter/lib/utils/convert_utils.dart index 9e80abcf752..bcf15706451 100644 --- a/flutter/lib/utils/convert_utils.dart +++ b/flutter/lib/utils/convert_utils.dart @@ -757,6 +757,9 @@ class ConvertUtils { result.microphoneNoiseReduction = MicrophoneNoiseReductionEnum.getValue(entry.value); break; + case OptionNameEnum.modeMemory: + result.modeMemory = ModeMemoryEnum.getValue(entry.value); + break; case OptionNameEnum.mobileNetworkSetting: result.mobileNetworkSetting = convertMobileNetworkSetting(entry.value); @@ -954,6 +957,8 @@ class ConvertUtils { return value.rawValue; } else if (value is MicrophoneNoiseReductionEnum) { return value.rawValue; + } else if (value is ModeMemoryEnum) { + return value.rawValue; } else if (value is MobileNetworkSetting) { return convertMobileNetworkSettingParam(value); } else if (value is NetworkTypeEnum) { diff --git a/flutter/test/options/option_mode_memory_test.dart b/flutter/test/options/option_mode_memory_test.dart new file mode 100644 index 00000000000..b16a897f6fa --- /dev/null +++ b/flutter/test/options/option_mode_memory_test.dart @@ -0,0 +1,56 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:theta_client_flutter/theta_client_flutter.dart'; +import 'package:theta_client_flutter/theta_client_flutter_method_channel.dart'; + +void main() { + MethodChannelThetaClientFlutter platform = MethodChannelThetaClientFlutter(); + const MethodChannel channel = MethodChannel('theta_client_flutter'); + + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, null); + }); + + tearDown(() { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, null); + }); + + test('ModeMemoryEnum const', () async { + List> data = [ + [ModeMemoryEnum.unknown, 'UNKNOWN'], + [ModeMemoryEnum.on, 'ON'], + [ModeMemoryEnum.off, 'OFF'] + ]; + expect(data.length, ModeMemoryEnum.values.length, reason: 'enum count'); + for (int i = 0; i < data.length; i++) { + expect(data[i][0].toString(), data[i][1], reason: data[i][1]); + } + }); + + test('getOptions', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall methodCall) async { + Map optionMap = {}; + optionMap['ModeMemory'] = 'ON'; + return Future.value(optionMap); + }); + Options options = await platform.getOptions([OptionNameEnum.modeMemory]); + expect(options.modeMemory?.rawValue, 'ON', reason: 'modeMemory'); + }); + + test('setOptions', () async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall methodCall) async { + var arguments = methodCall.arguments as Map; + expect(arguments['ModeMemory'], 'OFF', reason: 'modeMemory'); + return Future.value(); + }); + final options = Options(); + options.modeMemory = ModeMemoryEnum.off; + await platform.setOptions(options); + }); +} diff --git a/kotlin-multiplatform/build.gradle.kts b/kotlin-multiplatform/build.gradle.kts index b373f9de0e3..66324015f99 100644 --- a/kotlin-multiplatform/build.gradle.kts +++ b/kotlin-multiplatform/build.gradle.kts @@ -11,6 +11,7 @@ plugins { signing id("io.gitlab.arturbosch.detekt").version("1.23.3") id("com.vanniktech.maven.publish") version "0.32.0" + id("com.goncalossilva.resources") version "0.4.0" } dependencies { diff --git a/kotlin-multiplatform/src/androidUnitTest/kotlin/com/ricoh360/thetaclient/androidTest.kt b/kotlin-multiplatform/src/androidUnitTest/kotlin/com/ricoh360/thetaclient/androidTest.kt index 47be587c53e..570f651fdc9 100644 --- a/kotlin-multiplatform/src/androidUnitTest/kotlin/com/ricoh360/thetaclient/androidTest.kt +++ b/kotlin-multiplatform/src/androidUnitTest/kotlin/com/ricoh360/thetaclient/androidTest.kt @@ -9,4 +9,8 @@ class AndroidGreetingTest { fun testExample() { assertTrue("Check Android is mentioned", Greeting().greeting().contains("Android")) } -} \ No newline at end of file +} + +actual fun getEnv(name: String): String? { + return System.getenv(name) +} diff --git a/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/ThetaRepository.kt b/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/ThetaRepository.kt index b178e61b4d5..c4f09b2a186 100644 --- a/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/ThetaRepository.kt +++ b/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/ThetaRepository.kt @@ -1024,6 +1024,12 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? */ MobileNetworkSetting("_mobileNetworkSetting", ThetaRepository.MobileNetworkSetting::class), + /** + * Option name + * _modeMemory + */ + ModeMemory("_modeMemory", ModeMemoryEnum::class), + /** * Option name * _networkType @@ -1558,6 +1564,11 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? */ var mobileNetworkSetting: MobileNetworkSetting? = null, + /** + * @see ModeMemoryEnum + */ + var modeMemory: ModeMemoryEnum? = null, + /** * Network type of the camera. */ @@ -1789,6 +1800,7 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? maxRecordableTime = null, microphoneNoiseReduction = null, mobileNetworkSetting = null, + modeMemory = null, networkType = null, offDelay = null, offDelayUsb = null, @@ -1877,6 +1889,7 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? maxRecordableTime = options._maxRecordableTime?.let { MaxRecordableTimeEnum.get(it) }, microphoneNoiseReduction = options._microphoneNoiseReduction?.let { MicrophoneNoiseReductionEnum.get(it) }, mobileNetworkSetting = options._mobileNetworkSetting?.let { MobileNetworkSetting(it) }, + modeMemory = options._modeMemory?.let { ModeMemoryEnum.get(it) }, networkType = options._networkType?.let { NetworkTypeEnum.get(it) }, offDelay = options.offDelay?.let { OffDelayEnum.get(it) }, offDelayUsb = options._offDelayUSB?.let { OffDelayUsbEnum.get(it) }, @@ -1959,6 +1972,7 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? _maxRecordableTime = maxRecordableTime?.sec, _microphoneNoiseReduction = microphoneNoiseReduction?.value, _mobileNetworkSetting = mobileNetworkSetting?.toTransferredMobileNetworkSetting(), + _modeMemory = modeMemory?.value, _networkType = networkType?.value, offDelay = offDelay?.sec, _offDelayUSB = offDelayUsb?.sec, @@ -2056,6 +2070,7 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? OptionNameEnum.MaxRecordableTime -> maxRecordableTime OptionNameEnum.MicrophoneNoiseReduction -> microphoneNoiseReduction OptionNameEnum.MobileNetworkSetting -> mobileNetworkSetting + OptionNameEnum.ModeMemory -> modeMemory OptionNameEnum.NetworkType -> networkType OptionNameEnum.OffDelay -> offDelay OptionNameEnum.OffDelayUsb -> offDelayUsb @@ -2155,6 +2170,7 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? OptionNameEnum.MaxRecordableTime -> maxRecordableTime = value as MaxRecordableTimeEnum OptionNameEnum.MicrophoneNoiseReduction -> microphoneNoiseReduction = value as MicrophoneNoiseReductionEnum OptionNameEnum.MobileNetworkSetting -> mobileNetworkSetting = value as MobileNetworkSetting + OptionNameEnum.ModeMemory -> modeMemory = value as ModeMemoryEnum OptionNameEnum.NetworkType -> networkType = value as NetworkTypeEnum OptionNameEnum.OffDelay -> offDelay = value as OffDelay OptionNameEnum.OffDelayUsb -> offDelayUsb = value as OffDelayUsb @@ -5870,6 +5886,51 @@ class ThetaRepository internal constructor(val endpoint: String, config: Config? } } + /** + * Mode Memory + * + * The default setting is "off", preserving the previous behavior. + * When set to "on", the following shooting parameters will be retained even after power-off or sleep: + * - Still image stitching process + * - Exposure program / Aperture / Shutter speed / ISO sensitivity / Exposure compensation + * - White balance mode / Color temperature setting + * - Filters + * - Interval shooting: number of shots / interval + * - Multi-bracket shooting: number of shots / parameters + * - Interval composite shooting: duration / intermediate saving + * - Time-shift shooting settings (excluding shooting order) + * - Burst shooting options + * - Geotag data + */ + enum class ModeMemoryEnum(internal val value: ModeMemory) { + /** + * Undefined value + */ + UNKNOWN(ModeMemory.UNKNOWN), + + /** + * ON + */ + ON(ModeMemory.ON), + + /** + * OFF + */ + OFF(ModeMemory.OFF); + + companion object { + /** + * Convert ModeMemory to ModeMemoryEnum + * + * @param value ModeMemory. + * @return ModeMemoryEnum + */ + internal fun get(value: ModeMemory): ModeMemoryEnum? { + return entries.firstOrNull { it.value == value } + } + } + } + /** * Mobile Network Settings */ diff --git a/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/transferred/setOptionsCommand.kt b/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/transferred/setOptionsCommand.kt index 59416a10963..4314b5a6621 100644 --- a/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/transferred/setOptionsCommand.kt +++ b/kotlin-multiplatform/src/commonMain/kotlin/com/ricoh360/thetaclient/transferred/setOptionsCommand.kt @@ -641,6 +641,17 @@ internal data class Options( */ var _mobileNetworkSettingSupport: MobileNetworkSettingSupport? = null, + /** + * @see ModeMemory + */ + var _modeMemory: ModeMemory? = null, + + /** + * _modeMemory support + * @see ModeMemory + */ + var _modeMemorySupport: List? = null, + /** * Network type. */ @@ -1994,6 +2005,48 @@ internal data class MobileNetworkSettingSupport( val plan: List ) + +internal object ModeMemorySerializer : + SerialNameEnumIgnoreUnknownSerializer(ModeMemory.entries, ModeMemory.UNKNOWN) + +/** + * Mode Memory + * + * The default setting is "off", preserving the previous behavior. + * When set to "on", the following shooting parameters will be retained even after power-off or sleep: + * - Still image stitching process + * - Exposure program / Aperture / Shutter speed / ISO sensitivity / Exposure compensation + * - White balance mode / Color temperature setting + * - Filters + * - Interval shooting: number of shots / interval + * - Multi-bracket shooting: number of shots / parameters + * - Interval composite shooting: duration / intermediate saving + * - Time-shift shooting settings (excluding shooting order) + * - Burst shooting options + * - Geotag data + */ +@Serializable(with = ModeMemorySerializer::class) +internal enum class ModeMemory : SerialNameEnum { + /** + * Undefined value + */ + UNKNOWN, + + /** + * ON + */ + ON { + override val serialName: String = "on" + }, + + /** + * OFF + */ + OFF { + override val serialName: String = "off" + }, +} + internal object RoamingSerializer : SerialNameEnumIgnoreUnknownSerializer(Roaming.entries, Roaming.UNKNOWN) diff --git a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/CheckRequest.kt b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/CheckRequest.kt index 9d9d71e91d9..e920127c87e 100644 --- a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/CheckRequest.kt +++ b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/CheckRequest.kt @@ -27,6 +27,7 @@ import com.ricoh360.thetaclient.transferred.Language import com.ricoh360.thetaclient.transferred.MediaFileFormat import com.ricoh360.thetaclient.transferred.MicrophoneNoiseReduction import com.ricoh360.thetaclient.transferred.MobileNetworkSetting +import com.ricoh360.thetaclient.transferred.ModeMemory import com.ricoh360.thetaclient.transferred.NetworkType import com.ricoh360.thetaclient.transferred.PowerSaving import com.ricoh360.thetaclient.transferred.Preset @@ -143,6 +144,7 @@ internal class CheckRequest { maxRecordableTime: Int? = null, microphoneNoiseReduction: MicrophoneNoiseReduction? = null, mobileNetworkSetting: MobileNetworkSetting? = null, + modeMemory: ModeMemory? = null, networkType: NetworkType? = null, offDelay: Int? = null, offDelayUsb: Int? = null, @@ -300,6 +302,9 @@ internal class CheckRequest { mobileNetworkSetting?.let { assertEquals(optionsRequest.parameters.options._mobileNetworkSetting, it, "setOptions mobileNetworkSetting") } + modeMemory?.let { + assertEquals(optionsRequest.parameters.options._modeMemory, it, "setOptions modeMemory") + } networkType?.let { assertEquals(optionsRequest.parameters.options._networkType, it, "setOptions networkType") } diff --git a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/commonTest.kt b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/commonTest.kt index 174a37d1d54..7c342602070 100644 --- a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/commonTest.kt +++ b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/commonTest.kt @@ -12,4 +12,11 @@ class CommonGreetingTest { Resource("") print("CommonGreetingTest testExample") } -} \ No newline at end of file +} + +/** + * Get environment variable value by name + * @param name Environment variable name + * @return Environment variable value, or null if not set + */ +expect fun getEnv(name: String): String? diff --git a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/UpdateFirmwareTest.kt b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/UpdateFirmwareTest.kt index ae62282a05e..31e07aa8af6 100644 --- a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/UpdateFirmwareTest.kt +++ b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/UpdateFirmwareTest.kt @@ -3,6 +3,7 @@ package com.ricoh360.thetaclient.repository import com.goncalossilva.resources.Resource import com.ricoh360.thetaclient.MockApiClient import com.ricoh360.thetaclient.ThetaRepository +import com.ricoh360.thetaclient.getEnv import io.ktor.http.* import io.ktor.utils.io.* import io.ktor.utils.io.core.toByteArray @@ -37,7 +38,7 @@ class UpdateFirmwareTest { fun updateFirmwareTest() = runTest { var apiPath: String? = null kotlin.runCatching { - apiPath = System.getenv(FIRMWARE_UPDATE_API_ENV_NAME) + apiPath = getEnv(FIRMWARE_UPDATE_API_ENV_NAME) }.onFailure { println("$FIRMWARE_UPDATE_API_ENV_NAME can not be accessed so updateFirmwareTest() is skipped") } diff --git a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/ModeMemoryTest.kt b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/ModeMemoryTest.kt new file mode 100644 index 00000000000..56fcf6bb159 --- /dev/null +++ b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/ModeMemoryTest.kt @@ -0,0 +1,118 @@ +package com.ricoh360.thetaclient.repository.options + +import com.goncalossilva.resources.Resource +import com.ricoh360.thetaclient.CheckRequest +import com.ricoh360.thetaclient.MockApiClient +import com.ricoh360.thetaclient.ThetaRepository +import com.ricoh360.thetaclient.transferred.ModeMemory +import com.ricoh360.thetaclient.transferred.Options +import io.ktor.http.HttpStatusCode +import io.ktor.utils.io.ByteReadChannel +import kotlinx.coroutines.test.runTest +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals + +class ModeMemoryTest { + private val endpoint = "http://192.168.1.1:80/" + + @BeforeTest + fun setup() { + MockApiClient.status = HttpStatusCode.OK + } + + @AfterTest + fun teardown() { + MockApiClient.status = HttpStatusCode.OK + } + + /** + * Get option. + */ + @Test + fun getOptionTest() = runTest { + val optionNames = listOf( + ThetaRepository.OptionNameEnum.ModeMemory + ) + val stringOptionNames = listOf( + "_modeMemory" + ) + + MockApiClient.onRequest = { request -> + // check request + CheckRequest.checkGetOptions(request, stringOptionNames) + + ByteReadChannel(Resource("src/commonTest/resources/options/option_mode_memory_on.json").readText()) + } + + val thetaRepository = ThetaRepository(endpoint) + val options = thetaRepository.getOptions(optionNames) + assertEquals(options.modeMemory, ThetaRepository.ModeMemoryEnum.ON) + } + + /** + * Get option UNKNOWN. + */ + @Test + fun getOptionUnknownTest() = runTest { + val optionNames = listOf( + ThetaRepository.OptionNameEnum.ModeMemory + ) + val stringOptionNames = listOf( + "_modeMemory" + ) + + MockApiClient.onRequest = { request -> + // check request + CheckRequest.checkGetOptions(request, stringOptionNames) + + ByteReadChannel(Resource("src/commonTest/resources/options/option_mode_memory_unknown.json").readText()) + } + + val thetaRepository = ThetaRepository(endpoint) + val options = thetaRepository.getOptions(optionNames) + assertEquals(options.modeMemory, ThetaRepository.ModeMemoryEnum.UNKNOWN) + } + + /** + * Set option. + */ + @Test + fun setOptionTest() = runTest { + val value = Pair(ThetaRepository.ModeMemoryEnum.OFF, ModeMemory.OFF) + + MockApiClient.onRequest = { request -> + // check request + CheckRequest.checkSetOptions(request = request, modeMemory = value.second) + + ByteReadChannel(Resource("src/commonTest/resources/setOptions/set_options_done.json").readText()) + } + + val thetaRepository = ThetaRepository(endpoint) + val options = ThetaRepository.Options( + modeMemory = value.first + ) + thetaRepository.setOptions(options) + } + + /** + * Convert option. + */ + @Test + fun convertOptionTest() = runTest { + val values = listOf( + Pair(ThetaRepository.ModeMemoryEnum.UNKNOWN, ModeMemory.UNKNOWN), + Pair(ThetaRepository.ModeMemoryEnum.ON, ModeMemory.ON), + Pair(ThetaRepository.ModeMemoryEnum.OFF, ModeMemory.OFF), + ) + + values.forEach { + val orgOptions = Options( + _modeMemory = it.second + ) + val options = ThetaRepository.Options(orgOptions) + assertEquals(options.modeMemory, it.first, "_modeMemory ${it.second}") + } + } +} diff --git a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/OptionsTest.kt b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/OptionsTest.kt index 9a82681d73b..4d63fd10d33 100644 --- a/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/OptionsTest.kt +++ b/kotlin-multiplatform/src/commonTest/kotlin/com/ricoh360/thetaclient/repository/options/OptionsTest.kt @@ -41,6 +41,7 @@ import com.ricoh360.thetaclient.transferred.MediaFileFormat import com.ricoh360.thetaclient.transferred.MediaType import com.ricoh360.thetaclient.transferred.MicrophoneNoiseReduction import com.ricoh360.thetaclient.transferred.MobileNetworkSetting +import com.ricoh360.thetaclient.transferred.ModeMemory import com.ricoh360.thetaclient.transferred.NetworkType import com.ricoh360.thetaclient.transferred.Options import com.ricoh360.thetaclient.transferred.PitchSupport @@ -196,6 +197,7 @@ class OptionsTest { val maxRecordableTime = ThetaRepository.MaxRecordableTimeEnum.RECORDABLE_TIME_1500 val microphoneNoiseReduction = ThetaRepository.MicrophoneNoiseReductionEnum.ON val mobileNetworkSetting = ThetaRepository.MobileNetworkSetting(roaming = ThetaRepository.RoamingEnum.OFF, plan = ThetaRepository.PlanEnum.SORACOM) + val modeMemory = ThetaRepository.ModeMemoryEnum.ON val networkType = ThetaRepository.NetworkTypeEnum.DIRECT val offDelay = ThetaRepository.OffDelayEnum.OFF_DELAY_10M val offDelayUsb = ThetaRepository.OffDelayUsbEnum.OFF_DELAY_10M @@ -291,6 +293,7 @@ class OptionsTest { maxRecordableTime = maxRecordableTime, microphoneNoiseReduction = microphoneNoiseReduction, mobileNetworkSetting = mobileNetworkSetting, + modeMemory = modeMemory, networkType = networkType, offDelay = offDelay, offDelayUsb = offDelayUsb, @@ -381,6 +384,7 @@ class OptionsTest { assertEquals(options.getValue(ThetaRepository.OptionNameEnum.MaxRecordableTime), maxRecordableTime, "maxRecordableTime") assertEquals(options.getValue(ThetaRepository.OptionNameEnum.MicrophoneNoiseReduction), microphoneNoiseReduction, "microphoneNoiseReduction") assertEquals(options.getValue(ThetaRepository.OptionNameEnum.MobileNetworkSetting), mobileNetworkSetting, "mobileNetworkSetting") + assertEquals(options.getValue(ThetaRepository.OptionNameEnum.ModeMemory), modeMemory, "modeMemory") assertEquals(options.getValue(ThetaRepository.OptionNameEnum.NetworkType), networkType, "networkType") assertEquals(options.getValue(ThetaRepository.OptionNameEnum.OffDelay), offDelay, "offDelay") assertEquals(options.getValue(ThetaRepository.OptionNameEnum.OffDelayUsb), offDelayUsb, "offDelayUsb") @@ -534,6 +538,7 @@ class OptionsTest { ThetaRepository.OptionNameEnum.MobileNetworkSetting, ThetaRepository.MobileNetworkSetting(roaming = ThetaRepository.RoamingEnum.ON, plan = ThetaRepository.PlanEnum.SORACOM) ), + Pair(ThetaRepository.OptionNameEnum.ModeMemory, ThetaRepository.ModeMemoryEnum.ON), Pair(ThetaRepository.OptionNameEnum.NetworkType, ThetaRepository.NetworkTypeEnum.ETHERNET), Pair(ThetaRepository.OptionNameEnum.OffDelay, ThetaRepository.OffDelayEnum.OFF_DELAY_10M), Pair(ThetaRepository.OptionNameEnum.OffDelayUsb, ThetaRepository.OffDelayUsbEnum.OFF_DELAY_10M), @@ -777,6 +782,7 @@ class OptionsTest { MobileNetworkSetting(roaming = Roaming.ON, plan = Plan.SORACOM_PLAN_DU), ThetaRepository.MobileNetworkSetting(roaming = ThetaRepository.RoamingEnum.ON, plan = ThetaRepository.PlanEnum.SORACOM_PLAN_DU) ) + val modeMemory = Pair(ModeMemory.OFF, ThetaRepository.ModeMemoryEnum.OFF) val networkType = Pair(NetworkType.DIRECT, ThetaRepository.NetworkTypeEnum.DIRECT) val offDelay = Pair(600, ThetaRepository.OffDelayEnum.OFF_DELAY_10M) val offDelayUsb = Pair(600, ThetaRepository.OffDelayUsbEnum.OFF_DELAY_10M) @@ -884,6 +890,7 @@ class OptionsTest { _maxRecordableTime = maxRecordableTime.first, _microphoneNoiseReduction = microphoneNoiseReduction.first, _mobileNetworkSetting = mobileNetworkSetting.first, + _modeMemory = modeMemory.first, _networkType = networkType.first, offDelay = offDelay.first, _offDelayUSB = offDelayUsb.first, @@ -967,6 +974,7 @@ class OptionsTest { assertEquals(options.maxRecordableTime, maxRecordableTime.second, "maxRecordableTime") assertEquals(options.microphoneNoiseReduction, microphoneNoiseReduction.second, "microphoneNoiseReduction") assertEquals(options.mobileNetworkSetting, mobileNetworkSetting.second, "mobileNetworkSetting") + assertEquals(options.modeMemory, modeMemory.second, "modeMemory") assertEquals(options.networkType, networkType.second, "networkType") assertEquals(options.offDelay, offDelay.second, "offDelay") assertEquals(options.offDelayUsb, offDelayUsb.second, "offDelayUsb") @@ -1170,6 +1178,7 @@ class OptionsTest { MobileNetworkSetting(roaming = Roaming.OFF, plan = Plan.SORACOM), ThetaRepository.MobileNetworkSetting(roaming = ThetaRepository.RoamingEnum.OFF, plan = ThetaRepository.PlanEnum.SORACOM) ) + val modeMemory = Pair(ModeMemory.ON, ThetaRepository.ModeMemoryEnum.ON) val networkType = Pair(NetworkType.ETHERNET, ThetaRepository.NetworkTypeEnum.ETHERNET) val offDelay = Pair(600, ThetaRepository.OffDelayEnum.OFF_DELAY_10M) val offDelayUsb = Pair(600, ThetaRepository.OffDelayUsbEnum.OFF_DELAY_10M) @@ -1258,6 +1267,7 @@ class OptionsTest { maxRecordableTime = maxRecordableTime.second, microphoneNoiseReduction = microphoneNoiseReduction.second, mobileNetworkSetting = mobileNetworkSetting.second, + modeMemory = modeMemory.second, networkType = networkType.second, offDelay = offDelay.second, offDelayUsb = offDelayUsb.second, @@ -1332,6 +1342,7 @@ class OptionsTest { assertEquals(options._maxRecordableTime, maxRecordableTime.first, "maxRecordableTime") assertEquals(options._microphoneNoiseReduction, microphoneNoiseReduction.first, "microphoneNoiseReduction") assertEquals(options._mobileNetworkSetting, mobileNetworkSetting.first, "mobileNetworkSetting") + assertEquals(options._modeMemory, modeMemory.first, "modeMemory") assertEquals(options._networkType, networkType.first, "networkType") assertEquals(options.offDelay, offDelay.first, "offDelay") assertEquals(options._offDelayUSB, offDelayUsb.first, "offDelayUsb") diff --git a/kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_on.json b/kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_on.json new file mode 100644 index 00000000000..f4fc796903e --- /dev/null +++ b/kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_on.json @@ -0,0 +1,9 @@ +{ + "name": "camera.getOptions", + "state": "done", + "results": { + "options": { + "_modeMemory": "on" + } + } +} \ No newline at end of file diff --git a/kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_unknown.json b/kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_unknown.json new file mode 100644 index 00000000000..3e875cf5d99 --- /dev/null +++ b/kotlin-multiplatform/src/commonTest/resources/options/option_mode_memory_unknown.json @@ -0,0 +1,9 @@ +{ + "name": "camera.getOptions", + "state": "done", + "results": { + "options": { + "_modeMemory": "abc" + } + } +} \ No newline at end of file diff --git a/kotlin-multiplatform/src/iosMain/kotlin/com/ricoh360/thetaclient/Platform.kt b/kotlin-multiplatform/src/iosMain/kotlin/com/ricoh360/thetaclient/Platform.kt index 1744f5568c7..54f85691ee6 100644 --- a/kotlin-multiplatform/src/iosMain/kotlin/com/ricoh360/thetaclient/Platform.kt +++ b/kotlin-multiplatform/src/iosMain/kotlin/com/ricoh360/thetaclient/Platform.kt @@ -48,7 +48,7 @@ actual fun randomUUID(): String { actual fun currentTimeMillis(): Long { val interval = NSDate().timeIntervalSince1970 - return (interval / 1000.0).toLong() + return (interval * 1000.0).toLong() } @OptIn(ExperimentalNativeApi::class) diff --git a/kotlin-multiplatform/src/iosTest/kotlin/com/ricoh360/thetaclient/iosTest.kt b/kotlin-multiplatform/src/iosTest/kotlin/com/ricoh360/thetaclient/iosTest.kt index 3fd49efda3e..69445534944 100644 --- a/kotlin-multiplatform/src/iosTest/kotlin/com/ricoh360/thetaclient/iosTest.kt +++ b/kotlin-multiplatform/src/iosTest/kotlin/com/ricoh360/thetaclient/iosTest.kt @@ -1,5 +1,6 @@ package com.ricoh360.thetaclient +import platform.Foundation.NSProcessInfo import kotlin.test.Test import kotlin.test.assertTrue @@ -10,3 +11,7 @@ class iosTest { assertTrue(Greeting().greeting().contains("iOS"), "Check iOS is mentioned") } } + +actual fun getEnv(name: String): String? { + return NSProcessInfo.processInfo.environment[name] as? String +} diff --git a/react-native/android/src/main/java/com/ricoh360/thetaclientreactnative/Converter.kt b/react-native/android/src/main/java/com/ricoh360/thetaclientreactnative/Converter.kt index dbe709b88b0..7e15d72369e 100644 --- a/react-native/android/src/main/java/com/ricoh360/thetaclientreactnative/Converter.kt +++ b/react-native/android/src/main/java/com/ricoh360/thetaclientreactnative/Converter.kt @@ -105,6 +105,7 @@ val optionItemNameToEnum: Map = mutableMapOf( "latestEnabledExposureDelayTime" to OptionNameEnum.LatestEnabledExposureDelayTime, "maxRecordableTime" to OptionNameEnum.MaxRecordableTime, "microphoneNoiseReduction" to OptionNameEnum.MicrophoneNoiseReduction, + "modeMemory" to OptionNameEnum.ModeMemory, "mobileNetworkSetting" to OptionNameEnum.MobileNetworkSetting, "networkType" to OptionNameEnum.NetworkType, "offDelay" to OptionNameEnum.OffDelay, @@ -1152,6 +1153,7 @@ fun getOptionValueEnum(name: OptionNameEnum, valueName: String): Any? { OptionNameEnum.LatestEnabledExposureDelayTime -> ExposureDelayEnum.values().find { it.name == valueName } OptionNameEnum.MaxRecordableTime -> MaxRecordableTimeEnum.values().find { it.name == valueName } OptionNameEnum.MicrophoneNoiseReduction -> MicrophoneNoiseReductionEnum.values().find { it.name == valueName } + OptionNameEnum.ModeMemory -> ModeMemoryEnum.values().find { it.name == valueName } OptionNameEnum.NetworkType -> NetworkTypeEnum.values().find { it.name == valueName } OptionNameEnum.OffDelay -> OffDelayEnum.values().find { it.name == valueName } OptionNameEnum.OffDelayUsb -> OffDelayUsbEnum.entries.find { it.name == valueName } diff --git a/react-native/ios/ConvertUtil.swift b/react-native/ios/ConvertUtil.swift index 066575c4ee7..4e501b1eb1b 100644 --- a/react-native/ios/ConvertUtil.swift +++ b/react-native/ios/ConvertUtil.swift @@ -163,6 +163,7 @@ let optionItemNameToEnum = [ "latestEnabledExposureDelayTime": ThetaRepository.OptionNameEnum.latestenabledexposuredelaytime, KEY_MAX_RECORDABLE_TIME: ThetaRepository.OptionNameEnum.maxrecordabletime, "microphoneNoiseReduction": ThetaRepository.OptionNameEnum.microphonenoisereduction, + "modeMemory": ThetaRepository.OptionNameEnum.modememory, "mobileNetworkSetting": ThetaRepository.OptionNameEnum.mobilenetworksetting, "networkType": ThetaRepository.OptionNameEnum.networktype, KEY_OFF_DELAY: ThetaRepository.OptionNameEnum.offdelay, @@ -384,6 +385,10 @@ func setOptionsValue(options: ThetaRepository.Options, name: String, value: Any) options.microphoneNoiseReduction = getEnumValue( values: ThetaRepository.MicrophoneNoiseReductionEnum.values(), name: value as! String )! + case ThetaRepository.OptionNameEnum.modememory.name: + options.modeMemory = getEnumValue( + values: ThetaRepository.ModeMemoryEnum.values(), name: value as! String + )! case ThetaRepository.OptionNameEnum.mobilenetworksetting.name: if let params = value as? [String: Any] { options.mobileNetworkSetting = toMobileNetworkSetting(params: params) diff --git a/react-native/src/__tests__/options/option-mode-memory.test.ts b/react-native/src/__tests__/options/option-mode-memory.test.ts new file mode 100644 index 00000000000..0800b01ba6b --- /dev/null +++ b/react-native/src/__tests__/options/option-mode-memory.test.ts @@ -0,0 +1,19 @@ +import { ModeMemoryEnum } from '../../theta-repository/options/option-mode-memory'; + +describe('ModeMemoryEnum', () => { + const data: [ModeMemoryEnum, string][] = [ + [ModeMemoryEnum.UNKNOWN, 'UNKNOWN'], + [ModeMemoryEnum.ON, 'ON'], + [ModeMemoryEnum.OFF, 'OFF'], + ]; + + test('length', () => { + expect(data.length).toBe(Object.keys(ModeMemoryEnum).length); + }); + + test('data', () => { + data.forEach((item) => { + expect(item[0]).toBe(item[1]); + }); + }); +}); diff --git a/react-native/src/theta-repository/options/index.ts b/react-native/src/theta-repository/options/index.ts index c542143c99a..35c9b512dc1 100644 --- a/react-native/src/theta-repository/options/index.ts +++ b/react-native/src/theta-repository/options/index.ts @@ -26,6 +26,7 @@ export * from './option-gps-tag-recording'; export * from './option-image-stitching'; export * from './option-max-recordable-time'; export * from './option-microphone-noise-reduction'; +export * from './option-mode-memory'; export * from './option-mobile-network-setting'; export * from './option-network-type'; export * from './option-off-delay-usb'; diff --git a/react-native/src/theta-repository/options/option-mode-memory.ts b/react-native/src/theta-repository/options/option-mode-memory.ts new file mode 100644 index 00000000000..26328134e10 --- /dev/null +++ b/react-native/src/theta-repository/options/option-mode-memory.ts @@ -0,0 +1,28 @@ +/** + * Mode Memory + * + * The default setting is "off", preserving the previous behavior. + * When set to "on", the following shooting parameters will be retained even after power-off or sleep: + * - Still image stitching process + * - Exposure program / Aperture / Shutter speed / ISO sensitivity / Exposure compensation + * - White balance mode / Color temperature setting + * - Filters + * - Interval shooting: number of shots / interval + * - Multi-bracket shooting: number of shots / parameters + * - Interval composite shooting: duration / intermediate saving + * - Time-shift shooting settings (excluding shooting order) + * - Burst shooting options + * - Geotag data + */ +export const ModeMemoryEnum = { + /** Undefined value */ + UNKNOWN: 'UNKNOWN', + /** ON */ + ON: 'ON', + /** OFF */ + OFF: 'OFF', +} as const; + +/** type definition of ModeMemoryEnum */ +export type ModeMemoryEnum = + (typeof ModeMemoryEnum)[keyof typeof ModeMemoryEnum]; diff --git a/react-native/src/theta-repository/options/options.ts b/react-native/src/theta-repository/options/options.ts index 54d4d85eb2c..3f42bc98e4e 100644 --- a/react-native/src/theta-repository/options/options.ts +++ b/react-native/src/theta-repository/options/options.ts @@ -25,6 +25,7 @@ import type { ImageStitchingEnum } from './option-image-stitching'; import type { MaxRecordableTimeEnum } from './option-max-recordable-time'; import type { MicrophoneNoiseReductionEnum } from './option-microphone-noise-reduction'; import type { MobileNetworkSetting } from './option-mobile-network-setting'; +import type { ModeMemoryEnum } from './option-mode-memory'; import type { NetworkTypeEnum } from './option-network-type'; import type { OffDelayEnum } from './option-off-delay'; import type { OffDelayUsbEnum } from './option-off-delay-usb'; @@ -381,6 +382,8 @@ export const OptionNameEnum = { MicrophoneNoiseReduction: 'MicrophoneNoiseReduction', /** _mobileNetworkSetting */ MobileNetworkSetting: 'MobileNetworkSetting', + /** _modeMemory */ + ModeMemory: 'ModeMemory', /** networkType */ NetworkType: 'NetworkType', /** offDelay */ @@ -609,6 +612,8 @@ export type Options = { microphoneNoiseReduction?: MicrophoneNoiseReductionEnum; /** _mobileNetworkSetting */ mobileNetworkSetting?: MobileNetworkSetting; + /** _modeMemory */ + modeMemory?: ModeMemoryEnum; /** Network type of the camera */ networkType?: NetworkTypeEnum; /** Length of standby time before the camera automatically powers OFF. */ diff --git a/react-native/verification-tool/src/screen/options-screen/options-screen.tsx b/react-native/verification-tool/src/screen/options-screen/options-screen.tsx index 1047c7677cc..b6371256a26 100644 --- a/react-native/verification-tool/src/screen/options-screen/options-screen.tsx +++ b/react-native/verification-tool/src/screen/options-screen/options-screen.tsx @@ -20,6 +20,7 @@ import { IsoEnum, MaxRecordableTimeEnum, MicrophoneNoiseReductionEnum, + ModeMemoryEnum, OffDelayEnum, OffDelayUsbEnum, OptionNameEnum, @@ -499,6 +500,25 @@ const optionList: OptionItem[] = [ ), }, }, + { + name: 'modeMemory', + value: { + optionName: OptionNameEnum.ModeMemory, + editor: (options, onChange) => ( + { + onChange({ modeMemory }); + }} + optionEnum={ModeMemoryEnum} + /> + ), + defaultValue: { + modeMemory: ModeMemoryEnum.ON, + }, + }, + }, { name: 'networkType', value: { From 63be9fdadd644fe7eadbaab2664cba9fb8753a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E5=B2=A1=E3=80=80=E4=BE=91=E5=87=9B?= <129148471+LassicYM@users.noreply.github.com> Date: Thu, 19 Feb 2026 09:19:39 +0900 Subject: [PATCH 2/2] Upgrade version to v1.13.2 --- demos/demo-android/app/build.gradle | 2 +- demos/demo-ios/Podfile | 2 +- demos/demo-react-native/package.json | 2 +- docs/tutorial-android.ja.md | 2 +- docs/tutorial-android.md | 2 +- flutter/android/build.gradle | 2 +- flutter/ios/theta_client_flutter.podspec | 4 ++-- flutter/pubspec.yaml | 2 +- kotlin-multiplatform/build.gradle.kts | 2 +- react-native/android/build.gradle | 2 +- react-native/package.json | 2 +- react-native/theta-client-react-native.podspec | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/demos/demo-android/app/build.gradle b/demos/demo-android/app/build.gradle index 475728845ba..284441a17a2 100755 --- a/demos/demo-android/app/build.gradle +++ b/demos/demo-android/app/build.gradle @@ -76,7 +76,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:$ktor_version" - implementation "com.ricoh360.thetaclient:theta-client:1.13.1" + implementation "com.ricoh360.thetaclient:theta-client:1.13.2" testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0' testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version" diff --git a/demos/demo-ios/Podfile b/demos/demo-ios/Podfile index da27d630f1f..c365e40458a 100644 --- a/demos/demo-ios/Podfile +++ b/demos/demo-ios/Podfile @@ -7,5 +7,5 @@ target 'SdkSample' do use_frameworks! # Pods for SdkSample - pod 'THETAClient', '1.13.1' + pod 'THETAClient', '1.13.2' end diff --git a/demos/demo-react-native/package.json b/demos/demo-react-native/package.json index f5e05e8eded..ede89c59ef8 100644 --- a/demos/demo-react-native/package.json +++ b/demos/demo-react-native/package.json @@ -13,7 +13,7 @@ "dependencies": { "@react-navigation/native": "^6.1.0", "@react-navigation/native-stack": "^6.9.5", - "theta-client-react-native": "1.13.1", + "theta-client-react-native": "1.13.2", "react": "18.2.0", "react-native": "0.71.14", "react-native-safe-area-context": "^4.4.1", diff --git a/docs/tutorial-android.ja.md b/docs/tutorial-android.ja.md index 2dbd3cfaf6b..a6b16919bf5 100644 --- a/docs/tutorial-android.ja.md +++ b/docs/tutorial-android.ja.md @@ -4,7 +4,7 @@ - モジュールの`build.gradle`の`dependencies`に次を追加します。 ``` - implementation "com.ricoh360.thetaclient:theta-client:1.13.1" + implementation "com.ricoh360.thetaclient:theta-client:1.13.2" ``` - 本 SDK を使用したアプリケーションが動作するスマートフォンと THETA を無線 LAN 接続しておきます。 diff --git a/docs/tutorial-android.md b/docs/tutorial-android.md index 869de25bf87..73a2093df0a 100644 --- a/docs/tutorial-android.md +++ b/docs/tutorial-android.md @@ -5,7 +5,7 @@ - Add following descriptions to the `dependencies` of your module's `build.gradle`. ``` - implementation "com.ricoh360.thetaclient:theta-client:1.13.1" + implementation "com.ricoh360.thetaclient:theta-client:1.13.2" ``` - Connect the wireless LAN between THETA and the smartphone that runs on the application using this SDK. diff --git a/flutter/android/build.gradle b/flutter/android/build.gradle index 07b95b37c64..fe75c12d9c8 100644 --- a/flutter/android/build.gradle +++ b/flutter/android/build.gradle @@ -52,7 +52,7 @@ android { testImplementation("org.mockito:mockito-core:5.0.0") implementation("com.soywiz.korlibs.krypto:krypto:4.0.10") - implementation("com.ricoh360.thetaclient:theta-client:1.13.1") + implementation("com.ricoh360.thetaclient:theta-client:1.13.2") } testOptions { diff --git a/flutter/ios/theta_client_flutter.podspec b/flutter/ios/theta_client_flutter.podspec index 2f42194f569..65cbb3ad9be 100644 --- a/flutter/ios/theta_client_flutter.podspec +++ b/flutter/ios/theta_client_flutter.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'theta_client_flutter' - s.version = '1.13.1' + s.version = '1.13.2' s.summary = 'theta-client plugin project.' s.description = <<-DESC theta-client Flutter plugin project. @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.dependency 'Flutter' s.platform = :ios, '15.0' - s.dependency 'THETAClient', '1.13.1' + s.dependency 'THETAClient', '1.13.2' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index a374749bdee..4b8a0ad69c5 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: theta_client_flutter description: THETA Client Flutter plugin project. -version: 1.13.1 +version: 1.13.2 homepage: environment: diff --git a/kotlin-multiplatform/build.gradle.kts b/kotlin-multiplatform/build.gradle.kts index 66324015f99..00c43c8fcce 100644 --- a/kotlin-multiplatform/build.gradle.kts +++ b/kotlin-multiplatform/build.gradle.kts @@ -18,7 +18,7 @@ dependencies { dokkaPlugin("org.jetbrains.dokka:versioning-plugin:1.9.20") } -val thetaClientVersion = "1.13.1" +val thetaClientVersion = "1.13.2" group = "com.ricoh360.thetaclient" version = thetaClientVersion diff --git a/react-native/android/build.gradle b/react-native/android/build.gradle index b799932b90a..8ee0834dd35 100644 --- a/react-native/android/build.gradle +++ b/react-native/android/build.gradle @@ -136,7 +136,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.13.1" + implementation "com.ricoh360.thetaclient:theta-client:1.13.2" // From node_modules } diff --git a/react-native/package.json b/react-native/package.json index 7191f453507..85d8c2cdded 100644 --- a/react-native/package.json +++ b/react-native/package.json @@ -1,6 +1,6 @@ { "name": "theta-client-react-native", - "version": "1.13.1", + "version": "1.13.2", "description": "This library provides a way to control RICOH THETA using.", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/react-native/theta-client-react-native.podspec b/react-native/theta-client-react-native.podspec index 1731e45287a..5e89f869582 100644 --- a/react-native/theta-client-react-native.podspec +++ b/react-native/theta-client-react-native.podspec @@ -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.13.1" + s.dependency "THETAClient", "1.13.2" # Don't install the dependencies when we run `pod install` in the old architecture. if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then