diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt new file mode 100644 index 0000000..b2a83fe --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.vm + +import com.casic.app.safetreecontroller.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch + +class DeviceViewModel : BaseViewModel() { + /** + * 执行设备控制指令 + */ + fun executeDeviceCommand(action: String, speed: Int) = launch({ + RetrofitServiceManager.executeDeviceCommand(action, speed) + }) +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt new file mode 100644 index 0000000..b2a83fe --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.vm + +import com.casic.app.safetreecontroller.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch + +class DeviceViewModel : BaseViewModel() { + /** + * 执行设备控制指令 + */ + fun executeDeviceCommand(action: String, speed: Int) = launch({ + RetrofitServiceManager.executeDeviceCommand(action, speed) + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml new file mode 100644 index 0000000..59462ee --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt new file mode 100644 index 0000000..b2a83fe --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.vm + +import com.casic.app.safetreecontroller.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch + +class DeviceViewModel : BaseViewModel() { + /** + * 执行设备控制指令 + */ + fun executeDeviceCommand(action: String, speed: Int) = launch({ + RetrofitServiceManager.executeDeviceCommand(action, speed) + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml new file mode 100644 index 0000000..59462ee --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_audio.xml b/app/src/main/res/drawable/ic_audio.xml new file mode 100644 index 0000000..be021b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_audio.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt new file mode 100644 index 0000000..b2a83fe --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.vm + +import com.casic.app.safetreecontroller.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch + +class DeviceViewModel : BaseViewModel() { + /** + * 执行设备控制指令 + */ + fun executeDeviceCommand(action: String, speed: Int) = launch({ + RetrofitServiceManager.executeDeviceCommand(action, speed) + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml new file mode 100644 index 0000000..59462ee --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_audio.xml b/app/src/main/res/drawable/ic_audio.xml new file mode 100644 index 0000000..be021b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_audio.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_device_controller.xml b/app/src/main/res/layout/fragment_device_controller.xml new file mode 100644 index 0000000..744378b --- /dev/null +++ b/app/src/main/res/layout/fragment_device_controller.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt new file mode 100644 index 0000000..b2a83fe --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.vm + +import com.casic.app.safetreecontroller.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch + +class DeviceViewModel : BaseViewModel() { + /** + * 执行设备控制指令 + */ + fun executeDeviceCommand(action: String, speed: Int) = launch({ + RetrofitServiceManager.executeDeviceCommand(action, speed) + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml new file mode 100644 index 0000000..59462ee --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_audio.xml b/app/src/main/res/drawable/ic_audio.xml new file mode 100644 index 0000000..be021b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_audio.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_device_controller.xml b/app/src/main/res/layout/fragment_device_controller.xml new file mode 100644 index 0000000..744378b --- /dev/null +++ b/app/src/main/res/layout/fragment_device_controller.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_methane_data.xml b/app/src/main/res/layout/fragment_methane_data.xml new file mode 100644 index 0000000..573d4b5 --- /dev/null +++ b/app/src/main/res/layout/fragment_methane_data.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/SafeTreeController.jks b/app/SafeTreeController.jks new file mode 100644 index 0000000..baff2e6 --- /dev/null +++ b/app/SafeTreeController.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle index f7b2149..db545db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,14 @@ apply plugin: 'kotlin-android' android { + signingConfigs { + release { + storeFile file('SafeTreeController.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } compileSdkVersion 33 defaultConfig { @@ -12,11 +20,15 @@ targetSdkVersion 33 versionCode 1000 versionName "1.0.0.0" + ndk { + abiFilters "arm64-v8a", "armeabi-v7a", "x86_64", "x86" + } } buildTypes { release { minifyEnabled false + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -90,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //图表 + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt new file mode 100644 index 0000000..93e8aa2 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/adapter/TabPageViewAdapter.kt @@ -0,0 +1,17 @@ +package com.casic.app.safetreecontroller.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TabPageViewAdapter( + manager: FragmentManager, + private val pages: ArrayList, private val titles: Array +) : FragmentPagerAdapter(manager) { + + override fun getItem(position: Int): Fragment = pages[position] + + override fun getCount(): Int = pages.size + + override fun getPageTitle(position: Int): CharSequence = titles[position] +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt new file mode 100644 index 0000000..46bbf22 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/DeviceControllerFragment.kt @@ -0,0 +1,106 @@ +package com.casic.app.safetreecontroller.fragments + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import com.casic.app.safetreecontroller.databinding.FragmentDeviceControllerBinding +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.casic.app.safetreecontroller.view.MainActivity +import com.casic.app.safetreecontroller.vm.DeviceViewModel +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.widget.SteeringWheelView + +class DeviceControllerFragment : KotlinBaseFragment() { + + private lateinit var deviceViewModel: DeviceViewModel + private var speed = 5 + + override fun initOnCreate(savedInstanceState: Bundle?) { + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + binding.currentSpeedView.text = "速度:${speed}" + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentDeviceControllerBinding { + return FragmentDeviceControllerBinding.inflate(layoutInflater) + } + + @SuppressLint("ClickableViewAccessibility") + override fun initEvent() { + binding.steeringWheelView.setOnWheelTouchListener(object : + SteeringWheelView.OnWheelTouchListener { + override fun onCenterClicked() { + MainActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.PLAY_RTSP_CODE) + } + + override fun onLeftTurn() { + executeCommand("Left") + } + + override fun onTopTurn() { + executeCommand("Up") + } + + override fun onRightTurn() { + executeCommand("Right") + } + + override fun onBottomTurn() { + executeCommand("Down") + } + + override fun onActionTurnUp(dir: SteeringWheelView.Direction) { + executeCommand("Stop") + } + }) + + binding.upScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomAdd") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.downScaleButton.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> executeCommand("ZoomSub") + MotionEvent.ACTION_UP -> executeCommand("Stop") + } + false + } + + binding.accelerateButton.setOnClickListener { + speed++ + if (speed >= 8) { + speed = 8 + } + binding.currentSpeedView.text = "速度:${speed}" + } + + binding.decelerationButton.setOnClickListener { + speed-- + if (speed <= 1) { + speed = 1 + } + binding.currentSpeedView.text = "速度:${speed}" + } + } + + private fun executeCommand(action: String) { + deviceViewModel.executeDeviceCommand(action, speed) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt new file mode 100644 index 0000000..cd47ba8 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/MethaneDataFragment.kt @@ -0,0 +1,32 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentMethaneDataBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class MethaneDataFragment : KotlinBaseFragment() { + + override fun initEvent() { + + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMethaneDataBinding { + return FragmentMethaneDataBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt new file mode 100644 index 0000000..a125f9e --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/OtherSettingsFragment.kt @@ -0,0 +1,39 @@ +package com.casic.app.safetreecontroller.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import com.casic.app.safetreecontroller.databinding.FragmentOtherSettingsBinding +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class OtherSettingsFragment : KotlinBaseFragment() { + + override fun initOnCreate(savedInstanceState: Bundle?) { + + } + + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOtherSettingsBinding { + return FragmentOtherSettingsBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initEvent() { + binding.volumeSlider.addOnChangeListener { _, value, _ -> + binding.volumeValueView.text = value.toInt().toString() + } + } + + override fun onResume() { + super.onResume() + binding.volumeValueView.text = binding.volumeSlider.value.toInt().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt new file mode 100644 index 0000000..1f80074 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitService.kt @@ -0,0 +1,16 @@ +package com.casic.app.safetreecontroller.retrofit + +import retrofit2.http.* + +interface RetrofitService { + /** + * 执行设备控制指令 + */ + @GET("/cgi-bin/ptz_cgi") + suspend fun executeDeviceCommand( + @Query("action") action: String, + @Query("user") user: String, + @Query("pwd") pwd: String, + @Query("Speed") Speed: String + ): String +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt new file mode 100644 index 0000000..df76f96 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/retrofit/RetrofitServiceManager.kt @@ -0,0 +1,26 @@ +package com.casic.app.safetreecontroller.retrofit + +import android.util.Log +import com.casic.app.safetreecontroller.utils.LocaleConstant +import com.pengxh.kt.lite.utils.RetrofitFactory +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RetrofitServiceManager { + + private const val kTag = "RetrofitServiceManager" + + /** + * 执行设备控制指令 + */ + suspend fun executeDeviceCommand(action: String, speed: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.DEVICE_CONTROL_SERVER_CONFIG, "" + ) as String + if (httpConfig == "") { + Log.d(kTag, "executeDeviceCommand: httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig") + return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt new file mode 100644 index 0000000..215f307 --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -0,0 +1,12 @@ +package com.casic.app.safetreecontroller.utils + +object LocaleConstant { + const val PLAY_RTSP_CODE = 20241001 + + const val DEVICE_CONTROL_SERVER_CONFIG = "deviceControlServerConfig" + + //相机IP + const val CAMERA_IP = "192.168.10.137" + const val MAIN_RTSP_URL = "rtsp://${CAMERA_IP}:554" + const val SUB_RTSP_URL = "${MAIN_RTSP_URL}/h264/ch1/sub/av_stream" +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt new file mode 100644 index 0000000..b2a83fe --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/vm/DeviceViewModel.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.vm + +import com.casic.app.safetreecontroller.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch + +class DeviceViewModel : BaseViewModel() { + /** + * 执行设备控制指令 + */ + fun executeDeviceCommand(action: String, speed: Int) = launch({ + RetrofitServiceManager.executeDeviceCommand(action, speed) + }) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml new file mode 100644 index 0000000..59462ee --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_5.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_audio.xml b/app/src/main/res/drawable/ic_audio.xml new file mode 100644 index 0000000..be021b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_audio.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_device_controller.xml b/app/src/main/res/layout/fragment_device_controller.xml new file mode 100644 index 0000000..744378b --- /dev/null +++ b/app/src/main/res/layout/fragment_device_controller.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_methane_data.xml b/app/src/main/res/layout/fragment_methane_data.xml new file mode 100644 index 0000000..573d4b5 --- /dev/null +++ b/app/src/main/res/layout/fragment_methane_data.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_other_settings.xml b/app/src/main/res/layout/fragment_other_settings.xml new file mode 100644 index 0000000..9f9b1a8 --- /dev/null +++ b/app/src/main/res/layout/fragment_other_settings.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +