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
5d8f9f1a
Commit
5d8f9f1a
authored
Sep 21, 2016
by
d8ahazard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merge work from last night
parent
5124cd4b
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
32 additions
and
447 deletions
+32
-447
Utils.java
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
+32
-447
No files found.
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
View file @
5d8f9f1a
...
@@ -4,9 +4,7 @@ import android.Manifest;
...
@@ -4,9 +4,7 @@ import android.Manifest;
import
android.app.Activity
;
import
android.app.Activity
;
import
android.app.ActivityManager
;
import
android.app.ActivityManager
;
import
android.app.DownloadManager
;
import
android.app.DownloadManager
;
import
android.app.ProgressDialog
;
import
android.content.BroadcastReceiver
;
import
android.content.BroadcastReceiver
;
import
android.content.ContentResolver
;
import
android.content.Context
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.Intent
;
import
android.content.IntentFilter
;
import
android.content.IntentFilter
;
...
@@ -14,15 +12,12 @@ import android.content.SharedPreferences;
...
@@ -14,15 +12,12 @@ import android.content.SharedPreferences;
import
android.content.pm.PackageManager
;
import
android.content.pm.PackageManager
;
import
android.database.Cursor
;
import
android.database.Cursor
;
import
android.net.Uri
;
import
android.net.Uri
;
import
android.os.AsyncTask
;
import
android.os.Build
;
import
android.os.Build
;
import
android.os.Environment
;
import
android.os.Environment
;
import
android.preference.PreferenceManager
;
import
android.preference.PreferenceManager
;
import
android.provider.DocumentsContract
;
import
android.provider.Settings
;
import
android.provider.Settings
;
import
android.support.design.widget.Snackbar
;
import
android.support.design.widget.Snackbar
;
import
android.support.v4.app.ActivityCompat
;
import
android.support.v4.app.ActivityCompat
;
import
android.support.v7.app.AlertDialog
;
import
android.text.TextUtils
;
import
android.text.TextUtils
;
import
android.util.Base64
;
import
android.util.Base64
;
import
android.util.Log
;
import
android.util.Log
;
...
@@ -30,36 +25,19 @@ import android.view.View;
...
@@ -30,36 +25,19 @@ import android.view.View;
import
android.widget.Toast
;
import
android.widget.Toast
;
import
com.kcoppock.broadcasttilesupport.BroadcastTileIntentBuilder
;
import
com.kcoppock.broadcasttilesupport.BroadcastTileIntentBuilder
;
import
com.topjohnwu.magisk.ModulesFragment
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.ReposFragment
;
import
com.topjohnwu.magisk.RootFragment
;
import
com.topjohnwu.magisk.RootFragment
;
import
com.topjohnwu.magisk.module.Module
;
import
com.topjohnwu.magisk.module.BaseModule
;
import
com.topjohnwu.magisk.module.Repo
;
import
com.topjohnwu.magisk.module.RepoHelper
;
import
com.topjohnwu.magisk.receivers.PrivateBroadcastReceiver
;
import
com.topjohnwu.magisk.receivers.PrivateBroadcastReceiver
;
import
com.topjohnwu.magisk.receivers.Receiver
;
import
com.topjohnwu.magisk.receivers.RootFragmentReceiver
;
import
com.topjohnwu.magisk.services.MonitorService
;
import
com.topjohnwu.magisk.services.MonitorService
;
import
com.topjohnwu.magisk.services.QuickSettingTileService
;
import
com.topjohnwu.magisk.services.QuickSettingTileService
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
java.io.BufferedReader
;
import
java.io.File
;
import
java.io.File
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.OutputStream
;
import
java.io.UnsupportedEncodingException
;
import
java.io.UnsupportedEncodingException
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.security.InvalidKeyException
;
import
java.security.InvalidKeyException
;
import
java.security.NoSuchAlgorithmException
;
import
java.security.NoSuchAlgorithmException
;
import
java.security.spec.InvalidKeySpecException
;
import
java.security.spec.InvalidKeySpecException
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.List
;
import
javax.crypto.BadPaddingException
;
import
javax.crypto.BadPaddingException
;
...
@@ -80,6 +58,18 @@ public class Utils {
...
@@ -80,6 +58,18 @@ public class Utils {
public
static
final
String
MAGISK_CACHE_PATH
=
"/cache/magisk"
;
public
static
final
String
MAGISK_CACHE_PATH
=
"/cache/magisk"
;
public
static
final
String
UPDATE_JSON
=
"https://raw.githubusercontent.com/topjohnwu/MagiskManager/updates/magisk_update.json"
;
public
static
final
String
UPDATE_JSON
=
"https://raw.githubusercontent.com/topjohnwu/MagiskManager/updates/magisk_update.json"
;
public
static
void
init
(
Context
context
)
{
List
<
String
>
ret
=
Shell
.
sh
(
"getprop magisk.version"
);
if
(
ret
.
get
(
0
).
replaceAll
(
"\\s"
,
""
).
isEmpty
())
{
magiskVersion
=
-
1
;
}
else
{
magiskVersion
=
Integer
.
parseInt
(
ret
.
get
(
0
));
}
if
(!
Shell
.
rootAccess
())
{
Snackbar
.
make
(((
Activity
)
context
).
findViewById
(
android
.
R
.
id
.
content
),
R
.
string
.
no_root_access
,
Snackbar
.
LENGTH_LONG
).
show
();
}
}
public
static
boolean
fileExist
(
String
path
)
{
public
static
boolean
fileExist
(
String
path
)
{
List
<
String
>
ret
;
List
<
String
>
ret
;
String
command
=
"if [ -f "
+
path
+
" ]; then echo true; else echo false; fi"
;
String
command
=
"if [ -f "
+
path
+
" ]; then echo true; else echo false; fi"
;
...
@@ -148,17 +138,23 @@ public class Utils {
...
@@ -148,17 +138,23 @@ public class Utils {
public
static
List
<
String
>
getModList
(
String
path
)
{
public
static
List
<
String
>
getModList
(
String
path
)
{
List
<
String
>
ret
;
List
<
String
>
ret
;
ret
=
Shell
.
sh
(
"find "
+
path
+
" -type d -maxdepth 1 ! -name \"*.core\" ! -name \"*lost+found\" ! -name \"*magisk\""
);
String
command
=
"find "
+
path
+
" -type d -maxdepth 1 ! -name \"*.core\" ! -name \"*lost+found\" ! -name \"*magisk\""
;
if
(
ret
.
isEmpty
()
&&
Shell
.
rootAccess
())
if
(
Shell
.
rootAccess
())
{
ret
=
Shell
.
su
(
"find "
+
path
+
" -type d -maxdepth 1 ! -name \"*.core\" ! -name \"*lost+found\" ! -name \"*magisk\""
);
ret
=
Shell
.
su
(
command
);
}
else
{
ret
=
Shell
.
sh
(
command
);
}
return
ret
;
return
ret
;
}
}
public
static
List
<
String
>
readFile
(
String
path
)
{
public
static
List
<
String
>
readFile
(
String
path
)
{
List
<
String
>
ret
;
List
<
String
>
ret
;
ret
=
Shell
.
sh
(
"cat "
+
path
);
String
command
=
"cat "
+
path
;
if
(
ret
.
isEmpty
()
&&
Shell
.
rootAccess
())
if
(
Shell
.
rootAccess
())
{
ret
=
Shell
.
su
(
"cat "
+
path
);
ret
=
Shell
.
su
(
command
);
}
else
{
ret
=
Shell
.
sh
(
command
);
}
return
ret
;
return
ret
;
}
}
...
@@ -365,224 +361,6 @@ public class Utils {
...
@@ -365,224 +361,6 @@ public class Utils {
public
abstract
void
task
(
File
file
);
public
abstract
void
task
(
File
file
);
}
}
public
static
class
Initialize
extends
AsyncTask
<
Void
,
Void
,
Void
>
{
private
Context
mContext
;
public
Initialize
(
Context
context
)
{
mContext
=
context
;
}
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
List
<
String
>
ret
=
Shell
.
sh
(
"getprop magisk.version"
);
if
(
ret
.
get
(
0
).
replaceAll
(
"\\s"
,
""
).
isEmpty
())
{
magiskVersion
=
-
1
;
}
else
{
magiskVersion
=
Integer
.
parseInt
(
ret
.
get
(
0
));
}
// Install Busybox and set as top priority
// if (Shell.rootAccess()) {
// String busybox = mContext.getApplicationInfo().nativeLibraryDir + "/libbusybox.so";
// Shell.su(
// "rm -rf /data/busybox",
// "mkdir -p /data/busybox",
// "cp -af " + busybox + " /data/busybox/busybox",
// "chmod 755 /data/busybox /data/busybox/busybox",
// "chcon u:object_r:system_file:s0 /data/busybox /data/busybox/busybox",
// "/data/busybox/busybox --install -s /data/busybox",
// "rm -f /data/busybox/su",
// "export PATH=/data/busybox:$PATH"
// );
// }
return
null
;
}
@Override
protected
void
onPostExecute
(
Void
aVoid
)
{
super
.
onPostExecute
(
aVoid
);
if
(!
Shell
.
rootAccess
())
{
Snackbar
.
make
(((
Activity
)
mContext
).
findViewById
(
android
.
R
.
id
.
content
),
R
.
string
.
no_root_access
,
Snackbar
.
LENGTH_LONG
).
show
();
}
}
}
public
static
class
CheckUpdates
extends
AsyncTask
<
Void
,
Void
,
Void
>
{
private
Context
mContext
;
public
CheckUpdates
(
Context
context
)
{
mContext
=
context
;
}
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
try
{
HttpURLConnection
c
=
(
HttpURLConnection
)
new
URL
(
UPDATE_JSON
).
openConnection
();
c
.
setRequestMethod
(
"GET"
);
c
.
setInstanceFollowRedirects
(
false
);
c
.
setDoOutput
(
false
);
c
.
connect
();
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
c
.
getInputStream
()));
StringBuilder
sb
=
new
StringBuilder
();
String
line
;
while
((
line
=
br
.
readLine
())
!=
null
)
{
sb
.
append
(
line
);
}
br
.
close
();
JSONObject
json
=
new
JSONObject
(
sb
.
toString
());
JSONObject
magisk
=
json
.
getJSONObject
(
"magisk"
);
JSONObject
app
=
json
.
getJSONObject
(
"app"
);
JSONObject
root
=
json
.
getJSONObject
(
"root"
);
remoteMagiskVersion
=
magisk
.
getInt
(
"versionCode"
);
magiskLink
=
magisk
.
getString
(
"link"
);
magiskChangelog
=
magisk
.
getString
(
"changelog"
);
remoteAppVersion
=
app
.
getInt
(
"versionCode"
);
appLink
=
app
.
getString
(
"link"
);
appChangelog
=
app
.
getString
(
"changelog"
);
phhLink
=
root
.
getString
(
"phh"
);
supersuLink
=
root
.
getString
(
"supersu"
);
}
catch
(
IOException
|
JSONException
ignored
)
{
}
return
null
;
}
@Override
protected
void
onPostExecute
(
Void
aVoid
)
{
super
.
onPostExecute
(
aVoid
);
if
(
Shell
.
rootAccess
()
&&
magiskVersion
==
-
1
)
{
new
AlertDialog
.
Builder
(
mContext
)
.
setTitle
(
R
.
string
.
no_magisk_title
)
.
setMessage
(
R
.
string
.
no_magisk_msg
)
.
setCancelable
(
true
)
.
setPositiveButton
(
R
.
string
.
download_install
,
(
dialogInterface
,
i
)
->
{
new
AlertDialog
.
Builder
(
mContext
)
.
setTitle
(
R
.
string
.
root_method_title
)
.
setItems
(
new
String
[]{
mContext
.
getString
(
R
.
string
.
phh
),
mContext
.
getString
(
R
.
string
.
supersu
)},
(
dialogInterface1
,
root
)
->
{
DownloadReceiver
rootReceiver
;
String
link
,
filename
;
switch
(
root
)
{
case
0
:
link
=
phhLink
;
filename
=
"phhsu.zip"
;
rootReceiver
=
new
DownloadReceiver
(
mContext
.
getString
(
R
.
string
.
phh
))
{
@Override
public
void
task
(
File
file
)
{
new
RemoveSystemSU
().
execute
();
new
FlashZIP
(
mContext
,
mName
,
file
.
getPath
()).
execute
();
}
};
break
;
case
1
:
link
=
supersuLink
;
filename
=
"supersu.zip"
;
rootReceiver
=
new
DownloadReceiver
(
mContext
.
getString
(
R
.
string
.
supersu
))
{
@Override
public
void
task
(
File
file
)
{
new
RemoveSystemSU
().
execute
();
new
FlashZIP
(
mContext
,
mName
,
file
.
getPath
()).
execute
();
}
};
break
;
default
:
rootReceiver
=
null
;
link
=
filename
=
null
;
}
DownloadReceiver
magiskReceiver
=
new
DownloadReceiver
(
mContext
.
getString
(
R
.
string
.
magisk
))
{
@Override
public
void
task
(
File
file
)
{
Context
temp
=
mContext
;
new
FlashZIP
(
mContext
,
mName
,
file
.
getPath
())
{
@Override
protected
void
done
()
{
downloadAndReceive
(
temp
,
rootReceiver
,
link
,
filename
);
}
}.
execute
();
}
};
downloadAndReceive
(
mContext
,
magiskReceiver
,
magiskLink
,
"latest_magisk.zip"
);
})
.
show
();
})
.
setNegativeButton
(
R
.
string
.
no_thanks
,
null
)
.
show
();
}
else
if
(
Shell
.
rootStatus
==
2
)
{
new
AlertDialog
.
Builder
(
mContext
)
.
setTitle
(
R
.
string
.
root_system
)
.
setMessage
(
R
.
string
.
root_system_msg
)
.
setCancelable
(
true
)
.
setPositiveButton
(
R
.
string
.
download_install
,
(
dialogInterface
,
i
)
->
{
new
AlertDialog
.
Builder
(
mContext
)
.
setTitle
(
R
.
string
.
root_method_title
)
.
setItems
(
new
String
[]{
mContext
.
getString
(
R
.
string
.
phh
),
mContext
.
getString
(
R
.
string
.
supersu
)},
(
dialogInterface1
,
root
)
->
{
switch
(
root
)
{
case
0
:
downloadAndReceive
(
mContext
,
new
DownloadReceiver
(
mContext
.
getString
(
R
.
string
.
phh
))
{
@Override
public
void
task
(
File
file
)
{
new
FlashZIP
(
mContext
,
mName
,
file
.
getPath
()).
execute
();
}
},
phhLink
,
"phhsu.zip"
);
break
;
case
1
:
downloadAndReceive
(
mContext
,
new
DownloadReceiver
(
mContext
.
getString
(
R
.
string
.
supersu
))
{
@Override
public
void
task
(
File
file
)
{
new
FlashZIP
(
mContext
,
mName
,
file
.
getPath
()).
execute
();
}
},
supersuLink
,
"supersu.zip"
);
break
;
}
})
.
show
();
})
.
setNegativeButton
(
R
.
string
.
no_thanks
,
null
)
.
show
();
}
}
}
public
static
class
RemoveSystemSU
extends
AsyncTask
<
Void
,
Void
,
Void
>
{
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
Shell
.
su
(
"umount /system/xbin"
,
"umount -l /system/xbin"
,
"if [ ! -z $(which su | grep system) ]; then"
,
"mount -o rw,remount /system"
,
"rm -rf /system/.pin /system/app/SuperSU /system/bin/.ext /system/etc/.installed_su_daemon "
+
"/system/etc/install-recovery.sh /system/etc/init.d/99SuperSUDaemon /system/xbin/daemonsu "
+
"/system/xbin/su /system/xbin/sugote /system/xbin/sugote-mksh /system/xbin/supolicy "
+
"/data/app/eu.chainfire.supersu-*"
,
"mv -f /system/bin/app_process32_original /system/bin/app_process32"
,
"mv -f /system/bin/app_process64_original /system/bin/app_process64"
,
"mv -f /system/bin/install-recovery_original.sh /system/bin/install-recovery.sh"
,
"if [ -e /system/bin/app_process64 ]; then"
,
"ln -sf /system/bin/app_process64 /system/bin/app_process"
,
"else"
,
"ln -sf /system/bin/app_process32 /system/bin/app_process"
,
"fi"
,
"umount /system"
,
"fi"
,
"setprop magisk.root 1"
);
return
null
;
}
}
public
static
boolean
isMyServiceRunning
(
Class
<?>
serviceClass
,
Context
context
)
{
public
static
boolean
isMyServiceRunning
(
Class
<?>
serviceClass
,
Context
context
)
{
ActivityManager
manager
=
(
ActivityManager
)
context
.
getSystemService
(
Context
.
ACTIVITY_SERVICE
);
ActivityManager
manager
=
(
ActivityManager
)
context
.
getSystemService
(
Context
.
ACTIVITY_SERVICE
);
...
@@ -594,209 +372,16 @@ public class Utils {
...
@@ -594,209 +372,16 @@ public class Utils {
return
false
;
return
false
;
}
}
public
static
class
LoadModules
extends
AsyncTask
<
Void
,
Void
,
Void
>
{
public
interface
ItemClickListener
{
private
Context
mContext
;
public
LoadModules
(
Context
context
)
{
mContext
=
context
;
}
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
ModulesFragment
.
listModules
.
clear
();
List
<
String
>
magisk
=
getModList
(
MAGISK_PATH
);
Log
.
d
(
"Magisk"
,
"Utils: Reload called, loading modules"
);
List
<
String
>
magiskCache
=
getModList
(
MAGISK_CACHE_PATH
);
for
(
String
mod
:
magisk
)
{
Log
.
d
(
"Magisk"
,
"Utils: Adding module from string "
+
mod
);
ModulesFragment
.
listModules
.
add
(
new
Module
(
mod
,
mContext
));
}
for
(
String
mod
:
magiskCache
)
{
Log
.
d
(
"Magisk"
,
"Utils: Adding cache module from string "
+
mod
);
Module
cacheMod
=
new
Module
(
mod
,
mContext
);
// Prevent people forgot to change module.prop
cacheMod
.
setCache
();
ModulesFragment
.
listModules
.
add
(
cacheMod
);
}
return
null
;
}
}
public
static
class
LoadRepos
extends
AsyncTask
<
Void
,
Void
,
Void
>
{
private
Context
mContext
;
private
boolean
doReload
;
private
RepoHelper
.
TaskDelegate
mTaskDelegate
;
public
LoadRepos
(
Context
context
,
boolean
reload
,
RepoHelper
.
TaskDelegate
delegate
)
{
mContext
=
context
;
doReload
=
reload
;
mTaskDelegate
=
delegate
;
}
@Override
protected
Void
doInBackground
(
Void
...
voids
)
{
ReposFragment
.
mListRepos
.
clear
();
List
<
Repo
>
magiskRepos
=
RepoHelper
.
listRepos
(
mContext
,
doReload
,
mTaskDelegate
);
for
(
Repo
repo
:
magiskRepos
)
{
Log
.
d
(
"Magisk"
,
"Utils: Adding repo from string "
+
repo
.
getId
());
ReposFragment
.
mListRepos
.
add
(
repo
);
}
return
null
;
}
}
public
static
class
FlashZIP
extends
AsyncTask
<
Void
,
Void
,
Boolean
>
{
private
String
mPath
,
mName
;
private
Uri
mUri
;
private
ProgressDialog
progress
;
private
File
mFile
;
private
Context
mContext
;
private
List
<
String
>
ret
;
private
boolean
deleteFileAfter
;
public
FlashZIP
(
Context
context
,
String
name
,
String
path
)
{
mContext
=
context
;
mName
=
name
;
mPath
=
path
;
deleteFileAfter
=
false
;
}
public
FlashZIP
(
Context
context
,
Uri
uRi
)
{
mContext
=
context
;
mUri
=
uRi
;
deleteFileAfter
=
true
;
String
file
=
""
;
final
String
docId
=
DocumentsContract
.
getDocumentId
(
mUri
);
Log
.
d
(
"Magisk"
,
"Utils: FlashZip Running, "
+
docId
+
" and "
+
mUri
.
toString
());
if
(
docId
.
contains
(
":"
))
mName
=
docId
.
split
(
":"
)[
1
];
else
mName
=
docId
;
if
(
mName
.
contains
(
"/"
))
mName
=
mName
.
substring
(
mName
.
lastIndexOf
(
'/'
)
+
1
);
if
(
mName
.
contains
(
".zip"
))
{
file
=
mContext
.
getFilesDir
()
+
"/"
+
mName
;
Log
.
d
(
"Magisk"
,
"Utils: FlashZip running for uRI "
+
mUri
.
toString
());
}
else
{
Log
.
e
(
"Magisk"
,
"Utils: error parsing Zipfile "
+
mUri
.
getPath
());
this
.
cancel
(
true
);
}
ContentResolver
contentResolver
=
mContext
.
getContentResolver
();
//contentResolver.takePersistableUriPermission(mUri, flags);
try
{
InputStream
in
=
contentResolver
.
openInputStream
(
mUri
);
Log
.
d
(
"Magisk"
,
"Firing inputStream"
);
mFile
=
createFileFromInputStream
(
in
,
file
,
mContext
);
if
(
mFile
!=
null
)
{
mPath
=
mFile
.
getPath
();
Log
.
d
(
"Magisk"
,
"Utils: Mpath is "
+
mPath
);
}
else
{
Log
.
e
(
"Magisk"
,
"Utils: error creating file "
+
mUri
.
getPath
());
this
.
cancel
(
true
);
}
}
catch
(
FileNotFoundException
e
)
{
e
.
printStackTrace
();
}
// TODO handle non-primary volumes
}
private
static
File
createFileFromInputStream
(
InputStream
inputStream
,
String
fileName
,
Context
context
)
{
try
{
File
f
=
new
File
(
fileName
);
f
.
setWritable
(
true
,
false
);
OutputStream
outputStream
=
new
FileOutputStream
(
f
);
byte
buffer
[]
=
new
byte
[
1024
];
int
length
;
while
((
length
=
inputStream
.
read
(
buffer
))
>
0
)
{
outputStream
.
write
(
buffer
,
0
,
length
);
}
outputStream
.
close
();
inputStream
.
close
();
Log
.
d
(
"Magisk"
,
"Holy balls, I think it worked. File is "
+
f
.
getPath
());
return
f
;
}
catch
(
IOException
e
)
{
System
.
out
.
println
(
"error in creating a file"
);
e
.
printStackTrace
();
}
return
null
;
}
@Override
protected
void
onPreExecute
()
{
super
.
onPreExecute
();
progress
=
ProgressDialog
.
show
(
mContext
,
mContext
.
getString
(
R
.
string
.
zip_install_progress_title
),
mContext
.
getString
(
R
.
string
.
zip_install_progress_msg
,
mName
));
void
onItemClick
(
View
view
,
int
position
);
}
@Override
protected
Boolean
doInBackground
(
Void
...
voids
)
{
if
(
mPath
!=
null
)
{
Log
.
e
(
"Magisk"
,
"Utils: Error, flashZIP called without a valid zip file to flash."
);
progress
.
dismiss
();
this
.
cancel
(
true
);
return
false
;
}
if
(!
Shell
.
rootAccess
())
{
return
false
;
}
else
{
ret
=
Shell
.
su
(
"rm -rf /dev/tmp"
,
"mkdir -p /dev/tmp"
,
"cp -af "
+
mPath
+
" /dev/tmp/install.zip"
,
"unzip -o /dev/tmp/install.zip META-INF/com/google/android/* -d /dev/tmp"
,
"BOOTMODE=true sh /dev/tmp/META-INF/com/google/android/update-binary dummy 1 /dev/tmp/install.zip"
,
"if [ $? -eq 0 ]; then echo true; else echo false; fi"
);
return
ret
!=
null
&&
Boolean
.
parseBoolean
(
ret
.
get
(
ret
.
size
()
-
1
));
}
}
}
public
static
class
ModuleComparator
implements
Comparator
<
BaseModule
>
{
@Override
@Override
protected
void
onPostExecute
(
Boolean
result
)
{
public
int
compare
(
BaseModule
o1
,
BaseModule
o2
)
{
super
.
onPostExecute
(
result
);
return
o1
.
getName
().
compareTo
(
o2
.
getName
());
if
(
deleteFileAfter
)
{
Shell
.
su
(
"rm -rf "
+
mPath
);
Log
.
d
(
"Magisk"
,
"Utils: Deleting file "
+
mPath
);
}
progress
.
dismiss
();
if
(!
result
)
{
Toast
.
makeText
(
mContext
,
mContext
.
getString
(
R
.
string
.
manual_install
,
mPath
),
Toast
.
LENGTH_LONG
).
show
();
return
;
}
}
done
();
}
}
protected
void
done
()
{
new
AlertDialog
.
Builder
(
mContext
)
.
setTitle
(
R
.
string
.
reboot_title
)
.
setMessage
(
R
.
string
.
reboot_msg
)
.
setPositiveButton
(
R
.
string
.
reboot
,
(
dialogInterface1
,
i
)
->
Shell
.
su
(
"reboot"
))
.
setNegativeButton
(
R
.
string
.
no_thanks
,
null
)
.
show
();
}
}
public
interface
ItemClickListener
{
void
onItemClick
(
View
view
,
int
position
);
}
}
}
\ 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