Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
dd62fe89
Commit
dd62fe89
authored
Jul 17, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use CallbackList for collecting STDOUT in flash screen
Fix #2988
parent
ec2d7d77
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
21 additions
and
100 deletions
+21
-100
XJava.kt
app/src/main/java/com/topjohnwu/magisk/ktx/XJava.kt
+12
-6
XList.kt
app/src/main/java/com/topjohnwu/magisk/ktx/XList.kt
+0
-87
FlashViewModel.kt
...main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt
+9
-7
No files found.
app/src/main/java/com/topjohnwu/magisk/ktx/XJava.kt
View file @
dd62fe89
package
com.topjohnwu.magisk.ktx
import
android.os.Build
import
androidx.collection.SparseArrayCompat
import
timber.log.Timber
import
java.io.File
import
java.io.InputStream
...
...
@@ -11,7 +12,6 @@ import java.text.SimpleDateFormat
import
java.util.*
import
java.util.zip.ZipEntry
import
java.util.zip.ZipInputStream
import
kotlin.NoSuchElementException
fun
ZipInputStream
.
forEach
(
callback
:
(
ZipEntry
)
->
Unit
)
{
var
entry
:
ZipEntry
?
=
nextEntry
...
...
@@ -36,13 +36,19 @@ inline fun <In : InputStream, Out : OutputStream> withStreams(
}
}
inline
fun
<
T
,
R
>
List
<
T
>.
firstMap
(
mapper
:
(
T
)
->
R
?):
R
{
for
(
item
:
T
in
this
)
{
return
mapper
(
item
)
?:
continue
}
throw
NoSuchElementException
(
"Collection contains no element matching the predicate."
)
fun
<
T
>
MutableList
<
T
>.
update
(
newList
:
List
<
T
>)
{
clear
()
addAll
(
newList
)
}
operator
fun
<
E
>
SparseArrayCompat
<
E
>.
set
(
key
:
Int
,
value
:
E
)
{
put
(
key
,
value
)
}
fun
<
T
>
MutableList
<
T
>.
synchronized
()
=
Collections
.
synchronizedList
(
this
)
fun
<
T
>
MutableSet
<
T
>.
synchronized
()
=
Collections
.
synchronizedSet
(
this
)
fun
<
K
,
V
>
MutableMap
<
K
,
V
>.
synchronized
()
=
Collections
.
synchronizedMap
(
this
)
fun
String
.
langTagToLocale
():
Locale
{
if
(
Build
.
VERSION
.
SDK_INT
>=
21
)
{
return
Locale
.
forLanguageTag
(
this
)
...
...
app/src/main/java/com/topjohnwu/magisk/ktx/XList.kt
deleted
100644 → 0
View file @
ec2d7d77
package
com.topjohnwu.magisk.ktx
import
androidx.collection.SparseArrayCompat
import
androidx.databinding.ObservableList
import
com.topjohnwu.magisk.utils.DiffObservableList
import
kotlinx.coroutines.*
fun
<
T
>
MutableList
<
T
>.
update
(
newList
:
List
<
T
>)
{
clear
()
addAll
(
newList
)
}
fun
List
<
String
>.
toShellCmd
():
String
{
val
sb
=
StringBuilder
()
for
(
s
in
this
)
{
if
(
s
.
contains
(
" "
))
{
sb
.
append
(
'"'
).
append
(
s
).
append
(
'"'
)
}
else
{
sb
.
append
(
s
)
}
sb
.
append
(
' '
)
}
sb
.
deleteCharAt
(
sb
.
length
-
1
)
return
sb
.
toString
()
}
fun
<
T1
,
T2
>
ObservableList
<
T1
>.
sendUpdatesTo
(
target
:
DiffObservableList
<
T2
>,
scope
:
CoroutineScope
,
mapper
:
(
List
<
T1
>)
->
List
<
T2
>
)
=
addOnListChangedCallback
(
object
:
ObservableList
.
OnListChangedCallback
<
ObservableList
<
T1
>>()
{
override
fun
onChanged
(
sender
:
ObservableList
<
T1
>?)
{
updateAsync
(
sender
?:
return
)
}
override
fun
onItemRangeRemoved
(
sender
:
ObservableList
<
T1
>?,
p0
:
Int
,
p1
:
Int
)
{
updateAsync
(
sender
?:
return
)
}
override
fun
onItemRangeMoved
(
sender
:
ObservableList
<
T1
>?,
p0
:
Int
,
p1
:
Int
,
p2
:
Int
)
{
updateAsync
(
sender
?:
return
)
}
override
fun
onItemRangeInserted
(
sender
:
ObservableList
<
T1
>?,
p0
:
Int
,
p1
:
Int
)
{
updateAsync
(
sender
?:
return
)
}
override
fun
onItemRangeChanged
(
sender
:
ObservableList
<
T1
>?,
p0
:
Int
,
p1
:
Int
)
{
updateAsync
(
sender
?:
return
)
}
private
var
updater
:
Job
?
=
null
private
fun
updateAsync
(
sender
:
List
<
T1
>)
{
updater
?.
cancel
()
updater
=
scope
.
launch
{
val
(
list
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
list
=
mapper
(
sender
)
list
to
target
.
calculateDiff
(
list
)
}
target
.
update
(
list
,
diff
)
}
}
})
fun
<
T1
>
ObservableList
<
T1
>.
copyNewInputInto
(
target
:
MutableList
<
T1
>
)
=
addOnListChangedCallback
(
object
:
ObservableList
.
OnListChangedCallback
<
ObservableList
<
T1
>>()
{
override
fun
onChanged
(
p0
:
ObservableList
<
T1
>?)
=
Unit
override
fun
onItemRangeRemoved
(
p0
:
ObservableList
<
T1
>?,
p1
:
Int
,
p2
:
Int
)
=
Unit
override
fun
onItemRangeMoved
(
p0
:
ObservableList
<
T1
>?,
p1
:
Int
,
p2
:
Int
,
p3
:
Int
)
=
Unit
override
fun
onItemRangeChanged
(
p0
:
ObservableList
<
T1
>?,
p1
:
Int
,
p2
:
Int
)
=
Unit
override
fun
onItemRangeInserted
(
sender
:
ObservableList
<
T1
>?,
positionStart
:
Int
,
itemCount
:
Int
)
{
val
positionEnd
=
positionStart
+
itemCount
val
addedValues
=
sender
?.
slice
(
positionStart
until
positionEnd
).
orEmpty
()
target
.
addAll
(
addedValues
)
}
})
operator
fun
<
E
>
SparseArrayCompat
<
E
>.
set
(
key
:
Int
,
value
:
E
)
{
put
(
key
,
value
)
}
app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt
View file @
dd62fe89
...
...
@@ -4,7 +4,6 @@ import android.content.res.Resources
import
android.net.Uri
import
android.view.MenuItem
import
androidx.databinding.Bindable
import
androidx.databinding.ObservableArrayList
import
androidx.lifecycle.viewModelScope
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.R
...
...
@@ -21,12 +20,12 @@ import com.topjohnwu.magisk.ui.base.BaseViewModel
import
com.topjohnwu.magisk.ui.base.diffListOf
import
com.topjohnwu.magisk.ui.base.itemBindingOf
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.superuser.CallbackList
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
java.io.File
import
java.util.*
class
FlashViewModel
(
args
:
FlashFragmentArgs
,
...
...
@@ -45,13 +44,16 @@ class FlashViewModel(
val
items
=
diffListOf
<
ConsoleItem
>()
val
itemBinding
=
itemBindingOf
<
ConsoleItem
>()
private
val
outItems
=
ObservableArrayList
<
String
>()
private
val
logItems
=
Collections
.
synchronizedList
(
mutableListOf
<
String
>())
private
val
logItems
=
mutableListOf
<
String
>().
synchronized
()
private
val
outItems
=
object
:
CallbackList
<
String
>()
{
override
fun
onAddElement
(
e
:
String
?)
{
e
?:
return
items
.
add
(
ConsoleItem
(
e
))
logItems
.
add
(
e
)
}
}
init
{
outItems
.
sendUpdatesTo
(
items
,
viewModelScope
)
{
it
.
map
{
ConsoleItem
(
it
)
}
}
outItems
.
copyNewInputInto
(
logItems
)
args
.
dismissId
.
takeIf
{
it
!=
-
1
}
?.
also
{
Notifications
.
mgr
.
cancel
(
it
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment