diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index afe4904a..d84e4a52 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,6 +40,9 @@
+
+
+
(context: Context, actionName: String, task: T) {
+
+ private var mContext: Context?
+ private val mActionName: String
+ private var mReceiver: TimeTaskReceiver? = null
+ private val mTask: T?
+
+ companion object {
+ private var mPendingIntent: PendingIntent? = null
+ }
+
+ init {
+ mContext = context
+ mActionName = actionName
+ mTask = task
+ initReceiver(context, actionName)
+ }
+
+ fun startLooperTask() {
+ if (null != mTask) {
+ mTask.exeTask()
+ configureAlarmManager(mTask.period())
+ }
+ }
+
+ fun stopLooperTask() {
+ cancelAlarmManager()
+ }
+
+ fun onClose() {
+ mContext!!.unregisterReceiver(mReceiver)
+ mContext = null
+ }
+
+ @SuppressLint("ObsoleteSdkInt")
+ private fun configureAlarmManager(time: Long) {
+ val manager = mContext!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
+ val pendIntent = pendingIntent
+ when {
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
+ manager.setExactAndAllowWhileIdle(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + time,
+ pendIntent
+ )
+ }
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> {
+ manager.setExact(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + time,
+ pendIntent
+ )
+ }
+ else -> {
+ manager[AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + time] = pendIntent
+ }
+ }
+ }
+
+ @get:SuppressLint("UnspecifiedImmutableFlag")
+ private val pendingIntent: PendingIntent?
+ get() {
+ if (mPendingIntent == null) {
+ val requestCode = 0
+ val intent = Intent()
+ intent.action = mActionName
+ when {
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
+ mPendingIntent = PendingIntent.getBroadcast(
+ mContext, requestCode, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
+ )
+ }
+ else -> {
+ mPendingIntent = PendingIntent.getBroadcast(
+ mContext,
+ requestCode,
+ intent,
+ PendingIntent.FLAG_UPDATE_CURRENT
+ )
+ }
+ }
+ }
+ return mPendingIntent
+ }
+
+ private fun cancelAlarmManager() {
+ val manager = mContext!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
+ manager.cancel(pendingIntent)
+ }
+
+ private fun initReceiver(context: Context, actionName: String) {
+ mReceiver = TimeTaskReceiver()
+ val intentFilter = IntentFilter()
+ intentFilter.addAction(actionName)
+ context.registerReceiver(mReceiver, intentFilter)
+ }
+
+ internal inner class TimeTaskReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ startLooperTask()
+ }
+ }
+
+ interface Task {
+ fun period(): Long {
+ // 默认时间5S
+ return 5000L
+ }
+
+ fun exeTask()
+ }
+}
diff --git a/app/src/main/res/drawable-xhdpi/icon_finish_disable.png b/app/src/main/res/drawable-xhdpi/icon_finish_disable.png
new file mode 100644
index 00000000..626e4b3d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_finish_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_finish_nor.png b/app/src/main/res/drawable-xhdpi/icon_finish_nor.png
new file mode 100644
index 00000000..c09a06a8
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_finish_nor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_finish_press.png b/app/src/main/res/drawable-xhdpi/icon_finish_press.png
new file mode 100644
index 00000000..f572d57d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_finish_press.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_forward_disable.png b/app/src/main/res/drawable-xhdpi/icon_forward_disable.png
new file mode 100644
index 00000000..63978baf
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_forward_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_forward_nor.png b/app/src/main/res/drawable-xhdpi/icon_forward_nor.png
new file mode 100644
index 00000000..c8a5a518
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_forward_nor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_forward_press.png b/app/src/main/res/drawable-xhdpi/icon_forward_press.png
new file mode 100644
index 00000000..5beaed1d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_forward_press.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_mediaflag.png b/app/src/main/res/drawable-xhdpi/icon_mediaflag.png
new file mode 100644
index 00000000..2ba4e658
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_mediaflag.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_mediaflag_disable.png b/app/src/main/res/drawable-xhdpi/icon_mediaflag_disable.png
new file mode 100644
index 00000000..09f8a835
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_mediaflag_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_next_disable.png b/app/src/main/res/drawable-xhdpi/icon_next_disable.png
new file mode 100644
index 00000000..41a0abe7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_next_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_next_nor.png b/app/src/main/res/drawable-xhdpi/icon_next_nor.png
new file mode 100644
index 00000000..fe4a563d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_next_nor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_next_press.png b/app/src/main/res/drawable-xhdpi/icon_next_press.png
new file mode 100644
index 00000000..9863d55c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_next_press.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_no_mediaflag.png b/app/src/main/res/drawable-xhdpi/icon_no_mediaflag.png
new file mode 100644
index 00000000..feaf39a7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_no_mediaflag.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_pause_nor.png b/app/src/main/res/drawable-xhdpi/icon_pause_nor.png
new file mode 100644
index 00000000..e2aa3f68
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_pause_nor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_play_disable.png b/app/src/main/res/drawable-xhdpi/icon_play_disable.png
new file mode 100644
index 00000000..c421e09b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_play_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_play_nor.png b/app/src/main/res/drawable-xhdpi/icon_play_nor.png
new file mode 100644
index 00000000..643fb4d2
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_play_nor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_select_point_disable.png b/app/src/main/res/drawable-xhdpi/icon_select_point_disable.png
new file mode 100644
index 00000000..f0573f27
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_select_point_disable.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_select_point_nor.png b/app/src/main/res/drawable-xhdpi/icon_select_point_nor.png
new file mode 100644
index 00000000..e1e8b2f9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_select_point_nor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_select_point_press.png b/app/src/main/res/drawable-xhdpi/icon_select_point_press.png
new file mode 100644
index 00000000..f0b0cbc3
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_select_point_press.png differ
diff --git a/app/src/main/res/drawable/map_trace_finish.xml b/app/src/main/res/drawable/map_trace_finish.xml
new file mode 100644
index 00000000..013c9395
--- /dev/null
+++ b/app/src/main/res/drawable/map_trace_finish.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/map_trace_forward.xml b/app/src/main/res/drawable/map_trace_forward.xml
new file mode 100644
index 00000000..4f0afa14
--- /dev/null
+++ b/app/src/main/res/drawable/map_trace_forward.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/map_trace_mediaflag.xml b/app/src/main/res/drawable/map_trace_mediaflag.xml
new file mode 100644
index 00000000..6c196508
--- /dev/null
+++ b/app/src/main/res/drawable/map_trace_mediaflag.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/map_trace_next.xml b/app/src/main/res/drawable/map_trace_next.xml
new file mode 100644
index 00000000..59e80266
--- /dev/null
+++ b/app/src/main/res/drawable/map_trace_next.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/map_trace_pause.xml b/app/src/main/res/drawable/map_trace_pause.xml
new file mode 100644
index 00000000..006cc188
--- /dev/null
+++ b/app/src/main/res/drawable/map_trace_pause.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/map_trace_select_point.xml b/app/src/main/res/drawable/map_trace_select_point.xml
new file mode 100644
index 00000000..0c0ed8bb
--- /dev/null
+++ b/app/src/main/res/drawable/map_trace_select_point.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 690d0642..a5e3631e 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -119,6 +119,73 @@
android:elevation="2dp"
android:onClick="@{()->mainActivity.onClickMenu()}" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+