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
69e5bcd5
Commit
69e5bcd5
authored
Jun 06, 2017
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Simple OTA implementation
parent
efeddda3
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
124 additions
and
39 deletions
+124
-39
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+3
-2
MagiskManager.java
app/src/main/java/com/topjohnwu/magisk/MagiskManager.java
+3
-2
SplashActivity.java
app/src/main/java/com/topjohnwu/magisk/SplashActivity.java
+2
-2
ReposAdapter.java
...main/java/com/topjohnwu/magisk/adapters/ReposAdapter.java
+3
-0
CheckUpdates.java
...c/main/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java
+13
-27
DownloadReceiver.java
...java/com/topjohnwu/magisk/receivers/DownloadReceiver.java
+2
-3
ManagerUpdate.java
...in/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java
+43
-0
Utils.java
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
+53
-3
strings.xml
app/src/main/res/values/strings.xml
+2
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
69e5bcd5
...
...
@@ -52,8 +52,7 @@
android:taskAffinity=
"internal.superuser"
android:theme=
"@style/SuRequest"
/>
<receiver
android:name=
".superuser.SuReceiver"
/>
<receiver
android:name=
".superuser.SuReceiver"
/>
<receiver
android:name=
".receivers.BootReceiver"
>
<intent-filter>
...
...
@@ -69,6 +68,8 @@
</intent-filter>
</receiver>
<receiver
android:name=
".receivers.ManagerUpdate"
/>
<service
android:name=
".services.BootupIntentService"
/>
<service
...
...
app/src/main/java/com/topjohnwu/magisk/MagiskManager.java
View file @
69e5bcd5
...
...
@@ -28,8 +28,6 @@ public class MagiskManager extends Application {
public
static
final
String
UNINSTALLER
=
"magisk_uninstaller.sh"
;
public
static
final
String
INTENT_SECTION
=
"section"
;
public
static
final
String
BUSYBOX_VERSION
=
"1.26.2"
;
public
static
final
String
ROOT_ACCESS_PROP
=
"persist.magisk.root"
;
public
static
final
String
MULTIUSER_MODE_PROP
=
"persist.magisk.multiuser"
;
public
static
final
String
MAGISKHIDE_PROP
=
"persist.magisk.hide"
;
public
static
final
String
DISABLE_INDICATION_PROP
=
"ro.magisk.disable"
;
...
...
@@ -49,6 +47,9 @@ public class MagiskManager extends Application {
public
int
remoteMagiskVersionCode
=
-
1
;
public
String
magiskLink
;
public
String
releaseNoteLink
;
public
String
remoteManagerVersionString
;
public
int
remoteManagerVersionCode
=
-
1
;
public
String
managerLink
;
public
SafetyNetHelper
.
Result
SNCheckResult
;
public
String
bootBlock
=
null
;
public
boolean
isSuClient
=
false
;
...
...
app/src/main/java/com/topjohnwu/magisk/SplashActivity.java
View file @
69e5bcd5
...
...
@@ -34,13 +34,13 @@ public class SplashActivity extends Activity{
new
LoadApps
(
this
).
exec
();
if
(
Utils
.
checkNetworkStatus
(
this
))
{
// Initialize the update check service, notify every
12
hours
// Initialize the update check service, notify every
8
hours
if
(!
TextUtils
.
equals
(
"install"
,
getIntent
().
getStringExtra
(
MagiskManager
.
INTENT_SECTION
)))
{
ComponentName
service
=
new
ComponentName
(
this
,
UpdateCheckService
.
class
);
JobInfo
jobInfo
=
new
JobInfo
.
Builder
(
UPDATE_SERVICE_ID
,
service
)
.
setRequiredNetworkType
(
JobInfo
.
NETWORK_TYPE_ANY
)
.
setPersisted
(
true
)
.
setPeriodic
(
12
*
60
*
60
*
1000
)
.
setPeriodic
(
8
*
60
*
60
*
1000
)
.
build
();
JobScheduler
scheduler
=
(
JobScheduler
)
getSystemService
(
Context
.
JOB_SCHEDULER_SERVICE
);
scheduler
.
schedule
(
jobInfo
);
...
...
app/src/main/java/com/topjohnwu/magisk/adapters/ReposAdapter.java
View file @
69e5bcd5
package
com
.
topjohnwu
.
magisk
.
adapters
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.support.v7.widget.RecyclerView
;
...
...
@@ -65,6 +66,7 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
new
DownloadReceiver
()
{
@Override
public
void
onDownloadDone
(
Uri
uri
)
{
Activity
activity
=
(
Activity
)
mContext
;
new
ProcessRepoZip
(
activity
,
uri
,
true
).
exec
();
}
},
...
...
@@ -75,6 +77,7 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
new
DownloadReceiver
()
{
@Override
public
void
onDownloadDone
(
Uri
uri
)
{
Activity
activity
=
(
Activity
)
mContext
;
new
ProcessRepoZip
(
activity
,
uri
,
false
).
exec
();
}
},
...
...
app/src/main/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java
View file @
69e5bcd5
package
com
.
topjohnwu
.
magisk
.
asyncs
;
import
android.app.NotificationManager
;
import
android.app.PendingIntent
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.support.v4.app.TaskStackBuilder
;
import
android.support.v7.app.NotificationCompat
;
import
com.topjohnwu.magisk.MagiskManager
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.SplashActivity
;
import
com.topjohnwu.magisk.BuildConfig
;
import
com.topjohnwu.magisk.utils.Utils
;
import
com.topjohnwu.magisk.utils.WebService
;
...
...
@@ -19,7 +12,7 @@ import org.json.JSONObject;
public
class
CheckUpdates
extends
ParallelTask
<
Void
,
Void
,
Void
>
{
private
static
final
String
UPDATE_JSON
=
"https://raw.githubusercontent.com/topjohnwu/MagiskManager/update/magisk_update.json"
;
private
static
final
int
NOTIFICATION_ID
=
1
;
private
boolean
showNotification
=
false
;
...
...
@@ -42,30 +35,23 @@ public class CheckUpdates extends ParallelTask<Void, Void, Void> {
magiskManager
.
remoteMagiskVersionCode
=
magisk
.
getInt
(
"versionCode"
);
magiskManager
.
magiskLink
=
magisk
.
getString
(
"link"
);
magiskManager
.
releaseNoteLink
=
magisk
.
getString
(
"note"
);
JSONObject
manager
=
json
.
getJSONObject
(
"app"
);
magiskManager
.
remoteManagerVersionString
=
manager
.
getString
(
"version"
);
magiskManager
.
remoteManagerVersionCode
=
manager
.
getInt
(
"versionCode"
);
magiskManager
.
managerLink
=
manager
.
getString
(
"link"
);
}
catch
(
JSONException
ignored
)
{}
return
null
;
}
@Override
protected
void
onPostExecute
(
Void
v
)
{
if
(
magiskManager
.
magiskVersionCode
<
magiskManager
.
remoteMagiskVersionCode
&&
showNotification
&&
magiskManager
.
updateNotification
)
{
NotificationCompat
.
Builder
builder
=
new
NotificationCompat
.
Builder
(
magiskManager
);
builder
.
setSmallIcon
(
R
.
drawable
.
ic_magisk
)
.
setContentTitle
(
magiskManager
.
getString
(
R
.
string
.
magisk_update_title
))
.
setContentText
(
magiskManager
.
getString
(
R
.
string
.
magisk_update_available
,
magiskManager
.
remoteMagiskVersionString
))
.
setVibrate
(
new
long
[]{
0
,
100
,
100
,
100
})
.
setAutoCancel
(
true
);
Intent
intent
=
new
Intent
(
magiskManager
,
SplashActivity
.
class
);
intent
.
putExtra
(
MagiskManager
.
INTENT_SECTION
,
"install"
);
TaskStackBuilder
stackBuilder
=
TaskStackBuilder
.
create
(
magiskManager
);
stackBuilder
.
addParentStack
(
SplashActivity
.
class
);
stackBuilder
.
addNextIntent
(
intent
);
PendingIntent
pendingIntent
=
stackBuilder
.
getPendingIntent
(
NOTIFICATION_ID
,
PendingIntent
.
FLAG_UPDATE_CURRENT
);
builder
.
setContentIntent
(
pendingIntent
);
NotificationManager
notificationManager
=
(
NotificationManager
)
magiskManager
.
getSystemService
(
Context
.
NOTIFICATION_SERVICE
);
notificationManager
.
notify
(
NOTIFICATION_ID
,
builder
.
build
());
if
(
showNotification
&&
magiskManager
.
updateNotification
)
{
if
(
magiskManager
.
magiskVersionCode
<
magiskManager
.
remoteMagiskVersionCode
)
{
Utils
.
showMagiskUpdate
(
magiskManager
);
}
if
(
BuildConfig
.
VERSION_CODE
<
magiskManager
.
remoteManagerVersionCode
)
{
Utils
.
showManagerUpdate
(
magiskManager
);
}
}
magiskManager
.
updateCheckDone
.
trigger
();
super
.
onPostExecute
(
v
);
...
...
app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java
View file @
69e5bcd5
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.app.Activity
;
import
android.app.DownloadManager
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
...
...
@@ -13,7 +12,7 @@ import com.topjohnwu.magisk.R;
import
com.topjohnwu.magisk.utils.Utils
;
public
abstract
class
DownloadReceiver
extends
BroadcastReceiver
{
public
Activity
activity
;
public
Context
mContext
;
public
String
mFilename
;
long
downloadID
;
...
...
@@ -21,7 +20,7 @@ public abstract class DownloadReceiver extends BroadcastReceiver {
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
activity
=
(
Activity
)
context
;
mContext
=
context
;
DownloadManager
downloadManager
=
(
DownloadManager
)
context
.
getSystemService
(
Context
.
DOWNLOAD_SERVICE
);
String
action
=
intent
.
getAction
();
if
(
DownloadManager
.
ACTION_DOWNLOAD_COMPLETE
.
equals
(
action
))
{
...
...
app/src/main/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java
0 → 100644
View file @
69e5bcd5
package
com
.
topjohnwu
.
magisk
.
receivers
;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.net.Uri
;
import
android.os.Build
;
import
android.support.v4.content.FileProvider
;
import
com.topjohnwu.magisk.MagiskManager
;
import
com.topjohnwu.magisk.utils.Utils
;
import
java.io.File
;
public
class
ManagerUpdate
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
MagiskManager
magiskManager
=
Utils
.
getMagiskManager
(
context
);
Utils
.
dlAndReceive
(
magiskManager
,
new
DownloadReceiver
()
{
@Override
public
void
onDownloadDone
(
Uri
uri
)
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
N
)
{
Intent
install
=
new
Intent
(
Intent
.
ACTION_INSTALL_PACKAGE
);
install
.
setFlags
(
Intent
.
FLAG_GRANT_READ_URI_PERMISSION
);
Uri
content
=
FileProvider
.
getUriForFile
(
mContext
,
"com.topjohnwu.magisk.provider"
,
new
File
(
uri
.
getPath
()));
install
.
setData
(
content
);
mContext
.
startActivity
(
install
);
}
else
{
Intent
install
=
new
Intent
(
Intent
.
ACTION_VIEW
);
install
.
setDataAndType
(
uri
,
"application/vnd.android.package-archive"
);
install
.
setFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
mContext
.
startActivity
(
install
);
}
}
},
magiskManager
.
managerLink
,
Utils
.
getLegalFilename
(
"MagiskManager-v"
+
magiskManager
.
remoteManagerVersionString
+
".apk"
));
}
}
app/src/main/java/com/topjohnwu/magisk/utils/Utils.java
View file @
69e5bcd5
...
...
@@ -3,7 +3,10 @@ package com.topjohnwu.magisk.utils;
import
android.Manifest
;
import
android.app.Activity
;
import
android.app.DownloadManager
;
import
android.app.NotificationManager
;
import
android.app.PendingIntent
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.IntentFilter
;
import
android.content.SharedPreferences
;
import
android.content.pm.PackageManager
;
...
...
@@ -16,15 +19,19 @@ import android.provider.OpenableColumns;
import
android.support.design.widget.Snackbar
;
import
android.support.v4.app.ActivityCompat
;
import
android.support.v4.app.FragmentActivity
;
import
android.support.v4.app.TaskStackBuilder
;
import
android.support.v7.app.NotificationCompat
;
import
android.text.TextUtils
;
import
android.widget.Toast
;
import
com.topjohnwu.magisk.MagiskManager
;
import
com.topjohnwu.magisk.R
;
import
com.topjohnwu.magisk.SplashActivity
;
import
com.topjohnwu.magisk.asyncs.LoadRepos
;
import
com.topjohnwu.magisk.components.SnackbarMaker
;
import
com.topjohnwu.magisk.database.RepoDatabaseHelper
;
import
com.topjohnwu.magisk.receivers.DownloadReceiver
;
import
com.topjohnwu.magisk.receivers.ManagerUpdate
;
import
java.io.File
;
import
java.util.List
;
...
...
@@ -33,6 +40,9 @@ public class Utils {
public
static
boolean
isDownloading
=
false
;
private
static
final
int
MAGISK_UPDATE_NOTIFICATION_ID
=
1
;
private
static
final
int
APK_UPDATE_NOTIFICATION_ID
=
2
;
public
static
boolean
itemExist
(
String
path
)
{
String
command
=
"if [ -e "
+
path
+
" ]; then echo true; else echo false; fi"
;
List
<
String
>
ret
=
Shell
.
su
(
command
);
...
...
@@ -70,14 +80,16 @@ public class Utils {
if
(
isDownloading
)
return
;
if
(
ActivityCompat
.
checkSelfPermission
(
context
,
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
)
!=
PackageManager
.
PERMISSION_GRANTED
)
{
if
(
ActivityCompat
.
checkSelfPermission
(
context
,
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
)
!=
PackageManager
.
PERMISSION_GRANTED
)
{
Toast
.
makeText
(
context
,
R
.
string
.
permissionNotGranted
,
Toast
.
LENGTH_LONG
).
show
();
return
;
}
File
file
=
new
File
(
Environment
.
getExternalStorageDirectory
()
+
"/MagiskManager/"
+
filename
);
if
((!
file
.
getParentFile
().
exists
()
&&
!
file
.
getParentFile
().
mkdirs
())
||
(
file
.
exists
()
&&
!
file
.
delete
()))
{
if
((!
file
.
getParentFile
().
exists
()
&&
!
file
.
getParentFile
().
mkdirs
())
||
(
file
.
exists
()
&&
!
file
.
delete
()))
{
Toast
.
makeText
(
context
,
R
.
string
.
permissionNotGranted
,
Toast
.
LENGTH_LONG
).
show
();
return
;
}
...
...
@@ -105,7 +117,9 @@ public class Utils {
public
static
String
detectBootImage
()
{
String
[]
commands
=
{
"for PARTITION in kern-a KERN-A android_boot ANDROID_BOOT kernel KERNEL boot BOOT lnx LNX; do"
,
"BOOTIMAGE=`readlink /dev/block/by-name/$PARTITION || readlink /dev/block/platform/*/by-name/$PARTITION || readlink /dev/block/platform/*/*/by-name/$PARTITION`"
,
"BOOTIMAGE=`readlink /dev/block/by-name/$PARTITION || "
+
"readlink /dev/block/platform/*/by-name/$PARTITION || "
+
"readlink /dev/block/platform/*/*/by-name/$PARTITION`"
,
"if [ ! -z \"$BOOTIMAGE\" ]; then break; fi"
,
"done"
,
"echo \"$BOOTIMAGE\""
...
...
@@ -194,4 +208,40 @@ public class Utils {
}
return
true
;
}
public
static
void
showMagiskUpdate
(
MagiskManager
magiskManager
)
{
NotificationCompat
.
Builder
builder
=
new
NotificationCompat
.
Builder
(
magiskManager
);
builder
.
setSmallIcon
(
R
.
drawable
.
ic_magisk
)
.
setContentTitle
(
magiskManager
.
getString
(
R
.
string
.
magisk_update_title
))
.
setContentText
(
magiskManager
.
getString
(
R
.
string
.
magisk_update_available
,
magiskManager
.
remoteMagiskVersionString
))
.
setVibrate
(
new
long
[]{
0
,
100
,
100
,
100
})
.
setAutoCancel
(
true
);
Intent
intent
=
new
Intent
(
magiskManager
,
SplashActivity
.
class
);
intent
.
putExtra
(
MagiskManager
.
INTENT_SECTION
,
"install"
);
TaskStackBuilder
stackBuilder
=
TaskStackBuilder
.
create
(
magiskManager
);
stackBuilder
.
addParentStack
(
SplashActivity
.
class
);
stackBuilder
.
addNextIntent
(
intent
);
PendingIntent
pendingIntent
=
stackBuilder
.
getPendingIntent
(
MAGISK_UPDATE_NOTIFICATION_ID
,
PendingIntent
.
FLAG_UPDATE_CURRENT
);
builder
.
setContentIntent
(
pendingIntent
);
NotificationManager
notificationManager
=
(
NotificationManager
)
magiskManager
.
getSystemService
(
Context
.
NOTIFICATION_SERVICE
);
notificationManager
.
notify
(
MAGISK_UPDATE_NOTIFICATION_ID
,
builder
.
build
());
}
public
static
void
showManagerUpdate
(
MagiskManager
magiskManager
)
{
NotificationCompat
.
Builder
builder
=
new
NotificationCompat
.
Builder
(
magiskManager
);
builder
.
setSmallIcon
(
R
.
drawable
.
ic_magisk
)
.
setContentTitle
(
magiskManager
.
getString
(
R
.
string
.
manager_update_title
))
.
setContentText
(
magiskManager
.
getString
(
R
.
string
.
manager_download_install
))
.
setVibrate
(
new
long
[]{
0
,
100
,
100
,
100
})
.
setAutoCancel
(
true
);
Intent
intent
=
new
Intent
(
magiskManager
,
ManagerUpdate
.
class
);
PendingIntent
pendingIntent
=
PendingIntent
.
getBroadcast
(
magiskManager
,
APK_UPDATE_NOTIFICATION_ID
,
intent
,
PendingIntent
.
FLAG_UPDATE_CURRENT
);
builder
.
setContentIntent
(
pendingIntent
);
NotificationManager
notificationManager
=
(
NotificationManager
)
magiskManager
.
getSystemService
(
Context
.
NOTIFICATION_SERVICE
);
notificationManager
.
notify
(
APK_UPDATE_NOTIFICATION_ID
,
builder
.
build
());
}
}
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
69e5bcd5
...
...
@@ -130,6 +130,8 @@
<string
name=
"internal_storage"
>
The zip is stored in:\n[Internal Storage]%1$s
</string>
<string
name=
"zip_process_title"
>
Processing
</string>
<string
name=
"manual_boot_image"
>
Please manually select a boot image!
</string>
<string
name=
"manager_update_title"
>
New Magisk Manager Update Available!
</string>
<string
name=
"manager_download_install"
>
Press to download and install
</string>
<!--Settings Activity -->
<string
name=
"settings_general_category"
>
General
</string>
...
...
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