1
1
package com.draco.ladb.views
2
2
3
3
import android.content.Intent
4
+ import android.net.Uri
4
5
import android.os.Bundle
5
6
import android.view.KeyEvent
6
7
import android.view.Menu
@@ -12,14 +13,17 @@ import android.view.inputmethod.InputMethodManager
12
13
import android.widget.ScrollView
13
14
import androidx.activity.result.contract.ActivityResultContracts
14
15
import androidx.activity.viewModels
16
+ import androidx.appcompat.app.AlertDialog
15
17
import androidx.appcompat.app.AppCompatActivity
16
18
import androidx.core.content.FileProvider
17
19
import androidx.lifecycle.lifecycleScope
18
20
import com.draco.ladb.BuildConfig
19
21
import com.draco.ladb.R
20
22
import com.draco.ladb.databinding.ActivityMainBinding
21
23
import com.draco.ladb.viewmodels.MainActivityViewModel
24
+ import com.google.android.material.dialog.MaterialAlertDialogBuilder
22
25
import com.google.android.material.snackbar.Snackbar
26
+ import com.google.android.material.textfield.TextInputEditText
23
27
import kotlinx.coroutines.Dispatchers
24
28
import kotlinx.coroutines.launch
25
29
import kotlin.system.exitProcess
@@ -28,36 +32,23 @@ class MainActivity : AppCompatActivity() {
28
32
private val viewModel: MainActivityViewModel by viewModels()
29
33
private lateinit var binding: ActivityMainBinding
30
34
35
+ private lateinit var pairDialog: MaterialAlertDialogBuilder
36
+
31
37
private var lastCommand = " "
32
38
33
39
private var bookmarkGetResult = registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) {
34
40
val text = it.data?.getStringExtra(Intent .EXTRA_TEXT ) ? : return @registerForActivityResult
35
41
binding.command.setText(text)
36
42
}
37
43
38
- private var pairGetResult = registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
39
- val port = result.data?.getStringExtra(" port" ) ? : " "
40
- val code = result.data?.getStringExtra(" code" ) ? : " "
41
-
42
- viewModel.adb.debug(" Trying to pair..." )
43
- lifecycleScope.launch(Dispatchers .IO ) {
44
- val success = viewModel.adb.pair(port, code)
45
-
46
- if (success) {
47
- viewModel.setPairedBefore(true )
48
- viewModel.startADBServer()
49
- } else {
50
- /* Failed; try again! */
51
- viewModel.setPairedBefore(false )
52
- viewModel.adb.debug(" Failed to pair! Trying again..." )
53
- runOnUiThread { pairAndStart() }
54
- }
55
-
56
- viewModel.isPairing.postValue(false )
57
- }
58
- }
59
-
60
44
private fun setupUI () {
45
+ pairDialog = MaterialAlertDialogBuilder (this )
46
+ .setTitle(R .string.pair_title)
47
+ .setCancelable(false )
48
+ .setView(R .layout.dialog_pair)
49
+ .setPositiveButton(R .string.pair, null )
50
+ .setNegativeButton(R .string.help, null )
51
+
61
52
binding.command.setOnKeyListener { _, keyCode, keyEvent ->
62
53
if (keyCode == KeyEvent .KEYCODE_ENTER && keyEvent.action == KeyEvent .ACTION_DOWN ) {
63
54
sendCommandToADB()
@@ -117,23 +108,23 @@ class MainActivity : AppCompatActivity() {
117
108
118
109
/* Prepare progress bar, pairing latch, and script executing */
119
110
viewModel.adb.started.observe(this ) { started ->
120
- if (started == true ) {
121
- lifecycleScope.launch(Dispatchers .IO ) {
122
- runOnUiThread { setReadyForInput(true ) }
123
- executeScriptFromIntent()
124
- }
125
- } else {
126
- runOnUiThread { setReadyForInput(false ) }
127
- return @observe
128
- }
111
+ setReadyForInput(started == true )
129
112
}
130
113
}
131
114
132
115
private fun pairAndStart () {
133
116
if (viewModel.needsToPair()) {
134
117
viewModel.adb.debug(" Requesting pairing information" )
135
- viewModel.isPairing.value = true
136
- pairGetResult.launch(Intent (this , PairActivity ::class .java))
118
+ askToPair { thisPairSuccess ->
119
+ if (thisPairSuccess) {
120
+ viewModel.setPairedBefore(true )
121
+ viewModel.startADBServer()
122
+ } else {
123
+ /* Failed; try again! */
124
+ viewModel.adb.debug(" Failed to pair! Trying again..." )
125
+ runOnUiThread { pairAndStart() }
126
+ }
127
+ }
137
128
} else {
138
129
viewModel.startADBServer()
139
130
}
@@ -153,22 +144,43 @@ class MainActivity : AppCompatActivity() {
153
144
}
154
145
155
146
/* *
156
- * Execute a script from the main intent if one was given
147
+ * Ask the user to pair
157
148
*/
158
- private fun executeScriptFromIntent () {
159
- if (viewModel.getScriptFromIntent(intent) == null )
160
- return
161
-
162
- val code = viewModel.getScriptFromIntent(intent) ? : return
163
-
164
- /* Invalidate intent */
165
- intent.type = " "
166
-
167
- Snackbar .make(binding.output, getString(R .string.snackbar_file_opened), Snackbar .LENGTH_SHORT )
168
- .setAction(getString(R .string.dismiss)) {}
149
+ private fun askToPair (callback : ((Boolean ) -> (Unit ))? = null) {
150
+ pairDialog
151
+ .create()
152
+ .apply {
153
+ setOnShowListener {
154
+ getButton(AlertDialog .BUTTON_POSITIVE ).setOnClickListener {
155
+ val port = findViewById<TextInputEditText >(R .id.port)!! .text.toString()
156
+ val code = findViewById<TextInputEditText >(R .id.code)!! .text.toString()
157
+ dismiss()
158
+
159
+ lifecycleScope.launch(Dispatchers .IO ) {
160
+ viewModel.adb.debug(" Trying to pair..." )
161
+ val success = viewModel.adb.pair(port, code)
162
+ callback?.invoke(success)
163
+ }
164
+ }
165
+
166
+ getButton(AlertDialog .BUTTON_NEGATIVE ).setOnClickListener {
167
+ val intent = Intent (Intent .ACTION_VIEW , Uri .parse(getString(R .string.tutorial_url)))
168
+ try {
169
+ startActivity(intent)
170
+ } catch (e: Exception ) {
171
+ e.printStackTrace()
172
+ Snackbar .make(
173
+ binding.output,
174
+ getString(R .string.snackbar_intent_failed),
175
+ Snackbar .LENGTH_SHORT
176
+ )
177
+ .show()
178
+ }
179
+
180
+ }
181
+ }
182
+ }
169
183
.show()
170
-
171
- viewModel.adb.sendScript(code)
172
184
}
173
185
174
186
override fun onOptionsItemSelected (item : MenuItem ): Boolean {
0 commit comments