Skip to content

Commit 619c354

Browse files
authored
Merge pull request #22 from TranquilRock/dev
Improvment & Feature stubs
2 parents 68ef2ca + d353bd7 commit 619c354

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1315
-1987
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
<!-- Activity -->
3333
<activity
3434
android:name=".activity.Menu"
35+
android:configChanges="orientation|keyboardHidden"
3536
android:exported="true"
36-
android:screenOrientation="locked">
37+
android:screenOrientation="portrait"
38+
tools:ignore="LockedOrientationActivity">
3739
<intent-filter>
3840
<action android:name="android.intent.action.MAIN" />
3941

@@ -42,15 +44,25 @@
4244
</activity>
4345
<activity
4446
android:name=".activity.SelectActivity"
47+
android:configChanges="orientation|keyboardHidden"
4548
android:exported="false"
46-
android:screenOrientation="locked"
47-
android:windowSoftInputMode="adjustResize" />
49+
android:screenOrientation="portrait"
50+
android:windowSoftInputMode="adjustResize"
51+
tools:ignore="LockedOrientationActivity" />
4852
<activity
49-
android:name=".activity.editor.EditActivity"
53+
android:name=".activity.EditActivity"
54+
android:configChanges="orientation|keyboardHidden"
5055
android:exported="false"
51-
android:screenOrientation="locked"
52-
android:windowSoftInputMode="adjustResize" />
53-
56+
android:screenOrientation="portrait"
57+
android:windowSoftInputMode="adjustResize"
58+
tools:ignore="LockedOrientationActivity" />
59+
<activity
60+
android:name=".activity.ManageActivity"
61+
android:configChanges="orientation|keyboardHidden"
62+
android:exported="false"
63+
android:screenOrientation="portrait"
64+
android:windowSoftInputMode="adjustResize"
65+
tools:ignore="LockedOrientationActivity" />
5466
<!-- Service -->
5567
<service
5668
android:name=".service.WidgetService"

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
/*
2-
* https://developer.android.com/reference/android/app/Application
3-
* Holds the global application state.
4-
*/
51
package com.tranquilrock.androidscript
62

73
import android.app.Application
84
import android.util.Log
5+
import android.widget.Toast
6+
import com.google.gson.Gson
7+
import com.tranquilrock.androidscript.core.Command
8+
import org.opencv.android.OpenCVLoader
9+
import java.io.File
10+
import java.lang.IllegalStateException
11+
import kotlin.system.exitProcess
912

