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
70500cf2
Commit
70500cf2
authored
Oct 17, 2016
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add search bar & Magisk Hide option
parent
a7da6cf1
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
158 additions
and
36 deletions
+158
-36
LogFragment.java
app/src/main/java/com/topjohnwu/magisk/LogFragment.java
+1
-1
ReposAdapter.java
app/src/main/java/com/topjohnwu/magisk/ReposAdapter.java
+18
-5
ReposFragment.java
app/src/main/java/com/topjohnwu/magisk/ReposFragment.java
+82
-17
SettingsActivity.java
app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java
+27
-3
Module.java
app/src/main/java/com/topjohnwu/magisk/module/Module.java
+2
-2
Async.java
app/src/main/java/com/topjohnwu/magisk/utils/Async.java
+2
-2
Utils.java
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
+2
-4
menu_log.xml
app/src/main/res/menu/menu_log.xml
+1
-1
menu_repo.xml
app/src/main/res/menu/menu_repo.xml
+9
-0
strings.xml
app/src/main/res/values/strings.xml
+2
-0
app_settings.xml
app/src/main/res/xml/app_settings.xml
+11
-0
build.gradle
build.gradle
+1
-1
No files found.
app/src/main/java/com/topjohnwu/magisk/LogFragment.java
View file @
70500cf2
...
...
@@ -226,7 +226,7 @@ public class LogFragment extends Fragment {
return
llog
.
toString
();
}
else
{
if
(
Utils
.
remove
File
(
MAGISK_LOG
))
{
if
(
Utils
.
remove
Item
(
MAGISK_LOG
))
{
Snackbar
.
make
(
txtLog
,
R
.
string
.
logs_cleared
,
Snackbar
.
LENGTH_SHORT
).
show
();
}
else
{
Snackbar
.
make
(
txtLog
,
R
.
string
.
logs_clear_failed
,
Snackbar
.
LENGTH_SHORT
).
show
();
...
...
app/src/main/java/com/topjohnwu/magisk/ReposAdapter.java
View file @
70500cf2
...
...
@@ -35,13 +35,15 @@ import butterknife.ButterKnife;
public
class
ReposAdapter
extends
RecyclerView
.
Adapter
<
ReposAdapter
.
ViewHolder
>
{
private
final
List
<
Repo
>
mList
;
private
List
<
Repo
>
mUpdateRepos
,
mInstalledRepos
,
mOthersRepos
;
private
View
mView
;
private
Context
context
;
private
AlertDialog
.
Builder
builder
;
public
ReposAdapter
(
List
<
Repo
>
list
)
{
mList
=
list
;
public
ReposAdapter
(
List
<
Repo
>
update
,
List
<
Repo
>
installed
,
List
<
Repo
>
others
)
{
mUpdateRepos
=
update
;
mInstalledRepos
=
installed
;
mOthersRepos
=
others
;
}
@Override
...
...
@@ -62,7 +64,18 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
@Override
public
void
onBindViewHolder
(
final
ViewHolder
holder
,
int
position
)
{
final
Repo
repo
=
mList
.
get
(
position
);
final
Repo
repo
;
if
(
position
>=
mUpdateRepos
.
size
())
{
position
-=
mUpdateRepos
.
size
();
if
(
position
>=
mInstalledRepos
.
size
())
{
position
-=
mInstalledRepos
.
size
();
repo
=
mOthersRepos
.
get
(
position
);
}
else
{
repo
=
mInstalledRepos
.
get
(
position
);
}
}
else
{
repo
=
mUpdateRepos
.
get
(
position
);
}
if
(
repo
.
isCache
())
{
holder
.
title
.
setText
(
"[Cache] "
+
repo
.
getName
());
}
else
{
...
...
@@ -140,7 +153,7 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
@Override
public
int
getItemCount
()
{
return
m
List
.
size
();
return
m
UpdateRepos
.
size
()
+
mInstalledRepos
.
size
()
+
mOthersRepos
.
size
();
}
class
ViewHolder
extends
RecyclerView
.
ViewHolder
{
...
...
app/src/main/java/com/topjohnwu/magisk/ReposFragment.java
View file @
70500cf2
...
...
@@ -6,11 +6,15 @@ import android.os.AsyncTask;
import
android.os.Bundle
;
import
android.preference.PreferenceManager
;
import
android.support.annotation.Nullable
;
import
android.support.v4.view.MenuItemCompat
;
import
android.support.v4.widget.SwipeRefreshLayout
;
import
android.support.v7.widget.RecyclerView
;
import
android.view.LayoutInflater
;
import
android.view.Menu
;
import
android.view.MenuInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.widget.SearchView
;
import
android.widget.TextView
;
import
com.topjohnwu.magisk.module.Repo
;
...
...
@@ -29,20 +33,34 @@ public class ReposFragment extends Fragment {
@BindView
(
R
.
id
.
recyclerView
)
RecyclerView
recyclerView
;
@BindView
(
R
.
id
.
empty_rv
)
TextView
emptyTv
;
@BindView
(
R
.
id
.
swipeRefreshLayout
)
SwipeRefreshLayout
mSwipeRefreshLayout
;
private
List
<
Repo
>
mListRepos
=
new
ArrayList
<>();
private
List
<
Repo
>
mUpdateRepos
=
new
ArrayList
<>();
private
List
<
Repo
>
mInstalledRepos
=
new
ArrayList
<>();
private
List
<
Repo
>
mOthersRepos
=
new
ArrayList
<>();
private
List
<
Repo
>
fUpdateRepos
=
new
ArrayList
<>();
private
List
<
Repo
>
fInstalledRepos
=
new
ArrayList
<>();
private
List
<
Repo
>
fOthersRepos
=
new
ArrayList
<>();
private
ReposAdapter
mReposAdapter
=
new
ReposAdapter
(
fUpdateRepos
,
fInstalledRepos
,
fOthersRepos
);
private
SimpleSectionedRecyclerViewAdapter
mSectionedAdapter
;
private
SharedPreferences
.
OnSharedPreferenceChangeListener
listener
;
private
SharedPreferences
prefs
;
private
SearchView
.
OnQueryTextListener
searchListener
;
@Nullable
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
View
view
=
inflater
.
inflate
(
R
.
layout
.
repos_fragment
,
container
,
false
);
ButterKnife
.
bind
(
this
,
view
);
mSectionedAdapter
=
new
SimpleSectionedRecyclerViewAdapter
(
getActivity
(),
R
.
layout
.
section
,
R
.
id
.
section_text
,
mReposAdapter
);
recyclerView
.
setAdapter
(
mSectionedAdapter
);
mSwipeRefreshLayout
.
setRefreshing
(
true
);
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
getActivity
());
...
...
@@ -54,6 +72,7 @@ public class ReposFragment extends Fragment {
});
if
(
prefs
.
getBoolean
(
"repo_done"
,
false
))
{
reloadRepos
();
updateUI
();
}
...
...
@@ -61,22 +80,66 @@ public class ReposFragment extends Fragment {
if
(
s
.
equals
(
"repo_done"
))
{
if
(
pref
.
getBoolean
(
s
,
false
))
{
Logger
.
dev
(
"ReposFragment: UI refresh triggered"
);
reloadRepos
();
updateUI
();
}
}
};
searchListener
=
new
SearchView
.
OnQueryTextListener
()
{
@Override
public
boolean
onQueryTextSubmit
(
String
query
)
{
return
false
;
}
@Override
public
boolean
onQueryTextChange
(
String
newText
)
{
fUpdateRepos
.
clear
();
fInstalledRepos
.
clear
();
fOthersRepos
.
clear
();
for
(
Repo
repo:
mUpdateRepos
)
{
if
(
repo
.
getName
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
||
repo
.
getAuthor
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
||
repo
.
getDescription
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
)
{
fUpdateRepos
.
add
(
repo
);
}
}
for
(
Repo
repo:
mInstalledRepos
)
{
if
(
repo
.
getName
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
||
repo
.
getAuthor
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
||
repo
.
getDescription
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
)
{
fInstalledRepos
.
add
(
repo
);
}
}
for
(
Repo
repo:
mOthersRepos
)
{
if
(
repo
.
getName
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
||
repo
.
getAuthor
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
||
repo
.
getDescription
().
toLowerCase
().
contains
(
newText
.
toLowerCase
())
)
{
fOthersRepos
.
add
(
repo
);
}
}
updateUI
();
return
false
;
}
};
return
view
;
}
@Override
public
void
onAttachFragment
(
Fragment
childFragment
)
{
super
.
onAttachFragment
(
childFragment
);
public
void
onCreateOptionsMenu
(
Menu
menu
,
MenuInflater
inflater
)
{
inflater
.
inflate
(
R
.
menu
.
menu_repo
,
menu
);
SearchView
search
=
(
SearchView
)
MenuItemCompat
.
getActionView
(
menu
.
findItem
(
R
.
id
.
repo_search
));
search
.
setOnQueryTextListener
(
searchListener
);
}
@Override
public
void
onResume
()
{
super
.
onResume
();
setHasOptionsMenu
(
true
);
prefs
.
registerOnSharedPreferenceChangeListener
(
listener
);
}
...
...
@@ -86,32 +149,34 @@ public class ReposFragment extends Fragment {
prefs
.
unregisterOnSharedPreferenceChangeListener
(
listener
);
}
private
void
updateUI
()
{
private
void
reloadRepos
()
{
ModuleHelper
.
getRepoLists
(
mUpdateRepos
,
mInstalledRepos
,
mOthersRepos
);
mListRepos
.
clear
();
mListRepos
.
addAll
(
mUpdateRepos
);
mListRepos
.
addAll
(
mInstalledRepos
);
mListRepos
.
addAll
(
mOthersRepos
);
if
(
mListRepos
.
size
()
==
0
)
{
fUpdateRepos
.
clear
();
fInstalledRepos
.
clear
();
fOthersRepos
.
clear
();
fUpdateRepos
.
addAll
(
mUpdateRepos
);
fInstalledRepos
.
addAll
(
mInstalledRepos
);
fOthersRepos
.
addAll
(
mOthersRepos
);
}
private
void
updateUI
()
{
if
(
fUpdateRepos
.
size
()
+
fInstalledRepos
.
size
()
+
fOthersRepos
.
size
()
==
0
)
{
emptyTv
.
setVisibility
(
View
.
VISIBLE
);
recyclerView
.
setVisibility
(
View
.
GONE
);
}
else
{
List
<
SimpleSectionedRecyclerViewAdapter
.
Section
>
sections
=
new
ArrayList
<>();
if
(!
m
UpdateRepos
.
isEmpty
())
{
if
(!
f
UpdateRepos
.
isEmpty
())
{
sections
.
add
(
new
SimpleSectionedRecyclerViewAdapter
.
Section
(
0
,
getString
(
R
.
string
.
update_available
)));
}
if
(!
m
InstalledRepos
.
isEmpty
())
{
sections
.
add
(
new
SimpleSectionedRecyclerViewAdapter
.
Section
(
m
UpdateRepos
.
size
(),
getString
(
R
.
string
.
installed
)));
if
(!
f
InstalledRepos
.
isEmpty
())
{
sections
.
add
(
new
SimpleSectionedRecyclerViewAdapter
.
Section
(
f
UpdateRepos
.
size
(),
getString
(
R
.
string
.
installed
)));
}
if
(!
m
OthersRepos
.
isEmpty
())
{
sections
.
add
(
new
SimpleSectionedRecyclerViewAdapter
.
Section
(
mUpdateRepos
.
size
()
+
m
InstalledRepos
.
size
(),
getString
(
R
.
string
.
not_installed
)));
if
(!
f
OthersRepos
.
isEmpty
())
{
sections
.
add
(
new
SimpleSectionedRecyclerViewAdapter
.
Section
(
fUpdateRepos
.
size
()
+
f
InstalledRepos
.
size
(),
getString
(
R
.
string
.
not_installed
)));
}
SimpleSectionedRecyclerViewAdapter
.
Section
[]
array
=
sections
.
toArray
(
new
SimpleSectionedRecyclerViewAdapter
.
Section
[
sections
.
size
()]);
SimpleSectionedRecyclerViewAdapter
mSectionedAdapter
=
new
SimpleSectionedRecyclerViewAdapter
(
getActivity
(),
R
.
layout
.
section
,
R
.
id
.
section_text
,
new
ReposAdapter
(
mListRepos
));
mSectionedAdapter
.
setSections
(
array
);
recyclerView
.
setVisibility
(
View
.
VISIBLE
);
recyclerView
.
setAdapter
(
mSectionedAdapter
);
}
mSwipeRefreshLayout
.
setRefreshing
(
false
);
}
...
...
app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java
View file @
70500cf2
...
...
@@ -75,11 +75,13 @@ public class SettingsActivity extends AppCompatActivity {
@Override
public
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
addPreferencesFromResource
(
R
.
xml
.
ui
settings
);
PreferenceManager
.
setDefaultValues
(
getActivity
(),
R
.
xml
.
ui
settings
,
false
);
addPreferencesFromResource
(
R
.
xml
.
app_
settings
);
PreferenceManager
.
setDefaultValues
(
getActivity
(),
R
.
xml
.
app_
settings
,
false
);
themePreference
=
(
ListPreference
)
findPreference
(
"theme"
);
CheckBoxPreference
busyboxPreference
=
(
CheckBoxPreference
)
findPreference
(
"busybox"
);
CheckBoxPreference
magiskhidePreference
=
(
CheckBoxPreference
)
findPreference
(
"magiskhide"
);
magiskhidePreference
.
setChecked
(
Utils
.
itemExist
(
false
,
"/magisk/.core/magiskhide/enable"
));
busyboxPreference
.
setChecked
(
Utils
.
commandExists
(
"unzip"
));
PreferenceManager
.
getDefaultSharedPreferences
(
getActivity
()).
registerOnSharedPreferenceChangeListener
(
this
);
...
...
@@ -88,8 +90,10 @@ public class SettingsActivity extends AppCompatActivity {
if
(
MagiskFragment
.
magiskVersion
==
-
1
)
{
busyboxPreference
.
setEnabled
(
false
);
magiskhidePreference
.
setEnabled
(
false
);
}
else
{
busyboxPreference
.
setEnabled
(
true
);
magiskhidePreference
.
setEnabled
(
true
);
}
}
...
...
@@ -124,8 +128,28 @@ public class SettingsActivity extends AppCompatActivity {
intent
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
startActivity
(
intent
);
break
;
case
"magiskhide"
:
boolean
checked
=
sharedPreferences
.
getBoolean
(
"magiskhide"
,
false
);
if
(
checked
)
{
new
AsyncTask
<
Void
,
Void
,
Void
>()
{
@Override
protected
Void
doInBackground
(
Void
...
params
)
{
Utils
.
createFile
(
"/magisk/.core/magiskhide/enable"
);
return
null
;
}
}.
executeOnExecutor
(
AsyncTask
.
SERIAL_EXECUTOR
);
}
else
{
new
AsyncTask
<
Void
,
Void
,
Void
>()
{
@Override
protected
Void
doInBackground
(
Void
...
params
)
{
Utils
.
removeItem
(
"/magisk/.core/magiskhide/enable"
);
return
null
;
}
}.
executeOnExecutor
(
AsyncTask
.
SERIAL_EXECUTOR
);
}
break
;
case
"busybox"
:
boolean
checked
=
sharedPreferences
.
getBoolean
(
"busybox"
,
false
);
checked
=
sharedPreferences
.
getBoolean
(
"busybox"
,
false
);
new
Async
.
LinkBusyBox
(
checked
).
executeOnExecutor
(
AsyncTask
.
SERIAL_EXECUTOR
);
break
;
case
"developer_logging"
:
...
...
app/src/main/java/com/topjohnwu/magisk/module/Module.java
View file @
70500cf2
...
...
@@ -60,7 +60,7 @@ public class Module extends BaseModule {
new
AsyncTask
<
Void
,
Void
,
Void
>()
{
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
mEnable
=
Utils
.
remove
File
(
mDisableFile
);
mEnable
=
Utils
.
remove
Item
(
mDisableFile
);
return
null
;
}
}.
executeOnExecutor
(
AsyncTask
.
SERIAL_EXECUTOR
);
...
...
@@ -84,7 +84,7 @@ public class Module extends BaseModule {
new
AsyncTask
<
Void
,
Void
,
Void
>()
{
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
mRemove
=
!
Utils
.
remove
File
(
mRemoveFile
);
mRemove
=
!
Utils
.
remove
Item
(
mRemoveFile
);
return
null
;
}
}.
executeOnExecutor
(
AsyncTask
.
SERIAL_EXECUTOR
);
...
...
app/src/main/java/com/topjohnwu/magisk/utils/Async.java
View file @
70500cf2
...
...
@@ -200,7 +200,7 @@ public class Async {
InputStream
in
=
mContext
.
getContentResolver
().
openInputStream
(
mUri
);
mFile
=
new
File
(
mContext
.
getCacheDir
().
getAbsolutePath
()
+
"/install.zip"
);
mFile
.
delete
();
Utils
.
remove
File
(
mFile
.
getPath
());
Utils
.
remove
Item
(
mFile
.
getPath
());
createFileFromInputStream
(
in
,
mFile
);
in
.
close
();
}
catch
(
FileNotFoundException
e
)
{
...
...
@@ -273,7 +273,7 @@ public class Async {
}
}
if
(
mFile
!=
null
&&
mFile
.
exists
()
&&
!
mFile
.
delete
())
{
Utils
.
remove
File
(
mFile
.
getPath
());
Utils
.
remove
Item
(
mFile
.
getPath
());
}
if
(
ret
!=
null
&&
Boolean
.
parseBoolean
(
ret
.
get
(
ret
.
size
()
-
1
)))
{
return
1
;
...
...
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
View file @
70500cf2
...
...
@@ -7,13 +7,11 @@ import android.content.IntentFilter;
import
android.content.pm.PackageManager
;
import
android.net.Uri
;
import
android.os.Environment
;
import
android.preference.PreferenceManager
;
import
android.support.v4.app.ActivityCompat
;
import
android.util.Base64
;
import
android.view.View
;
import
android.widget.Toast
;
import
com.topjohnwu.magisk.MagiskFragment
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.receivers.DownloadReceiver
;
...
...
@@ -68,8 +66,8 @@ public class Utils {
return
Shell
.
rootAccess
()
&&
Boolean
.
parseBoolean
(
Shell
.
su
(
command
).
get
(
0
));
}
public
static
boolean
remove
File
(
String
path
)
{
String
command
=
"rm -
f "
+
path
+
" 2>/dev/null; if [ -f
"
+
path
+
" ]; then echo false; else echo true; fi"
;
public
static
boolean
remove
Item
(
String
path
)
{
String
command
=
"rm -
rf "
+
path
+
" 2>/dev/null; if [ -e
"
+
path
+
" ]; then echo false; else echo true; fi"
;
return
Shell
.
rootAccess
()
&&
Boolean
.
parseBoolean
(
Shell
.
su
(
command
).
get
(
0
));
}
...
...
app/src/main/res/menu/menu_log.xml
View file @
70500cf2
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<item
android:id=
"@+id/menu_save"
...
...
app/src/main/res/menu/menu_repo.xml
0 → 100644
View file @
70500cf2
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<item
android:id=
"@+id/repo_search"
app:actionViewClass=
"android.widget.SearchView"
app:showAsAction=
"always"
/>
</menu>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
70500cf2
...
...
@@ -98,6 +98,8 @@
<string
name=
"settings_developer_logging_summary"
>
Check this to enable more verbose logging.
</string>
<string
name=
"settings_shell_logging_title"
>
Enable shell command debug logging
</string>
<string
name=
"settings_shell_logging_summary"
>
Check this to enable logging all shell commands and output
</string>
<string
name=
"settings_magiskhide_title"
>
Enable Magisk Hide
</string>
<string
name=
"settings_magiskhide_summary"
>
Reboot to apply settings
</string>
<!-- Strings related to Settings -->
...
...
app/src/main/res/xml/
ui
settings.xml
→
app/src/main/res/xml/
app_
settings.xml
View file @
70500cf2
...
...
@@ -12,6 +12,17 @@
android:entries=
"@array/themes"
android:entryValues=
"@array/themes"
/>
</PreferenceCategory>
<PreferenceCategory
android:title=
"Magisk"
>
<CheckBoxPreference
android:key=
"magiskhide"
android:defaultValue=
"false"
android:title=
"@string/settings_magiskhide_title"
android:summary=
"@string/settings_magiskhide_summary"
/>
<CheckBoxPreference
android:key=
"busybox"
android:defaultValue=
"false"
...
...
build.gradle
View file @
70500cf2
...
...
@@ -6,7 +6,7 @@ buildscript {
mavenCentral
()
}
dependencies
{
classpath
'com.android.tools.build:gradle:2.2.
0
'
classpath
'com.android.tools.build:gradle:2.2.
1
'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
...
...
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