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
10ce11d6
Commit
10ce11d6
authored
Oct 31, 2019
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix config/locale issues
Close #1977
parent
0f34457a
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
77 additions
and
66 deletions
+77
-66
App.kt
app/src/main/java/com/topjohnwu/magisk/App.kt
+6
-5
Hacks.kt
app/src/main/java/com/topjohnwu/magisk/Hacks.kt
+14
-28
SettingsFragment.kt
...java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt
+2
-18
Locales.kt
app/src/main/java/com/topjohnwu/magisk/utils/Locales.kt
+55
-15
No files found.
app/src/main/java/com/topjohnwu/magisk/App.kt
View file @
10ce11d6
...
...
@@ -16,6 +16,7 @@ import com.topjohnwu.magisk.di.koinModules
import
com.topjohnwu.magisk.extensions.get
import
com.topjohnwu.magisk.extensions.unwrap
import
com.topjohnwu.magisk.utils.RootInit
import
com.topjohnwu.magisk.utils.updateConfig
import
com.topjohnwu.superuser.Shell
import
org.koin.android.ext.koin.androidContext
import
org.koin.core.context.startKoin
...
...
@@ -58,15 +59,15 @@ open class App() : Application() {
app
=
this
impl
=
base
}
ResourceMgr
.
init
(
impl
)
super
.
attachBaseContext
(
impl
.
wrap
()
)
val
wrapped
=
impl
.
wrap
(
)
super
.
attachBaseContext
(
wrapped
)
// Normal startup
startKoin
{
androidContext
(
baseContext
)
androidContext
(
wrapped
)
modules
(
koinModules
)
}
ResourceMgr
.
reload
(
)
ResourceMgr
.
init
(
impl
)
app
.
registerActivityLifecycleCallbacks
(
get
<
ActivityTracker
>())
WorkManager
.
initialize
(
impl
.
wrapJob
(),
androidx
.
work
.
Configuration
.
Builder
().
build
())
}
...
...
@@ -77,7 +78,7 @@ open class App() : Application() {
}
override
fun
onConfigurationChanged
(
newConfig
:
Configuration
)
{
ResourceMgr
.
reload
(
newConfig
)
resources
.
updateConfig
(
newConfig
)
if
(!
isRunningAsStub
)
super
.
onConfigurationChanged
(
newConfig
)
}
...
...
app/src/main/java/com/topjohnwu/magisk/Hacks.kt
View file @
10ce11d6
...
...
@@ -25,6 +25,8 @@ import com.topjohnwu.magisk.ui.flash.FlashActivity
import
com.topjohnwu.magisk.ui.surequest.SuRequestActivity
import
com.topjohnwu.magisk.utils.currentLocale
import
com.topjohnwu.magisk.utils.defaultLocale
import
com.topjohnwu.magisk.utils.refreshLocale
import
com.topjohnwu.magisk.utils.updateConfig
import
java.util.*
fun
AssetManager
.
addAssetPath
(
path
:
String
)
{
...
...
@@ -51,15 +53,6 @@ fun Context.wrapJob(): Context = object : GlobalResContext(this) {
}
}
// Override locale and inject resources from dynamic APK
private
fun
Resources
.
patch
(
config
:
Configuration
=
Configuration
(
configuration
)):
Resources
{
config
.
setLocale
(
currentLocale
)
updateConfiguration
(
config
,
displayMetrics
)
if
(
isRunningAsStub
)
assets
.
addAssetPath
(
ResourceMgr
.
resApk
)
return
this
}
fun
Class
<*>.
cmp
(
pkg
:
String
=
BuildConfig
.
APPLICATION_ID
):
ComponentName
{
val
name
=
ClassMap
[
this
].
name
return
ComponentName
(
pkg
,
Info
.
stub
?.
componentMap
?.
get
(
name
)
?:
name
)
...
...
@@ -92,35 +85,28 @@ private open class GlobalResContext(base: Context) : ContextWrapper(base) {
private
class
ResContext
(
base
:
Context
)
:
GlobalResContext
(
base
)
{
override
val
mRes
by
lazy
{
base
.
resources
.
patch
()
}
private
fun
Resources
.
patch
():
Resources
{
updateConfig
()
if
(
isRunningAsStub
)
assets
.
addAssetPath
(
ResourceMgr
.
resApk
)
return
this
}
}
object
ResourceMgr
{
internal
lateinit
var
resource
:
Resources
internal
lateinit
var
resApk
:
String
lateinit
var
resource
:
Resources
lateinit
var
resApk
:
String
fun
init
(
context
:
Context
)
{
resource
=
context
.
resources
if
(
isRunningAsStub
)
refreshLocale
()
if
(
isRunningAsStub
)
{
resApk
=
DynAPK
.
current
(
context
).
path
}
fun
reload
(
config
:
Configuration
=
Configuration
(
resource
.
configuration
))
{
val
localeConfig
=
Config
.
locale
currentLocale
=
when
{
localeConfig
.
isEmpty
()
->
defaultLocale
else
->
localeConfig
.
langTagToLocale
()
resource
.
assets
.
addAssetPath
(
resApk
)
}
Locale
.
setDefault
(
currentLocale
)
resource
.
patch
(
config
)
}
fun
getString
(
locale
:
Locale
,
@StringRes
id
:
Int
):
String
{
val
config
=
Configuration
()
config
.
setLocale
(
locale
)
return
Resources
(
resource
.
assets
,
resource
.
displayMetrics
,
config
).
getString
(
id
)
}
}
@RequiresApi
(
api
=
28
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt
View file @
10ce11d6
...
...
@@ -19,7 +19,6 @@ import com.topjohnwu.magisk.data.database.RepoDao
import
com.topjohnwu.magisk.databinding.CustomDownloadDialogBinding
import
com.topjohnwu.magisk.databinding.DialogCustomNameBinding
import
com.topjohnwu.magisk.extensions.subscribeK
import
com.topjohnwu.magisk.extensions.toLangTag
import
com.topjohnwu.magisk.model.download.DownloadService
import
com.topjohnwu.magisk.model.entity.internal.Configuration
import
com.topjohnwu.magisk.model.entity.internal.DownloadSubject
...
...
@@ -199,7 +198,7 @@ class SettingsFragment : BasePreferenceFragment() {
Shell
.
su
(
"magiskhide --disable"
).
submit
()
}
Config
.
Key
.
LOCALE
->
{
ResourceMgr
.
reload
()
refreshLocale
()
activity
.
recreate
()
}
Config
.
Key
.
CHECK_UPDATES
->
Utils
.
scheduleUpdateCheck
(
activity
)
...
...
@@ -223,22 +222,7 @@ class SettingsFragment : BasePreferenceFragment() {
private
fun
setLocalePreference
(
lp
:
ListPreference
)
{
lp
.
isEnabled
=
false
availableLocales
.
map
{
val
names
=
mutableListOf
<
String
>()
val
values
=
mutableListOf
<
String
>()
names
.
add
(
ResourceMgr
.
getString
(
defaultLocale
,
R
.
string
.
system_default
)
)
values
.
add
(
""
)
it
.
forEach
{
locale
->
names
.
add
(
locale
.
getDisplayName
(
locale
))
values
.
add
(
locale
.
toLangTag
())
}
Pair
(
names
.
toTypedArray
(),
values
.
toTypedArray
())
}.
subscribeK
{
(
names
,
values
)
->
availableLocales
.
subscribeK
{
(
names
,
values
)
->
lp
.
isEnabled
=
true
lp
.
entries
=
names
lp
.
entryValues
=
values
...
...
app/src/main/java/com/topjohnwu/magisk/utils/Locales.kt
View file @
10ce11d6
@file
:
Suppress
(
"DEPRECATION"
)
package
com.topjohnwu.magisk.utils
import
android.annotation.SuppressLint
import
android.content.res.Configuration
import
android.content.res.Resources
import
com.topjohnwu.magisk.Config
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.ResourceMgr
import
com.topjohnwu.magisk.extensions.langTagToLocale
import
com.topjohnwu.magisk.extensions.toLangTag
import
io.reactivex.Single
import
java.util.*
import
kotlin.Comparator
import
kotlin.collections.ArrayList
var
currentLocale
:
Locale
=
Locale
.
getDefault
()
@SuppressLint
(
"ConstantLocale"
)
val
defaultLocale
:
Locale
=
Locale
.
getDefault
()
@Suppress
(
"DEPRECATION"
)
val
availableLocales
=
Single
.
fromCallable
{
val
compareId
=
R
.
string
.
app_changelog
mutableListOf
<
Locale
>().
apply
{
val
config
=
ResourceMgr
.
resource
.
configuration
val
metrics
=
ResourceMgr
.
resource
.
displayMetrics
val
res
=
Resources
(
ResourceMgr
.
resource
.
assets
,
metrics
,
config
)
val
locales
=
mutableListOf
<
Locale
>().
apply
{
// Add default locale
add
(
Locale
.
ENGLISH
)
...
...
@@ -26,24 +34,56 @@ val availableLocales = Single.fromCallable {
add
(
Locale
.
TAIWAN
)
add
(
Locale
(
"pt"
,
"BR"
))
val
config
=
Configuration
()
val
metrics
=
ResourceMgr
.
resource
.
displayMetrics
val
res
=
Resources
(
ResourceMgr
.
resource
.
assets
,
metrics
,
config
)
// Other locales
val
otherLocales
=
ResourceMgr
.
resource
.
assets
.
locales
.
map
{
it
.
langTagToLocale
()
}
.
distinctBy
{
config
.
setLocale
(
it
)
res
.
updateConfiguration
(
config
,
metrics
)
res
.
getString
(
compareId
)
}
listOf
(
""
,
""
).
toTypedArray
()
.
map
{
it
.
langTagToLocale
()
}
.
distinctBy
{
config
.
setLocale
(
it
)
res
.
updateConfiguration
(
config
,
metrics
)
res
.
getString
(
compareId
)
}
addAll
(
otherLocales
)
}.
sortedWith
(
Comparator
{
a
,
b
->
a
.
getDisplayName
(
a
).
toLowerCase
(
a
)
.
compareTo
(
b
.
getDisplayName
(
b
).
toLowerCase
(
b
))
.
compareTo
(
b
.
getDisplayName
(
b
).
toLowerCase
(
b
))
})
config
.
setLocale
(
defaultLocale
)
res
.
updateConfiguration
(
config
,
metrics
)
val
defName
=
res
.
getString
(
R
.
string
.
system_default
)
// Restore back to current locale
config
.
setLocale
(
currentLocale
)
res
.
updateConfiguration
(
config
,
metrics
)
Pair
(
locales
,
defName
)
}.
map
{
(
locales
,
defName
)
->
val
names
=
ArrayList
<
String
>(
locales
.
size
+
1
)
val
values
=
ArrayList
<
String
>(
locales
.
size
+
1
)
names
.
add
(
defName
)
values
.
add
(
""
)
locales
.
forEach
{
locale
->
names
.
add
(
locale
.
getDisplayName
(
locale
))
values
.
add
(
locale
.
toLangTag
())
}
Pair
(
names
.
toTypedArray
(),
values
.
toTypedArray
())
}.
cache
()
!!
fun
Resources
.
updateConfig
(
config
:
Configuration
=
configuration
)
{
config
.
setLocale
(
currentLocale
)
updateConfiguration
(
config
,
displayMetrics
)
}
fun
refreshLocale
()
{
val
localeConfig
=
Config
.
locale
currentLocale
=
when
{
localeConfig
.
isEmpty
()
->
defaultLocale
else
->
localeConfig
.
langTagToLocale
()
}
Locale
.
setDefault
(
currentLocale
)
ResourceMgr
.
resource
.
updateConfig
()
}
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