Skip to content

Commit ec5147c

Browse files
committed
Show save progress
1 parent 8c2b498 commit ec5147c

6 files changed

Lines changed: 117 additions & 87 deletions

File tree

app/src/main/java/com/mcal/disassembler/activities/MainActivity.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import com.mcal.disassembler.nativeapi.Dumper
2525
import com.mcal.disassembler.utils.FileHelper
2626
import com.mcal.disassembler.utils.FilePickHelper
2727
import com.mcal.disassembler.view.CenteredToolBar
28+
import kotlinx.coroutines.CoroutineScope
29+
import kotlinx.coroutines.Dispatchers
30+
import kotlinx.coroutines.launch
2831
import java.io.File
2932
import java.io.FileOutputStream
3033

@@ -129,29 +132,27 @@ class MainActivity : AppCompatActivity(), MainView, Dumper.DumperListener {
129132
override fun loadSo(path: String) {
130133
showProgressDialog()
131134
this.path = path
132-
object : Thread() {
133-
override fun run() {
134-
DisassemblerDumper.load(path)
135-
Dumper.readData(this@MainActivity)
136-
toClassesActivity()
137-
}
138-
}.start()
135+
CoroutineScope(Dispatchers.IO).launch {
136+
DisassemblerDumper.load(path)
137+
Dumper.readData(this@MainActivity)
138+
toClassesActivity()
139+
}
139140
}
140141

141142
private fun showProgressDialog() {
142143
dialog = MaterialAlertDialogBuilder(this).apply {
143144
dialogBinding = ProgressDialogBinding.inflate(layoutInflater).also { binding ->
144145
setView(binding.root)
145146
}
147+
setCancelable(false)
146148
setTitle(R.string.loading)
147149
}.create().also {
148150
it.show()
149151
}
150152
}
151153

152154
private fun dismissProgressDialog() {
153-
dialog?.let {
154-
it.dismiss()
155+
dialog?.dismiss().also {
155156
dialog = null
156157
}
157158
dialogBinding = null
@@ -166,7 +167,7 @@ class MainActivity : AppCompatActivity(), MainView, Dumper.DumperListener {
166167
dismissProgressDialog()
167168
}
168169

169-
override fun updateProgress(last: Int, total: Int) {
170+
override fun updateDialogProgress(last: Int, total: Int) {
170171
runOnUiThread {
171172
dialogBinding?.let { binding ->
172173
val progressView = binding.progress

app/src/main/java/com/mcal/disassembler/activities/NameDemanglerActivity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.os.Bundle;
44
import android.view.MenuItem;
55
import android.view.View;
6-
import android.widget.EditText;
76

87
import androidx.appcompat.app.AppCompatActivity;
98

app/src/main/java/com/mcal/disassembler/activities/SymbolsActivity.kt

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
package com.mcal.disassembler.activities
22

3-
import android.annotation.SuppressLint
4-
import android.app.ProgressDialog
53
import android.os.Bundle
6-
import android.os.Handler
7-
import android.os.Message
84
import android.text.Editable
95
import android.text.TextUtils
106
import android.text.TextWatcher
117
import android.view.MenuItem
128
import android.view.View
9+
import androidx.appcompat.app.AlertDialog
1310
import androidx.appcompat.app.AppCompatActivity
1411
import androidx.recyclerview.widget.LinearLayoutManager
12+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1513
import com.mcal.disassembler.R
1614
import com.mcal.disassembler.adapters.SymbolsListAdapter
1715
import com.mcal.disassembler.data.Storage.getHomeDir
16+
import com.mcal.disassembler.databinding.ProgressDialogBinding
1817
import com.mcal.disassembler.databinding.SymbolsActivityBinding
1918
import com.mcal.disassembler.nativeapi.Dumper
2019
import com.mcal.disassembler.utils.FileSaver
2120
import com.mcal.disassembler.view.FloatingButton
2221
import com.mcal.disassembler.view.SnackBar
22+
import kotlinx.coroutines.CoroutineScope
23+
import kotlinx.coroutines.Dispatchers
24+
import kotlinx.coroutines.launch
25+
import kotlinx.coroutines.withContext
2326

2427
class SymbolsActivity : AppCompatActivity(), SymbolsListAdapter.SymbolItemClick {
2528
private val binding by lazy(LazyThreadSafetyMode.NONE) {
2629
SymbolsActivityBinding.inflate(layoutInflater)
2730
}
31+
private var dialogBinding: ProgressDialogBinding? = null
2832
private val data by lazy(LazyThreadSafetyMode.NONE) {
2933
val list = mutableListOf<Map<String, Any>>()
3034
var map: MutableMap<String, Any>
@@ -48,26 +52,10 @@ class SymbolsActivity : AppCompatActivity(), SymbolsListAdapter.SymbolItemClick
4852
}
4953

5054
private var path: String? = null
51-
private var mDialog: ProgressDialog? = null
55+
private var dialog: AlertDialog? = null
5256
private var mBar: SnackBar? = null
5357
private var lastValue: String? = null
5458

55-
@SuppressLint("HandlerLeak")
56-
private val mHandler: Handler = object : Handler() {
57-
override fun handleMessage(msg: Message) {
58-
super.handleMessage(msg)
59-
mDialog?.dismiss().also {
60-
mDialog = null
61-
}
62-
mBar?.show() ?: {
63-
SnackBar(
64-
this@SymbolsActivity,
65-
this@SymbolsActivity.getString(R.string.done)
66-
).show()
67-
}
68-
}
69-
}
70-
7159
public override fun onCreate(savedInstanceState: Bundle?) {
7260
super.onCreate(savedInstanceState)
7361
setContentView(binding.root)
@@ -147,37 +135,68 @@ class SymbolsActivity : AppCompatActivity(), SymbolsListAdapter.SymbolItemClick
147135
FloatingButton(this, path).show()
148136
}
149137

150-
fun saveSymbols(view: View?) {
151-
mDialog = ProgressDialog(this).apply {
152-
setTitle(getString(R.string.saving))
153-
}.also {
138+
private fun showProgressDialog() {
139+
dialog = MaterialAlertDialogBuilder(this).apply {
140+
dialogBinding = ProgressDialogBinding.inflate(layoutInflater).also { binding ->
141+
setView(binding.root)
142+
}
143+
setCancelable(false)
144+
setTitle(R.string.saving)
145+
}.create().also {
154146
it.show()
155147
}
148+
}
149+
150+
fun saveSymbols(view: View?) {
151+
showProgressDialog()
156152
mBar = SnackBar(this, getString(R.string.done))
157-
object : Thread() {
158-
override fun run() {
159-
val symbols = arrayOfNulls<String>(Dumper.symbols.size)
160-
for (i in Dumper.symbols.indices) {
161-
symbols[i] = Dumper.symbols[i].name
153+
CoroutineScope(Dispatchers.IO).launch {
154+
val size = Dumper.symbols.size
155+
val symbols = arrayOfNulls<String>(size)
156+
val demangledSymbols = arrayOfNulls<String>(size)
157+
for (i in Dumper.symbols.indices) {
158+
withContext(Dispatchers.Main) {
159+
updateDialogProgress(i, size)
160+
}
161+
symbols[i] = Dumper.symbols[i].name
162+
demangledSymbols[i] = Dumper.symbols[i].demangledName
163+
}
164+
FileSaver(
165+
getHomeDir(this@SymbolsActivity).path + "/Disassembler/symbols/",
166+
"Symbols.txt",
167+
symbols
168+
).save()
169+
FileSaver(
170+
getHomeDir(this@SymbolsActivity).path + "/Disassembler/symbols/",
171+
"Symbols_demangled.txt",
172+
demangledSymbols
173+
).save()
174+
withContext(Dispatchers.Main) {
175+
dialog?.dismiss().also {
176+
dialog = null
177+
dialogBinding = null
162178
}
163-
FileSaver(
164-
getHomeDir(this@SymbolsActivity).path + "/Disassembler/symbols/",
165-
"Symbols.txt",
166-
symbols
167-
).save()
168-
val demangledSymbols = arrayOfNulls<String>(Dumper.symbols.size)
169-
for (i in Dumper.symbols.indices) {
170-
demangledSymbols[i] = Dumper.symbols[i].demangledName
179+
mBar?.show() ?: run {
180+
SnackBar(
181+
this@SymbolsActivity,
182+
this@SymbolsActivity.getString(R.string.done)
183+
).show()
171184
}
172-
FileSaver(
173-
getHomeDir(this@SymbolsActivity).path + "/Disassembler/symbols/",
174-
"Symbols_demangled.txt",
175-
demangledSymbols
176-
).save()
177-
val msg = Message()
178-
mHandler.sendMessage(msg)
179185
}
180-
}.start()
186+
}
187+
}
188+
189+
private fun updateDialogProgress(last: Int, total: Int) {
190+
dialogBinding?.let { binding ->
191+
val progressView = binding.progress
192+
progressView.progress = last
193+
progressView.max = total
194+
binding.count.text = buildString {
195+
append(last)
196+
append(" / ")
197+
append(total)
198+
}
199+
}
181200
}
182201

183202
@Deprecated("Deprecated in Java")

app/src/main/java/com/mcal/disassembler/activities/VtableActivity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import android.content.Context;
55
import android.content.Intent;
66
import android.os.Bundle;
7-
import android.os.Environment;
87
import android.view.LayoutInflater;
98
import android.view.MenuItem;
109
import android.view.View;

app/src/main/java/com/mcal/disassembler/nativeapi/Dumper.java

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.mcal.disassembler.nativeapi
2+
3+
import kotlinx.coroutines.Dispatchers
4+
import kotlinx.coroutines.withContext
5+
import java.util.Vector
6+
7+
object Dumper {
8+
@JvmField
9+
var symbols = Vector<DisassemblerSymbol>()
10+
11+
@JvmField
12+
var exploed = Vector<DisassemblerVtable>()
13+
14+
@JvmField
15+
var classes = Vector<DisassemblerClass>()
16+
suspend fun readData(listener: DumperListener) {
17+
symbols.clear()
18+
exploed.clear()
19+
classes.clear()
20+
val size = DisassemblerDumper.getSize()
21+
for (i in 0 until size) {
22+
withContext(Dispatchers.Main) {
23+
listener.updateDialogProgress(i.toInt(), size.toInt())
24+
}
25+
var demangledName = DisassemblerDumper.getDemangledNameAt(i)
26+
if (demangledName == null || demangledName.isEmpty() || demangledName == " ") {
27+
demangledName = DisassemblerDumper.getNameAt(i)
28+
}
29+
val newSymbol = DisassemblerSymbol(
30+
DisassemblerDumper.getNameAt(i), demangledName, DisassemblerDumper.getTypeAt(
31+
i
32+
), DisassemblerDumper.getBindAt(i)
33+
)
34+
symbols.addElement(newSymbol)
35+
}
36+
}
37+
38+
interface DumperListener {
39+
fun updateDialogProgress(last: Int, total: Int)
40+
}
41+
}

0 commit comments

Comments
 (0)