Compare commits
10 Commits
0d2d9020bc
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 449fed287e | |||
| 7458216cbc | |||
| b3bf7c77f5 | |||
| d2c7fdd5a8 | |||
| 4eb0d65e8a | |||
| 8e37bca0c3 | |||
| 151e488b6f | |||
| 5d349abe65 | |||
| 8fee8d692c | |||
| da1efc3c32 |
@@ -84,7 +84,7 @@
|
|||||||
android:fullBackupContent="@xml/backupscheme"
|
android:fullBackupContent="@xml/backupscheme"
|
||||||
android:fullBackupOnly="true"
|
android:fullBackupOnly="true"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:icon="@drawable/ic_launcher_home"
|
android:icon="@mipmap/ic_launcher_home"
|
||||||
android:label="@string/derived_app_name"
|
android:label="@string/derived_app_name"
|
||||||
android:largeHeap="@bool/config_largeHeap"
|
android:largeHeap="@bool/config_largeHeap"
|
||||||
android:networkSecurityConfig="@xml/network"
|
android:networkSecurityConfig="@xml/network"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
android:fullBackupContent="@xml/backupscheme"
|
android:fullBackupContent="@xml/backupscheme"
|
||||||
android:fullBackupOnly="true"
|
android:fullBackupOnly="true"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:icon="@drawable/ic_launcher_home"
|
android:icon="@mipmap/ic_launcher_home"
|
||||||
android:label="@string/derived_app_name"
|
android:label="@string/derived_app_name"
|
||||||
android:largeHeap="@bool/config_largeHeap"
|
android:largeHeap="@bool/config_largeHeap"
|
||||||
android:restoreAnyVersion="true"
|
android:restoreAnyVersion="true"
|
||||||
|
|||||||
177
build.gradle
@@ -75,8 +75,8 @@ android {
|
|||||||
minSdkVersion 26
|
minSdkVersion 26
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
|
|
||||||
versionCode 203
|
versionCode 216
|
||||||
versionName "1.6.0526"
|
versionName "1.6.1016"
|
||||||
|
|
||||||
ndk {
|
ndk {
|
||||||
//选择要添加的对应 cpu 类型的 .so 库。
|
//选择要添加的对应 cpu 类型的 .so 库。
|
||||||
@@ -159,6 +159,15 @@ android {
|
|||||||
v2SigningEnabled true
|
v2SigningEnabled true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iPlay50miniPro {
|
||||||
|
storeFile file("keystore/iPlay50miniPro.jks")
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias "iplay50minipro"
|
||||||
|
keyPassword "123456"
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
|
|
||||||
G10P {
|
G10P {
|
||||||
storeFile file("keystore/G10PMTK11.jks")
|
storeFile file("keystore/G10PMTK11.jks")
|
||||||
storePassword "123456"
|
storePassword "123456"
|
||||||
@@ -239,27 +248,127 @@ android {
|
|||||||
v2SigningEnabled true
|
v2SigningEnabled true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
G122 {
|
||||||
|
storeFile file("keystore/6789U.p12")
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias "6789u"
|
||||||
|
keyPassword "123456"
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
|
|
||||||
|
DX11 {
|
||||||
|
storeFile file("keystore/DX11.p12")
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias "dx11"
|
||||||
|
keyPassword "123456"
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
|
|
||||||
|
MT6789 {
|
||||||
|
storeFile file("keystore/MT6789.keystore")
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias "mt6789"
|
||||||
|
keyPassword "123456"
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
|
|
||||||
|
SM8150 {
|
||||||
|
storeFile file("keystore/sm8150.jks")
|
||||||
|
storePassword "logan-123456789"
|
||||||
|
keyAlias "platformkey"
|
||||||
|
keyPassword "logan-123456789"
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
|
|
||||||
|
G122J {
|
||||||
|
storeFile file("keystore/G122J.p12")
|
||||||
|
storePassword "123456"
|
||||||
|
keyAlias "g122j"
|
||||||
|
keyPassword "123456"
|
||||||
|
v1SigningEnabled true
|
||||||
|
v2SigningEnabled true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
G122JDebug.initWith(debug)
|
||||||
|
G122JDebug {
|
||||||
|
buildConfigField "String", "platform", '"G122J"'
|
||||||
|
versionNameSuffix "_debug"
|
||||||
|
debuggable true
|
||||||
|
signingConfig signingConfigs.G122J
|
||||||
|
}
|
||||||
|
|
||||||
|
G122JRelease.initWith(release)
|
||||||
|
G122JRelease {
|
||||||
|
buildConfigField "String", "platform", '"G122J"'
|
||||||
|
signingConfig signingConfigs.G122J
|
||||||
|
}
|
||||||
|
|
||||||
|
G12NLDebug.initWith(debug)
|
||||||
|
G12NLDebug {
|
||||||
|
buildConfigField "String", "platform", '"G12NL"'
|
||||||
|
versionNameSuffix "_debug"
|
||||||
|
debuggable true
|
||||||
|
signingConfig signingConfigs.MT6789
|
||||||
|
}
|
||||||
|
|
||||||
|
G12NLRelease.initWith(release)
|
||||||
|
G12NLRelease {
|
||||||
|
buildConfigField "String", "platform", '"G12NL"'
|
||||||
|
signingConfig signingConfigs.MT6789
|
||||||
|
}
|
||||||
|
|
||||||
|
DX11Debug.initWith(debug)
|
||||||
|
DX11Debug {
|
||||||
|
buildConfigField "String", "platform", '"DX11"'
|
||||||
|
versionNameSuffix "_debug"
|
||||||
|
debuggable true
|
||||||
|
signingConfig signingConfigs.DX11
|
||||||
|
}
|
||||||
|
|
||||||
|
DX11Release.initWith(release)
|
||||||
|
DX11Release {
|
||||||
|
buildConfigField "String", "platform", '"DX11"'
|
||||||
|
signingConfig signingConfigs.DX11
|
||||||
|
}
|
||||||
|
|
||||||
|
G122Debug.initWith(debug)
|
||||||
|
G122Debug {
|
||||||
|
buildConfigField "String", "platform", '"MT6765"'
|
||||||
|
versionNameSuffix "_debug"
|
||||||
|
debuggable true
|
||||||
|
signingConfig signingConfigs.G122
|
||||||
|
}
|
||||||
|
|
||||||
|
G122Release.initWith(release)
|
||||||
|
G122Release {
|
||||||
|
buildConfigField "String", "platform", '"MT6765"'
|
||||||
|
signingConfig signingConfigs.G122
|
||||||
|
}
|
||||||
|
|
||||||
QualcommDebug.initWith(debug)
|
QualcommDebug.initWith(debug)
|
||||||
QualcommDebug {
|
QualcommDebug {
|
||||||
buildConfigField "String", "platform", '"QualcommA"'
|
buildConfigField "String", "platform", '"QualcommA"'
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.zhanRui
|
signingConfig signingConfigs.SM8150
|
||||||
}
|
}
|
||||||
|
|
||||||
QualcommRelease.initWith(release)
|
QualcommRelease.initWith(release)
|
||||||
QualcommRelease {
|
QualcommRelease {
|
||||||
buildConfigField "String", "platform", '"QualcommA"'
|
buildConfigField "String", "platform", '"QualcommA"'
|
||||||
signingConfig signingConfigs.zhanRui
|
signingConfig signingConfigs.SM8150
|
||||||
}
|
}
|
||||||
|
|
||||||
G128TDebug.initWith(debug)
|
G128TDebug.initWith(debug)
|
||||||
G128TDebug {
|
G128TDebug {
|
||||||
buildConfigField "String", "platform", '"G128T"'
|
buildConfigField "String", "platform", '"G128T"'
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.G128T
|
signingConfig signingConfigs.G128T
|
||||||
}
|
}
|
||||||
@@ -273,7 +382,7 @@ android {
|
|||||||
QZ15Debug.initWith(debug)
|
QZ15Debug.initWith(debug)
|
||||||
QZ15Debug {
|
QZ15Debug {
|
||||||
buildConfigField "String", "platform", '"QZA15"'
|
buildConfigField "String", "platform", '"QZA15"'
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.U1302
|
signingConfig signingConfigs.U1302
|
||||||
}
|
}
|
||||||
@@ -283,10 +392,10 @@ android {
|
|||||||
buildConfigField "String", "platform", '"QZA15"'
|
buildConfigField "String", "platform", '"QZA15"'
|
||||||
signingConfig signingConfigs.U1302
|
signingConfig signingConfigs.U1302
|
||||||
}
|
}
|
||||||
|
|
||||||
seewoDebug.initWith(debug)
|
seewoDebug.initWith(debug)
|
||||||
seewoDebug {
|
seewoDebug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.seewo
|
signingConfig signingConfigs.seewo
|
||||||
buildConfigField "String", "platform", '"seewo"'
|
buildConfigField "String", "platform", '"seewo"'
|
||||||
@@ -300,7 +409,7 @@ android {
|
|||||||
|
|
||||||
P50Debug.initWith(debug)
|
P50Debug.initWith(debug)
|
||||||
P50Debug {
|
P50Debug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.P50
|
signingConfig signingConfigs.P50
|
||||||
buildConfigField "String", "platform", '"P50TD"'
|
buildConfigField "String", "platform", '"P50TD"'
|
||||||
@@ -314,7 +423,7 @@ android {
|
|||||||
|
|
||||||
T40AirDebug.initWith(debug)
|
T40AirDebug.initWith(debug)
|
||||||
T40AirDebug {
|
T40AirDebug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.T40Air
|
signingConfig signingConfigs.T40Air
|
||||||
buildConfigField "String", "platform", '"HL500"'
|
buildConfigField "String", "platform", '"HL500"'
|
||||||
@@ -328,7 +437,7 @@ android {
|
|||||||
|
|
||||||
// AiUduDebug.initWith(debug)
|
// AiUduDebug.initWith(debug)
|
||||||
// AiUduDebug {
|
// AiUduDebug {
|
||||||
// versionNameSuffix "-debug"
|
// versionNameSuffix "_debug"
|
||||||
// debuggable true
|
// debuggable true
|
||||||
// signingConfig signingConfigs.G10P
|
// signingConfig signingConfigs.G10P
|
||||||
// buildConfigField "String", "platform", '"AUDG104"'
|
// buildConfigField "String", "platform", '"AUDG104"'
|
||||||
@@ -339,10 +448,10 @@ android {
|
|||||||
// signingConfig signingConfigs.G10P
|
// signingConfig signingConfigs.G10P
|
||||||
// buildConfigField "String", "platform", '"AUDG104"'
|
// buildConfigField "String", "platform", '"AUDG104"'
|
||||||
// }
|
// }
|
||||||
|
|
||||||
Huaruian8768Debug.initWith(debug)
|
Huaruian8768Debug.initWith(debug)
|
||||||
Huaruian8768Debug {
|
Huaruian8768Debug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.Huaruian8768
|
signingConfig signingConfigs.Huaruian8768
|
||||||
buildConfigField "String", "platform", '"MT8768"'
|
buildConfigField "String", "platform", '"MT8768"'
|
||||||
@@ -356,7 +465,7 @@ android {
|
|||||||
|
|
||||||
G11Debug.initWith(debug)
|
G11Debug.initWith(debug)
|
||||||
G11Debug {
|
G11Debug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.G11Userdebug
|
signingConfig signingConfigs.G11Userdebug
|
||||||
buildConfigField "String", "platform", '"MTKG11"'
|
buildConfigField "String", "platform", '"MTKG11"'
|
||||||
@@ -370,7 +479,7 @@ android {
|
|||||||
|
|
||||||
YXPD1Debug.initWith(debug)
|
YXPD1Debug.initWith(debug)
|
||||||
YXPD1Debug {
|
YXPD1Debug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.G10P
|
signingConfig signingConfigs.G10P
|
||||||
buildConfigField "String", "platform", '"YXPD1"'
|
buildConfigField "String", "platform", '"YXPD1"'
|
||||||
@@ -384,7 +493,7 @@ android {
|
|||||||
|
|
||||||
c2Debug.initWith(debug)
|
c2Debug.initWith(debug)
|
||||||
c2Debug {
|
c2Debug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.teclast8183
|
signingConfig signingConfigs.teclast8183
|
||||||
buildConfigField "String", "platform", '"MTK8183"'
|
buildConfigField "String", "platform", '"MTK8183"'
|
||||||
@@ -398,7 +507,7 @@ android {
|
|||||||
|
|
||||||
G10PDebug.initWith(debug)
|
G10PDebug.initWith(debug)
|
||||||
G10PDebug {
|
G10PDebug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.G10P
|
signingConfig signingConfigs.G10P
|
||||||
buildConfigField "String", "platform", '"G10P"'
|
buildConfigField "String", "platform", '"G10P"'
|
||||||
@@ -413,7 +522,7 @@ android {
|
|||||||
G104Debug.initWith(debug)
|
G104Debug.initWith(debug)
|
||||||
G104Debug {
|
G104Debug {
|
||||||
buildConfigField "String", "platform", '"MTK11"'
|
buildConfigField "String", "platform", '"MTK11"'
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.G10P
|
signingConfig signingConfigs.G10P
|
||||||
}
|
}
|
||||||
@@ -424,9 +533,23 @@ android {
|
|||||||
signingConfig signingConfigs.G10P
|
signingConfig signingConfigs.G10P
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iPlay50miniProDebug.initWith(debug)
|
||||||
|
iPlay50miniProDebug {
|
||||||
|
buildConfigField "String", "platform", '"miniG99"'
|
||||||
|
versionNameSuffix "_debug"
|
||||||
|
debuggable true
|
||||||
|
signingConfig signingConfigs.iPlay50miniPro
|
||||||
|
}
|
||||||
|
|
||||||
|
iPlay50miniProRelease.initWith(release)
|
||||||
|
iPlay50miniProRelease {
|
||||||
|
buildConfigField "String", "platform", '"miniG99"'
|
||||||
|
signingConfig signingConfigs.iPlay50miniPro
|
||||||
|
}
|
||||||
|
|
||||||
zhanRuiDebug.initWith(debug)
|
zhanRuiDebug.initWith(debug)
|
||||||
zhanRuiDebug {
|
zhanRuiDebug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
buildConfigField "String", "platform", '"ZhanRui"'
|
buildConfigField "String", "platform", '"ZhanRui"'
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.zhanRui
|
signingConfig signingConfigs.zhanRui
|
||||||
@@ -441,7 +564,7 @@ android {
|
|||||||
//userdebug rom使用这个版本
|
//userdebug rom使用这个版本
|
||||||
zhanRuiUserdebug.initWith(zhanRuiDebug)
|
zhanRuiUserdebug.initWith(zhanRuiDebug)
|
||||||
zhanRuiUserdebug {
|
zhanRuiUserdebug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
buildConfigField "String", "platform", '"ZhanRui"'
|
buildConfigField "String", "platform", '"ZhanRui"'
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.zhanRuiUserdebug
|
signingConfig signingConfigs.zhanRuiUserdebug
|
||||||
@@ -449,7 +572,7 @@ android {
|
|||||||
|
|
||||||
zhanRui12Debug.initWith(debug)
|
zhanRui12Debug.initWith(debug)
|
||||||
zhanRui12Debug {
|
zhanRui12Debug {
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
buildConfigField "String", "platform", '"AH6016"'
|
buildConfigField "String", "platform", '"AH6016"'
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.zhanRui12
|
signingConfig signingConfigs.zhanRui12
|
||||||
@@ -464,7 +587,7 @@ android {
|
|||||||
TeclastP20SDebug.initWith(debug)
|
TeclastP20SDebug.initWith(debug)
|
||||||
TeclastP20SDebug {
|
TeclastP20SDebug {
|
||||||
debuggable true
|
debuggable true
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
buildConfigField "String", "platform", '"P20S"'
|
buildConfigField "String", "platform", '"P20S"'
|
||||||
signingConfig signingConfigs.TeclastP20S
|
signingConfig signingConfigs.TeclastP20S
|
||||||
}
|
}
|
||||||
@@ -478,7 +601,7 @@ android {
|
|||||||
zhanruiG10ZDebug.initWith(debug)
|
zhanruiG10ZDebug.initWith(debug)
|
||||||
zhanruiG10ZDebug {
|
zhanruiG10ZDebug {
|
||||||
buildConfigField "String", "platform", '"ZR6016"'
|
buildConfigField "String", "platform", '"ZR6016"'
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
debuggable true
|
debuggable true
|
||||||
signingConfig signingConfigs.zhanruiG10Z
|
signingConfig signingConfigs.zhanruiG10Z
|
||||||
}
|
}
|
||||||
@@ -492,7 +615,7 @@ android {
|
|||||||
debug {
|
debug {
|
||||||
buildConfigField "String", "platform", '"MTK"'
|
buildConfigField "String", "platform", '"MTK"'
|
||||||
debuggable true
|
debuggable true
|
||||||
versionNameSuffix "-debug"
|
versionNameSuffix "_debug"
|
||||||
minifyEnabled false
|
minifyEnabled false
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.mtk
|
signingConfig signingConfigs.mtk
|
||||||
@@ -631,7 +754,7 @@ repositories {
|
|||||||
maven { url "../../../prebuilts/fullsdk-darwin/extras/android/m2repository" }
|
maven { url "../../../prebuilts/fullsdk-darwin/extras/android/m2repository" }
|
||||||
maven { url "../../../prebuilts/fullsdk-linux/extras/android/m2repository" }
|
maven { url "../../../prebuilts/fullsdk-linux/extras/android/m2repository" }
|
||||||
|
|
||||||
google()
|
// google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven { url 'https://jitpack.io' }
|
maven { url 'https://jitpack.io' }
|
||||||
maven { url 'https://maven.google.com' }
|
maven { url 'https://maven.google.com' }
|
||||||
@@ -686,6 +809,8 @@ dependencies {
|
|||||||
implementation 'com.jakewharton:disklrucache:2.0.2'
|
implementation 'com.jakewharton:disklrucache:2.0.2'
|
||||||
//mmkv
|
//mmkv
|
||||||
implementation 'com.tencent:mmkv-static:2.4.0'
|
implementation 'com.tencent:mmkv-static:2.4.0'
|
||||||
|
//bugly
|
||||||
|
implementation 'com.tencent.bugly:crashreport:4.1.9.2'
|
||||||
// //腾讯移动推送 TPNS
|
// //腾讯移动推送 TPNS
|
||||||
// implementation 'com.tencent.tpns:tpns:1.3.2.0-release'
|
// implementation 'com.tencent.tpns:tpns:1.3.2.0-release'
|
||||||
// //阿里云推送
|
// //阿里云推送
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
android:fullBackupOnly="true"
|
android:fullBackupOnly="true"
|
||||||
android:fullBackupContent="@xml/backupscheme"
|
android:fullBackupContent="@xml/backupscheme"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:icon="@drawable/ic_launcher_home"
|
android:icon="@mipmap/ic_launcher_home"
|
||||||
android:label="@string/derived_app_name"
|
android:label="@string/derived_app_name"
|
||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
android:largeHeap="@bool/config_largeHeap"
|
android:largeHeap="@bool/config_largeHeap"
|
||||||
|
|||||||
@@ -15,6 +15,16 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
G122JDebug {}
|
||||||
|
G122JRelease {}
|
||||||
|
MX11Debug {}
|
||||||
|
MX11Release {}
|
||||||
|
G12NLDebug {}
|
||||||
|
G12NLRelease {}
|
||||||
|
DX11Debug {}
|
||||||
|
DX11Release {}
|
||||||
|
G122Debug {}
|
||||||
|
G122Release {}
|
||||||
QualcommDebug {}
|
QualcommDebug {}
|
||||||
QualcommRelease {}
|
QualcommRelease {}
|
||||||
G128TDebug {}
|
G128TDebug {}
|
||||||
@@ -39,6 +49,8 @@ android {
|
|||||||
c2Release {}
|
c2Release {}
|
||||||
G104Debug {}
|
G104Debug {}
|
||||||
G104Release {}
|
G104Release {}
|
||||||
|
iPlay50miniProDebug {}
|
||||||
|
iPlay50miniProRelease {}
|
||||||
G10PDebug {}
|
G10PDebug {}
|
||||||
G10PRelease {}
|
G10PRelease {}
|
||||||
zhanRuiDebug {}
|
zhanRuiDebug {}
|
||||||
|
|||||||
BIN
keystore/6789U.p12
Normal file
BIN
keystore/DX11.p12
Normal file
BIN
keystore/G122J.p12
Normal file
BIN
keystore/MT6789.keystore
Normal file
BIN
keystore/iPlay50miniPro.jks
Normal file
BIN
keystore/sm8150.jks
Normal file
@@ -29,7 +29,7 @@
|
|||||||
android:fullBackupOnly="true"
|
android:fullBackupOnly="true"
|
||||||
android:fullBackupContent="@xml/backupscheme"
|
android:fullBackupContent="@xml/backupscheme"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:icon="@drawable/ic_launcher_home"
|
android:icon="@mipmap/ic_launcher_home"
|
||||||
android:label="@string/derived_app_name"
|
android:label="@string/derived_app_name"
|
||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
android:largeHeap="@bool/config_largeHeap"
|
android:largeHeap="@bool/config_largeHeap"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 9.2 KiB |
BIN
res/drawable-hdpi/com_onyx_easytransfer.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
res/drawable-hdpi/com_onyx_easytransfer_wechat.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
res/drawable-hdpi/com_onyx_floatingbutton.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
res/drawable-hdpi/icon_close.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
@@ -2,8 +2,8 @@
|
|||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<solid android:color="#ffffff" />
|
<solid android:color="#ffffff" />
|
||||||
<stroke
|
<stroke
|
||||||
android:width="0.8dp"
|
android:width="1dp"
|
||||||
android:color="#ffffff" />
|
android:color="#000000" />
|
||||||
<!-- 圆角 -->
|
<!-- 圆角 -->
|
||||||
<corners android:radius="6dp" />
|
<corners android:radius="6dp" />
|
||||||
</shape>
|
</shape>
|
||||||
|
|||||||
@@ -53,6 +53,17 @@
|
|||||||
tools:text="请输入密码" />
|
tools:text="请输入密码" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/iv_close"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginEnd="12dp"
|
||||||
|
android:src="@drawable/icon_close" />
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/message"
|
android:id="@+id/message"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<widget
|
<widget
|
||||||
android:label="My custom widget"
|
android:label="My custom widget"
|
||||||
android:initialLayout="@layout/sample_widget_layout"
|
android:initialLayout="@layout/sample_widget_layout"
|
||||||
android:icon="@drawable/ic_launcher_home"
|
android:icon="@mipmap/ic_launcher_home"
|
||||||
android:resizeMode="horizontal|vertical"
|
android:resizeMode="horizontal|vertical"
|
||||||
launcher:numRows="2"
|
launcher:numRows="2"
|
||||||
launcher:numColumns="3"
|
launcher:numColumns="3"
|
||||||
|
|||||||
55
res/xml/default_workspace_tab10cpro_5x5.xml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2009 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Tab10CPro_GK exclusive 5x5 layout (5 columns / 5 rows, 5 hotseat icons) -->
|
||||||
|
<favorites xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.uiuios">
|
||||||
|
|
||||||
|
<!-- Hotseat (screen 0..4 for 5x5, without com.aoleyun.info) -->
|
||||||
|
<favorite
|
||||||
|
launcher:className="com.aoleyun.sn.activity.SplashActivity"
|
||||||
|
launcher:container="-101"
|
||||||
|
launcher:packageName="com.aoleyun.sn"
|
||||||
|
launcher:screen="0"
|
||||||
|
launcher:x="0"
|
||||||
|
launcher:y="0" />
|
||||||
|
<favorite
|
||||||
|
launcher:className="com.aoleyun.appstore.activity.SplashActivity"
|
||||||
|
launcher:container="-101"
|
||||||
|
launcher:packageName="com.aoleyun.appstore"
|
||||||
|
launcher:screen="1"
|
||||||
|
launcher:x="1"
|
||||||
|
launcher:y="0" />
|
||||||
|
<favorite
|
||||||
|
launcher:className="com.android.settings.Settings"
|
||||||
|
launcher:container="-101"
|
||||||
|
launcher:packageName="com.android.settings"
|
||||||
|
launcher:screen="2"
|
||||||
|
launcher:x="2"
|
||||||
|
launcher:y="0" />
|
||||||
|
<favorite
|
||||||
|
launcher:className="com.aoleyun.browser.activity.main.MainActivity"
|
||||||
|
launcher:container="-101"
|
||||||
|
launcher:packageName="com.aoleyun.browser"
|
||||||
|
launcher:screen="3"
|
||||||
|
launcher:x="3"
|
||||||
|
launcher:y="0" />
|
||||||
|
<favorite
|
||||||
|
launcher:className="com.aoleyun.sn.activity.EyeProtectionActivity"
|
||||||
|
launcher:container="-101"
|
||||||
|
launcher:packageName="com.aoleyun.sn"
|
||||||
|
launcher:screen="4"
|
||||||
|
launcher:x="4"
|
||||||
|
launcher:y="0" />
|
||||||
|
</favorites>
|
||||||
@@ -176,4 +176,24 @@
|
|||||||
|
|
||||||
</grid-option>
|
</grid-option>
|
||||||
|
|
||||||
|
<!-- Tab10CPro_GK (1860x2480, density 300) exclusive 5x5 profile with larger icons -->
|
||||||
|
<grid-option
|
||||||
|
launcher:name="tab10cpro_5x5"
|
||||||
|
launcher:numRows="5"
|
||||||
|
launcher:numColumns="5"
|
||||||
|
launcher:numFolderRows="4"
|
||||||
|
launcher:numFolderColumns="4"
|
||||||
|
launcher:numHotseatIcons="5"
|
||||||
|
launcher:defaultLayoutId="@xml/default_workspace_tab10cpro_5x5" >
|
||||||
|
|
||||||
|
<display-option
|
||||||
|
launcher:name="Tab10CPro 5x5"
|
||||||
|
launcher:minWidthDps="992"
|
||||||
|
launcher:minHeightDps="1323"
|
||||||
|
launcher:iconImageSize="100"
|
||||||
|
launcher:iconTextSize="15.0"
|
||||||
|
launcher:canBeDefault="true" />
|
||||||
|
|
||||||
|
</grid-option>
|
||||||
|
|
||||||
</profiles>
|
</profiles>
|
||||||
@@ -224,19 +224,6 @@ public class DeviceProfile {
|
|||||||
updateAvailableDimensions(dm, res);
|
updateAvailableDimensions(dm, res);
|
||||||
|
|
||||||
// Now that we have all of the variables calculated, we can tune certain sizes.
|
// Now that we have all of the variables calculated, we can tune certain sizes.
|
||||||
if (!isVerticalBarLayout() && isPhone && isTallDevice) {
|
|
||||||
// We increase the hotseat size when there is extra space.
|
|
||||||
// ie. For a display with a large aspect ratio, we can keep the icons on the workspace
|
|
||||||
// in portrait mode closer together by adding more height to the hotseat.
|
|
||||||
// Note: This calculation was created after noticing a pattern in the design spec.
|
|
||||||
int extraSpace = getCellSize().y - iconSizePx - iconDrawablePaddingPx * 2
|
|
||||||
- verticalDragHandleSizePx;
|
|
||||||
hotseatBarSizePx += extraSpace;
|
|
||||||
hotseatBarBottomPaddingPx += extraSpace;
|
|
||||||
|
|
||||||
// Recalculate the available dimensions using the new hotseat size.
|
|
||||||
updateAvailableDimensions(dm, res);
|
|
||||||
}
|
|
||||||
updateWorkspacePadding();
|
updateWorkspacePadding();
|
||||||
|
|
||||||
// This is done last, after iconSizePx is calculated above.
|
// This is done last, after iconSizePx is calculated above.
|
||||||
@@ -473,11 +460,8 @@ public class DeviceProfile {
|
|||||||
((inv.numColumns - 1) * cellWidthPx)));
|
((inv.numColumns - 1) * cellWidthPx)));
|
||||||
availablePaddingX = (int) Math.min(availablePaddingX,
|
availablePaddingX = (int) Math.min(availablePaddingX,
|
||||||
widthPx * MAX_HORIZONTAL_PADDING_PERCENT);
|
widthPx * MAX_HORIZONTAL_PADDING_PERCENT);
|
||||||
int availablePaddingY = Math.max(0, heightPx - edgeMarginPx - paddingBottom
|
padding.set(availablePaddingX / 2, edgeMarginPx,
|
||||||
- (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx
|
availablePaddingX / 2, paddingBottom);
|
||||||
- hotseatBarBottomPaddingPx);
|
|
||||||
padding.set(availablePaddingX / 2, edgeMarginPx + availablePaddingY / 2,
|
|
||||||
availablePaddingX / 2, paddingBottom + availablePaddingY / 2);
|
|
||||||
} else {
|
} else {
|
||||||
// Pad the top and bottom of the workspace with search/hotseat bar sizes
|
// Pad the top and bottom of the workspace with search/hotseat bar sizes
|
||||||
padding.set(desiredWorkspaceLeftRightMarginPx,
|
padding.set(desiredWorkspaceLeftRightMarginPx,
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ import android.annotation.TargetApi;
|
|||||||
import android.appwidget.AppWidgetHostView;
|
import android.appwidget.AppWidgetHostView;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
@@ -56,7 +59,6 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
@@ -69,6 +71,7 @@ public class InvariantDeviceProfile {
|
|||||||
new MainThreadInitializedObject<>(InvariantDeviceProfile::new);
|
new MainThreadInitializedObject<>(InvariantDeviceProfile::new);
|
||||||
|
|
||||||
private static final String KEY_IDP_GRID_NAME = "idp_grid_name";
|
private static final String KEY_IDP_GRID_NAME = "idp_grid_name";
|
||||||
|
private static final String KEY_LAST_VERSION = "idp_last_version";
|
||||||
|
|
||||||
private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48;
|
private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48;
|
||||||
|
|
||||||
@@ -127,7 +130,8 @@ public class InvariantDeviceProfile {
|
|||||||
private OverlayMonitor mOverlayMonitor;
|
private OverlayMonitor mOverlayMonitor;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public InvariantDeviceProfile() {}
|
public InvariantDeviceProfile() {
|
||||||
|
}
|
||||||
|
|
||||||
private InvariantDeviceProfile(InvariantDeviceProfile p) {
|
private InvariantDeviceProfile(InvariantDeviceProfile p) {
|
||||||
numRows = p.numRows;
|
numRows = p.numRows;
|
||||||
@@ -147,6 +151,9 @@ public class InvariantDeviceProfile {
|
|||||||
|
|
||||||
@TargetApi(23)
|
@TargetApi(23)
|
||||||
private InvariantDeviceProfile(Context context) {
|
private InvariantDeviceProfile(Context context) {
|
||||||
|
// On app upgrade, drop the previously saved grid for Tab10CPro_GK so the dedicated
|
||||||
|
// 5x5 profile (icon size / grid / default layout) is re-selected.
|
||||||
|
maybeResetGridOnUpgrade(context);
|
||||||
initGrid(context, Utilities.getPrefs(context).getString(KEY_IDP_GRID_NAME, null));
|
initGrid(context, Utilities.getPrefs(context).getString(KEY_IDP_GRID_NAME, null));
|
||||||
mConfigMonitor = new ConfigMonitor(context,
|
mConfigMonitor = new ConfigMonitor(context,
|
||||||
APPLY_CONFIG_AT_RUNTIME.get() ? this::onConfigChanged : this::killProcess);
|
APPLY_CONFIG_AT_RUNTIME.get() ? this::onConfigChanged : this::killProcess);
|
||||||
@@ -163,6 +170,41 @@ public class InvariantDeviceProfile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When the app's versionCode is raised, clear the previously saved grid name for
|
||||||
|
* Tab10CPro_GK so that {@link #initGrid} re-selects the dedicated 5x5 profile
|
||||||
|
* (icon size / grid / default layout) instead of keeping a stale saved configuration.
|
||||||
|
* A same-version reinstall does NOT trigger a reset. Other models are unaffected.
|
||||||
|
*/
|
||||||
|
private static void maybeResetGridOnUpgrade(Context context) {
|
||||||
|
if (!"Tab10CPro_GK".equals(Build.MODEL)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SharedPreferences prefs = Utilities.getPrefs(context);
|
||||||
|
long currentVersion = getCurrentVersionCode(context);
|
||||||
|
long lastVersion = prefs.getLong(KEY_LAST_VERSION, -1);
|
||||||
|
if (lastVersion != -1 && lastVersion < currentVersion) {
|
||||||
|
Log.e(TAG, "maybeResetGridOnUpgrade: version raised " + lastVersion
|
||||||
|
+ " -> " + currentVersion + ", reset saved grid: "
|
||||||
|
+ prefs.getString(KEY_IDP_GRID_NAME, null));
|
||||||
|
prefs.edit().remove(KEY_IDP_GRID_NAME).apply();
|
||||||
|
}
|
||||||
|
prefs.edit().putLong(KEY_LAST_VERSION, currentVersion).apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long getCurrentVersionCode(Context context) {
|
||||||
|
try {
|
||||||
|
PackageInfo info = context.getPackageManager()
|
||||||
|
.getPackageInfo(context.getPackageName(), 0);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
return info.getLongVersionCode();
|
||||||
|
}
|
||||||
|
return info.versionCode;
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve system defined or RRO overriden icon shape.
|
* Retrieve system defined or RRO overriden icon shape.
|
||||||
*/
|
*/
|
||||||
@@ -185,8 +227,8 @@ public class InvariantDeviceProfile {
|
|||||||
display.getCurrentSizeRange(smallestSize, largestSize);
|
display.getCurrentSizeRange(smallestSize, largestSize);
|
||||||
|
|
||||||
ArrayList<DisplayOption> allOptions = getPredefinedDeviceProfiles(context, gridName);
|
ArrayList<DisplayOption> allOptions = getPredefinedDeviceProfiles(context, gridName);
|
||||||
for (DisplayOption displayOption:allOptions){
|
for (DisplayOption displayOption : allOptions) {
|
||||||
Log.e(TAG, "initGrid: "+displayOption.grid.name);
|
Log.e(TAG, "initGrid: " + displayOption.grid.name);
|
||||||
}
|
}
|
||||||
// This guarantees that width < height
|
// This guarantees that width < height
|
||||||
float minWidthDps = Utilities.dpiFromPx(Math.min(smallestSize.x, smallestSize.y), dm);
|
float minWidthDps = Utilities.dpiFromPx(Math.min(smallestSize.x, smallestSize.y), dm);
|
||||||
@@ -196,18 +238,35 @@ public class InvariantDeviceProfile {
|
|||||||
Float.compare(dist(minWidthDps, minHeightDps, a.minWidthDps, a.minHeightDps),
|
Float.compare(dist(minWidthDps, minHeightDps, a.minWidthDps, a.minHeightDps),
|
||||||
dist(minWidthDps, minHeightDps, b.minWidthDps, b.minHeightDps)));
|
dist(minWidthDps, minHeightDps, b.minWidthDps, b.minHeightDps)));
|
||||||
DisplayOption interpolatedDisplayOption =
|
DisplayOption interpolatedDisplayOption =
|
||||||
invDistWeightedInterpolate(minWidthDps, minHeightDps, allOptions);
|
invDistWeightedInterpolate(minWidthDps, minHeightDps, allOptions);
|
||||||
GridOption closestProfile;
|
GridOption closestProfile = allOptions.stream()
|
||||||
if ("Aiud_A8_ag_1095".equals(Build.MODEL)) {
|
.filter(new Predicate<DisplayOption>() {
|
||||||
closestProfile = allOptions.stream().filter(new Predicate<DisplayOption>() {
|
@Override
|
||||||
@Override
|
public boolean test(DisplayOption displayOption) {
|
||||||
public boolean test(DisplayOption displayOption) {
|
if ("Aiud_A8_ag_1095".equals(Build.MODEL)) {
|
||||||
return "aiudu".equals(displayOption.grid.name);
|
return "aiudu".equals(displayOption.grid.name);
|
||||||
}
|
} else if ("Tab10CPro_GK".equals(Build.MODEL)) {
|
||||||
}).collect(Collectors.toList()).get(0).grid;
|
// Tab10CPro_GK (1860x2480, density 300) exclusive 5x5 profile
|
||||||
}else {
|
return "tab10cpro_5x5".equals(displayOption.grid.name);
|
||||||
closestProfile = allOptions.get(0).grid;
|
}
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.map(new java.util.function.Function<DisplayOption, GridOption>() {
|
||||||
|
@Override
|
||||||
|
public GridOption apply(DisplayOption displayOption) {
|
||||||
|
return displayOption.grid;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.findFirst()
|
||||||
|
.orElse(allOptions.get(0).grid);
|
||||||
|
Log.e(TAG, "initGrid: deviceModel=" + Build.MODEL
|
||||||
|
+ ", minWidthDps=" + minWidthDps + ", minHeightDps=" + minHeightDps
|
||||||
|
+ ", selectedGrid=" + closestProfile.name
|
||||||
|
+ ", numRows=" + closestProfile.numRows
|
||||||
|
+ ", numColumns=" + closestProfile.numColumns
|
||||||
|
+ ", numHotseatIcons=" + closestProfile.numHotseatIcons
|
||||||
|
+ ", defaultLayoutId=" + closestProfile.defaultLayoutId);
|
||||||
numRows = closestProfile.numRows;
|
numRows = closestProfile.numRows;
|
||||||
numColumns = closestProfile.numColumns;
|
numColumns = closestProfile.numColumns;
|
||||||
numHotseatIcons = closestProfile.numHotseatIcons;
|
numHotseatIcons = closestProfile.numHotseatIcons;
|
||||||
@@ -360,7 +419,7 @@ public class InvariantDeviceProfile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (IOException|XmlPullParserException e) {
|
} catch (IOException | XmlPullParserException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,7 +447,7 @@ public class InvariantDeviceProfile {
|
|||||||
|
|
||||||
private int getLauncherIconDensity(int requiredSize) {
|
private int getLauncherIconDensity(int requiredSize) {
|
||||||
// Densities typically defined by an app.
|
// Densities typically defined by an app.
|
||||||
int[] densityBuckets = new int[] {
|
int[] densityBuckets = new int[]{
|
||||||
DisplayMetrics.DENSITY_LOW,
|
DisplayMetrics.DENSITY_LOW,
|
||||||
DisplayMetrics.DENSITY_MEDIUM,
|
DisplayMetrics.DENSITY_MEDIUM,
|
||||||
DisplayMetrics.DENSITY_TV,
|
DisplayMetrics.DENSITY_TV,
|
||||||
@@ -412,7 +471,7 @@ public class InvariantDeviceProfile {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply any Partner customization grid overrides.
|
* Apply any Partner customization grid overrides.
|
||||||
*
|
* <p>
|
||||||
* Currently we support: all apps row / column count.
|
* Currently we support: all apps row / column count.
|
||||||
*/
|
*/
|
||||||
private void applyPartnerDeviceProfileOverrides(Context context, DisplayMetrics dm) {
|
private void applyPartnerDeviceProfileOverrides(Context context, DisplayMetrics dm) {
|
||||||
@@ -428,7 +487,7 @@ public class InvariantDeviceProfile {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static DisplayOption invDistWeightedInterpolate(float width, float height,
|
static DisplayOption invDistWeightedInterpolate(float width, float height,
|
||||||
ArrayList<DisplayOption> points) {
|
ArrayList<DisplayOption> points) {
|
||||||
float weights = 0;
|
float weights = 0;
|
||||||
|
|
||||||
DisplayOption p = points.get(0);
|
DisplayOption p = points.get(0);
|
||||||
@@ -471,8 +530,8 @@ public class InvariantDeviceProfile {
|
|||||||
// We will use these two data points to extrapolate how much the wallpaper parallax effect
|
// We will use these two data points to extrapolate how much the wallpaper parallax effect
|
||||||
// to span (ie travel) at any aspect ratio:
|
// to span (ie travel) at any aspect ratio:
|
||||||
|
|
||||||
final float ASPECT_RATIO_LANDSCAPE = 16/10f;
|
final float ASPECT_RATIO_LANDSCAPE = 16 / 10f;
|
||||||
final float ASPECT_RATIO_PORTRAIT = 10/16f;
|
final float ASPECT_RATIO_PORTRAIT = 10 / 16f;
|
||||||
final float WALLPAPER_WIDTH_TO_SCREEN_RATIO_LANDSCAPE = 1.5f;
|
final float WALLPAPER_WIDTH_TO_SCREEN_RATIO_LANDSCAPE = 1.5f;
|
||||||
final float WALLPAPER_WIDTH_TO_SCREEN_RATIO_PORTRAIT = 1.2f;
|
final float WALLPAPER_WIDTH_TO_SCREEN_RATIO_PORTRAIT = 1.2f;
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ import android.os.Build;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.os.StrictMode;
|
import android.os.StrictMode;
|
||||||
@@ -78,6 +79,7 @@ import com.aoleyun.os.allapps.AllAppsStore;
|
|||||||
import com.aoleyun.os.allapps.AllAppsTransitionController;
|
import com.aoleyun.os.allapps.AllAppsTransitionController;
|
||||||
import com.aoleyun.os.allapps.DiscoveryBounce;
|
import com.aoleyun.os.allapps.DiscoveryBounce;
|
||||||
import com.aoleyun.os.anim.PropertyListBuilder;
|
import com.aoleyun.os.anim.PropertyListBuilder;
|
||||||
|
import com.aoleyun.os.comm.CommonConfig;
|
||||||
import com.aoleyun.os.compat.AppWidgetManagerCompat;
|
import com.aoleyun.os.compat.AppWidgetManagerCompat;
|
||||||
import com.aoleyun.os.compat.LauncherAppsCompatVO;
|
import com.aoleyun.os.compat.LauncherAppsCompatVO;
|
||||||
import com.aoleyun.os.config.FeatureFlags;
|
import com.aoleyun.os.config.FeatureFlags;
|
||||||
@@ -153,6 +155,7 @@ import com.aoleyun.os.widget.custom.CustomWidgetParser;
|
|||||||
import com.arialyy.aria.core.Aria;
|
import com.arialyy.aria.core.Aria;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.tencent.bugly.crashreport.CrashReport;
|
||||||
import com.tencent.mmkv.MMKV;
|
import com.tencent.mmkv.MMKV;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -203,6 +206,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||||||
public static final String TAG = "Launcher";
|
public static final String TAG = "Launcher";
|
||||||
static final boolean LOGD = false;
|
static final boolean LOGD = false;
|
||||||
|
|
||||||
|
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||||
|
|
||||||
static final boolean DEBUG_STRICT_MODE = false;
|
static final boolean DEBUG_STRICT_MODE = false;
|
||||||
|
|
||||||
private static final int REQUEST_CREATE_SHORTCUT = 1;
|
private static final int REQUEST_CREATE_SHORTCUT = 1;
|
||||||
@@ -480,10 +485,12 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||||||
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
|
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
|
||||||
try {
|
try {
|
||||||
if ("Aiud_A8_ag_1095".equals(Build.MODEL)
|
if ("Aiud_A8_ag_1095".equals(Build.MODEL)
|
||||||
||JgyUtils.getInstance().checkAppPlatform() == JgyUtils.seewoPlatform
|
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.seewoPlatform
|
||||||
) {
|
) {
|
||||||
wallpaperManager.setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.wallpapers_aiudu));
|
wallpaperManager.setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.wallpapers_aiudu));
|
||||||
}else {
|
} else if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.QualcommPlatform) {
|
||||||
|
// wallpaperManager.clear();
|
||||||
|
} else {
|
||||||
wallpaperManager.setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.wallpapers));
|
wallpaperManager.setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.wallpapers));
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -1243,10 +1250,10 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void removeRecentTask() {
|
private void removeRecentTask() {
|
||||||
Handler.getMain().postDelayed(new Runnable() {
|
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
String ApplicationLock = MMKV.defaultMMKV().decodeString("ApplicationLock");
|
String ApplicationLock = mMMKV.decodeString("ApplicationLock");
|
||||||
Type type = new TypeToken<List<AppPasswdBean>>() {
|
Type type = new TypeToken<List<AppPasswdBean>>() {
|
||||||
}.getType();
|
}.getType();
|
||||||
Gson gson = new Gson();
|
Gson gson = new Gson();
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
package com.aoleyun.os.base;
|
package com.aoleyun.os.base;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.aoleyun.os.manager.ConnectManager;
|
import com.aoleyun.os.manager.ConnectManager;
|
||||||
import com.aoleyun.os.network.NetInterfaceManager;
|
import com.aoleyun.os.network.NetInterfaceManager;
|
||||||
import com.aoleyun.os.uiuiutils.JgyUtils;
|
import com.aoleyun.os.uiuiutils.JgyUtils;
|
||||||
import com.aoleyun.os.uiuiutils.TimeUtils;
|
import com.aoleyun.os.uiuiutils.TimeUtils;
|
||||||
|
import com.aoleyun.os.uiuiutils.Utils;
|
||||||
import com.arialyy.aria.core.Aria;
|
import com.arialyy.aria.core.Aria;
|
||||||
import com.hjq.toast.Toaster;
|
import com.hjq.toast.Toaster;
|
||||||
|
import com.tencent.bugly.crashreport.CrashReport;
|
||||||
import com.tencent.mmkv.MMKV;
|
import com.tencent.mmkv.MMKV;
|
||||||
|
|
||||||
public class BaseApplication extends Application {
|
public class BaseApplication extends Application {
|
||||||
@@ -20,6 +23,10 @@ public class BaseApplication extends Application {
|
|||||||
String rootDir = MMKV.initialize(this);
|
String rootDir = MMKV.initialize(this);
|
||||||
Log.e(TAG, "onCreate: " + rootDir);
|
Log.e(TAG, "onCreate: " + rootDir);
|
||||||
|
|
||||||
|
CrashReport.initCrashReport(getApplicationContext(), "6c94f946fe", false);
|
||||||
|
CrashReport.setDeviceModel(this, Build.MODEL);
|
||||||
|
CrashReport.setDeviceId(this, Utils.getSerial(this));
|
||||||
|
|
||||||
JgyUtils.init(this);
|
JgyUtils.init(this);
|
||||||
TimeUtils.init(this);
|
TimeUtils.init(this);
|
||||||
Aria.init(this);
|
Aria.init(this);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
|
|||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.aoleyun.os.comm.CommonConfig;
|
||||||
import com.jakewharton.disklrucache.DiskLruCache;
|
import com.jakewharton.disklrucache.DiskLruCache;
|
||||||
import com.tencent.mmkv.MMKV;
|
import com.tencent.mmkv.MMKV;
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ import java.io.Serializable;
|
|||||||
public class CacheHelper {
|
public class CacheHelper {
|
||||||
private static final String TAG = "DiskLruCacheHelper";
|
private static final String TAG = "DiskLruCacheHelper";
|
||||||
|
|
||||||
private MMKV mMMKV = MMKV.defaultMMKV();
|
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||||
|
|
||||||
private static final String DIR_NAME = "diskCache";
|
private static final String DIR_NAME = "diskCache";
|
||||||
private static final int MAX_COUNT = 5 * 1024 * 1024;
|
private static final int MAX_COUNT = 5 * 1024 * 1024;
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ public class IconCache extends BaseIconCache {
|
|||||||
false /*replace existing*/);
|
false /*replace existing*/);
|
||||||
}
|
}
|
||||||
} catch (NameNotFoundException e) {
|
} catch (NameNotFoundException e) {
|
||||||
Log.d(TAG, "Package not found", e);
|
Log.d(TAG, "Package not found: " + packageName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,16 +233,20 @@ public class IconCache extends BaseIconCache {
|
|||||||
|
|
||||||
private List<String> appClassNameList = new ArrayList<String>() {{
|
private List<String> appClassNameList = new ArrayList<String>() {{
|
||||||
this.add("com.android.calculator2.Calculator");//计算器
|
this.add("com.android.calculator2.Calculator");//计算器
|
||||||
|
this.add("com.onyx.calculator.Calculator");//计算器
|
||||||
this.add("com.android.calendar.AllInOneActivity");//日历
|
this.add("com.android.calendar.AllInOneActivity");//日历
|
||||||
|
this.add("com.onyx.mail.calendar.ui.CalendarActivity");//日历
|
||||||
this.add("com.android.camera.CameraLauncher");//相机
|
this.add("com.android.camera.CameraLauncher");//相机
|
||||||
this.add("com.mediatek.camera.CameraLauncher");//相机
|
this.add("com.mediatek.camera.CameraLauncher");//相机
|
||||||
this.add("com.android.contacts.activities.PeopleActivity");//通讯录
|
this.add("com.android.contacts.activities.PeopleActivity");//通讯录
|
||||||
this.add("com.android.deskclock.DeskClock");//时钟
|
this.add("com.android.deskclock.DeskClock");//时钟
|
||||||
|
this.add("com.simplemobiletools.clock.activities.SplashActivity");//时钟
|
||||||
this.add("com.android.dialer.DialtactsActivity");//电话
|
this.add("com.android.dialer.DialtactsActivity");//电话
|
||||||
this.add("com.android.dialer.app.DialtactsActivity");//电话
|
this.add("com.android.dialer.app.DialtactsActivity");//电话
|
||||||
this.add("com.android.dialer.main.impl.MainActivity");//电话
|
this.add("com.android.dialer.main.impl.MainActivity");//电话
|
||||||
this.add("com.android.gallery3d.v2.app.GalleryActivity2");//图库
|
this.add("com.android.gallery3d.v2.app.GalleryActivity2");//图库
|
||||||
this.add("com.android.gallery3d.app.GalleryActivity");//图库
|
this.add("com.android.gallery3d.app.GalleryActivity");//图库
|
||||||
|
this.add("com.onyx.gallery.activities.NewMainActivity");//图库
|
||||||
this.add("com.android.messaging.ui.conversationlist.ConversationListActivity");//信息
|
this.add("com.android.messaging.ui.conversationlist.ConversationListActivity");//信息
|
||||||
this.add("com.android.mms.ui.BootActivity");//信息
|
this.add("com.android.mms.ui.BootActivity");//信息
|
||||||
this.add("com.android.music.MusicBrowserActivity");//音乐
|
this.add("com.android.music.MusicBrowserActivity");//音乐
|
||||||
@@ -262,20 +266,28 @@ public class IconCache extends BaseIconCache {
|
|||||||
this.add("com.aoleyun.sn.activity.EyeProtectionActivity");//护眼模式
|
this.add("com.aoleyun.sn.activity.EyeProtectionActivity");//护眼模式
|
||||||
this.add("com.aoleyun.sn.activity.CleanupActivity");//一键加速
|
this.add("com.aoleyun.sn.activity.CleanupActivity");//一键加速
|
||||||
this.add("com.aoleyun.sn.activity.update.UpdateActivity");//检查更新
|
this.add("com.aoleyun.sn.activity.update.UpdateActivity");//检查更新
|
||||||
|
this.add("com.onyx.easytransfer.main.MainActivity");//互传
|
||||||
|
this.add("com.onyx.easytransfer.wechat.ui.WeChatDropActivity");//微信互传
|
||||||
|
this.add("com.onyx.floatingbutton.FloatButtonSettingActivity");//互传
|
||||||
|
|
||||||
|
|
||||||
}};
|
}};
|
||||||
private List<String> appIconList = new ArrayList<String>() {{
|
private List<String> appIconList = new ArrayList<String>() {{
|
||||||
this.add("com_android_calculator2");
|
this.add("com_android_calculator2");
|
||||||
|
this.add("com_android_calculator2");
|
||||||
|
this.add("com_android_calendar");
|
||||||
this.add("com_android_calendar");
|
this.add("com_android_calendar");
|
||||||
this.add("com_android_camera");
|
this.add("com_android_camera");
|
||||||
this.add("com_android_camera");
|
this.add("com_android_camera");
|
||||||
this.add("com_android_contacts");
|
this.add("com_android_contacts");
|
||||||
this.add("com_android_deskclock");
|
this.add("com_android_deskclock");
|
||||||
|
this.add("com_android_deskclock");
|
||||||
this.add("com_android_dialer");
|
this.add("com_android_dialer");
|
||||||
this.add("com_android_dialer");
|
this.add("com_android_dialer");
|
||||||
this.add("com_android_dialer");
|
this.add("com_android_dialer");
|
||||||
this.add("com_android_gallery3d_app");
|
this.add("com_android_gallery3d_app");
|
||||||
this.add("com_android_gallery3d_app");
|
this.add("com_android_gallery3d_app");
|
||||||
|
this.add("com_android_gallery3d_app");
|
||||||
this.add("com_android_mms_ui");
|
this.add("com_android_mms_ui");
|
||||||
this.add("com_android_mms_ui");
|
this.add("com_android_mms_ui");
|
||||||
this.add("com_android_music");
|
this.add("com_android_music");
|
||||||
@@ -295,6 +307,9 @@ public class IconCache extends BaseIconCache {
|
|||||||
this.add("com_system_huyan");
|
this.add("com_system_huyan");
|
||||||
this.add("com_system_clean");
|
this.add("com_system_clean");
|
||||||
this.add("com_aoleyun_update");
|
this.add("com_aoleyun_update");
|
||||||
|
this.add("com_onyx_easytransfer");
|
||||||
|
this.add("com_onyx_easytransfer_wechat");
|
||||||
|
this.add("com_onyx_floatingbutton");
|
||||||
}};
|
}};
|
||||||
|
|
||||||
public Drawable getFullResIcon(LauncherActivityInfo info) {
|
public Drawable getFullResIcon(LauncherActivityInfo info) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.aoleyun.os.comm.CommonConfig;
|
||||||
import com.aoleyun.os.uiuiutils.TimeUtils;
|
import com.aoleyun.os.uiuiutils.TimeUtils;
|
||||||
import com.tencent.mmkv.MMKV;
|
import com.tencent.mmkv.MMKV;
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ public class ConnectManager {
|
|||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
private static ConnectManager sInstance;
|
private static ConnectManager sInstance;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private MMKV mMMKV = MMKV.defaultMMKV();
|
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||||
|
|
||||||
private ConnectManager(Context context) {
|
private ConnectManager(Context context) {
|
||||||
if (context == null) {
|
if (context == null) {
|
||||||
|
|||||||
@@ -267,6 +267,11 @@ public class LoaderTask implements Runnable {
|
|||||||
this.add("com.elink.autotest");
|
this.add("com.elink.autotest");
|
||||||
this.add("com.emdoor.pressure.tester");
|
this.add("com.emdoor.pressure.tester");
|
||||||
this.add("emdoor.digit.tester");
|
this.add("emdoor.digit.tester");
|
||||||
|
|
||||||
|
this.add("com.eswi.android.expand");
|
||||||
|
this.add("com.eswi.errorscollection");
|
||||||
|
this.add("com.eswi.homework");
|
||||||
|
this.add("com.eswi.learnpackage");
|
||||||
}};
|
}};
|
||||||
|
|
||||||
/*爱优读需要隐藏的图标*/
|
/*爱优读需要隐藏的图标*/
|
||||||
@@ -356,6 +361,7 @@ public class LoaderTask implements Runnable {
|
|||||||
this.add("com.ss.android.ugc.aweme");
|
this.add("com.ss.android.ugc.aweme");
|
||||||
this.add("com.tencent.mm");
|
this.add("com.tencent.mm");
|
||||||
this.add("com.google.android.inputmethod.pinyin");
|
this.add("com.google.android.inputmethod.pinyin");
|
||||||
|
this.add("com.onyx");
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
||||||
@@ -556,6 +562,11 @@ public class LoaderTask implements Runnable {
|
|||||||
ComponentName cn = intent.getComponent();
|
ComponentName cn = intent.getComponent();
|
||||||
targetPkg = cn == null ? intent.getPackage() : cn.getPackageName();
|
targetPkg = cn == null ? intent.getPackage() : cn.getPackageName();
|
||||||
|
|
||||||
|
if (!TextUtils.isEmpty(targetPkg) && SYSTEM_HIDE_APP.contains(targetPkg)) {
|
||||||
|
c.markDeleted("System hide app removed: " + targetPkg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (allUsers.indexOfValue(c.user) < 0) {
|
if (allUsers.indexOfValue(c.user) < 0) {
|
||||||
if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
|
if (c.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
|
||||||
c.markDeleted("Legacy shortcuts are only allowed for current users");
|
c.markDeleted("Legacy shortcuts are only allowed for current users");
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.content.Context;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.aoleyun.os.comm.CommonConfig;
|
||||||
import com.aoleyun.os.disklrucache.CacheHelper;
|
import com.aoleyun.os.disklrucache.CacheHelper;
|
||||||
import com.aoleyun.os.manager.ConnectManager;
|
import com.aoleyun.os.manager.ConnectManager;
|
||||||
import com.aoleyun.os.manager.ConnectMode;
|
import com.aoleyun.os.manager.ConnectMode;
|
||||||
@@ -54,7 +55,7 @@ public class NetInterfaceManager {
|
|||||||
private Context mContext;
|
private Context mContext;
|
||||||
private Retrofit mRetrofit;
|
private Retrofit mRetrofit;
|
||||||
private OkHttpClient okHttpClient;
|
private OkHttpClient okHttpClient;
|
||||||
private MMKV mMMKV = MMKV.defaultMMKV();
|
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||||
private CacheHelper cacheHelper;
|
private CacheHelper cacheHelper;
|
||||||
|
|
||||||
//超时时间
|
//超时时间
|
||||||
@@ -207,6 +208,14 @@ public class NetInterfaceManager {
|
|||||||
set.add(JgyUtils.AUDG104Tag);
|
set.add(JgyUtils.AUDG104Tag);
|
||||||
} else if (platform == JgyUtils.seewoPlatform) {
|
} else if (platform == JgyUtils.seewoPlatform) {
|
||||||
set.add(JgyUtils.seewoTag);
|
set.add(JgyUtils.seewoTag);
|
||||||
|
} else if (platform == JgyUtils.QualcommPlatform) {
|
||||||
|
set.add(JgyUtils.Qualcomm_TAG);
|
||||||
|
} else if (platform == JgyUtils.DX11Platform) {
|
||||||
|
set.add(JgyUtils.DX11_TAG);
|
||||||
|
} else if (platform == JgyUtils.G12NLPlatform) {
|
||||||
|
set.add(JgyUtils.G12NL_TAG);
|
||||||
|
} else if (platform == JgyUtils.G122JPlatform) {
|
||||||
|
set.add(JgyUtils.G122J_TAG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -267,10 +276,10 @@ public class NetInterfaceManager {
|
|||||||
if (listBaseResponse.code == 200) {
|
if (listBaseResponse.code == 200) {
|
||||||
List<AppPasswdBean> beanList = listBaseResponse.data;
|
List<AppPasswdBean> beanList = listBaseResponse.data;
|
||||||
String jsonString = JsonParser.parseString(new Gson().toJson(beanList)).getAsJsonArray().toString();
|
String jsonString = JsonParser.parseString(new Gson().toJson(beanList)).getAsJsonArray().toString();
|
||||||
MMKV.defaultMMKV().encode("ApplicationLock", jsonString);
|
mMMKV.encode("ApplicationLock", jsonString);
|
||||||
Log.e("getAppPasswd", "onNext: " + jsonString);
|
Log.e("getAppPasswd", "onNext: " + jsonString);
|
||||||
} else {
|
} else {
|
||||||
MMKV.defaultMMKV().encode("ApplicationLock", "");
|
mMMKV.remove("ApplicationLock");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,13 @@ import com.aoleyun.os.uiuiutils.MD5Util;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import okhttp3.Headers;
|
||||||
import okhttp3.Interceptor;
|
import okhttp3.Interceptor;
|
||||||
|
import okhttp3.MediaType;
|
||||||
import okhttp3.Protocol;
|
import okhttp3.Protocol;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.RequestBody;
|
import okhttp3.RequestBody;
|
||||||
@@ -19,89 +23,292 @@ import okhttp3.ResponseBody;
|
|||||||
import okio.Buffer;
|
import okio.Buffer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* v1.0 2022-07-15 16:16:52
|
* 重复请求拦截器。
|
||||||
|
*
|
||||||
|
* <p>原实现是在 {@code chain.proceed()} 之后才判断是否为重复请求,此时请求早已发到服务器,
|
||||||
|
* 只能丢弃返回结果,所以服务端依然会收到两次(甚至多次)请求;并且记录在 finally 中立即删除,
|
||||||
|
* 去重窗口几乎为零,重复请求根本拦不住。</p>
|
||||||
|
*
|
||||||
|
* <p>优化后的策略:</p>
|
||||||
|
* <ul>
|
||||||
|
* <li>发请求之前先判断是否已经有相同请求:有则等待它的结果并复用,不再访问服务器;</li>
|
||||||
|
* <li>请求完成后在 {@link #REUSE_WINDOW_MS} 内保留结果,短时间内相同的请求直接复用结果;</li>
|
||||||
|
* <li>复用时使用真实的状态码、响应头和响应体,调用方无感知(原来的空 {@link Response} 会让
|
||||||
|
* 解析层直接抛异常);</li>
|
||||||
|
* <li>无响应体或响应体过大(超过 {@link #MAX_DEDUP_BODY_BYTES})的请求不参与去重,直接透传,
|
||||||
|
* 避免占用大量内存。</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>v1.0 2022-07-15 16:16:52</p>
|
||||||
*/
|
*/
|
||||||
public class RepeatRequestInterceptor implements Interceptor {
|
public class RepeatRequestInterceptor implements Interceptor {
|
||||||
private static final String TAG = RepeatRequestInterceptor.class.getSimpleName();
|
private static final String TAG = "RepeatRequestInterceptor";
|
||||||
|
|
||||||
private final ConcurrentHashMap<String, Long> requestIdsMap = new ConcurrentHashMap<>();
|
/**
|
||||||
public static final String REPEAT_REQUEST_PROTOCOL = "OKHTTP_REPEAT_REQUEST_PROTOCOL";
|
* 等待进行中请求返回结果的最长时间,超时后本次请求自己访问服务器。
|
||||||
|
* 需要大于 OkHttpClient 的超时时间(当前为 5 秒)。
|
||||||
|
*/
|
||||||
|
private static final long WAIT_IN_FLIGHT_TIMEOUT_MS = 10_000L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求完成后结果保留的时间。在该时间内收到相同请求,直接复用结果,不再访问服务器。
|
||||||
|
* 需要小于业务侧的刷新间隔(ConnectMode 最小为 1 分钟)。
|
||||||
|
*/
|
||||||
|
private static final long REUSE_WINDOW_MS = 500L;
|
||||||
|
|
||||||
|
/** 超过该大小的响应体不参与去重(直接透传),避免内存占用 */
|
||||||
|
private static final long MAX_DEDUP_BODY_BYTES = 1024 * 1024L;
|
||||||
|
|
||||||
|
/** 参与去重 key 计算的请求体最大字节数 */
|
||||||
|
private static final int MAX_BODY_BYTES_FOR_KEY = 8 * 1024;
|
||||||
|
|
||||||
|
/** 日志中请求体、响应体的最大长度 */
|
||||||
|
private static final int MAX_LOG_BODY_LENGTH = 10240;
|
||||||
|
|
||||||
|
private final ConcurrentHashMap<String, RepeatRecord> recordMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Response intercept(@NotNull Chain chain) throws IOException {
|
public Response intercept(@NotNull Chain chain) throws IOException {
|
||||||
Request request = chain.request();
|
Request request = chain.request();
|
||||||
Response response = chain.proceed(request);
|
String bodyText = requestBodyToString(request.body());
|
||||||
ResponseBody responseBody = response.body();
|
String requestKey = buildRequestKey(request, bodyText);
|
||||||
|
|
||||||
//会消费请求,导致请求多次
|
clearExpiredRecords();
|
||||||
String content = responseBody.string();
|
|
||||||
// Response copy = response.newBuilder().body(responseBody).build();
|
RepeatRecord record = acquireRecord(requestKey);
|
||||||
ResponseBody copy = ResponseBody.create(responseBody.contentType(), content);
|
if (record == null) {
|
||||||
if (BuildConfig.DEBUG) {
|
// 已有相同请求,但没有拿到可用结果(上一次失败、超时或结果过大),本次请求直接访问服务器
|
||||||
Log.e(TAG, "请求体返回:| Response: " + request.url().encodedPath() + "\t body: " + content);
|
return chain.proceed(request);
|
||||||
}
|
}
|
||||||
//相同的请求
|
if (!record.isOwner()) {
|
||||||
String requestKey = MD5Util.getUpperMD5Str(request.method() + request.url().toString() + requestBodyToString(request.body()));
|
// 复用相同请求的结果:服务端只会收到一次请求
|
||||||
long time = System.currentTimeMillis();//请求时间
|
log("复用请求:", requestKey, request, bodyText);
|
||||||
|
return record.newResponse(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
log("注册请求:", requestKey, request, bodyText);
|
||||||
try {
|
try {
|
||||||
if (requestIdsMap.size() > 0 && requestIdsMap.containsKey(requestKey)) {
|
Response response = chain.proceed(request);
|
||||||
log("重复请求:", requestKey, request);
|
ResponseBody responseBody = response.body();
|
||||||
//下面这行写了不会抛出onerror
|
if (responseBody == null || responseBody.contentLength() > MAX_DEDUP_BODY_BYTES) {
|
||||||
// chain.call().cancel();
|
// 无响应体或响应体过大:不消费 body,也不参与去重,直接透传
|
||||||
return new Response.Builder()
|
logResponse(request, null);
|
||||||
.protocol(Protocol.get(REPEAT_REQUEST_PROTOCOL))
|
return response;
|
||||||
.request(request) //multi thread
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
requestIdsMap.put(requestKey, time);
|
|
||||||
log("注册请求:", requestKey, request);
|
// body 只能被消费一次,读出来之后重建一个新的 body 返回给调用方
|
||||||
// RepeatRequestInterceptor.Builder builder = request.newBuilder();
|
MediaType contentType = responseBody.contentType();
|
||||||
// builder.addHeader("header", jsonObject.toString());
|
byte[] bytes = responseBody.bytes();
|
||||||
return response.newBuilder().body(copy).build();
|
logResponse(request, bytes);
|
||||||
|
if (bytes.length <= MAX_DEDUP_BODY_BYTES) {
|
||||||
|
// 缓存结果,供等待中的、以及短时间内后续的相同请求复用
|
||||||
|
record.complete(response, bytes, contentType);
|
||||||
|
}
|
||||||
|
return response.newBuilder().body(ResponseBody.create(contentType, bytes)).build();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "intercept: " + e.getMessage());
|
Log.e(TAG, "intercept: " + e.getMessage());
|
||||||
throw e;
|
throw e;
|
||||||
} finally {
|
} finally {
|
||||||
if (requestIdsMap.containsKey(requestKey) && requestIdsMap.containsValue(time)) {//请求任务完成删除map中的数据
|
// 兜底:无论成功、失败还是异常,都结束记录,避免等待中的相同请求被一直阻塞
|
||||||
requestIdsMap.remove(requestKey);
|
record.finish();
|
||||||
log("移除请求:", requestKey, request);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取请求对应的去重记录。
|
||||||
|
*
|
||||||
|
* @return 返回记录表示本次请求要么成为 owner 去访问服务器、要么直接复用已有结果;
|
||||||
|
* 返回 null 表示已有相同请求但结果不可用,本次请求自己访问服务器(不参与去重)
|
||||||
|
*/
|
||||||
|
private RepeatRecord acquireRecord(String requestKey) {
|
||||||
|
while (true) {
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
RepeatRecord record = recordMap.get(requestKey);
|
||||||
|
if (record == null) {
|
||||||
|
RepeatRecord created = new RepeatRecord();
|
||||||
|
if (recordMap.putIfAbsent(requestKey, created) == null) {
|
||||||
|
created.markOwner();
|
||||||
|
return created;
|
||||||
|
}
|
||||||
|
continue;// 其他线程抢先注册,重新判断
|
||||||
|
}
|
||||||
|
if (record.isExpired(now)) {
|
||||||
|
// 结果已过期,替换为本次请求的记录并成为 owner
|
||||||
|
RepeatRecord created = new RepeatRecord();
|
||||||
|
if (recordMap.replace(requestKey, record, created)) {
|
||||||
|
created.markOwner();
|
||||||
|
return created;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 已有相同请求:等待它的结果,拿到结果直接复用
|
||||||
|
if (record.await(WAIT_IN_FLIGHT_TIMEOUT_MS)) {
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 清理过期记录,释放其缓存的响应体 */
|
||||||
|
private void clearExpiredRecords() {
|
||||||
|
if (recordMap.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
for (Map.Entry<String, RepeatRecord> entry : recordMap.entrySet()) {
|
||||||
|
RepeatRecord record = entry.getValue();
|
||||||
|
if (record.isExpired(now)) {
|
||||||
|
recordMap.remove(entry.getKey(), record);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void log(String action, String requestKey, Request request) {
|
private static String buildRequestKey(Request request, String bodyText) {
|
||||||
|
return MD5Util.getUpperMD5Str(request.method() + "|" + request.url() + "|" + bodyText);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求体转字符串,用于计算去重 key 和输出日志。
|
||||||
|
* 只读取可重复读写的请求体,避免把一次性(one-shot)请求体读空。
|
||||||
|
*/
|
||||||
|
private static String requestBodyToString(RequestBody body) {
|
||||||
|
if (body == null || body.isOneShot()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Buffer buffer = new Buffer();
|
||||||
|
body.writeTo(buffer);
|
||||||
|
long size = buffer.size();
|
||||||
|
if (size > MAX_BODY_BYTES_FOR_KEY) {
|
||||||
|
// 请求体过大时只取前一部分参与去重,避免不必要的内存开销
|
||||||
|
return size + ":" + buffer.readByteString(MAX_BODY_BYTES_FOR_KEY).hex();
|
||||||
|
}
|
||||||
|
return buffer.readUtf8();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void log(String action, String requestKey, Request request, String bodyText) {
|
||||||
if (BuildConfig.DEBUG) {
|
if (BuildConfig.DEBUG) {
|
||||||
Log.e("REPEAT-REQUEST", action + requestKey + " Method @" + request.method() + " --- " + " URL = " + request.url().encodedPath() + "\t" + bodyToString(request));
|
String body = bodyText.length() > MAX_LOG_BODY_LENGTH ? "-too long" : bodyText;
|
||||||
|
Log.e("REPEAT-REQUEST", action + requestKey + " Method @" + request.method()
|
||||||
|
+ " --- " + " URL = " + request.url().encodedPath() + "\t" + body);
|
||||||
} else {
|
} else {
|
||||||
Log.e("REPEAT-REQUEST", action + requestKey + " Method @" + request.method());
|
Log.e("REPEAT-REQUEST", action + requestKey + " Method @" + request.method());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String bodyToString(final Request request) {
|
private static void logResponse(Request request, byte[] bytes) {
|
||||||
try {
|
if (!BuildConfig.DEBUG) {
|
||||||
final Request copy = request.newBuilder().build();
|
return;
|
||||||
final Buffer buffer = new Buffer();
|
}
|
||||||
copy.body().writeTo(buffer);
|
if (bytes == null || bytes.length > MAX_LOG_BODY_LENGTH) {
|
||||||
if (buffer.size() > 4096) {
|
Log.e(TAG, "请求体返回:| Response: " + request.url() + "\t body: too long");
|
||||||
return "-too long";
|
} else {
|
||||||
}
|
Log.e(TAG, "请求体返回:| Response: " + request.url()
|
||||||
return buffer.readUtf8();
|
+ "\t body: " + new String(bytes, StandardCharsets.UTF_8));
|
||||||
} catch (Exception e) {
|
|
||||||
return "-";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String requestBodyToString(RequestBody body) {
|
/**
|
||||||
try {
|
* 一次请求的去重记录:owner 线程负责访问服务器,其他相同请求等待并复用它的结果
|
||||||
final Buffer buffer = new Buffer();
|
*/
|
||||||
body.writeTo(buffer);
|
private static final class RepeatRecord {
|
||||||
if (buffer.size() > 4096) {
|
private final Object lock = new Object();
|
||||||
return "-too long";
|
private final long createdTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
private boolean owner;
|
||||||
|
private boolean finished;
|
||||||
|
private boolean succeed;
|
||||||
|
private long finishedTime;
|
||||||
|
private byte[] body;
|
||||||
|
private MediaType contentType;
|
||||||
|
private Headers headers;
|
||||||
|
private Protocol protocol;
|
||||||
|
private int code;
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
void markOwner() {
|
||||||
|
owner = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 等待 owner 请求结束
|
||||||
|
*
|
||||||
|
* @return true 表示已拿到可复用的结果
|
||||||
|
*/
|
||||||
|
boolean await(long timeoutMs) {
|
||||||
|
synchronized (lock) {
|
||||||
|
if (!finished) {
|
||||||
|
try {
|
||||||
|
lock.wait(timeoutMs);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return finished && succeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 请求成功,缓存结果并唤醒等待的请求 */
|
||||||
|
void complete(Response response, byte[] body, MediaType contentType) {
|
||||||
|
synchronized (lock) {
|
||||||
|
if (finished) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.body = body;
|
||||||
|
this.contentType = contentType;
|
||||||
|
this.headers = response.headers();
|
||||||
|
this.protocol = response.protocol();
|
||||||
|
this.code = response.code();
|
||||||
|
this.message = response.message();
|
||||||
|
this.succeed = true;
|
||||||
|
finished = true;
|
||||||
|
finishedTime = System.currentTimeMillis();
|
||||||
|
lock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 请求结束(失败或异常时没有可复用的结果);重复调用忽略 */
|
||||||
|
void finish() {
|
||||||
|
synchronized (lock) {
|
||||||
|
if (finished) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
finished = true;
|
||||||
|
finishedTime = System.currentTimeMillis();
|
||||||
|
lock.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 进行中的记录超过等待超时时间、已完成的记录超过结果保留时间即视为过期 */
|
||||||
|
boolean isExpired(long now) {
|
||||||
|
synchronized (lock) {
|
||||||
|
if (!finished) {
|
||||||
|
return now - createdTime > WAIT_IN_FLIGHT_TIMEOUT_MS;
|
||||||
|
}
|
||||||
|
return now - finishedTime > REUSE_WINDOW_MS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 用缓存的结果构建响应,状态码、响应头、响应体都是真实数据 */
|
||||||
|
Response newResponse(Request request) {
|
||||||
|
synchronized (lock) {
|
||||||
|
return new Response.Builder()
|
||||||
|
.request(request)
|
||||||
|
.protocol(protocol)
|
||||||
|
.code(code)
|
||||||
|
.message(message)
|
||||||
|
.headers(headers)
|
||||||
|
.body(ResponseBody.create(contentType, body))
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
return buffer.readUtf8();
|
|
||||||
} catch (Exception e) {
|
|
||||||
return "-";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import static com.aoleyun.os.ItemInfoWithIcon.FLAG_DISABLED_SUSPENDED;
|
|||||||
import static com.aoleyun.os.model.AppLaunchTracker.CONTAINER_ALL_APPS;
|
import static com.aoleyun.os.model.AppLaunchTracker.CONTAINER_ALL_APPS;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
@@ -44,6 +45,7 @@ import com.aoleyun.os.ItemInfo;
|
|||||||
import com.aoleyun.os.Launcher;
|
import com.aoleyun.os.Launcher;
|
||||||
import com.aoleyun.os.LauncherAppWidgetInfo;
|
import com.aoleyun.os.LauncherAppWidgetInfo;
|
||||||
import com.aoleyun.os.LauncherAppWidgetProviderInfo;
|
import com.aoleyun.os.LauncherAppWidgetProviderInfo;
|
||||||
|
import com.aoleyun.os.comm.CommonConfig;
|
||||||
import com.aoleyun.os.uiuiutils.CustomDialog;
|
import com.aoleyun.os.uiuiutils.CustomDialog;
|
||||||
import com.aoleyun.os.uiuiutils.JgyUtils;
|
import com.aoleyun.os.uiuiutils.JgyUtils;
|
||||||
import com.hjq.toast.Toaster;
|
import com.hjq.toast.Toaster;
|
||||||
@@ -72,6 +74,7 @@ import java.util.List;
|
|||||||
* Class for handling clicks on workspace and all-apps items
|
* Class for handling clicks on workspace and all-apps items
|
||||||
*/
|
*/
|
||||||
public class ItemClickHandler {
|
public class ItemClickHandler {
|
||||||
|
private static MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instance used for click handling on items
|
* Instance used for click handling on items
|
||||||
@@ -107,14 +110,29 @@ public class ItemClickHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Object tag = v.getTag();
|
Object tag = v.getTag();
|
||||||
|
|
||||||
|
if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.QualcommPlatform) {
|
||||||
|
// 点击系统设置时,重定向到 onyx 设置页面
|
||||||
|
String pkgName = getTagPackageName(tag);
|
||||||
|
if ("com.android.settings".equals(pkgName)) {
|
||||||
|
Intent onyxSettingsIntent = new Intent();
|
||||||
|
onyxSettingsIntent.setComponent(
|
||||||
|
new ComponentName("com.onyx", "com.onyx.tablet.settings.SettingsActivity"));
|
||||||
|
onyxSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
launcher.startActivitySafely(v, onyxSettingsIntent,
|
||||||
|
tag instanceof ItemInfo ? (ItemInfo) tag : null, sourceContainer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (tag instanceof WorkspaceItemInfo) {
|
if (tag instanceof WorkspaceItemInfo) {
|
||||||
String packageName = ((WorkspaceItemInfo) tag).getTargetComponent().getPackageName();
|
String packageName = ((WorkspaceItemInfo) tag).getTargetComponent().getPackageName();
|
||||||
if (is_forbid(v.getContext(), packageName)) {
|
if (is_forbid(v.getContext(), packageName)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//获取本地密码
|
//获取本地密码
|
||||||
String ApplicationLock = MMKV.defaultMMKV().decodeString("ApplicationLock");
|
String ApplicationLock = mMMKV.decodeString("ApplicationLock");
|
||||||
Log.e("onClick", "onClick: " + ApplicationLock);
|
Log.e("ItemClickHandler", "onClick: " + ApplicationLock);
|
||||||
Type type = new TypeToken<List<AppPasswdBean>>() {
|
Type type = new TypeToken<List<AppPasswdBean>>() {
|
||||||
}.getType();
|
}.getType();
|
||||||
List<AppPasswdBean> appPasswdBeans = new Gson().fromJson(ApplicationLock, type);
|
List<AppPasswdBean> appPasswdBeans = new Gson().fromJson(ApplicationLock, type);
|
||||||
@@ -189,7 +207,7 @@ public class ItemClickHandler {
|
|||||||
switch (pkg) {
|
switch (pkg) {
|
||||||
case "com.mediatek.camera":
|
case "com.mediatek.camera":
|
||||||
case "com.android.camera2":
|
case "com.android.camera2":
|
||||||
if (Settings.System.getInt(context.getContentResolver(), "qch_app_camera", 0) == 1) {
|
if (Settings.System.getInt(context.getContentResolver(), "qch_app_camera", 1) == 1) {
|
||||||
Toaster.show("摄像头已禁止使用");
|
Toaster.show("摄像头已禁止使用");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -207,7 +225,7 @@ public class ItemClickHandler {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "com.android.deskclock":
|
case "com.android.deskclock":
|
||||||
if (Settings.System.getInt(context.getContentResolver(), "qch_app_deskclock", 0) == 1) {
|
if (Settings.System.getInt(context.getContentResolver(), "qch_app_deskclock", 1) == 1) {
|
||||||
Toaster.show("时钟已禁止使用");
|
Toaster.show("时钟已禁止使用");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -237,6 +255,13 @@ public class ItemClickHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "com.android.calculator":
|
||||||
|
case "com.android.calculator2":
|
||||||
|
if (Settings.System.getInt(context.getContentResolver(), "aole_app_calculator", 1) == 1) {
|
||||||
|
Toaster.show("计算器已禁止使用");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -396,4 +421,18 @@ public class ItemClickHandler {
|
|||||||
}
|
}
|
||||||
launcher.startActivitySafely(v, intent, item, sourceContainer);
|
launcher.startActivitySafely(v, intent, item, sourceContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从点击的 tag 中提取包名,用于判断是否重定向到 onyx 设置页。
|
||||||
|
*/
|
||||||
|
private static String getTagPackageName(Object tag) {
|
||||||
|
if (tag instanceof WorkspaceItemInfo) {
|
||||||
|
ComponentName cn = ((WorkspaceItemInfo) tag).getTargetComponent();
|
||||||
|
return cn != null ? cn.getPackageName() : null;
|
||||||
|
} else if (tag instanceof AppInfo) {
|
||||||
|
ComponentName cn = ((AppInfo) tag).getTargetComponent();
|
||||||
|
return cn != null ? cn.getPackageName() : null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class CustomDialog extends AlertDialog {
|
|||||||
/**
|
/**
|
||||||
* 显示的图片
|
* 显示的图片
|
||||||
*/
|
*/
|
||||||
private ImageView imageIv;
|
private ImageView imageIv, ivClose;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 显示的标题
|
* 显示的标题
|
||||||
@@ -103,6 +103,12 @@ public class CustomDialog extends AlertDialog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
ivClose.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -176,6 +182,7 @@ public class CustomDialog extends AlertDialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
imageIv = findViewById(R.id.image);
|
imageIv = findViewById(R.id.image);
|
||||||
|
ivClose= findViewById(R.id.iv_close);
|
||||||
columnLineView = findViewById(R.id.column_line);
|
columnLineView = findViewById(R.id.column_line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ public class JgyUtils {
|
|||||||
public static final int MT8768Platform = 17;
|
public static final int MT8768Platform = 17;
|
||||||
public static final int AUDG104Platform = 18;
|
public static final int AUDG104Platform = 18;
|
||||||
public static final int seewoPlatform = 25;
|
public static final int seewoPlatform = 25;
|
||||||
|
public static final int QualcommPlatform = 30;
|
||||||
|
public static final int DX11Platform = 31;
|
||||||
|
public static final int G12NLPlatform = 32;
|
||||||
|
public static final int G122JPlatform = 34;
|
||||||
|
|
||||||
|
|
||||||
public static final String Other = "其他";
|
public static final String Other = "其他";
|
||||||
public static final String MTKTag = "MTK";
|
public static final String MTKTag = "MTK";
|
||||||
@@ -62,7 +67,10 @@ public class JgyUtils {
|
|||||||
public static final String MT8768Tag = "MT8768";
|
public static final String MT8768Tag = "MT8768";
|
||||||
public static final String AUDG104Tag = "AUDG104";
|
public static final String AUDG104Tag = "AUDG104";
|
||||||
public static final String seewoTag = "seewo";
|
public static final String seewoTag = "seewo";
|
||||||
|
public static final String Qualcomm_TAG = "QualcommA";
|
||||||
|
public static final String DX11_TAG = "DX11";
|
||||||
|
public static final String G12NL_TAG = "G12NL";
|
||||||
|
public static final String G122J_TAG = "G122J";
|
||||||
|
|
||||||
private JgyUtils(Context context) {
|
private JgyUtils(Context context) {
|
||||||
if (context == null) {
|
if (context == null) {
|
||||||
@@ -120,6 +128,18 @@ public class JgyUtils {
|
|||||||
} else if (seewoTag.equalsIgnoreCase(platform)) {
|
} else if (seewoTag.equalsIgnoreCase(platform)) {
|
||||||
Log.i(TAG, "checkAppPlatform: " + "seewo");
|
Log.i(TAG, "checkAppPlatform: " + "seewo");
|
||||||
return seewoPlatform;
|
return seewoPlatform;
|
||||||
|
} else if (Qualcomm_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
Log.i(TAG, "checkAppPlatform: " + "QualcommA");
|
||||||
|
return QualcommPlatform;
|
||||||
|
} else if (DX11_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
Log.i(TAG, "checkAppPlatform: " + "DX11");
|
||||||
|
return DX11Platform;
|
||||||
|
} else if (G12NL_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
Log.i(TAG, "checkAppPlatform: " + "G12NL");
|
||||||
|
return G12NLPlatform;
|
||||||
|
} else if (G122J_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
Log.i(TAG, "checkAppPlatform: " + "G122J");
|
||||||
|
return G122JPlatform;
|
||||||
} else {
|
} else {
|
||||||
Log.i(TAG, "checkAppPlatform: " + "没有数据");
|
Log.i(TAG, "checkAppPlatform: " + "没有数据");
|
||||||
return UnknowPlatform;
|
return UnknowPlatform;
|
||||||
@@ -154,6 +174,14 @@ public class JgyUtils {
|
|||||||
getAppPlatformCallback.AppPlatform(AUDG104Platform);
|
getAppPlatformCallback.AppPlatform(AUDG104Platform);
|
||||||
} else if (seewoTag.equalsIgnoreCase(platform)) {
|
} else if (seewoTag.equalsIgnoreCase(platform)) {
|
||||||
getAppPlatformCallback.AppPlatform(seewoPlatform);
|
getAppPlatformCallback.AppPlatform(seewoPlatform);
|
||||||
|
} else if (Qualcomm_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
getAppPlatformCallback.AppPlatform(QualcommPlatform);
|
||||||
|
} else if (DX11_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
getAppPlatformCallback.AppPlatform(DX11Platform);
|
||||||
|
} else if (G12NL_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
getAppPlatformCallback.AppPlatform(G12NLPlatform);
|
||||||
|
} else if (G122J_TAG.equalsIgnoreCase(platform)) {
|
||||||
|
getAppPlatformCallback.AppPlatform(G122JPlatform);
|
||||||
} else {
|
} else {
|
||||||
getAppPlatformCallback.AppPlatform(UnknowPlatform);
|
getAppPlatformCallback.AppPlatform(UnknowPlatform);
|
||||||
}
|
}
|
||||||
@@ -291,6 +319,13 @@ public class JgyUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isDisable(Context context, String pkg) {
|
public static boolean isDisable(Context context, String pkg) {
|
||||||
|
if (
|
||||||
|
"org.chromium.chrome".equals(pkg)
|
||||||
|
|| "com.onyx.appmarket".equals(pkg)
|
||||||
|
// || "com.onyx.easytransfer".equals(pkg)
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
String aole_disable_app_list = Settings.Global.getString(context.getContentResolver(), "aole_disable_app_list");
|
String aole_disable_app_list = Settings.Global.getString(context.getContentResolver(), "aole_disable_app_list");
|
||||||
if (TextUtils.isEmpty(aole_disable_app_list)) {
|
if (TextUtils.isEmpty(aole_disable_app_list)) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
120
src/com/aoleyun/os/uiuiutils/WallpaperUtils.java
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
package com.aoleyun.os.uiuiutils;
|
||||||
|
|
||||||
|
import android.app.WallpaperManager;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class WallpaperUtils {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param lockOnly true=仅锁屏;false=按 flags 控制
|
||||||
|
* @param flags 0 使用传统 setBitmap(主屏);
|
||||||
|
* WallpaperManager.FLAG_SYSTEM 主屏;
|
||||||
|
* WallpaperManager.FLAG_LOCK 锁屏;
|
||||||
|
* 可组合 FLAG_SYSTEM|FLAG_LOCK
|
||||||
|
*/
|
||||||
|
public static void setBitmapAsWallpaper(final Context context,
|
||||||
|
final Bitmap bmp,
|
||||||
|
final boolean lockOnly,
|
||||||
|
final int flags) {
|
||||||
|
new AsyncTask<Void, Void, Boolean>() {
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground(Void... v) {
|
||||||
|
try {
|
||||||
|
WallpaperManager wm = WallpaperManager.getInstance(context);
|
||||||
|
if (lockOnly && android.os.Build.VERSION.SDK_INT >= 24) {
|
||||||
|
wm.setBitmap(bmp, null, true, WallpaperManager.FLAG_LOCK);
|
||||||
|
} else if (flags != 0 && android.os.Build.VERSION.SDK_INT >= 24) {
|
||||||
|
wm.setBitmap(bmp, null, true, flags);
|
||||||
|
} else {
|
||||||
|
wm.setBitmap(bmp); // 传统:设置主屏壁纸
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("Wallpaper", "set failed", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取当前主屏壁纸并重新设置(相当于“重设当前壁纸”)
|
||||||
|
public static void reapplyCurrentWallpaper(Context context) {
|
||||||
|
new AsyncTask<Void, Void, Bitmap>() {
|
||||||
|
@Override
|
||||||
|
protected Bitmap doInBackground(Void... voids) {
|
||||||
|
try {
|
||||||
|
WallpaperManager wm = WallpaperManager.getInstance(context);
|
||||||
|
Drawable d = wm.getDrawable(); // 当前系统壁纸,无则返回默认 [11](@ref)
|
||||||
|
if (d instanceof BitmapDrawable) {
|
||||||
|
return ((BitmapDrawable) d).getBitmap();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Bitmap bmp) {
|
||||||
|
if (bmp == null) return;
|
||||||
|
setBitmapAsWallpaper(context, bmp, false, 0);
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reapplyLockWallpaper(Context context) {
|
||||||
|
if (android.os.Build.VERSION.SDK_INT < 24) return;
|
||||||
|
new AsyncTask<Void, Void, Bitmap>() {
|
||||||
|
@Override
|
||||||
|
protected Bitmap doInBackground(Void... v) {
|
||||||
|
try {
|
||||||
|
WallpaperManager wm = WallpaperManager.getInstance(context);
|
||||||
|
ParcelFileDescriptor pfd = wm.getWallpaperFile(WallpaperManager.FLAG_LOCK);
|
||||||
|
if (pfd == null) {
|
||||||
|
pfd = wm.getWallpaperFile(WallpaperManager.FLAG_SYSTEM);
|
||||||
|
}
|
||||||
|
if (pfd == null) return null;
|
||||||
|
Bitmap bmp = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
|
||||||
|
pfd.close();
|
||||||
|
return bmp;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Bitmap bmp) {
|
||||||
|
if (bmp != null) setBitmapAsWallpaper(context, bmp, true, 0);
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void applyBuiltInDefault(Context context) {
|
||||||
|
new AsyncTask<Void, Void, Bitmap>() {
|
||||||
|
@Override
|
||||||
|
protected Bitmap doInBackground(Void... v) {
|
||||||
|
WallpaperManager wm = WallpaperManager.getInstance(context);
|
||||||
|
Drawable d = wm.getBuiltInDrawable(); // 框架内置默认壁纸
|
||||||
|
if (d instanceof BitmapDrawable) {
|
||||||
|
return ((BitmapDrawable) d).getBitmap();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Bitmap bmp) {
|
||||||
|
if (bmp != null) setBitmapAsWallpaper(context, bmp, false, 0);
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -174,6 +174,7 @@ public class ScrimView extends View implements Insettable, WallpaperColorInfo.On
|
|||||||
onExtractedColorsChanged(mWallpaperColorInfo);
|
onExtractedColorsChanged(mWallpaperColorInfo);
|
||||||
|
|
||||||
mAM.addAccessibilityStateChangeListener(this);
|
mAM.addAccessibilityStateChangeListener(this);
|
||||||
|
mLauncher.getStateManager().addStateListener(this);
|
||||||
onAccessibilityStateChanged(mAM.isEnabled());
|
onAccessibilityStateChanged(mAM.isEnabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +183,7 @@ public class ScrimView extends View implements Insettable, WallpaperColorInfo.On
|
|||||||
super.onDetachedFromWindow();
|
super.onDetachedFromWindow();
|
||||||
mWallpaperColorInfo.removeOnChangeListener(this);
|
mWallpaperColorInfo.removeOnChangeListener(this);
|
||||||
mAM.removeAccessibilityStateChangeListener(this);
|
mAM.removeAccessibilityStateChangeListener(this);
|
||||||
|
mLauncher.getStateManager().removeStateListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -320,11 +322,7 @@ public class ScrimView extends View implements Insettable, WallpaperColorInfo.On
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAccessibilityStateChanged(boolean enabled) {
|
public void onAccessibilityStateChanged(boolean enabled) {
|
||||||
LauncherStateManager stateManager = mLauncher.getStateManager();
|
|
||||||
stateManager.removeStateListener(this);
|
|
||||||
|
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
stateManager.addStateListener(this);
|
|
||||||
handleStateChangedComplete(mLauncher.getStateManager().getState());
|
handleStateChangedComplete(mLauncher.getStateManager().getState());
|
||||||
} else {
|
} else {
|
||||||
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
|
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
|
||||||
@@ -333,7 +331,9 @@ public class ScrimView extends View implements Insettable, WallpaperColorInfo.On
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateDragHandleVisibility(Drawable recycle) {
|
private void updateDragHandleVisibility(Drawable recycle) {
|
||||||
boolean visible = mLauncher.getDeviceProfile().isVerticalBarLayout() || mAM.isEnabled();
|
// 桌面主屏(NORMAL)状态下隐藏上滑把手(drag handle),由分页指示器(PageIndicatorDots)展示页面信息
|
||||||
|
boolean visible = (mLauncher.getDeviceProfile().isVerticalBarLayout() || mAM.isEnabled())
|
||||||
|
&& !mLauncher.isInState(NORMAL);
|
||||||
boolean wasVisible = mDragHandle != null;
|
boolean wasVisible = mDragHandle != null;
|
||||||
if (visible != wasVisible) {
|
if (visible != wasVisible) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
@@ -378,6 +378,7 @@ public class ScrimView extends View implements Insettable, WallpaperColorInfo.On
|
|||||||
setImportantForAccessibility(finalState == ALL_APPS
|
setImportantForAccessibility(finalState == ALL_APPS
|
||||||
? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
|
? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
|
||||||
: IMPORTANT_FOR_ACCESSIBILITY_AUTO);
|
: IMPORTANT_FOR_ACCESSIBILITY_AUTO);
|
||||||
|
updateDragHandleVisibility(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class AccessibilityHelper extends ExploreByTouchHelper {
|
protected class AccessibilityHelper extends ExploreByTouchHelper {
|
||||||
|
|||||||