Skip to content

Commit 6630d42

Browse files
authored
Merge pull request #23 from TranquilRock/dev
Add `Manage` functionality and unzip feature.
2 parents 619c354 + 7ce61c7 commit 6630d42

26 files changed

+611
-215
lines changed

app/build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ android {
1212
minSdkVersion 30
1313
targetSdk 33
1414
versionCode 2
15-
versionName '2.1.0'
15+
versionName '3.0.0'
1616

1717
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1818
vectorDrawables {
@@ -63,10 +63,12 @@ android {
6363
}
6464

6565
dependencies {
66+
//noinspection GradleDependency
6667
implementation 'androidx.core:core-ktx:1.8.0' // Changing to 1.10 will cause conflict.
6768
implementation 'androidx.appcompat:appcompat:1.6.1'
6869
implementation 'com.google.android.material:material:1.9.0'
6970
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
71+
//noinspection GradleDependency
7072
implementation 'androidx.navigation:navigation-ui:2.5.3' // Changing to 2.6 will cause conflict.
7173
implementation 'org.jetbrains:annotations:24.0.1'
7274
implementation project(path: ':openCVLibrary3415')

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
<!-- Activity -->
3333
<activity
34-
android:name=".activity.Menu"
34+
android:name=".activity.MenuActivity"
3535
android:configChanges="orientation|keyboardHidden"
3636
android:exported="true"
3737
android:screenOrientation="portrait"

app/src/main/java/com/tranquilrock/androidscript/App.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import com.tranquilrock.androidscript.core.Command
88
import org.opencv.android.OpenCVLoader
99
import java.io.File
1010
import java.lang.IllegalStateException
11-
import kotlin.system.exitProcess
1211

1312
/**
1413
* Application's global states.
@@ -18,7 +17,6 @@ import kotlin.system.exitProcess
1817
class App : Application() {
1918
companion object {
2019
const val BLOCK_DATA_KEY = "BLOCK_DATA_KEY"
21-
const val BLOCK_META_KEY = "BLOCK_META_KEY"
2220
const val MEDIA_PROJECTION_KEY = "MEDIA_PROJECTION"
2321
const val BASIC_SCRIPT_TYPE = "BASIC"
2422
const val SCRIPT_TYPE_KEY = "SCRIPT_TYPE"
@@ -30,15 +28,14 @@ class App : Application() {
3028
super.onCreate()
3129
Log.d(packageName, "onCreate")
3230

31+
/** Assert OpenCV Loaded. */
3332
if (!OpenCVLoader.initDebug()) {
3433
Toast.makeText(this, "OpenCV Not Loaded!!!", Toast.LENGTH_LONG).show()
3534
Log.e(packageName, "OpenCV Failed to Load.")
3635
throw IllegalStateException("OpenCV Missing")
3736
}
3837

39-
/**
40-
* Initialize BASIC's meta If not Exist
41-
*/
38+
/** Initialize BASIC's meta If NOT EXIST. */
4239
File(getDir(BASIC_SCRIPT_TYPE, MODE_PRIVATE), "meta.json").run {
4340
if (createNewFile()) {
4441
val data = Gson().toJson(

app/src/main/java/com/tranquilrock/androidscript/activity/EditActivity.kt

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@ import android.content.Intent
44
import android.media.projection.MediaProjectionManager
55
import androidx.appcompat.app.AppCompatActivity
66
import android.os.Bundle
7-
import com.tranquilrock.androidscript.R
8-
import android.view.View
7+
import android.util.Log
98
import androidx.recyclerview.widget.DividerItemDecoration
109
import androidx.recyclerview.widget.GridLayoutManager
1110
import androidx.recyclerview.widget.LinearLayoutManager
12-
import androidx.recyclerview.widget.RecyclerView
1311
import com.tranquilrock.androidscript.feature.InternalStorageUser
1412
import com.tranquilrock.androidscript.component.editor.BlockAdapter
1513
import com.tranquilrock.androidscript.component.editor.ButtonAdapter
1614
import android.widget.Toast
17-
import android.widget.ToggleButton
1815
import androidx.activity.result.contract.ActivityResultContracts
16+
import com.google.gson.Gson
17+
import com.google.gson.JsonSyntaxException
1918
import com.tranquilrock.androidscript.App.Companion.BLOCK_DATA_KEY
20-
import com.tranquilrock.androidscript.App.Companion.BLOCK_META_KEY
2119
import com.tranquilrock.androidscript.App.Companion.MEDIA_PROJECTION_KEY
2220
import com.tranquilrock.androidscript.App.Companion.ORIENTATION_KEY
2321
import com.tranquilrock.androidscript.App.Companion.SCRIPT_NAME_KEY
2422
import com.tranquilrock.androidscript.App.Companion.SCRIPT_TYPE_KEY
23+
import com.tranquilrock.androidscript.databinding.ActivityEditBinding
2524
import com.tranquilrock.androidscript.feature.PermissionRequester
2625
import com.tranquilrock.androidscript.service.WidgetService
26+
import java.io.IOException
2727

2828
/**
2929
* UI for editing scripts.
@@ -37,33 +37,40 @@ import com.tranquilrock.androidscript.service.WidgetService
3737
* [{"first":"Exit","second":[]},{"first":"Call","second":["EditText", "Placeholder"]}]
3838
* */
3939
class EditActivity : AppCompatActivity(), InternalStorageUser, PermissionRequester {
40-
private lateinit var toggleOrientation: ToggleButton
41-
private lateinit var blockView: RecyclerView
42-
private lateinit var buttonView: RecyclerView
40+
4341
private lateinit var blockData: ArrayList<ArrayList<String>>
4442
private lateinit var blockMeta: Array<Pair<String, List<List<String>>>>
4543
private lateinit var fileName: String
4644
private lateinit var scriptClass: String
45+
private lateinit var binding: ActivityEditBinding
4746

4847

4948
override fun onCreate(savedInstanceState: Bundle?) {
5049
super.onCreate(savedInstanceState)
51-
setContentView(R.layout.activity_edit)
52-
toggleOrientation = findViewById(R.id.toggle_orientation)
53-
54-
buttonView = findViewById(R.id.edit_button_grid)
55-
blockView = findViewById(R.id.edit_code_grid)
50+
binding = ActivityEditBinding.inflate(layoutInflater)
51+
setContentView(binding.root)
5652

5753
scriptClass = intent.getStringExtra(SCRIPT_TYPE_KEY)!!
5854
fileName = intent.getStringExtra(SCRIPT_NAME_KEY)!!
5955

60-
blockMeta = getMetadata(this, scriptClass)
61-
blockData = getScript(this, scriptClass, fileName)
56+
try {
57+
blockMeta = getMetadata(this, scriptClass)
58+
} catch (e: JsonSyntaxException) {
59+
e.printStackTrace()
60+
Log.e(TAG, "Meta file format error!")
61+
}
62+
63+
try {
64+
blockData = getScript(this, scriptClass, fileName)
65+
} catch (e: IOException) {
66+
e.printStackTrace()
67+
Log.e(TAG, "Reading block file error!")
68+
}
6269

6370
val mediaProjectionLauncher = registerForActivityResult(
6471
ActivityResultContracts.StartActivityForResult()
6572
) { result ->
66-
if (result.resultCode == RESULT_OK) {
73+
if (result.resultCode == RESULT_OK && result.data != null) {
6774
startWidgetService(result.data!!)
6875
} else {
6976
Toast.makeText(
@@ -72,7 +79,7 @@ class EditActivity : AppCompatActivity(), InternalStorageUser, PermissionRequest
7279
}
7380
}
7481

75-
findViewById<View>(R.id.start_service).setOnClickListener {
82+
binding.startService.setOnClickListener {
7683
for (block in blockData) {
7784
if (block.contains("")) {
7885
Toast.makeText(
@@ -93,43 +100,51 @@ class EditActivity : AppCompatActivity(), InternalStorageUser, PermissionRequest
93100
}
94101
}
95102

96-
findViewById<View>(R.id.save_file).setOnClickListener {
103+
binding.saveFile.setOnClickListener {
97104
saveScript(this, scriptClass, fileName, blockData)
98105
Toast.makeText(
99106
this, "File Saved", Toast.LENGTH_LONG
100107
).show()
101108
}
102109

103-
blockView.run {
110+
binding.editCodeGrid.run {
104111
layoutManager = LinearLayoutManager(this@EditActivity)
112+
adapter = BlockAdapter(blockMeta, blockData)
105113
addItemDecoration(
106114
DividerItemDecoration(
107115
this@EditActivity, DividerItemDecoration.VERTICAL
108116
)
109117
)
110-
adapter = BlockAdapter(blockMeta, blockData)
111118
}
112119

113-
buttonView.run {
120+
binding.editButtonGrid.run {
114121
layoutManager = GridLayoutManager(this@EditActivity, 2)
115-
buttonView.adapter = ButtonAdapter(
122+
adapter = ButtonAdapter(
116123
blockMeta,
117124
blockData,
118-
(blockView.adapter as BlockAdapter).onOrderChange,
125+
(binding.editCodeGrid.adapter as BlockAdapter).onOrderChange,
119126
)
120127
}
121128
}
122129

123130
private fun startWidgetService(data: Intent) {
131+
val blockCopy = Gson().fromJson(Gson().toJson(blockData), Array<Array<String>>::class.java)
132+
blockCopy.forEach {
133+
it[0] = blockMeta[it[0].toInt()].first
134+
}
135+
124136
val startServiceIntent = Intent(this, WidgetService::class.java).apply {
125137
putExtra(SCRIPT_TYPE_KEY, scriptClass)
126138
putExtra(MEDIA_PROJECTION_KEY, data)
127-
putExtra(BLOCK_DATA_KEY, blockData)
128-
putExtra(BLOCK_META_KEY, blockMeta)
129-
putExtra(ORIENTATION_KEY, toggleOrientation.isChecked)
139+
putExtra(BLOCK_DATA_KEY, Gson().toJson(blockCopy))
140+
putExtra(ORIENTATION_KEY, binding.toggleOrientation.isChecked)
130141
}
131142

132143
this.startService(startServiceIntent)
133144
finishAffinity()
134145
}
146+
147+
companion object {
148+
val TAG: String = EditActivity::class.java.simpleName
149+
}
135150
}

app/src/main/java/com/tranquilrock/androidscript/activity/ManageActivity.kt

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,77 @@ package com.tranquilrock.androidscript.activity
22

33
import android.content.Intent
44
import android.graphics.Bitmap
5-
import android.graphics.ImageDecoder
6-
import android.net.Uri
75
import android.os.Bundle
8-
import android.widget.Button
6+
import android.webkit.MimeTypeMap
7+
import android.widget.Toast
98
import androidx.activity.result.ActivityResult
109
import androidx.activity.result.contract.ActivityResultContracts
1110
import androidx.appcompat.app.AppCompatActivity
12-
import com.tranquilrock.androidscript.R
11+
import androidx.recyclerview.widget.DividerItemDecoration
12+
import androidx.recyclerview.widget.LinearLayoutManager
13+
import com.tranquilrock.androidscript.App
14+
import com.tranquilrock.androidscript.component.manage.ManageAdapter
15+
import com.tranquilrock.androidscript.databinding.ActivityManageBinding
1316
import com.tranquilrock.androidscript.feature.InternalStorageUser
14-
import java.io.FileNotFoundException
15-
import java.io.IOException
16-
17+
import com.tranquilrock.androidscript.feature.InternalStorageUser.Companion.IMAGE_UPLOAD_EXTENSION
18+
import com.tranquilrock.androidscript.utils.ResourceRemover
1719

20+
// TODO recycler view to list images with remove button
1821
class ManageActivity : AppCompatActivity(), InternalStorageUser {
1922

23+
private lateinit var binding: ActivityManageBinding
24+
private lateinit var scriptClass: String
25+
2026
override fun onCreate(savedInstanceState: Bundle?) {
2127
super.onCreate(savedInstanceState)
22-
setContentView(R.layout.activity_manage)
23-
findViewById<Button>(R.id.manage_add).setOnClickListener {
24-
imageChooser()
28+
binding = ActivityManageBinding.inflate(layoutInflater)
29+
setContentView(binding.root)
30+
31+
binding.manageAdd.setOnClickListener {
32+
Intent().run {
33+
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(IMAGE_UPLOAD_EXTENSION)
34+
action = Intent.ACTION_GET_CONTENT
35+
uploadImage.launch(this)
36+
}
2537
}
38+
39+
scriptClass = intent.getStringExtra(App.SCRIPT_TYPE_KEY)!!
2640
}
2741

28-
private fun imageChooser() {
29-
val i = Intent()
30-
i.type = "image/*"
31-
i.action = Intent.ACTION_GET_CONTENT
32-
launchSomeActivity.launch(i)
42+
override fun onResume() {
43+
super.onResume()
44+
// TODO on item add instead of all from scratch?
45+
val data = mutableListOf<Pair<String, Bitmap?>>()
46+
for (script in getScriptList(this, scriptClass)) {
47+
data.add(Pair(script, null))
48+
}
49+
for (imageName in getImageList(this, scriptClass)) {
50+
data.add(Pair(imageName, getImage(this, scriptClass, imageName)))
51+
}
52+
53+
binding.manageResourceGrid.run {
54+
layoutManager = LinearLayoutManager(this@ManageActivity)
55+
adapter = ManageAdapter(data, ResourceRemover(this@ManageActivity, scriptClass))
56+
addItemDecoration(
57+
DividerItemDecoration(
58+
this@ManageActivity, DividerItemDecoration.VERTICAL
59+
)
60+
)
61+
}
3362
}
3463

35-
private var launchSomeActivity = registerForActivityResult (
64+
private var uploadImage = registerForActivityResult(
3665
ActivityResultContracts.StartActivityForResult()
3766
) { result: ActivityResult ->
3867
if (result.resultCode == RESULT_OK) {
39-
val data = result.data
40-
if (data != null && data.data != null) {
41-
val selectedImageUri = data.data
42-
saveImage(this, "FGO", "a", getImage(selectedImageUri!!))
43-
}
68+
result.data?.data?.run {
69+
saveImage(
70+
this@ManageActivity, scriptClass, "a", getImage(this@ManageActivity, this)
71+
)
72+
Toast.makeText(this@ManageActivity, "File Uploaded!", Toast.LENGTH_SHORT).show()
73+
} ?: Toast.makeText(this@ManageActivity, "File Failed!", Toast.LENGTH_SHORT).show()
74+
} else {
75+
Toast.makeText(this, "No File Selected!", Toast.LENGTH_SHORT).show()
4476
}
4577
}
46-
47-
@Throws(FileNotFoundException::class, IOException::class)
48-
fun getImage(uri: Uri): Bitmap {
49-
val source = ImageDecoder.createSource(this.contentResolver, uri)
50-
return ImageDecoder.decodeBitmap(source)
51-
}
5278
}

app/src/main/java/com/tranquilrock/androidscript/activity/Menu.kt

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)