1 package jp.osdn.gokigen.thetaview
3 import android.Manifest
4 import android.content.Intent
5 import android.content.pm.PackageManager
6 import android.os.Build
7 import android.os.Bundle
8 import android.os.VibrationEffect
9 import android.os.Vibrator
10 import android.util.Log
11 import android.view.WindowManager
12 import android.widget.ImageButton
13 import android.widget.Toast
14 import androidx.appcompat.app.AppCompatActivity
15 import androidx.core.app.ActivityCompat
16 import androidx.core.content.ContextCompat
17 import jp.osdn.gokigen.thetaview.camera.ICameraStatusReceiver
18 import jp.osdn.gokigen.thetaview.camera.theta.status.ThetaCameraStatusWatcher
19 import jp.osdn.gokigen.thetaview.preference.PreferenceValueInitializer
20 import jp.osdn.gokigen.thetaview.scene.*
22 class MainActivity : AppCompatActivity(), IShowInformation, ICameraStatusReceiver, ICameraConnectionStatus
24 private val mainButtonHandler : MainButtonHandler = MainButtonHandler(this, this, this)
25 private val showMessage : ShowMessage = ShowMessage(this)
26 private val accessPermission : IScopedStorageAccessPermission? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { StorageOperationWithPermission(this) } else { null }
27 private val sceneChanger : SceneChanger = SceneChanger(this, showMessage, accessPermission, this, this)
28 private var connectionStatus : ICameraConnectionStatus.CameraConnectionStatus = ICameraConnectionStatus.CameraConnectionStatus.UNKNOWN
30 override fun onCreate(savedInstanceState: Bundle?)
32 Log.v(TAG, " ----- onCreate() -----")
33 super.onCreate(savedInstanceState)
34 mainButtonHandler.setSceneChanger(sceneChanger)
36 setContentView(R.layout.activity_main)
38 supportActionBar?.hide()
39 window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
43 PreferenceValueInitializer().initializePreferences(this)
50 if (allPermissionsGranted())
52 checkMediaWritePermission()
53 sceneChanger.initializeFragment()
54 mainButtonHandler.initialize()
58 ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
62 override fun onDestroy()
68 private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
69 ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED
72 private fun checkMediaWritePermission()
74 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
76 StorageOperationWithPermission(this).requestStorageAccessFrameworkLocation()
80 override fun onRequestPermissionsResult(
82 permissions: Array<String>,
83 grantResults: IntArray
86 if (requestCode == REQUEST_CODE_PERMISSIONS)
88 if (allPermissionsGranted())
90 checkMediaWritePermission()
91 sceneChanger.initializeFragment()
92 mainButtonHandler.initialize()
96 Toast.makeText(this, getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show()
97 //Snackbar.make(main_layout,"Permissions not granted by the user.", Snackbar.LENGTH_SHORT).show()
103 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
105 super.onActivityResult(requestCode, resultCode, data)
106 if (requestCode == REQUEST_CODE_MEDIA_EDIT)
108 accessPermission?.responseAccessPermission(resultCode, data)
110 if (requestCode == REQUEST_CODE_OPEN_DOCUMENT_TREE)
112 accessPermission?.responseStorageAccessFrameworkLocation(resultCode, data)
118 private val TAG = MainActivity::class.java.simpleName
120 private const val REQUEST_CODE_PERMISSIONS = 10
121 const val REQUEST_CODE_MEDIA_EDIT = 12
122 const val REQUEST_CODE_OPEN_DOCUMENT_TREE = 20
124 private val REQUIRED_PERMISSIONS = arrayOf(
125 Manifest.permission.CAMERA,
126 Manifest.permission.VIBRATE,
127 Manifest.permission.INTERNET,
128 Manifest.permission.ACCESS_NETWORK_STATE,
129 Manifest.permission.ACCESS_WIFI_STATE,
130 Manifest.permission.WRITE_EXTERNAL_STORAGE,
131 Manifest.permission.READ_EXTERNAL_STORAGE
135 override fun showToast(rscId: Int, appendMessage: String, duration: Int)
142 val message = if (rscId != 0) getString(rscId) + appendMessage else appendMessage
143 Toast.makeText(applicationContext, message, duration).show()
145 catch (e: java.lang.Exception)
157 override fun vibrate(vibratePattern: IShowInformation.VibratePattern)
162 val vibrator = getSystemService(VIBRATOR_SERVICE) as Vibrator
163 if (!vibrator.hasVibrator())
165 Log.v(TAG, " not have Vibrator...")
168 @Suppress("DEPRECATION") val thread = Thread {
171 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
173 vibrator.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE))
177 when (vibratePattern)
179 IShowInformation.VibratePattern.SIMPLE_SHORT -> vibrator.vibrate(50)
180 IShowInformation.VibratePattern.SIMPLE_LONG -> vibrator.vibrate(150)
185 catch (e : Exception)
192 catch (e: java.lang.Exception)
198 override fun invalidate()
203 //if (liveView != null) {
204 // liveView.invalidate()
214 override fun setMessage(area: IShowInformation.Area, color: Int, message: String)
216 Log.v(TAG, ">>> $area[$color] : $message")
230 override fun onStatusNotify(message: String?)
232 Log.v(TAG, " onStatusNotify() $message ")
233 updateConnectionIcon(ICameraConnectionStatus.CameraConnectionStatus.CONNECTING)
238 //if (liveView != null) {
239 // liveView.invalidate()
249 override fun onCameraConnected()
251 Log.v(TAG, " onCameraConnected() ")
252 updateConnectionIcon(ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
257 //if (liveView != null) {
258 // liveView.invalidate()
268 override fun onCameraDisconnected()
270 Log.v(TAG, " onCameraDisconnected() ")
273 updateConnectionIcon(ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED)
281 private fun updateConnectionIcon(connectionStatus : ICameraConnectionStatus.CameraConnectionStatus)
283 Log.v(TAG, " onCameraDisconnected() $connectionStatus")
284 this.connectionStatus = connectionStatus
290 val view : ImageButton = this.findViewById(R.id.button_connect)
291 val iconId = when (connectionStatus)
293 ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED -> { R.drawable.ic_baseline_cloud_off_24 }
294 ICameraConnectionStatus.CameraConnectionStatus.UNKNOWN -> { R.drawable.ic_baseline_cloud_off_24 }
295 ICameraConnectionStatus.CameraConnectionStatus.CONNECTING -> { R.drawable.ic_baseline_cloud_queue_24 }
296 ICameraConnectionStatus.CameraConnectionStatus.CONNECTED -> { R.drawable.ic_baseline_cloud_done_24 }
298 view.setImageDrawable(ContextCompat.getDrawable(this, iconId))
301 catch (e : Exception)
313 override fun onCameraConnectError(msg: String?)
315 Log.v(TAG, " onCameraConnectError() $msg ")
318 override fun getConnectionStatus(): ICameraConnectionStatus.CameraConnectionStatus
320 return (connectionStatus)