13+
/**
14+
* Application's global states.
15+
*
16+
* Handles OpenCV check and setup the default exception handler.
17+
*/
1018
class App : Application() {
1119
companion object {
1220
const val BLOCK_DATA_KEY = "BLOCK_DATA_KEY"
@@ -21,5 +29,26 @@ class App : Application() {
2129
override fun onCreate() {
2230
super.onCreate()
2331
Log.d(packageName, "onCreate")
32+
33+
if (!OpenCVLoader.initDebug()) {
34+
Toast.makeText(this, "OpenCV Not Loaded!!!", Toast.LENGTH_LONG).show()
35+
Log.e(packageName, "OpenCV Failed to Load.")
36+
throw IllegalStateException("OpenCV Missing")
37+
}
38+
39+
/**
40+
* Initialize BASIC's meta If not Exist
41+
*/
42+
File(getDir(BASIC_SCRIPT_TYPE, MODE_PRIVATE), "meta.json").run {
43+
if (createNewFile()) {
44+
val data = Gson().toJson(
45+
Command.BASIC_META
46+
)
47+
bufferedWriter().run {
48+
use { out -> out.write(data) }
49+
close()
50+
}
51+
}
52+
}
2453
}
2554
}

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

Lines changed: 52 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,18 @@
1-
/* UI for editing scripts.
2-
* This will read from scriptClass.meta to get blocks and buttons definition, for example:
3-
* {
4-
* "Exit": [],
5-
* "Call": ["file", "arg1"],
6-
* "ClickPic": ["Pic"],
7-
* }
8-
* {"Exit":"[]","T":"[(Spinner, [1, 2, 3]), (EditText, [Placeholder])]"}
9-
* */
10-
package com.tranquilrock.androidscript.activity.editor
1+
package com.tranquilrock.androidscript.activity
112

123
import android.content.Intent
134
import android.media.projection.MediaProjectionManager
145
import androidx.appcompat.app.AppCompatActivity
156
import android.os.Bundle
16-
import android.util.Log
177
import com.tranquilrock.androidscript.R
188
import android.view.View
199
import androidx.recyclerview.widget.DividerItemDecoration
2010
import androidx.recyclerview.widget.GridLayoutManager
2111
import androidx.recyclerview.widget.LinearLayoutManager
2212
import androidx.recyclerview.widget.RecyclerView
23-
import com.tranquilrock.androidscript.feature.InternalStorageReader
24-
import com.tranquilrock.androidscript.activity.editor.component.BlockAdapter
25-
import com.tranquilrock.androidscript.activity.editor.component.ButtonAdapter
13+
import com.tranquilrock.androidscript.feature.InternalStorageUser
14+
import com.tranquilrock.androidscript.component.editor.BlockAdapter
15+
import com.tranquilrock.androidscript.component.editor.ButtonAdapter
2616
import android.widget.Toast
2717
import android.widget.ToggleButton
2818
import androidx.activity.result.contract.ActivityResultContracts
@@ -35,83 +25,99 @@ import com.tranquilrock.androidscript.App.Companion.SCRIPT_TYPE_KEY
3525
import com.tranquilrock.androidscript.feature.PermissionRequester
3626
import com.tranquilrock.androidscript.service.WidgetService
3727

38-
class EditActivity : AppCompatActivity(), InternalStorageReader, PermissionRequester {
28+
/**
29+
* UI for editing scripts.
30+
* This will read from scriptClass.meta to get blocks and buttons definition, for example:
31+
* [
32+
* Pair("Exit", []),
33+
* Pair("Call", ["EditText", "Placeholder"]),
34+
* ...
35+
* ]
36+
* will be stored as:
37+
* [{"first":"Exit","second":[]},{"first":"Call","second":["EditText", "Placeholder"]}]
38+
* */
39+
class EditActivity : AppCompatActivity(), InternalStorageUser, PermissionRequester {
3940
private lateinit var toggleOrientation: ToggleButton
4041
private lateinit var blockView: RecyclerView
4142
private lateinit var buttonView: RecyclerView
4243
private lateinit var blockData: ArrayList<ArrayList<String>>
43-
private lateinit var blockMeta: Array<Array<Any>>
44+
private lateinit var blockMeta: Array<Pair<String, List<List<String>>>>
4445
private lateinit var fileName: String
4546
private lateinit var scriptClass: String
4647

4748

4849
override fun onCreate(savedInstanceState: Bundle?) {
4950
super.onCreate(savedInstanceState)
5051
setContentView(R.layout.activity_edit)
51-
toggleOrientation = findViewById<ToggleButton?>(R.id.toggle_orientation)
52+
toggleOrientation = findViewById(R.id.toggle_orientation)
5253

5354
buttonView = findViewById(R.id.edit_button_grid)
5455
blockView = findViewById(R.id.edit_code_grid)
5556

5657
scriptClass = intent.getStringExtra(SCRIPT_TYPE_KEY)!!
5758
fileName = intent.getStringExtra(SCRIPT_NAME_KEY)!!
5859

59-
blockMeta = getMetadata(this, scriptClass).also {
60-
Log.d(TAG, "Metadata: $it")
61-
}
62-
blockData = getScript(this, scriptClass, fileName).also {
63-
Log.d(TAG, "Block data: $it")
64-
}
65-
60+
blockMeta = getMetadata(this, scriptClass)
61+
blockData = getScript(this, scriptClass, fileName)
6662

67-
val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
68-
69-
val startMediaProjection = registerForActivityResult(
63+
val mediaProjectionLauncher = registerForActivityResult(
7064
ActivityResultContracts.StartActivityForResult()
7165
) { result ->
7266
if (result.resultCode == RESULT_OK) {
7367
startWidgetService(result.data!!)
7468
} else {
7569
Toast.makeText(
76-
this,
77-
"Please Enable Media Projection",
78-
Toast.LENGTH_LONG
70+
this, "Please Enable Media Projection", Toast.LENGTH_SHORT
7971
).show()
8072
}
8173
}
8274

8375
findViewById<View>(R.id.start_service).setOnClickListener {
76+
for (block in blockData) {
77+
if (block.contains("")) {
78+
Toast.makeText(
79+
this, "Block not filled.", Toast.LENGTH_SHORT
80+
).show()
81+
return@setOnClickListener
82+
}
83+
}
84+
8485
if (!canDrawOverlays(this)) {
85-
Log.d(TAG, "Requesting Overlays")
8686
requestDrawOverlays(this)
8787
} else if (!accessibilityEnabled(contentResolver)) {
8888
requestAccessibility(this)
89-
Log.d(TAG, "Requesting Accessibility")
9089
} else {
91-
startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())
92-
// Start Service Within Callback.
90+
mediaProjectionLauncher.launch(
91+
getSystemService(MediaProjectionManager::class.java).createScreenCaptureIntent()
92+
)
9393
}
9494
}
9595

9696
findViewById<View>(R.id.save_file).setOnClickListener {
9797
saveScript(this, scriptClass, fileName, blockData)
9898
Toast.makeText(
99-
this,
100-
"File Saved",
101-
Toast.LENGTH_LONG
99+
this, "File Saved", Toast.LENGTH_LONG
102100
).show()
103101
}
104102

105-
blockView.layoutManager = LinearLayoutManager(this)
106-
blockView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
107-
blockView.adapter = BlockAdapter(blockMeta, blockData)
103+
blockView.run {
104+
layoutManager = LinearLayoutManager(this@EditActivity)
105+
addItemDecoration(
106+
DividerItemDecoration(
107+
this@EditActivity, DividerItemDecoration.VERTICAL
108+
)
109+
)
110+
adapter = BlockAdapter(blockMeta, blockData)
111+
}
108112

109-
buttonView.layoutManager = GridLayoutManager(this, 2)
110-
buttonView.adapter = ButtonAdapter(
111-
blockMeta,
112-
blockData,
113-
(blockView.adapter as BlockAdapter).onOrderChange,
114-
)
113+
buttonView.run {
114+
layoutManager = GridLayoutManager(this@EditActivity, 2)
115+
buttonView.adapter = ButtonAdapter(
116+
blockMeta,
117+
blockData,
118+
(blockView.adapter as BlockAdapter).onOrderChange,
119+
)
120+
}
115121
}
116122

117123
private fun startWidgetService(data: Intent) {
@@ -125,10 +131,5 @@ class EditActivity : AppCompatActivity(), InternalStorageReader, PermissionReque
125131

126132
this.startService(startServiceIntent)
127133
finishAffinity()
128-
Log.d(TAG, "Start Service")
129-
}
130-
131-
companion object {
132-
private val TAG = EditActivity::class.java.simpleName
133134
}
134135
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.tranquilrock.androidscript.activity
2+
3+
import android.content.Intent
4+
import android.graphics.Bitmap
5+
import android.graphics.ImageDecoder
6+
import android.net.Uri
7+
import android.os.Bundle
8+
import android.widget.Button
9+
import androidx.activity.result.ActivityResult
10+
import androidx.activity.result.contract.ActivityResultContracts
11+
import androidx.appcompat.app.AppCompatActivity
12+
import com.tranquilrock.androidscript.R
13+
import com.tranquilrock.androidscript.feature.InternalStorageUser
14+
import java.io.FileNotFoundException
15+
import java.io.IOException
16+
17+
18+
class ManageActivity : AppCompatActivity(), InternalStorageUser {
19+
20+
override fun onCreate(savedInstanceState: Bundle?) {
21+
super.onCreate(savedInstanceState)
22+
setContentView(R.layout.activity_manage)
23+
findViewById<Button>(R.id.manage_add).setOnClickListener {
24+
imageChooser()
25+
}
26+
}
27+
28+
private fun imageChooser() {
29+
val i = Intent()
30+
i.type = "image/*"
31+
i.action = Intent.ACTION_GET_CONTENT
32+
launchSomeActivity.launch(i)
33+
}
34+
35+
private var launchSomeActivity = registerForActivityResult (
36+
ActivityResultContracts.StartActivityForResult()
37+
) { result: ActivityResult ->
38+
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+
}
44+
}
45+
}
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+
}
52+
}

0 commit comments

Comments
 (0)