11package com.mcal.disassembler.activities
22
3- import android.annotation.SuppressLint
4- import android.app.ProgressDialog
53import android.os.Bundle
6- import android.os.Handler
7- import android.os.Message
84import android.text.Editable
95import android.text.TextUtils
106import android.text.TextWatcher
117import android.view.MenuItem
128import android.view.View
9+ import androidx.appcompat.app.AlertDialog
1310import androidx.appcompat.app.AppCompatActivity
1411import androidx.recyclerview.widget.LinearLayoutManager
12+ import com.google.android.material.dialog.MaterialAlertDialogBuilder
1513import com.mcal.disassembler.R
1614import com.mcal.disassembler.adapters.SymbolsListAdapter
1715import com.mcal.disassembler.data.Storage.getHomeDir
16+ import com.mcal.disassembler.databinding.ProgressDialogBinding
1817import com.mcal.disassembler.databinding.SymbolsActivityBinding
1918import com.mcal.disassembler.nativeapi.Dumper
2019import com.mcal.disassembler.utils.FileSaver
2120import com.mcal.disassembler.view.FloatingButton
2221import 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
2427class 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" )
0 commit comments