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
7cc8c014
Commit
7cc8c014
authored
Apr 22, 2019
by
Viktor De Pasquale
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated log screen with new arch
parent
f21241d9
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
629 additions
and
71 deletions
+629
-71
ViewModelsModule.kt
...src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt
+2
-0
ConsoleRvItem.kt
...m/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt
+11
-0
LogRvItem.kt
...a/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt
+75
-0
ViewEvents.kt
...main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt
+3
-1
LogFragment.java
...rc/main/java/com/topjohnwu/magisk/ui/log/LogFragment.java
+0
-45
LogFragment.kt
app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt
+53
-0
LogViewModel.kt
...src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt
+122
-0
DataBindingAdapters.kt
...in/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt
+24
-0
XRx.kt
app/src/main/java/com/topjohnwu/magisk/utils/XRx.kt
+5
-1
fragment_log.xml
app/src/main/res/layout/fragment_log.xml
+36
-24
item_console.xml
app/src/main/res/layout/item_console.xml
+26
-0
item_page_log.xml
app/src/main/res/layout/item_page_log.xml
+37
-0
item_page_magisk_log.xml
app/src/main/res/layout/item_page_magisk_log.xml
+39
-0
item_superuser_log.xml
app/src/main/res/layout/item_superuser_log.xml
+84
-0
item_superuser_log_entry.xml
app/src/main/res/layout/item_superuser_log_entry.xml
+112
-0
No files found.
app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt
View file @
7cc8c014
...
...
@@ -3,6 +3,7 @@ package com.topjohnwu.magisk.di
import
com.topjohnwu.magisk.ui.MainViewModel
import
com.topjohnwu.magisk.ui.hide.HideViewModel
import
com.topjohnwu.magisk.ui.home.HomeViewModel
import
com.topjohnwu.magisk.ui.log.LogViewModel
import
com.topjohnwu.magisk.ui.module.ModuleViewModel
import
com.topjohnwu.magisk.ui.superuser.SuperuserViewModel
import
org.koin.androidx.viewmodel.dsl.viewModel
...
...
@@ -15,4 +16,5 @@ val viewModelModules = module {
viewModel
{
SuperuserViewModel
(
get
(),
get
(),
get
(),
get
())
}
viewModel
{
HideViewModel
(
get
(),
get
())
}
viewModel
{
ModuleViewModel
(
get
())
}
viewModel
{
LogViewModel
(
get
(),
get
())
}
}
app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ConsoleRvItem.kt
0 → 100644
View file @
7cc8c014
package
com.topjohnwu.magisk.model.entity.recycler
import
com.skoumal.teanity.databinding.ComparableRvItem
import
com.topjohnwu.magisk.R
class
ConsoleRvItem
(
val
item
:
String
)
:
ComparableRvItem
<
ConsoleRvItem
>()
{
override
val
layoutRes
:
Int
=
R
.
layout
.
item_console
override
fun
contentSameAs
(
other
:
ConsoleRvItem
)
=
itemSameAs
(
other
)
override
fun
itemSameAs
(
other
:
ConsoleRvItem
)
=
item
==
other
.
item
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt
0 → 100644
View file @
7cc8c014
package
com.topjohnwu.magisk.model.entity.recycler
import
androidx.databinding.ObservableList
import
com.skoumal.teanity.databinding.ComparableRvItem
import
com.skoumal.teanity.util.DiffObservableList
import
com.skoumal.teanity.util.KObservableField
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.model.entity.SuLogEntry
import
com.topjohnwu.magisk.utils.toggle
class
LogRvItem
:
ComparableRvItem
<
LogRvItem
>()
{
override
val
layoutRes
:
Int
=
R
.
layout
.
item_page_log
val
items
=
DiffObservableList
(
callback
)
fun
update
(
list
:
List
<
LogItemRvItem
>)
{
list
.
firstOrNull
()
?.
isExpanded
?.
value
=
true
items
.
update
(
list
)
}
//two of these will never be present, safe to assume it's unique
override
fun
contentSameAs
(
other
:
LogRvItem
):
Boolean
=
false
override
fun
itemSameAs
(
other
:
LogRvItem
):
Boolean
=
false
}
class
LogItemRvItem
(
val
items
:
ObservableList
<
ComparableRvItem
<*>>
)
:
ComparableRvItem
<
LogItemRvItem
>()
{
override
val
layoutRes
:
Int
=
R
.
layout
.
item_superuser_log
val
date
=
items
.
filterIsInstance
<
LogItemEntryRvItem
>().
firstOrNull
()
?.
item
?.
dateString
.
orEmpty
()
val
isExpanded
=
KObservableField
(
false
)
fun
toggle
()
=
isExpanded
.
toggle
()
override
fun
contentSameAs
(
other
:
LogItemRvItem
):
Boolean
=
items
.
any
{
!
other
.
items
.
contains
(
it
)
}
override
fun
itemSameAs
(
other
:
LogItemRvItem
):
Boolean
=
date
==
other
.
date
}
class
LogItemEntryRvItem
(
val
item
:
SuLogEntry
)
:
ComparableRvItem
<
LogItemEntryRvItem
>()
{
override
val
layoutRes
:
Int
=
R
.
layout
.
item_superuser_log_entry
val
isExpanded
=
KObservableField
(
false
)
fun
toggle
()
=
isExpanded
.
toggle
()
override
fun
contentSameAs
(
other
:
LogItemEntryRvItem
)
=
item
.
fromUid
==
other
.
item
.
fromUid
&&
item
.
toUid
==
other
.
item
.
toUid
&&
item
.
fromPid
==
other
.
item
.
fromPid
&&
item
.
packageName
==
other
.
item
.
packageName
&&
item
.
command
==
other
.
item
.
command
&&
item
.
action
==
other
.
item
.
action
&&
item
.
date
==
other
.
item
.
date
override
fun
itemSameAs
(
other
:
LogItemEntryRvItem
)
=
item
.
appName
==
other
.
item
.
appName
}
class
MagiskLogRvItem
:
ComparableRvItem
<
MagiskLogRvItem
>()
{
override
val
layoutRes
:
Int
=
R
.
layout
.
item_page_magisk_log
val
items
=
DiffObservableList
(
callback
)
fun
update
(
list
:
List
<
ConsoleRvItem
>)
{
items
.
update
(
list
)
}
//two of these will never be present, safe to assume it's unique
override
fun
contentSameAs
(
other
:
MagiskLogRvItem
):
Boolean
=
false
override
fun
itemSameAs
(
other
:
MagiskLogRvItem
):
Boolean
=
false
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/model/events/ViewEvents.kt
View file @
7cc8c014
...
...
@@ -24,3 +24,5 @@ class OpenFilePickerEvent : ViewEvent()
class
OpenChangelogEvent
(
val
item
:
Repo
)
:
ViewEvent
()
class
InstallModuleEvent
(
val
item
:
Repo
)
:
ViewEvent
()
class
PageChangedEvent
:
ViewEvent
()
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.java
deleted
100644 → 0
View file @
f21241d9
package
com
.
topjohnwu
.
magisk
.
ui
.
log
;
import
android.os.Bundle
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
androidx.viewpager.widget.ViewPager
;
import
com.google.android.material.tabs.TabLayout
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.model.adapters.TabFragmentAdapter
;
import
com.topjohnwu.magisk.ui.base.BaseFragment
;
import
butterknife.BindView
;
public
class
LogFragment
extends
BaseFragment
{
@BindView
(
R
.
id
.
container
)
ViewPager
viewPager
;
@BindView
(
R
.
id
.
tab
)
TabLayout
tab
;
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
ViewGroup
container
,
Bundle
savedInstanceState
)
{
// Inflate the layout for this fragment
View
v
=
inflater
.
inflate
(
R
.
layout
.
fragment_log
,
container
,
false
);
unbinder
=
new
LogFragment_ViewBinding
(
this
,
v
);
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
((MainActivity) requireActivity()).toolbar.setElevation(0);
}*/
TabFragmentAdapter
adapter
=
new
TabFragmentAdapter
(
getChildFragmentManager
());
adapter
.
addTab
(
new
SuLogFragment
(),
getString
(
R
.
string
.
superuser
));
adapter
.
addTab
(
new
MagiskLogFragment
(),
getString
(
R
.
string
.
magisk
));
tab
.
setupWithViewPager
(
viewPager
);
tab
.
setVisibility
(
View
.
VISIBLE
);
viewPager
.
setAdapter
(
adapter
);
return
v
;
}
}
app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt
0 → 100644
View file @
7cc8c014
package
com.topjohnwu.magisk.ui.log
import
android.os.Bundle
import
android.view.Menu
import
android.view.MenuInflater
import
android.view.MenuItem
import
android.view.View
import
com.skoumal.teanity.viewevents.ViewEvent
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.FragmentLogBinding
import
com.topjohnwu.magisk.model.events.PageChangedEvent
import
com.topjohnwu.magisk.ui.base.MagiskFragment
import
org.koin.androidx.viewmodel.ext.android.viewModel
class
LogFragment
:
MagiskFragment
<
LogViewModel
,
FragmentLogBinding
>()
{
override
val
layoutRes
:
Int
=
R
.
layout
.
fragment_log
override
val
viewModel
:
LogViewModel
by
viewModel
()
override
fun
onEventDispatched
(
event
:
ViewEvent
)
{
super
.
onEventDispatched
(
event
)
when
(
event
)
{
is
PageChangedEvent
->
magiskActivity
.
invalidateOptionsMenu
()
}
}
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
binding
.
logTabs
.
setupWithViewPager
(
binding
.
logContainer
,
true
)
}
override
fun
onStart
()
{
super
.
onStart
()
setHasOptionsMenu
(
true
)
magiskActivity
.
setTitle
(
R
.
string
.
log
)
}
override
fun
onCreateOptionsMenu
(
menu
:
Menu
,
inflater
:
MenuInflater
)
{
inflater
.
inflate
(
R
.
menu
.
menu_log
,
menu
)
menu
.
findItem
(
R
.
id
.
menu_save
).
isVisible
=
viewModel
.
currentPage
.
value
==
1
}
override
fun
onOptionsItemSelected
(
item
:
MenuItem
):
Boolean
{
when
(
item
.
itemId
)
{
R
.
id
.
menu_save
->
viewModel
.
saveLog
()
R
.
id
.
menu_clear
->
viewModel
.
clearLog
()
R
.
id
.
menu_refresh
->
viewModel
.
refresh
()
}
return
true
}
}
app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt
0 → 100644
View file @
7cc8c014
package
com.topjohnwu.magisk.ui.log
import
android.content.res.Resources
import
androidx.databinding.ObservableArrayList
import
com.skoumal.teanity.databinding.ComparableRvItem
import
com.skoumal.teanity.extensions.addOnPropertyChangedCallback
import
com.skoumal.teanity.extensions.doOnSuccessUi
import
com.skoumal.teanity.extensions.subscribeK
import
com.skoumal.teanity.util.DiffObservableList
import
com.skoumal.teanity.util.KObservableField
import
com.skoumal.teanity.viewevents.SnackbarEvent
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.Const
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.data.database.MagiskDB
import
com.topjohnwu.magisk.model.entity.recycler.*
import
com.topjohnwu.magisk.model.events.PageChangedEvent
import
com.topjohnwu.magisk.ui.base.MagiskViewModel
import
com.topjohnwu.magisk.utils.toSingle
import
com.topjohnwu.magisk.utils.zip
import
com.topjohnwu.superuser.Shell
import
io.reactivex.Single
import
me.tatarka.bindingcollectionadapter2.BindingViewPagerAdapter
import
me.tatarka.bindingcollectionadapter2.OnItemBind
import
java.io.File
import
java.io.IOException
import
java.util.*
class
LogViewModel
(
private
val
resources
:
Resources
,
private
val
database
:
MagiskDB
)
:
MagiskViewModel
(),
BindingViewPagerAdapter
.
PageTitles
<
ComparableRvItem
<*>>
{
val
items
=
DiffObservableList
(
ComparableRvItem
.
callback
)
val
itemBinding
=
OnItemBind
<
ComparableRvItem
<*>>
{
itemBinding
,
_
,
item
->
item
.
bind
(
itemBinding
)
itemBinding
.
bindExtra
(
BR
.
viewModel
,
this
@LogViewModel
)
}
val
currentPage
=
KObservableField
(
0
)
private
val
currentItem
get
()
=
items
[
currentPage
.
value
]
private
val
logItem
get
()
=
items
[
0
]
as
LogRvItem
private
val
magiskLogItem
get
()
=
items
[
1
]
as
MagiskLogRvItem
init
{
currentPage
.
addOnPropertyChangedCallback
{
it
?:
return
@addOnPropertyChangedCallback
PageChangedEvent
().
publish
()
}
items
.
addAll
(
listOf
(
LogRvItem
(),
MagiskLogRvItem
()))
refresh
()
}
override
fun
getPageTitle
(
position
:
Int
,
item
:
ComparableRvItem
<
*
>?)
=
when
(
item
)
{
is
LogRvItem
->
resources
.
getString
(
R
.
string
.
superuser
)
is
MagiskLogRvItem
->
resources
.
getString
(
R
.
string
.
magisk
)
else
->
""
}
fun
refresh
()
=
zip
(
updateLogs
(),
updateMagiskLog
())
{
_
,
_
->
true
}
.
subscribeK
()
.
add
()
fun
saveLog
()
{
val
now
=
Calendar
.
getInstance
()
val
filename
=
"magisk_log_%04d%02d%02d_%02d%02d%02d.log"
.
format
(
now
.
get
(
Calendar
.
YEAR
),
now
.
get
(
Calendar
.
MONTH
)
+
1
,
now
.
get
(
Calendar
.
DAY_OF_MONTH
),
now
.
get
(
Calendar
.
HOUR_OF_DAY
),
now
.
get
(
Calendar
.
MINUTE
),
now
.
get
(
Calendar
.
SECOND
)
)
val
logFile
=
File
(
Const
.
EXTERNAL_PATH
,
filename
)
try
{
logFile
.
createNewFile
()
}
catch
(
e
:
IOException
)
{
return
}
Shell
.
su
(
"cat ${Const.MAGISK_LOG} > $logFile"
).
submit
{
SnackbarEvent
(
logFile
.
path
).
publish
()
}
}
fun
clearLog
()
=
when
(
currentItem
)
{
is
LogRvItem
->
clearLogs
{
refresh
()
}
is
MagiskLogRvItem
->
clearMagiskLogs
{
refresh
()
}
else
->
Unit
}
private
fun
clearLogs
(
callback
:
()
->
Unit
)
{
Single
.
fromCallable
{
database
.
clearLogs
()
}
.
subscribeK
{
SnackbarEvent
(
R
.
string
.
logs_cleared
).
publish
()
callback
()
}
.
add
()
}
private
fun
clearMagiskLogs
(
callback
:
()
->
Unit
)
{
Shell
.
su
(
"echo -n > "
+
Const
.
MAGISK_LOG
).
submit
{
SnackbarEvent
(
R
.
string
.
logs_cleared
).
publish
()
callback
()
}
}
private
fun
updateLogs
()
=
Single
.
fromCallable
{
database
.
logs
}
.
flattenAsFlowable
{
it
}
.
map
{
it
.
map
{
LogItemEntryRvItem
(
it
)
}
}
.
map
{
LogItemRvItem
(
ObservableArrayList
<
ComparableRvItem
<*>>().
apply
{
addAll
(
it
)
})
}
.
toList
()
.
doOnSuccessUi
{
logItem
.
update
(
it
)
}
private
fun
updateMagiskLog
()
=
Shell
.
su
(
"tail -n 5000 ${Const.MAGISK_LOG}"
).
toSingle
()
.
map
{
it
.
exec
()
}
.
map
{
it
.
out
}
.
flattenAsFlowable
{
it
}
.
map
{
ConsoleRvItem
(
it
)
}
.
toList
()
.
doOnSuccessUi
{
magiskLogItem
.
update
(
it
)
}
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt
View file @
7cc8c014
...
...
@@ -6,7 +6,10 @@ import androidx.annotation.DrawableRes
import
androidx.appcompat.widget.AppCompatImageView
import
androidx.appcompat.widget.Toolbar
import
androidx.databinding.BindingAdapter
import
androidx.databinding.InverseBindingAdapter
import
androidx.databinding.InverseBindingListener
import
androidx.drawerlayout.widget.DrawerLayout
import
androidx.viewpager.widget.ViewPager
import
com.google.android.material.navigation.NavigationView
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.model.entity.state.IndeterminateState
...
...
@@ -57,3 +60,24 @@ fun setChecked(view: AppCompatImageView, isChecked: IndeterminateState) {
}
)
}
@BindingAdapter
(
"position"
)
fun
setPosition
(
view
:
ViewPager
,
position
:
Int
)
{
view
.
currentItem
=
position
}
@InverseBindingAdapter
(
attribute
=
"position"
,
event
=
"positionChanged"
)
fun
getPosition
(
view
:
ViewPager
)
=
view
.
currentItem
@BindingAdapter
(
"positionChanged"
)
fun
setPositionChangedListener
(
view
:
ViewPager
,
listener
:
InverseBindingListener
)
{
view
.
addOnPageChangeListener
(
object
:
ViewPager
.
OnPageChangeListener
{
override
fun
onPageSelected
(
position
:
Int
)
=
listener
.
onChange
()
override
fun
onPageScrollStateChanged
(
state
:
Int
)
=
listener
.
onChange
()
override
fun
onPageScrolled
(
position
:
Int
,
positionOffset
:
Float
,
positionOffsetPixels
:
Int
)
=
listener
.
onChange
()
})
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/utils/XRx.kt
View file @
7cc8c014
package
com.topjohnwu.magisk.utils
import
io.reactivex.Single
import
io.reactivex.functions.BiFunction
fun
<
T
:
Any
>
T
.
toSingle
()
=
Single
.
just
(
this
)
fun
<
T1
,
T2
,
R
>
zip
(
t1
:
Single
<
T1
>,
t2
:
Single
<
T2
>,
zipper
:
(
T1
,
T2
)
->
R
)
=
Single
.
zip
(
t1
,
t2
,
BiFunction
<
T1
,
T2
,
R
>
{
rt1
,
rt2
->
zipper
(
rt1
,
rt2
)
})
\ No newline at end of file
app/src/main/res/layout/fragment_log.xml
View file @
7cc8c014
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<data>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.log.LogViewModel"
/>
</data>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<com.google.android.material.tabs.TabLayout
android:id=
"@+id/tab
"
android:id=
"@+id/log_tabs
"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"?attr/colorPrimary"
android:elevation=
"4dp"
android:visibility=
"gone"
app:tabPaddingEnd=
"20dp"
app:tabPaddingStart=
"20dp"
app:elevation=
"4dp"
app:tabSelectedTextColor=
"@android:color/white"
app:tabTextColor=
"@android:color/secondary_text_dark"
tools:visibility=
"visible"
/>
app:tabTextColor=
"@android:color/secondary_text_dark"
/>
<androidx.viewpager.widget.ViewPager
android:id=
"@+id/container"
android:id=
"@+id/log_container"
itemBinding=
"@{viewModel.itemBinding}"
items=
"@{viewModel.items}"
pageTitles=
"@{viewModel}"
position=
"@={viewModel.currentPage}"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
/>
</LinearLayout>
</LinearLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/item_console.xml
0 → 100644
View file @
7cc8c014
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
<variable
name=
"item"
type=
"com.topjohnwu.magisk.model.entity.recycler.ConsoleRvItem"
/>
<!--no actions are required-->
<variable
name=
"viewModel"
type=
"Object"
/>
</data>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:fontFamily=
"monospace"
android:text=
"@{item.item}"
android:textSize=
"10sp"
tools:text=
"@tools:sample/lorem/random"
/>
</layout>
app/src/main/res/layout/item_page_log.xml
0 → 100644
View file @
7cc8c014
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
<variable
name=
"item"
type=
"com.topjohnwu.magisk.model.entity.recycler.LogRvItem"
/>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.log.LogViewModel"
/>
</data>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<androidx.recyclerview.widget.RecyclerView
dividerColor=
"@{@android:color/transparent}"
dividerSize=
"@{@dimen/margin_generic}"
itemBinding=
"@{viewModel.itemBinding}"
items=
"@{item.items}"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:clipToPadding=
"false"
android:orientation=
"vertical"
android:padding=
"@dimen/margin_generic"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem=
"@layout/item_superuser_log"
/>
</FrameLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/item_page_magisk_log.xml
0 → 100644
View file @
7cc8c014
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
<variable
name=
"item"
type=
"com.topjohnwu.magisk.model.entity.recycler.MagiskLogRvItem"
/>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.log.LogViewModel"
/>
</data>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<HorizontalScrollView
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<androidx.recyclerview.widget.RecyclerView
itemBinding=
"@{viewModel.itemBinding}"
items=
"@{item.items}"
android:layout_width=
"wrap_content"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem=
"@layout/item_console"
/>
</HorizontalScrollView>
</FrameLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/item_superuser_log.xml
0 → 100644
View file @
7cc8c014
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
<variable
name=
"item"
type=
"com.topjohnwu.magisk.model.entity.recycler.LogItemRvItem"
/>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.log.LogViewModel"
/>
</data>
<com.google.android.material.card.MaterialCardView
style=
"@style/Widget.Card"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:cardElevation=
"2dp"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:animateLayoutChanges=
"true"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:id=
"@+id/log_header"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"?attr/selectableItemBackground"
android:onClick=
"@{() -> item.toggle()}"
android:orientation=
"horizontal"
android:paddingLeft=
"@dimen/margin_generic"
android:paddingTop=
"@dimen/margin_generic_half"
android:paddingRight=
"@dimen/margin_generic"
android:paddingBottom=
"@dimen/margin_generic_half"
app:layout_constraintTop_toTopOf=
"parent"
>
<androidx.appcompat.widget.AppCompatTextView
style=
"@style/Widget.Text.Emphasize"
android:layout_width=
"0dp"
android:layout_height=
"0dp"
android:gravity=
"center_vertical"
android:text=
"@{item.date}"
android:textColor=
"?android:attr/textColorPrimary"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toStartOf=
"@+id/log_header_indicator"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:text=
"@tools:sample/date/ddmmyy"
/>
<androidx.appcompat.widget.AppCompatImageView
android:id=
"@+id/log_header_indicator"
style=
"@style/Widget.Icon"
android:background=
"@android:color/transparent"
android:rotation=
"@{item.isExpanded() ? 180 : 0}"
android:tint=
"?attr/imageColorTint"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:srcCompat=
"@drawable/ic_arrow"
tools:rotation=
"180"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
gone=
"@{!item.isExpanded}"
itemBinding=
"@{viewModel.itemBinding}"
items=
"@{item.items}"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layoutManager=
"androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toBottomOf=
"@+id/log_header"
tools:itemCount=
"3"
tools:listitem=
"@layout/item_superuser_log_entry"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</layout>
\ No newline at end of file
app/src/main/res/layout/item_superuser_log_entry.xml
0 → 100644
View file @
7cc8c014
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
<variable
name=
"item"
type=
"com.topjohnwu.magisk.model.entity.recycler.LogItemEntryRvItem"
/>
<variable
name=
"viewModel"
type=
"com.topjohnwu.magisk.ui.log.LogViewModel"
/>
</data>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:animateLayoutChanges=
"true"
android:background=
"?attr/selectableItemBackground"
android:onClick=
"@{() -> item.toggle()}"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
android:paddingLeft=
"@dimen/margin_generic"
android:paddingTop=
"@dimen/margin_generic_half"
android:paddingRight=
"@dimen/margin_generic"
android:paddingBottom=
"@dimen/margin_generic_half"
>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"2"
android:ellipsize=
"end"
android:maxLines=
"1"
android:text=
"@{item.item.appName}"
android:textAppearance=
"?android:attr/textAppearanceSmall"
android:textColor=
"?android:attr/textColorPrimary"
android:textIsSelectable=
"false"
tools:text=
"@tools:sample/lorem"
/>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center_horizontal"
android:text=
"@{item.item.action ? @string/grant : @string/deny}"
android:textAppearance=
"?android:attr/textAppearanceSmall"
android:textColor=
"?android:attr/textColorSecondary"
tools:text=
"@string/grant"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id=
"@+id/time"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center_horizontal"
android:text=
"@{item.item.timeString}"
android:textAppearance=
"?android:attr/textAppearanceSmall"
android:textColor=
"?android:attr/textColorSecondary"
tools:text=
"@tools:sample/date/hhmm"
/>
</LinearLayout>
<LinearLayout
gone=
"@{!item.isExpanded}"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:gravity=
"center"
android:orientation=
"horizontal"
android:paddingStart=
"@dimen/margin_generic"
android:paddingTop=
"@dimen/margin_generic_half"
android:paddingEnd=
"@dimen/margin_generic"
android:paddingBottom=
"@dimen/margin_generic_half"
>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:text=
"@{@string/pid(item.item.fromPid)}"
android:textColor=
"?android:attr/textColorSecondary"
android:textSize=
"12sp"
tools:text=
"@string/pid"
/>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:text=
"@{@string/target_uid(item.item.toUid)}"
android:textColor=
"?android:attr/textColorSecondary"
android:textSize=
"12sp"
tools:text=
"@string/target_uid"
/>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_weight=
"2"
android:text=
"@{@string/command(item.item.command)}"
android:textColor=
"?android:attr/textColorSecondary"
android:textSize=
"12sp"
tools:text=
"@string/command"
/>
</LinearLayout>
</LinearLayout>
</layout>
\ No newline at end of file
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