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
9bebe07d
Commit
9bebe07d
authored
Sep 28, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Better network connection observing
parent
ee4db431
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
91 additions
and
82 deletions
+91
-82
Info.kt
app/src/main/java/com/topjohnwu/magisk/core/Info.kt
+2
-2
LollipopNetworkObserver.kt
...opjohnwu/magisk/core/utils/net/LollipopNetworkObserver.kt
+15
-4
MarshmallowNetworkObserver.kt
...ohnwu/magisk/core/utils/net/MarshmallowNetworkObserver.kt
+53
-0
NetworkObserver.kt
...va/com/topjohnwu/magisk/core/utils/net/NetworkObserver.kt
+8
-18
PreLollipopNetworkObserver.kt
...ohnwu/magisk/core/utils/net/PreLollipopNetworkObserver.kt
+13
-9
Connectivity.kt
.../main/java/com/topjohnwu/magisk/utils/net/Connectivity.kt
+0
-49
No files found.
app/src/main/java/com/topjohnwu/magisk/core/Info.kt
View file @
9bebe07d
...
...
@@ -3,9 +3,9 @@ package com.topjohnwu.magisk.core
import
androidx.databinding.ObservableBoolean
import
com.topjohnwu.magisk.DynAPK
import
com.topjohnwu.magisk.core.model.UpdateInfo
import
com.topjohnwu.magisk.core.utils.net.NetworkObserver
import
com.topjohnwu.magisk.ktx.get
import
com.topjohnwu.magisk.utils.CachedValue
import
com.topjohnwu.magisk.utils.net.NetworkObserver
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.ShellUtils.fastCmd
import
com.topjohnwu.superuser.internal.UiThreadHandler
...
...
@@ -38,7 +38,7 @@ object Info {
val
isConnected
by
lazy
{
ObservableBoolean
(
false
).
also
{
field
->
NetworkObserver
.
observe
(
get
())
{
UiThreadHandler
.
run
{
field
.
set
(
it
.
isAvailable
)
}
UiThreadHandler
.
run
{
field
.
set
(
it
)
}
}
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/utils/net/LollipopNetworkObserver.kt
→
app/src/main/java/com/topjohnwu/magisk/
core/
utils/net/LollipopNetworkObserver.kt
View file @
9bebe07d
package
com.topjohnwu.magisk.utils.net
package
com.topjohnwu.magisk.
core.
utils.net
import
android.annotation.TargetApi
import
android.content.Context
...
...
@@ -6,11 +6,12 @@ import android.net.ConnectivityManager
import
android.net.Network
import
android.net.NetworkCapabilities
import
android.net.NetworkRequest
import
androidx.collection.ArraySet
@TargetApi
(
21
)
open
class
LollipopNetworkObserver
(
context
:
Context
,
callback
:
NetInfo
Callback
callback
:
Connection
Callback
):
NetworkObserver
(
context
,
callback
)
{
private
val
networkCallback
=
NetCallback
()
...
...
@@ -22,17 +23,27 @@ open class LollipopNetworkObserver(
manager
.
registerNetworkCallback
(
request
,
networkCallback
)
}
@Suppress
(
"DEPRECATION"
)
override
fun
getCurrentState
()
{
callback
(
manager
.
activeNetworkInfo
?.
isConnected
?:
false
)
}
override
fun
stopObserving
()
{
manager
.
unregisterNetworkCallback
(
networkCallback
)
}
private
inner
class
NetCallback
:
ConnectivityManager
.
NetworkCallback
()
{
private
val
activeList
=
ArraySet
<
Network
>()
override
fun
onAvailable
(
network
:
Network
)
{
emit
(
Connectivity
.
create
(
manager
,
network
))
activeList
.
add
(
network
)
callback
(
true
)
}
override
fun
onLost
(
network
:
Network
)
{
emit
(
Connectivity
.
create
(
manager
,
network
))
activeList
.
remove
(
network
)
callback
(!
activeList
.
isEmpty
())
}
}
}
app/src/main/java/com/topjohnwu/magisk/utils/net/MarshmallowNetworkObserver.kt
→
app/src/main/java/com/topjohnwu/magisk/
core/
utils/net/MarshmallowNetworkObserver.kt
View file @
9bebe07d
@file
:
Suppress
(
"DEPRECATION"
)
package
com.topjohnwu.magisk.utils.net
package
com.topjohnwu.magisk.
core.
utils.net
import
android.annotation.TargetApi
import
android.content.BroadcastReceiver
import
android.content.Context
import
android.content.Intent
import
android.content.IntentFilter
import
android.net.Network
Info
import
android.net.Network
Capabilities
import
android.os.PowerManager
import
androidx.core.content.getSystemService
@TargetApi
(
23
)
class
MarshmallowNetworkObserver
(
context
:
Context
,
callback
:
NetInfo
Callback
callback
:
Connection
Callback
):
LollipopNetworkObserver
(
context
,
callback
)
{
private
val
idleR
eceiver
=
IdleBroadcastReceiver
()
private
val
r
eceiver
=
IdleBroadcastReceiver
()
init
{
val
filter
=
IntentFilter
(
PowerManager
.
ACTION_DEVICE_IDLE_MODE_CHANGED
)
context
.
registerReceiver
(
idleR
eceiver
,
filter
)
app
.
registerReceiver
(
r
eceiver
,
filter
)
}
override
fun
stopObserving
()
{
super
.
stopObserving
()
context
.
unregisterReceiver
(
idleR
eceiver
)
app
.
unregisterReceiver
(
r
eceiver
)
}
override
fun
emit
(
current
:
Connectivity
)
{
val
typeChanged
=
last
.
type
!=
current
.
type
val
wasConnected
=
last
.
state
==
NetworkInfo
.
State
.
CONNECTED
val
isDisconnected
=
current
.
state
==
NetworkInfo
.
State
.
DISCONNECTED
val
isNotIdle
=
current
.
detailedState
!=
NetworkInfo
.
DetailedState
.
IDLE
if
(
typeChanged
&&
wasConnected
&&
isDisconnected
&&
isNotIdle
)
{
super
.
emit
(
current
)
super
.
emit
(
last
)
last
=
current
}
else
{
super
.
emit
(
current
)
}
override
fun
getCurrentState
()
{
callback
(
manager
.
getNetworkCapabilities
(
manager
.
activeNetwork
)
?.
hasCapability
(
NetworkCapabilities
.
NET_CAPABILITY_INTERNET
)
?:
false
)
}
private
inner
class
IdleBroadcastReceiver
:
BroadcastReceiver
()
{
private
fun
isIdleMode
(
context
:
Context
):
Boolean
{
val
packageName
=
context
.
packageName
val
manager
=
context
.
getSystemService
<
PowerManager
>()
!!
val
isIgnoringOptimizations
=
manager
.
isIgnoringBatteryOptimizations
(
packageName
)
return
manager
.
isDeviceIdleMode
&&
!
isIgnoringOptimizations
private
fun
Context
.
isIdleMode
():
Boolean
{
val
pwm
=
getSystemService
<
PowerManager
>()
?:
return
true
val
isIgnoringOptimizations
=
pwm
.
isIgnoringBatteryOptimizations
(
packageName
)
return
pwm
.
isDeviceIdleMode
&&
!
isIgnoringOptimizations
}
override
fun
onReceive
(
context
:
Context
,
intent
:
Intent
)
{
if
(
isIdleMode
(
context
))
{
emit
(
Connectivity
()
)
if
(
context
.
isIdleMode
(
))
{
callback
(
false
)
}
else
{
emit
(
Connectivity
.
create
(
manager
)
)
getCurrentState
(
)
}
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/utils/net/NetworkObserver.kt
→
app/src/main/java/com/topjohnwu/magisk/
core/
utils/net/NetworkObserver.kt
View file @
9bebe07d
package
com.topjohnwu.magisk.utils.net
package
com.topjohnwu.magisk.
core.
utils.net
import
android.content.Context
import
android.net.ConnectivityManager
import
android.os.Build
import
androidx.core.content.getSystemService
typealias
NetInfoCallback
=
(
Connectivity
)
->
Unit
typealias
ConnectionCallback
=
(
Boolean
)
->
Unit
abstract
class
NetworkObserver
protected
constructor
(
abstract
class
NetworkObserver
(
context
:
Context
,
pr
ivate
val
callback
:
NetInfo
Callback
pr
otected
val
callback
:
Connection
Callback
)
{
protected
val
c
ontext
=
context
.
applicationContext
protected
val
app
:
C
ontext
=
context
.
applicationContext
protected
val
manager
=
context
.
getSystemService
<
ConnectivityManager
>()
!!
protected
var
last
=
Connectivity
.
create
(
manager
)
init
{
callback
(
last
)
}
protected
open
fun
emit
(
current
:
Connectivity
)
{
if
(
last
!=
current
)
callback
(
current
)
last
=
current
}
protected
abstract
fun
stopObserving
()
protected
abstract
fun
getCurrentState
()
companion
object
{
fun
observe
(
context
:
Context
,
callback
:
NetInfo
Callback
):
NetworkObserver
{
fun
observe
(
context
:
Context
,
callback
:
Connection
Callback
):
NetworkObserver
{
return
when
(
Build
.
VERSION
.
SDK_INT
)
{
in
23
until
Int
.
MAX_VALUE
->
MarshmallowNetworkObserver
(
context
,
callback
)
in
21
until
23
->
LollipopNetworkObserver
(
context
,
callback
)
else
->
PreLollipopNetworkObserver
(
context
,
callback
)
}
}
.
apply
{
getCurrentState
()
}
}
}
}
app/src/main/java/com/topjohnwu/magisk/utils/net/PreLollipopNetworkObserver.kt
→
app/src/main/java/com/topjohnwu/magisk/
core/
utils/net/PreLollipopNetworkObserver.kt
View file @
9bebe07d
@file
:
Suppress
(
"DEPRECATION"
)
package
com.topjohnwu.magisk.utils.net
package
com.topjohnwu.magisk.
core.
utils.net
import
android.content.BroadcastReceiver
import
android.content.Context
import
android.content.Intent
import
android.content.IntentFilter
import
android.net.ConnectivityManager
import
androidx.core.net.ConnectivityManagerCompat
class
PreLollipopNetworkObserver
(
context
:
Context
,
callback
:
NetInfo
Callback
callback
:
Connection
Callback
):
NetworkObserver
(
context
,
callback
)
{
private
val
receiver
=
ConnectivityBroadcastReceiver
()
init
{
val
filter
=
IntentFilter
()
filter
.
addAction
(
ConnectivityManager
.
CONNECTIVITY_ACTION
)
context
.
registerReceiver
(
receiver
,
filter
)
val
filter
=
IntentFilter
(
ConnectivityManager
.
CONNECTIVITY_ACTION
)
app
.
registerReceiver
(
receiver
,
filter
)
}
override
fun
stopObserving
()
{
context
.
unregisterReceiver
(
receiver
)
app
.
unregisterReceiver
(
receiver
)
}
override
fun
getCurrentState
()
{
callback
(
manager
.
activeNetworkInfo
?.
isConnected
?:
false
)
}
private
inner
class
ConnectivityBroadcastReceiver
:
BroadcastReceiver
()
{
override
fun
onReceive
(
context
:
Context
?,
intent
:
Intent
?)
{
emit
(
Connectivity
.
create
(
manager
))
override
fun
onReceive
(
context
:
Context
?,
intent
:
Intent
)
{
val
info
=
ConnectivityManagerCompat
.
getNetworkInfoFromBroadcast
(
manager
,
intent
)
callback
(
info
?.
isConnected
?:
false
)
}
}
}
app/src/main/java/com/topjohnwu/magisk/utils/net/Connectivity.kt
deleted
100644 → 0
View file @
ee4db431
@file
:
Suppress
(
"DEPRECATION"
)
package
com.topjohnwu.magisk.utils.net
import
android.net.ConnectivityManager
import
android.net.Network
import
android.net.NetworkInfo
import
android.net.NetworkInfo.DetailedState
import
androidx.annotation.RequiresApi
// Recreate NetworkInfo with Kotlin data class
data class
Connectivity
(
val
state
:
NetworkInfo
.
State
=
NetworkInfo
.
State
.
DISCONNECTED
,
val
detailedState
:
DetailedState
=
DetailedState
.
IDLE
,
val
type
:
Int
=
-
1
,
val
subType
:
Int
=
-
1
,
val
isAvailable
:
Boolean
=
false
,
val
isFailover
:
Boolean
=
false
,
val
isRoaming
:
Boolean
=
false
,
val
typeName
:
String
=
"NONE"
,
val
subTypeName
:
String
=
"NONE"
,
val
reason
:
String
?
=
null
,
val
extraInfo
:
String
?
=
null
)
{
private
constructor
(
info
:
NetworkInfo
)
:
this
(
info
.
state
,
info
.
detailedState
,
info
.
type
,
info
.
subtype
,
info
.
isAvailable
,
info
.
isFailover
,
info
.
isRoaming
,
info
.
typeName
,
info
.
subtypeName
,
info
.
reason
,
info
.
extraInfo
)
companion
object
{
fun
create
(
manager
:
ConnectivityManager
):
Connectivity
{
return
manager
.
activeNetworkInfo
?.
let
{
Connectivity
(
it
)
}
?:
Connectivity
()
}
@RequiresApi
(
21
)
fun
create
(
manager
:
ConnectivityManager
,
network
:
Network
):
Connectivity
{
return
manager
.
getNetworkInfo
(
network
)
?.
let
{
Connectivity
(
it
)
}
?:
Connectivity
()
}
}
}
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