From a6bb5753d67deb08014ae790a4f01a496bf26a52 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Thu, 28 Aug 2025 09:21:29 +0800 Subject: [PATCH 01/15] Add resetMap parameter to support save home base after reset --- gradle.properties | 2 +- .../src/main/java/com/robotemi/sdk/sample/MapActivity.kt | 3 ++- sdk/src/main/aidl/com/robotemi/sdk/ISdkService.aidl | 2 +- sdk/src/main/java/com/robotemi/sdk/Robot.kt | 7 ++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6eb556c4..ff5e9253 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,7 +25,7 @@ android.defaults.buildfeatures.buildconfig=true android.nonFinalResIds=false GROUP=com.robotemi -VERSION_NAME=1.136.0 +VERSION_NAME=1.137.0.1-SNAPSHOT POM_URL=https://github.com/robotemi/sdk/ POM_SCM_URL=https://github.com/robotemi/sdk/ POM_SCM_CONNECTION=scm:git:git://github.com/robotemi/sdk.git diff --git a/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt b/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt index ce177170..df985ed9 100644 --- a/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt +++ b/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt @@ -178,7 +178,7 @@ class MapActivity : AppCompatActivity() { binding.btnResetMap.setOnClickListener { binding.progressBar.visibility = View.VISIBLE lifecycleScope.launch(Dispatchers.IO) { - val resp = robot.resetMap(false) + val resp = robot.resetMap(false, saveHomeBaseIfCharging = true) withContext(Dispatchers.Main) { printLog("Reset map result $resp") binding.progressBar.visibility = View.GONE @@ -186,6 +186,7 @@ class MapActivity : AppCompatActivity() { } } } + binding.btnFinishMapping.setOnClickListener { binding.progressBar.visibility = View.VISIBLE lifecycleScope.launch(Dispatchers.IO) { diff --git a/sdk/src/main/aidl/com/robotemi/sdk/ISdkService.aidl b/sdk/src/main/aidl/com/robotemi/sdk/ISdkService.aidl index 9a6abb4d..0012f353 100644 --- a/sdk/src/main/aidl/com/robotemi/sdk/ISdkService.aidl +++ b/sdk/src/main/aidl/com/robotemi/sdk/ISdkService.aidl @@ -376,7 +376,7 @@ interface ISdkService { int setMicGainLevel(in String packageName, int level); - String resetMap(in String packageName, boolean allFloor); + String resetMap(in String packageName, boolean allFloor, boolean saveHomeBaseIfCharging); String finishMapping(in String packageName, in String mapName); diff --git a/sdk/src/main/java/com/robotemi/sdk/Robot.kt b/sdk/src/main/java/com/robotemi/sdk/Robot.kt index 0cf2eedd..293ff3ef 100644 --- a/sdk/src/main/java/com/robotemi/sdk/Robot.kt +++ b/sdk/src/main/java/com/robotemi/sdk/Robot.kt @@ -3629,6 +3629,7 @@ class Robot private constructor(private val context: Context) { * Supported from 134 launcher. * * @param allFloor, true to reset maps of all floor, false to reset current map. Used in multi-floor. + * @param saveHomeBaseIfCharging, default as false. If true, when temi is on charging state, it will save home base after reset map. Added in 137 version * @return 0 if the operation is not supported by current launcher * 200 for reset map succeed * 400 for invalid action @@ -3637,10 +3638,10 @@ class Robot private constructor(private val context: Context) { * */ @WorkerThread - fun resetMap(allFloor: Boolean): Int { + fun resetMap(allFloor: Boolean, saveHomeBaseIfCharging: Boolean = false): Int { try { - val resp = sdkService?.resetMap(applicationInfo.packageName, allFloor)?.toIntOrNull() ?: 0 - Log.d(TAG, "resetMap $allFloor, result $resp") + val resp = sdkService?.resetMap(applicationInfo.packageName, allFloor, saveHomeBaseIfCharging)?.toIntOrNull() ?: 0 + Log.d(TAG, "resetMap $allFloor, saveHomeBaseIfCharging $saveHomeBaseIfCharging, result $resp") return resp } catch (e: RemoteException) { Log.e(TAG, "resetMap() error") From 015bc6d88c89812c30149cc5cc3f172511ee322a Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Thu, 28 Aug 2025 16:20:53 +0800 Subject: [PATCH 02/15] Update gradle --- sample/build.gradle | 3 +++ sdk/build.gradle | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sample/build.gradle b/sample/build.gradle index 26ef3dea..71e1eef2 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -6,6 +6,9 @@ repositories { maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + maven { + url 'https://central.sonatype.com/repository/maven-snapshots/' + } } android { diff --git a/sdk/build.gradle b/sdk/build.gradle index d3b46252..9fb0e065 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -1,6 +1,6 @@ plugins { id 'com.android.library' - id "com.vanniktech.maven.publish" version "0.33.0" apply true + id "com.vanniktech.maven.publish" version "0.34.0" apply true } apply plugin: 'kotlin-android' From 3ebc3fd77ba37e3153b0993ceb2c18dc6ac59aa4 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 16 Sep 2025 15:08:10 +0800 Subject: [PATCH 03/15] add rename_location --- gradle.properties | 2 +- sample/build.gradle | 1 + .../com/robotemi/sdk/sample/EditDialog.kt | 74 +++++++++++++++++++ .../com/robotemi/sdk/sample/MapActivity.kt | 52 +++++++++++++ sample/src/main/res/layout/activity_map.xml | 4 + .../main/res/layout/dialog_edit_locations.xml | 31 ++++++++ .../res/layout/item_editable_dialog_row.xml | 11 +++ sample/src/main/res/values/strings.xml | 1 + .../aidl/com/robotemi/sdk/ISdkService.aidl | 2 + sdk/src/main/java/com/robotemi/sdk/Robot.kt | 32 ++++++++ .../java/com/robotemi/sdk/map/MapDataModel.kt | 6 +- 11 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 sample/src/main/java/com/robotemi/sdk/sample/EditDialog.kt create mode 100644 sample/src/main/res/layout/dialog_edit_locations.xml create mode 100644 sample/src/main/res/layout/item_editable_dialog_row.xml diff --git a/gradle.properties b/gradle.properties index ff5e9253..d21dd111 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,7 +25,7 @@ android.defaults.buildfeatures.buildconfig=true android.nonFinalResIds=false GROUP=com.robotemi -VERSION_NAME=1.137.0.1-SNAPSHOT +VERSION_NAME=1.137.0.2-SNAPSHOT POM_URL=https://github.com/robotemi/sdk/ POM_SCM_URL=https://github.com/robotemi/sdk/ POM_SCM_CONNECTION=scm:git:git://github.com/robotemi/sdk.git diff --git a/sample/build.gradle b/sample/build.gradle index 71e1eef2..50d1e728 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -66,4 +66,5 @@ dependencies { implementation project(':sdk') // implementation 'com.robotemi:sdk:1.134.1' implementation 'com.google.code.gson:gson:2.9.0' + implementation 'androidx.core:core-ktx:1.8.0' } diff --git a/sample/src/main/java/com/robotemi/sdk/sample/EditDialog.kt b/sample/src/main/java/com/robotemi/sdk/sample/EditDialog.kt new file mode 100644 index 00000000..017d5697 --- /dev/null +++ b/sample/src/main/java/com/robotemi/sdk/sample/EditDialog.kt @@ -0,0 +1,74 @@ +package com.robotemi.sdk.sample + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager +import android.widget.BaseAdapter +import android.widget.Button +import android.widget.EditText +import android.widget.ListView +import androidx.core.widget.doAfterTextChanged + +class EditDialog( + context: Context, private val locations: MutableList, + private val editorActionListener: EditorActionListener +) : Dialog(context) { + private lateinit var listView: ListView + private lateinit var confirmBtn: Button + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.dialog_edit_locations) + listView = findViewById(R.id.listView) + val adapter = EditableListAdapter( + context, + locations + ) + listView.adapter = adapter + confirmBtn = findViewById(R.id.confirmBtn) + confirmBtn.setOnClickListener { + editorActionListener.editCompleted(this, adapter.oldText, adapter.newText) + } + } + + override fun dismiss() { + val view = currentFocus + if (view is EditText) { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(view.windowToken, 0) + } + super.dismiss() + } + class EditableListAdapter( + private val context: Context, + private val dataList: MutableList + ) : BaseAdapter() { + var newText: String = "" + var oldText: String = "" + + override fun getCount(): Int = dataList.size + override fun getItem(position: Int): Any = dataList[position] + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = convertView ?: LayoutInflater.from(context) + .inflate(R.layout.item_editable_dialog_row, parent, false) + + val editText = view.findViewById(R.id.name) + editText.setText(dataList[position]) + + editText.doAfterTextChanged { + oldText = dataList[position] + newText = it.toString() + } + return view + } + } + + interface EditorActionListener { + fun editCompleted(editDialog: EditDialog, oldName: String, newName: String) + } +} \ No newline at end of file diff --git a/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt b/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt index df985ed9..022c94d3 100644 --- a/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt +++ b/sample/src/main/java/com/robotemi/sdk/sample/MapActivity.kt @@ -15,12 +15,15 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import androidx.lifecycle.lifecycleScope import com.robotemi.sdk.Robot +import com.robotemi.sdk.TtsRequest.Companion.create import com.robotemi.sdk.map.GREEN_PATH import com.robotemi.sdk.map.LOCATION import com.robotemi.sdk.map.Layer import com.robotemi.sdk.map.LayerPose import com.robotemi.sdk.map.MapDataModel import com.robotemi.sdk.navigation.model.Position +import com.robotemi.sdk.permission.Permission +import com.robotemi.sdk.sample.EditDialog.EditorActionListener import com.robotemi.sdk.sample.databinding.ActivityMapBinding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -306,6 +309,55 @@ class MapActivity : AppCompatActivity() { } } + binding.btnRenameLocation.setOnClickListener { + val dialog = EditDialog( + this, + robot.locations.toMutableList(), + object : EditorActionListener { + override fun editCompleted( + editDialog: EditDialog, + oldLocationName: String, + newLocationName: String + ) { + if (oldLocationName == newLocationName) return + binding.progressBar.visibility = View.VISIBLE + lifecycleScope.launch(Dispatchers.IO) { + val layer = Layer.upsertLayer( + oldLocationName, + LOCATION, + listOf(LayerPose(1.5f, 1.5f, 1f)), + 10 + ) + if (layer == null) { + // Invalid parameter + withContext(Dispatchers.Main) { + binding.progressBar.visibility = View.GONE + } + return@launch + } + +// val resp = robot.renameLocation(oldLocationName, newLocationName) + val resp = robot.renameLocation(oldLocationName, newLocationName, layer) + withContext(Dispatchers.Main) { + binding.progressBar.visibility = View.GONE + if (resp == 200) { + printLog("rename location success:${robot.getCurrentFloor()?.locations} ") + } else { + robot.speak( + create( + "rename the $newLocationName location failed.", + true + ) + ) + } + editDialog.dismiss() + } + } + } + }) + dialog.show() + } + binding.refreshMap() } diff --git a/sample/src/main/res/layout/activity_map.xml b/sample/src/main/res/layout/activity_map.xml index 5849850a..3b19bece 100644 --- a/sample/src/main/res/layout/activity_map.xml +++ b/sample/src/main/res/layout/activity_map.xml @@ -144,6 +144,10 @@ style="@style/ButtonCommon" android:text="Add / Update Location"/> +