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.preference.PreferenceValueInitializer
19 import jp.osdn.gokigen.thetaview.scene.*
21 class MainActivity : AppCompatActivity(), IShowInformation, ICameraStatusReceiver, ICameraConnectionStatus
23 private val mainButtonHandler : MainButtonHandler = MainButtonHandler(this, this, this)
24 private val showMessage : ShowMessage = ShowMessage(this)
25 private val accessPermission : IScopedStorageAccessPermission? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { StorageOperationWithPermission(this) } else { null }
26 private val sceneChanger : SceneChanger = SceneChanger(this, showMessage, accessPermission, this, this)
27 private var connectionStatus : ICameraConnectionStatus.CameraConnectionStatus = ICameraConnectionStatus.CameraConnectionStatus.UNKNOWN
29 override fun onCreate(savedInstanceState: Bundle?)
31 Log.v(TAG, " ----- onCreate() -----")
32 super.onCreate(savedInstanceState)
33 mainButtonHandler.setSceneChanger(sceneChanger)
35 setContentView(R.layout.activity_main)
37 supportActionBar?.hide()
38 window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
42 PreferenceValueInitializer().initializePreferences(this)
49 if (allPermissionsGranted())
51 checkMediaWritePermission()
52 sceneChanger.initializeFragment()
53 mainButtonHandler.initialize()
57 ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
61 override fun onDestroy()
67 private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
68 ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED
71 private fun checkMediaWritePermission()
73 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
75 StorageOperationWithPermission(this).requestStorageAccessFrameworkLocation()
79 override fun onRequestPermissionsResult(
81 permissions: Array<String>,
82 grantResults: IntArray
85 if (requestCode == REQUEST_CODE_PERMISSIONS)
87 if (allPermissionsGranted())
89 checkMediaWritePermission()
90 sceneChanger.initializeFragment()
91 mainButtonHandler.initialize()
95 Toast.makeText(this, getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show()
96 //Snackbar.make(main_layout,"Permissions not granted by the user.", Snackbar.LENGTH_SHORT).show()
102 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
104 super.onActivityResult(requestCode, resultCode, data)
105 if (requestCode == REQUEST_CODE_MEDIA_EDIT)
107 accessPermission?.responseAccessPermission(resultCode, data)
109 if (requestCode == REQUEST_CODE_OPEN_DOCUMENT_TREE)
111 accessPermission?.responseStorageAccessFrameworkLocation(resultCode, data)
117 private val TAG = MainActivity::class.java.simpleName
119 private const val REQUEST_CODE_PERMISSIONS = 10
120 const val REQUEST_CODE_MEDIA_EDIT = 12
121 const val REQUEST_CODE_OPEN_DOCUMENT_TREE = 20
123 private val REQUIRED_PERMISSIONS = arrayOf(
124 Manifest.permission.CAMERA,
125 Manifest.permission.VIBRATE,
126 Manifest.permission.INTERNET,
127 Manifest.permission.ACCESS_NETWORK_STATE,
128 Manifest.permission.ACCESS_WIFI_STATE,
129 Manifest.permission.WRITE_EXTERNAL_STORAGE,
130 Manifest.permission.READ_EXTERNAL_STORAGE
134 override fun showToast(rscId: Int, appendMessage: String, duration: Int)
141 val message = if (rscId != 0) getString(rscId) + appendMessage else appendMessage
142 Toast.makeText(applicationContext, message, duration).show()
144 catch (e: java.lang.Exception)
156 override fun vibrate(vibratePattern: IShowInformation.VibratePattern)
161 val vibrator = getSystemService(VIBRATOR_SERVICE) as Vibrator
162 if (!vibrator.hasVibrator())
164 Log.v(TAG, " not have Vibrator...")
167 @Suppress("DEPRECATION") val thread = Thread {
170 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
172 vibrator.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE))
176 when (vibratePattern)
178 IShowInformation.VibratePattern.SIMPLE_SHORT -> vibrator.vibrate(50)
179 IShowInformation.VibratePattern.SIMPLE_LONG -> vibrator.vibrate(150)
184 catch (e : Exception)
191 catch (e: java.lang.Exception)
197 override fun invalidate()
202 //if (liveView != null) {
203 // liveView.invalidate()
213 override fun onStatusNotify(message: String?)
215 Log.v(TAG, " onStatusNotify() $message ")
216 updateConnectionIcon(ICameraConnectionStatus.CameraConnectionStatus.CONNECTING)
221 //if (liveView != null) {
222 // liveView.invalidate()
232 override fun onCameraConnected()
234 Log.v(TAG, " onCameraConnected() ")
235 updateConnectionIcon(ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
240 //if (liveView != null) {
241 // liveView.invalidate()
251 override fun onCameraDisconnected()
253 Log.v(TAG, " onCameraDisconnected() ")
256 updateConnectionIcon(ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED)
264 private fun updateConnectionIcon(connectionStatus : ICameraConnectionStatus.CameraConnectionStatus)
266 Log.v(TAG, " onCameraDisconnected() $connectionStatus")
267 this.connectionStatus = connectionStatus
273 val view : ImageButton = this.findViewById(R.id.button_connect)
274 val iconId = when (connectionStatus)
276 ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED -> { R.drawable.ic_baseline_cloud_off_24 }
277 ICameraConnectionStatus.CameraConnectionStatus.UNKNOWN -> { R.drawable.ic_baseline_cloud_off_24 }
278 ICameraConnectionStatus.CameraConnectionStatus.CONNECTING -> { R.drawable.ic_baseline_cloud_queue_24 }
279 ICameraConnectionStatus.CameraConnectionStatus.CONNECTED -> { R.drawable.ic_baseline_cloud_done_24 }
281 view.setImageDrawable(ContextCompat.getDrawable(this, iconId))
284 catch (e : Exception)
296 override fun onCameraConnectError(msg: String?)
298 Log.v(TAG, " onCameraConnectError() $msg ")
301 override fun getConnectionStatus(): ICameraConnectionStatus.CameraConnectionStatus
303 return (connectionStatus)