Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
com.ccwangluo.accelerator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sheteng
com.ccwangluo.accelerator
Commits
18107d7d
Unverified
Commit
18107d7d
authored
Jun 12, 2018
by
Max Lv
Committed by
GitHub
Jun 12, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1826 from shadowsocks/beta
Support Android P
parents
e5473215
51e57528
Changes
38
Hide whitespace changes
Inline
Side-by-side
Showing
38 changed files
with
219 additions
and
68 deletions
+219
-68
build.gradle
build.gradle
+4
-3
core/build.gradle
core/build.gradle
+1
-1
core/src/main/AndroidManifest.xml
core/src/main/AndroidManifest.xml
+3
-1
gradle/wrapper/gradle-wrapper.properties
gradle/wrapper/gradle-wrapper.properties
+1
-1
mobile/build.gradle
mobile/build.gradle
+2
-1
mobile/src/main/java/android/support/design/animation/AnimationConsts.kt
.../java/android/support/design/animation/AnimationConsts.kt
+27
-0
mobile/src/main/java/android/support/design/widget/SnackbarAnimation.kt
...n/java/android/support/design/widget/SnackbarAnimation.kt
+0
-8
mobile/src/main/java/android/support/design/widget/SnackbarConsts.kt
...main/java/android/support/design/widget/SnackbarConsts.kt
+25
-0
mobile/src/main/java/com/github/shadowsocks/App.kt
mobile/src/main/java/com/github/shadowsocks/App.kt
+3
-2
mobile/src/main/java/com/github/shadowsocks/AppManager.kt
mobile/src/main/java/com/github/shadowsocks/AppManager.kt
+2
-6
mobile/src/main/java/com/github/shadowsocks/GlobalSettingsPreferenceFragment.kt
...om/github/shadowsocks/GlobalSettingsPreferenceFragment.kt
+2
-2
mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt
...main/java/com/github/shadowsocks/ProfileConfigFragment.kt
+2
-2
mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt
.../src/main/java/com/github/shadowsocks/ProfilesFragment.kt
+2
-1
mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt
...e/src/main/java/com/github/shadowsocks/ScannerActivity.kt
+4
-5
mobile/src/main/java/com/github/shadowsocks/VpnRequestActivity.kt
...rc/main/java/com/github/shadowsocks/VpnRequestActivity.kt
+2
-3
mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt
...in/java/com/github/shadowsocks/acl/CustomRulesFragment.kt
+2
-2
mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt
...le/src/main/java/com/github/shadowsocks/bg/BaseService.kt
+1
-1
mobile/src/main/java/com/github/shadowsocks/bg/ServiceNotification.kt
...ain/java/com/github/shadowsocks/bg/ServiceNotification.kt
+4
-3
mobile/src/main/java/com/github/shadowsocks/bg/TileService.kt
...le/src/main/java/com/github/shadowsocks/bg/TileService.kt
+2
-2
mobile/src/main/java/com/github/shadowsocks/bg/VpnService.kt
mobile/src/main/java/com/github/shadowsocks/bg/VpnService.kt
+3
-4
mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt
.../main/java/com/github/shadowsocks/plugin/PluginManager.kt
+2
-1
mobile/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt
...main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt
+2
-1
mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt
mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt
+16
-0
mobile/src/main/java/com/github/shadowsocks/widget/ShrinkUpwardBehavior.kt
...ava/com/github/shadowsocks/widget/ShrinkUpwardBehavior.kt
+6
-4
mobile/src/main/res/drawable/ic_action_dns.xml
mobile/src/main/res/drawable/ic_action_dns.xml
+10
-0
mobile/src/main/res/drawable/ic_action_lock.xml
mobile/src/main/res/drawable/ic_action_lock.xml
+10
-0
mobile/src/main/res/drawable/ic_action_offline_bolt.xml
mobile/src/main/res/drawable/ic_action_offline_bolt.xml
+10
-0
mobile/src/main/res/drawable/ic_action_settings.xml
mobile/src/main/res/drawable/ic_action_settings.xml
+2
-1
mobile/src/main/res/drawable/ic_image_brightness_3.xml
mobile/src/main/res/drawable/ic_image_brightness_3.xml
+6
-0
mobile/src/main/res/drawable/ic_image_looks_6.xml
mobile/src/main/res/drawable/ic_image_looks_6.xml
+10
-0
mobile/src/main/res/drawable/ic_navigation_apps.xml
mobile/src/main/res/drawable/ic_navigation_apps.xml
+10
-0
mobile/src/main/res/drawable/ic_notification_enhanced_encryption.xml
...main/res/drawable/ic_notification_enhanced_encryption.xml
+10
-0
mobile/src/main/res/layout/layout_apps.xml
mobile/src/main/res/layout/layout_apps.xml
+2
-2
mobile/src/main/res/layout/layout_apps_item.xml
mobile/src/main/res/layout/layout_apps_item.xml
+3
-3
mobile/src/main/res/values/styles.xml
mobile/src/main/res/values/styles.xml
+9
-0
mobile/src/main/res/xml/pref_global.xml
mobile/src/main/res/xml/pref_global.xml
+12
-7
mobile/src/main/res/xml/pref_profile.xml
mobile/src/main/res/xml/pref_profile.xml
+6
-0
plugin/build.gradle
plugin/build.gradle
+1
-1
No files found.
build.gradle
View file @
18107d7d
...
@@ -6,9 +6,10 @@ buildscript {
...
@@ -6,9 +6,10 @@ buildscript {
ext
{
ext
{
kotlinVersion
=
'1.2.41'
kotlinVersion
=
'1.2.41'
minSdkVersion
=
21
minSdkVersion
=
21
sdkVersion
=
27
sdkVersion
=
28
buildToolsVersion
=
'27.0.3'
compileSdkVersion
=
28
supportLibraryVersion
=
'27.1.1'
buildToolsVersion
=
'28.0.0'
supportLibraryVersion
=
'28.0.0-alpha3'
takisoftFixVersion
=
'27.1.1.1'
takisoftFixVersion
=
'27.1.1.1'
roomVersion
=
'1.1.0'
roomVersion
=
'1.1.0'
junitVersion
=
'4.12'
junitVersion
=
'4.12'
...
...
core/build.gradle
View file @
18107d7d
...
@@ -4,7 +4,7 @@ apply plugin: 'com.android.library'
...
@@ -4,7 +4,7 @@ apply plugin: 'com.android.library'
android
{
android
{
buildToolsVersion
rootProject
.
buildToolsVersion
buildToolsVersion
rootProject
.
buildToolsVersion
compileSdkVersion
rootProject
.
s
dkVersion
compileSdkVersion
rootProject
.
compileS
dkVersion
defaultConfig
{
defaultConfig
{
minSdkVersion
rootProject
.
minSdkVersion
minSdkVersion
rootProject
.
minSdkVersion
...
...
core/src/main/AndroidManifest.xml
View file @
18107d7d
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"com.github.shadowsocks.core"
/>
package=
"com.github.shadowsocks.core"
>
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE"
/>
</manifest>
gradle/wrapper/gradle-wrapper.properties
View file @
18107d7d
...
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
...
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath
=
wrapper/dists
distributionPath
=
wrapper/dists
zipStoreBase
=
GRADLE_USER_HOME
zipStoreBase
=
GRADLE_USER_HOME
zipStorePath
=
wrapper/dists
zipStorePath
=
wrapper/dists
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-4.
4.1
-all.zip
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-4.
6
-all.zip
mobile/build.gradle
View file @
18107d7d
...
@@ -17,7 +17,7 @@ def getCurrentFlavor() {
...
@@ -17,7 +17,7 @@ def getCurrentFlavor() {
android
{
android
{
buildToolsVersion
rootProject
.
buildToolsVersion
buildToolsVersion
rootProject
.
buildToolsVersion
compileSdkVersion
rootProject
.
s
dkVersion
compileSdkVersion
rootProject
.
compileS
dkVersion
defaultConfig
{
defaultConfig
{
applicationId
"com.github.shadowsocks"
applicationId
"com.github.shadowsocks"
minSdkVersion
rootProject
.
minSdkVersion
minSdkVersion
rootProject
.
minSdkVersion
...
@@ -64,6 +64,7 @@ dependencies {
...
@@ -64,6 +64,7 @@ dependencies {
implementation
"com.android.support:customtabs:$supportLibraryVersion"
implementation
"com.android.support:customtabs:$supportLibraryVersion"
implementation
"com.android.support:design:$supportLibraryVersion"
implementation
"com.android.support:design:$supportLibraryVersion"
implementation
"com.android.support:gridlayout-v7:$supportLibraryVersion"
implementation
"com.android.support:gridlayout-v7:$supportLibraryVersion"
implementation
"com.android.support:support-v4:$supportLibraryVersion"
implementation
'com.futuremind.recyclerfastscroll:fastscroll:0.2.5'
implementation
'com.futuremind.recyclerfastscroll:fastscroll:0.2.5'
implementation
'com.evernote:android-job:1.2.6'
implementation
'com.evernote:android-job:1.2.6'
implementation
"com.google.android.gms:play-services-ads:15.0.1"
implementation
"com.google.android.gms:play-services-ads:15.0.1"
...
...
mobile/src/main/java/android/support/design/animation/AnimationConsts.kt
0 → 100644
View file @
18107d7d
/*******************************************************************************
* *
* Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package
android.support.design.animation
import
android.animation.TimeInterpolator
object
AnimationConsts
{
val
FAST_OUT_SLOW_IN_INTERPOLATOR
:
TimeInterpolator
get
()
=
AnimationUtils
.
FAST_OUT_SLOW_IN_INTERPOLATOR
}
mobile/src/main/java/android/support/design/widget/SnackbarAnimation.kt
deleted
100644 → 0
View file @
e5473215
package
android.support.design.widget
import
android.view.animation.Interpolator
object
SnackbarAnimation
{
val
FAST_OUT_SLOW_IN_INTERPOLATOR
:
Interpolator
get
()
=
AnimationUtils
.
FAST_OUT_SLOW_IN_INTERPOLATOR
const
val
ANIMATION_DURATION
=
BaseTransientBottomBar
.
ANIMATION_DURATION
.
toLong
()
}
mobile/src/main/java/android/support/design/widget/SnackbarConsts.kt
0 → 100644
View file @
18107d7d
/*******************************************************************************
* *
* Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package
android.support.design.widget
object
SnackbarConsts
{
const
val
ANIMATION_DURATION
=
BaseTransientBottomBar
.
ANIMATION_DURATION
.
toLong
()
}
mobile/src/main/java/com/github/shadowsocks/App.kt
View file @
18107d7d
...
@@ -78,8 +78,9 @@ class App : Application() {
...
@@ -78,8 +78,9 @@ class App : Application() {
.
storageEncryptionStatus
==
DevicePolicyManager
.
ENCRYPTION_STATUS_ACTIVE_PER_USER
.
storageEncryptionStatus
==
DevicePolicyManager
.
ENCRYPTION_STATUS_ACTIVE_PER_USER
}
}
fun
getPackageInfo
(
packageName
:
String
)
=
fun
getPackageInfo
(
packageName
:
String
)
=
packageManager
.
getPackageInfo
(
packageName
,
packageManager
.
getPackageInfo
(
packageName
,
PackageManager
.
GET_SIGNATURES
)
!!
if
(
Build
.
VERSION
.
SDK_INT
>=
28
)
PackageManager
.
GET_SIGNING_CERTIFICATES
else
@Suppress
(
"DEPRECATION"
)
PackageManager
.
GET_SIGNATURES
)
!!
fun
startService
()
{
fun
startService
()
{
val
intent
=
Intent
(
this
,
BaseService
.
serviceClass
.
java
)
val
intent
=
Intent
(
this
,
BaseService
.
serviceClass
.
java
)
...
...
mobile/src/main/java/com/github/shadowsocks/AppManager.kt
View file @
18107d7d
...
@@ -27,7 +27,6 @@ import android.annotation.SuppressLint
...
@@ -27,7 +27,6 @@ import android.annotation.SuppressLint
import
android.content.BroadcastReceiver
import
android.content.BroadcastReceiver
import
android.content.ClipData
import
android.content.ClipData
import
android.content.ClipboardManager
import
android.content.ClipboardManager
import
android.content.Context
import
android.content.pm.ApplicationInfo
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageInfo
import
android.content.pm.PackageInfo
import
android.content.pm.PackageManager
import
android.content.pm.PackageManager
...
@@ -49,10 +48,7 @@ import com.futuremind.recyclerviewfastscroll.SectionTitleProvider
...
@@ -49,10 +48,7 @@ import com.futuremind.recyclerviewfastscroll.SectionTitleProvider
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.database.ProfileManager
import
com.github.shadowsocks.database.ProfileManager
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.utils.DirectBoot
import
com.github.shadowsocks.utils.*
import
com.github.shadowsocks.utils.Key
import
com.github.shadowsocks.utils.resolveResourceId
import
com.github.shadowsocks.utils.thread
import
java.util.concurrent.atomic.AtomicBoolean
import
java.util.concurrent.atomic.AtomicBoolean
class
AppManager
:
AppCompatActivity
(),
Toolbar
.
OnMenuItemClickListener
{
class
AppManager
:
AppCompatActivity
(),
Toolbar
.
OnMenuItemClickListener
{
...
@@ -140,7 +136,7 @@ class AppManager : AppCompatActivity(), Toolbar.OnMenuItemClickListener {
...
@@ -140,7 +136,7 @@ class AppManager : AppCompatActivity(), Toolbar.OnMenuItemClickListener {
private
lateinit
var
loadingView
:
View
private
lateinit
var
loadingView
:
View
private
val
appsLoading
=
AtomicBoolean
()
private
val
appsLoading
=
AtomicBoolean
()
private
val
handler
=
Handler
()
private
val
handler
=
Handler
()
private
val
clipboard
by
lazy
{
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
}
private
val
clipboard
by
lazy
{
systemService
<
ClipboardManager
>()
}
private
fun
initProxiedApps
(
str
:
String
=
DataStore
.
individual
)
{
private
fun
initProxiedApps
(
str
:
String
=
DataStore
.
individual
)
{
proxiedApps
=
str
.
split
(
'\n'
).
toHashSet
()
proxiedApps
=
str
.
split
(
'\n'
).
toHashSet
()
...
...
mobile/src/main/java/com/github/shadowsocks/GlobalSettingsPreferenceFragment.kt
View file @
18107d7d
...
@@ -31,9 +31,9 @@ import com.github.shadowsocks.preference.DataStore
...
@@ -31,9 +31,9 @@ import com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.utils.DirectBoot
import
com.github.shadowsocks.utils.DirectBoot
import
com.github.shadowsocks.utils.Key
import
com.github.shadowsocks.utils.Key
import
com.github.shadowsocks.utils.TcpFastOpen
import
com.github.shadowsocks.utils.TcpFastOpen
import
com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat
Dividers
import
com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat
class
GlobalSettingsPreferenceFragment
:
PreferenceFragmentCompat
Dividers
()
{
class
GlobalSettingsPreferenceFragment
:
PreferenceFragmentCompat
()
{
override
fun
onCreatePreferencesFix
(
savedInstanceState
:
Bundle
?,
rootKey
:
String
?)
{
override
fun
onCreatePreferencesFix
(
savedInstanceState
:
Bundle
?,
rootKey
:
String
?)
{
preferenceManager
.
preferenceDataStore
=
DataStore
.
publicStore
preferenceManager
.
preferenceDataStore
=
DataStore
.
publicStore
DataStore
.
initGlobal
()
DataStore
.
initGlobal
()
...
...
mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt
View file @
18107d7d
...
@@ -48,9 +48,9 @@ import com.github.shadowsocks.utils.Action
...
@@ -48,9 +48,9 @@ import com.github.shadowsocks.utils.Action
import
com.github.shadowsocks.utils.DirectBoot
import
com.github.shadowsocks.utils.DirectBoot
import
com.github.shadowsocks.utils.Key
import
com.github.shadowsocks.utils.Key
import
com.takisoft.fix.support.v7.preference.EditTextPreference
import
com.takisoft.fix.support.v7.preference.EditTextPreference
import
com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat
Dividers
import
com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat
class
ProfileConfigFragment
:
PreferenceFragmentCompat
Dividers
(),
Toolbar
.
OnMenuItemClickListener
,
class
ProfileConfigFragment
:
PreferenceFragmentCompat
(),
Toolbar
.
OnMenuItemClickListener
,
Preference
.
OnPreferenceChangeListener
,
OnPreferenceDataStoreChangeListener
{
Preference
.
OnPreferenceChangeListener
,
OnPreferenceDataStoreChangeListener
{
companion
object
{
companion
object
{
private
const
val
REQUEST_CODE_PLUGIN_CONFIGURE
=
1
private
const
val
REQUEST_CODE_PLUGIN_CONFIGURE
=
1
...
...
mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt
View file @
18107d7d
...
@@ -45,6 +45,7 @@ import com.github.shadowsocks.database.ProfileManager
...
@@ -45,6 +45,7 @@ import com.github.shadowsocks.database.ProfileManager
import
com.github.shadowsocks.plugin.PluginConfiguration
import
com.github.shadowsocks.plugin.PluginConfiguration
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.utils.Action
import
com.github.shadowsocks.utils.Action
import
com.github.shadowsocks.utils.systemService
import
com.github.shadowsocks.widget.UndoSnackbarManager
import
com.github.shadowsocks.widget.UndoSnackbarManager
import
com.google.android.gms.ads.AdRequest
import
com.google.android.gms.ads.AdRequest
import
com.google.android.gms.ads.AdSize
import
com.google.android.gms.ads.AdSize
...
@@ -308,7 +309,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
...
@@ -308,7 +309,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
private
var
txTotal
:
Long
=
0L
private
var
txTotal
:
Long
=
0L
private
var
rxTotal
:
Long
=
0L
private
var
rxTotal
:
Long
=
0L
private
val
clipboard
by
lazy
{
requireContext
().
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
}
private
val
clipboard
by
lazy
{
requireContext
().
systemService
<
ClipboardManager
>()
}
private
fun
startConfig
(
profile
:
Profile
)
{
private
fun
startConfig
(
profile
:
Profile
)
{
profile
.
serialize
()
profile
.
serialize
()
...
...
mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt
View file @
18107d7d
...
@@ -21,10 +21,8 @@
...
@@ -21,10 +21,8 @@
package
com.github.shadowsocks
package
com.github.shadowsocks
import
android.app.Activity
import
android.app.Activity
import
android.content.Context
import
android.content.Intent
import
android.content.Intent
import
android.content.pm.ShortcutManager
import
android.content.pm.ShortcutManager
import
android.graphics.BitmapFactory
import
android.hardware.camera2.CameraAccessException
import
android.hardware.camera2.CameraAccessException
import
android.hardware.camera2.CameraManager
import
android.hardware.camera2.CameraManager
import
android.os.Build
import
android.os.Build
...
@@ -39,7 +37,9 @@ import android.widget.Toast
...
@@ -39,7 +37,9 @@ import android.widget.Toast
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.database.Profile
import
com.github.shadowsocks.database.Profile
import
com.github.shadowsocks.database.ProfileManager
import
com.github.shadowsocks.database.ProfileManager
import
com.github.shadowsocks.utils.openBitmap
import
com.github.shadowsocks.utils.resolveResourceId
import
com.github.shadowsocks.utils.resolveResourceId
import
com.github.shadowsocks.utils.systemService
import
com.google.android.gms.common.GoogleApiAvailability
import
com.google.android.gms.common.GoogleApiAvailability
import
com.google.android.gms.samples.vision.barcodereader.BarcodeCapture
import
com.google.android.gms.samples.vision.barcodereader.BarcodeCapture
import
com.google.android.gms.samples.vision.barcodereader.BarcodeGraphic
import
com.google.android.gms.samples.vision.barcodereader.BarcodeGraphic
...
@@ -86,7 +86,7 @@ class ScannerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListener, Ba
...
@@ -86,7 +86,7 @@ class ScannerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListener, Ba
}
}
if
(
Build
.
VERSION
.
SDK_INT
>=
25
)
getSystemService
(
ShortcutManager
::
class
.
java
).
reportShortcutUsed
(
"scan"
)
if
(
Build
.
VERSION
.
SDK_INT
>=
25
)
getSystemService
(
ShortcutManager
::
class
.
java
).
reportShortcutUsed
(
"scan"
)
if
(
try
{
if
(
try
{
(
getSystemService
(
Context
.
CAMERA_SERVICE
)
as
CameraManager
).
cameraIdList
.
isEmpty
()
systemService
<
CameraManager
>(
).
cameraIdList
.
isEmpty
()
}
catch
(
_
:
CameraAccessException
)
{
}
catch
(
_
:
CameraAccessException
)
{
true
true
})
{
})
{
...
@@ -138,10 +138,9 @@ class ScannerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListener, Ba
...
@@ -138,10 +138,9 @@ class ScannerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListener, Ba
var
list
=
listOfNotNull
(
data
?.
data
)
var
list
=
listOfNotNull
(
data
?.
data
)
val
clipData
=
data
?.
clipData
val
clipData
=
data
?.
clipData
if
(
clipData
!=
null
)
list
+=
(
0
until
clipData
.
itemCount
).
map
{
clipData
.
getItemAt
(
it
).
uri
}
if
(
clipData
!=
null
)
list
+=
(
0
until
clipData
.
itemCount
).
map
{
clipData
.
getItemAt
(
it
).
uri
}
val
resolver
=
contentResolver
for
(
uri
in
list
)
try
{
for
(
uri
in
list
)
try
{
val
barcodes
=
detector
.
detect
(
Frame
.
Builder
()
val
barcodes
=
detector
.
detect
(
Frame
.
Builder
()
.
setBitmap
(
BitmapFactory
.
decodeStream
(
resolver
.
openInputStream
(
uri
)
)).
build
())
.
setBitmap
(
contentResolver
.
openBitmap
(
uri
)).
build
())
for
(
i
in
0
until
barcodes
.
size
())
Profile
.
findAll
(
barcodes
.
valueAt
(
i
).
rawValue
).
forEach
{
for
(
i
in
0
until
barcodes
.
size
())
Profile
.
findAll
(
barcodes
.
valueAt
(
i
).
rawValue
).
forEach
{
ProfileManager
.
createProfile
(
it
)
ProfileManager
.
createProfile
(
it
)
success
=
true
success
=
true
...
...
mobile/src/main/java/com/github/shadowsocks/VpnRequestActivity.kt
View file @
18107d7d
...
@@ -22,7 +22,6 @@ package com.github.shadowsocks
...
@@ -22,7 +22,6 @@ package com.github.shadowsocks
import
android.app.KeyguardManager
import
android.app.KeyguardManager
import
android.content.BroadcastReceiver
import
android.content.BroadcastReceiver
import
android.content.Context
import
android.content.Intent
import
android.content.Intent
import
android.content.IntentFilter
import
android.content.IntentFilter
import
android.net.VpnService
import
android.net.VpnService
...
@@ -33,6 +32,7 @@ import com.github.shadowsocks.App.Companion.app
...
@@ -33,6 +32,7 @@ import com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.aidl.IShadowsocksService
import
com.github.shadowsocks.aidl.IShadowsocksService
import
com.github.shadowsocks.bg.BaseService
import
com.github.shadowsocks.bg.BaseService
import
com.github.shadowsocks.utils.broadcastReceiver
import
com.github.shadowsocks.utils.broadcastReceiver
import
com.github.shadowsocks.utils.systemService
class
VpnRequestActivity
:
AppCompatActivity
(),
ShadowsocksConnection
.
Interface
{
class
VpnRequestActivity
:
AppCompatActivity
(),
ShadowsocksConnection
.
Interface
{
companion
object
{
companion
object
{
...
@@ -48,8 +48,7 @@ class VpnRequestActivity : AppCompatActivity(), ShadowsocksConnection.Interface
...
@@ -48,8 +48,7 @@ class VpnRequestActivity : AppCompatActivity(), ShadowsocksConnection.Interface
finish
()
finish
()
return
return
}
}
val
km
=
getSystemService
(
Context
.
KEYGUARD_SERVICE
)
as
KeyguardManager
if
(
systemService
<
KeyguardManager
>().
isKeyguardLocked
)
{
if
(
km
.
inKeyguardRestrictedInputMode
())
{
receiver
=
broadcastReceiver
{
_
,
_
->
connection
.
connect
()
}
receiver
=
broadcastReceiver
{
_
,
_
->
connection
.
connect
()
}
registerReceiver
(
receiver
,
IntentFilter
(
Intent
.
ACTION_USER_PRESENT
))
registerReceiver
(
receiver
,
IntentFilter
(
Intent
.
ACTION_USER_PRESENT
))
}
else
connection
.
connect
()
}
else
connection
.
connect
()
...
...
mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt
View file @
18107d7d
...
@@ -22,7 +22,6 @@ package com.github.shadowsocks.acl
...
@@ -22,7 +22,6 @@ package com.github.shadowsocks.acl
import
android.content.ClipData
import
android.content.ClipData
import
android.content.ClipboardManager
import
android.content.ClipboardManager
import
android.content.Context
import
android.content.res.Configuration
import
android.content.res.Configuration
import
android.os.Build
import
android.os.Build
import
android.os.Bundle
import
android.os.Bundle
...
@@ -49,6 +48,7 @@ import com.github.shadowsocks.bg.BaseService
...
@@ -49,6 +48,7 @@ import com.github.shadowsocks.bg.BaseService
import
com.github.shadowsocks.utils.Subnet
import
com.github.shadowsocks.utils.Subnet
import
com.github.shadowsocks.utils.asIterable
import
com.github.shadowsocks.utils.asIterable
import
com.github.shadowsocks.utils.resolveResourceId
import
com.github.shadowsocks.utils.resolveResourceId
import
com.github.shadowsocks.utils.systemService
import
com.github.shadowsocks.widget.UndoSnackbarManager
import
com.github.shadowsocks.widget.UndoSnackbarManager
import
java.net.IDN
import
java.net.IDN
import
java.net.MalformedURLException
import
java.net.MalformedURLException
...
@@ -361,7 +361,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
...
@@ -361,7 +361,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
private
lateinit
var
list
:
RecyclerView
private
lateinit
var
list
:
RecyclerView
private
var
mode
:
ActionMode
?
=
null
private
var
mode
:
ActionMode
?
=
null
private
lateinit
var
undoManager
:
UndoSnackbarManager
<
Any
>
private
lateinit
var
undoManager
:
UndoSnackbarManager
<
Any
>
private
val
clipboard
by
lazy
{
requireContext
().
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
}
private
val
clipboard
by
lazy
{
requireContext
().
systemService
<
ClipboardManager
>()
}
private
fun
onSelectedItemsUpdated
()
{
private
fun
onSelectedItemsUpdated
()
{
if
(
selectedItems
.
isEmpty
())
mode
?.
finish
()
else
if
(
mode
==
null
)
mode
=
toolbar
.
startActionMode
(
this
)
if
(
selectedItems
.
isEmpty
())
mode
?.
finish
()
else
if
(
mode
==
null
)
mode
=
toolbar
.
startActionMode
(
this
)
...
...
mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt
View file @
18107d7d
...
@@ -370,7 +370,7 @@ object BaseService {
...
@@ -370,7 +370,7 @@ object BaseService {
.
readTimeout
(
30
,
TimeUnit
.
SECONDS
)
.
readTimeout
(
30
,
TimeUnit
.
SECONDS
)
.
build
()
.
build
()
val
mdg
=
MessageDigest
.
getInstance
(
"SHA-1"
)
val
mdg
=
MessageDigest
.
getInstance
(
"SHA-1"
)
mdg
.
update
(
app
.
info
.
signatures
[
0
]
.
toByteArray
())
mdg
.
update
(
app
.
info
.
signatures
Compat
.
first
()
.
toByteArray
())
val
requestBody
=
FormBody
.
Builder
()
val
requestBody
=
FormBody
.
Builder
()
.
add
(
"sig"
,
String
(
Base64
.
encode
(
mdg
.
digest
(),
0
)))
.
add
(
"sig"
,
String
(
Base64
.
encode
(
mdg
.
digest
(),
0
)))
.
build
()
.
build
()
...
...
mobile/src/main/java/com/github/shadowsocks/bg/ServiceNotification.kt
View file @
18107d7d
...
@@ -37,6 +37,7 @@ import com.github.shadowsocks.R
...
@@ -37,6 +37,7 @@ import com.github.shadowsocks.R
import
com.github.shadowsocks.aidl.IShadowsocksServiceCallback
import
com.github.shadowsocks.aidl.IShadowsocksServiceCallback
import
com.github.shadowsocks.utils.Action
import
com.github.shadowsocks.utils.Action
import
com.github.shadowsocks.utils.broadcastReceiver
import
com.github.shadowsocks.utils.broadcastReceiver
import
com.github.shadowsocks.utils.systemService
import
java.util.*
import
java.util.*
/**
/**
...
@@ -47,7 +48,7 @@ import java.util.*
...
@@ -47,7 +48,7 @@ import java.util.*
*/
*/
class
ServiceNotification
(
private
val
service
:
BaseService
.
Interface
,
profileName
:
String
,
class
ServiceNotification
(
private
val
service
:
BaseService
.
Interface
,
profileName
:
String
,
channel
:
String
,
private
val
visible
:
Boolean
=
false
)
{
channel
:
String
,
private
val
visible
:
Boolean
=
false
)
{
private
val
keyGuard
=
(
service
as
Context
).
getSystemService
(
Context
.
KEYGUARD_SERVICE
)
as
KeyguardManager
private
val
keyGuard
=
(
service
as
Context
).
systemService
<
KeyguardManager
>()
private
val
nm
by
lazy
{
private
val
nm
by
lazy
{
(
service
as
Context
).
getSystemService
(
Context
.
NOTIFICATION_SERVICE
)
as
NotificationManager
(
service
as
Context
).
getSystemService
(
Context
.
NOTIFICATION_SERVICE
)
as
NotificationManager
}
}
...
@@ -83,7 +84,7 @@ class ServiceNotification(private val service: BaseService.Interface, profileNam
...
@@ -83,7 +84,7 @@ class ServiceNotification(private val service: BaseService.Interface, profileNam
service
as
Context
service
as
Context
if
(
Build
.
VERSION
.
SDK_INT
<
24
)
builder
.
addAction
(
R
.
drawable
.
ic_navigation_close
,
if
(
Build
.
VERSION
.
SDK_INT
<
24
)
builder
.
addAction
(
R
.
drawable
.
ic_navigation_close
,
service
.
getString
(
R
.
string
.
stop
),
PendingIntent
.
getBroadcast
(
service
,
0
,
Intent
(
Action
.
CLOSE
),
0
))
service
.
getString
(
R
.
string
.
stop
),
PendingIntent
.
getBroadcast
(
service
,
0
,
Intent
(
Action
.
CLOSE
),
0
))
val
power
=
service
.
getSystemService
(
Context
.
POWER_SERVICE
)
as
PowerManager
val
power
=
service
.
systemService
<
PowerManager
>()
update
(
if
(
power
.
isInteractive
)
Intent
.
ACTION_SCREEN_ON
else
Intent
.
ACTION_SCREEN_OFF
,
true
)
update
(
if
(
power
.
isInteractive
)
Intent
.
ACTION_SCREEN_ON
else
Intent
.
ACTION_SCREEN_OFF
,
true
)
val
screenFilter
=
IntentFilter
()
val
screenFilter
=
IntentFilter
()
screenFilter
.
addAction
(
Intent
.
ACTION_SCREEN_ON
)
screenFilter
.
addAction
(
Intent
.
ACTION_SCREEN_ON
)
...
@@ -99,7 +100,7 @@ class ServiceNotification(private val service: BaseService.Interface, profileNam
...
@@ -99,7 +100,7 @@ class ServiceNotification(private val service: BaseService.Interface, profileNam
unregisterCallback
()
// unregister callback to save battery
unregisterCallback
()
// unregister callback to save battery
}
}
Intent
.
ACTION_SCREEN_ON
->
{
Intent
.
ACTION_SCREEN_ON
->
{
setVisible
(
visible
&&
!
keyGuard
.
i
nKeyguardRestrictedInputMode
()
,
forceShow
)
setVisible
(
visible
&&
!
keyGuard
.
i
sKeyguardLocked
,
forceShow
)
service
.
data
.
binder
.
registerCallback
(
callback
)
service
.
data
.
binder
.
registerCallback
(
callback
)
service
.
data
.
binder
.
startListeningForBandwidth
(
callback
)
service
.
data
.
binder
.
startListeningForBandwidth
(
callback
)
callbackRegistered
=
true
callbackRegistered
=
true
...
...
mobile/src/main/java/com/github/shadowsocks/bg/TileService.kt
View file @
18107d7d
...
@@ -21,7 +21,6 @@
...
@@ -21,7 +21,6 @@
package
com.github.shadowsocks.bg
package
com.github.shadowsocks.bg
import
android.app.KeyguardManager
import
android.app.KeyguardManager
import
android.content.Context
import
android.graphics.drawable.Icon
import
android.graphics.drawable.Icon
import
android.service.quicksettings.Tile
import
android.service.quicksettings.Tile
import
android.support.annotation.RequiresApi
import
android.support.annotation.RequiresApi
...
@@ -31,6 +30,7 @@ import com.github.shadowsocks.ShadowsocksConnection
...
@@ -31,6 +30,7 @@ import com.github.shadowsocks.ShadowsocksConnection
import
com.github.shadowsocks.aidl.IShadowsocksService
import
com.github.shadowsocks.aidl.IShadowsocksService
import
com.github.shadowsocks.aidl.IShadowsocksServiceCallback
import
com.github.shadowsocks.aidl.IShadowsocksServiceCallback
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.utils.systemService
import
android.service.quicksettings.TileService
as
BaseTileService
import
android.service.quicksettings.TileService
as
BaseTileService
@RequiresApi
(
24
)
@RequiresApi
(
24
)
...
@@ -38,7 +38,7 @@ class TileService : BaseTileService(), ShadowsocksConnection.Interface {
...
@@ -38,7 +38,7 @@ class TileService : BaseTileService(), ShadowsocksConnection.Interface {
private
val
iconIdle
by
lazy
{
Icon
.
createWithResource
(
this
,
R
.
drawable
.
ic_service_idle
)
}
private
val
iconIdle
by
lazy
{
Icon
.
createWithResource
(
this
,
R
.
drawable
.
ic_service_idle
)
}
private
val
iconBusy
by
lazy
{
Icon
.
createWithResource
(
this
,
R
.
drawable
.
ic_service_busy
)
}
private
val
iconBusy
by
lazy
{
Icon
.
createWithResource
(
this
,
R
.
drawable
.
ic_service_busy
)
}
private
val
iconConnected
by
lazy
{
Icon
.
createWithResource
(
this
,
R
.
drawable
.
ic_service_active
)
}
private
val
iconConnected
by
lazy
{
Icon
.
createWithResource
(
this
,
R
.
drawable
.
ic_service_active
)
}
private
val
keyguard
by
lazy
{
getSystemService
(
Context
.
KEYGUARD_SERVICE
)
as
KeyguardManager
}
private
val
keyguard
by
lazy
{
systemService
<
KeyguardManager
>()
}
override
val
serviceCallback
:
IShadowsocksServiceCallback
.
Stub
by
lazy
{
override
val
serviceCallback
:
IShadowsocksServiceCallback
.
Stub
by
lazy
{
@RequiresApi
(
24
)
@RequiresApi
(
24
)
...
...
mobile/src/main/java/com/github/shadowsocks/bg/VpnService.kt
View file @
18107d7d
...
@@ -22,14 +22,12 @@ package com.github.shadowsocks.bg
...
@@ -22,14 +22,12 @@ package com.github.shadowsocks.bg
import
android.annotation.TargetApi
import
android.annotation.TargetApi
import
android.app.Service
import
android.app.Service
import
android.content.Context
import
android.content.Intent
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.content.pm.PackageManager
import
android.net.*
import
android.net.*
import
android.os.Build
import
android.os.Build
import
android.os.IBinder
import
android.os.IBinder
import
android.os.ParcelFileDescriptor
import
android.os.ParcelFileDescriptor
import
android.support.v4.os.BuildCompat
import
android.util.Log
import
android.util.Log
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.JniHelper
import
com.github.shadowsocks.JniHelper
...
@@ -40,6 +38,7 @@ import com.github.shadowsocks.acl.Acl
...
@@ -40,6 +38,7 @@ import com.github.shadowsocks.acl.Acl
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.preference.DataStore
import
com.github.shadowsocks.utils.Subnet
import
com.github.shadowsocks.utils.Subnet
import
com.github.shadowsocks.utils.parseNumericAddress
import
com.github.shadowsocks.utils.parseNumericAddress
import
com.github.shadowsocks.utils.systemService
import
java.io.File
import
java.io.File
import
java.io.FileDescriptor
import
java.io.FileDescriptor
import
java.io.IOException
import
java.io.IOException
...
@@ -123,7 +122,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
...
@@ -123,7 +122,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
field
=
value
field
=
value
}
}
private
val
connectivity
by
lazy
{
getSystemService
(
Context
.
CONNECTIVITY_SERVICE
)
as
ConnectivityManager
}
private
val
connectivity
by
lazy
{
systemService
<
ConnectivityManager
>()
}
@TargetApi
(
28
)
@TargetApi
(
28
)
private
val
defaultNetworkCallback
=
object
:
ConnectivityManager
.
NetworkCallback
()
{
private
val
defaultNetworkCallback
=
object
:
ConnectivityManager
.
NetworkCallback
()
{
override
fun
onAvailable
(
network
:
Network
)
{
override
fun
onAvailable
(
network
:
Network
)
{
...
@@ -230,7 +229,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
...
@@ -230,7 +229,7 @@ class VpnService : BaseVpnService(), LocalDnsService.Interface {
this
.
conn
=
conn
this
.
conn
=
conn
val
fd
=
conn
.
fd
val
fd
=
conn
.
fd
if
(
Build
Compat
.
isAtLeastP
()
)
{
if
(
Build
.
VERSION
.
SDK_INT
>=
28
)
{
// we want REQUEST here instead of LISTEN
// we want REQUEST here instead of LISTEN
connectivity
.
requestNetwork
(
defaultNetworkRequest
,
defaultNetworkCallback
)
connectivity
.
requestNetwork
(
defaultNetworkRequest
,
defaultNetworkCallback
)
listeningForDefaultNetwork
=
true
listeningForDefaultNetwork
=
true
...
...
mobile/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt
View file @
18107d7d
...
@@ -32,6 +32,7 @@ import android.util.Base64
...
@@ -32,6 +32,7 @@ import android.util.Base64
import
android.util.Log
import
android.util.Log
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.utils.Commandline
import
com.github.shadowsocks.utils.Commandline
import
com.github.shadowsocks.utils.signaturesCompat
import
eu.chainfire.libsuperuser.Shell
import
eu.chainfire.libsuperuser.Shell
import
java.io.File
import
java.io.File
import
java.io.FileNotFoundException
import
java.io.FileNotFoundException
...
@@ -47,7 +48,7 @@ object PluginManager {
...
@@ -47,7 +48,7 @@ object PluginManager {
* public key yet since it will also automatically trust packages signed by the same signatures, e.g. debug keys.
* public key yet since it will also automatically trust packages signed by the same signatures, e.g. debug keys.
*/
*/
val
trustedSignatures
by
lazy
{
val
trustedSignatures
by
lazy
{
app
.
info
.
signatures
.
toSet
()
+
app
.
info
.
signatures
Compat
.
toSet
()
+
Signature
(
Base64
.
decode
(
// @Mygod
Signature
(
Base64
.
decode
(
// @Mygod
"""
"""
|MIIDWzCCAkOgAwIBAgIEUzfv8DANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJD
|MIIDWzCCAkOgAwIBAgIEUzfv8DANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJD
...
...
mobile/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt
View file @
18107d7d
...
@@ -24,6 +24,7 @@ import android.content.pm.ResolveInfo
...
@@ -24,6 +24,7 @@ import android.content.pm.ResolveInfo
import
android.graphics.drawable.Drawable
import
android.graphics.drawable.Drawable
import
android.os.Bundle
import
android.os.Bundle
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.utils.signaturesCompat
abstract
class
ResolvedPlugin
(
protected
val
resolveInfo
:
ResolveInfo
)
:
Plugin
()
{
abstract
class
ResolvedPlugin
(
protected
val
resolveInfo
:
ResolveInfo
)
:
Plugin
()
{
protected
abstract
val
metaData
:
Bundle
protected
abstract
val
metaData
:
Bundle
...
@@ -34,6 +35,6 @@ abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin()
...
@@ -34,6 +35,6 @@ abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin()
override
val
defaultConfig
:
String
by
lazy
{
metaData
.
getString
(
PluginContract
.
METADATA_KEY_DEFAULT_CONFIG
)
}
override
val
defaultConfig
:
String
by
lazy
{
metaData
.
getString
(
PluginContract
.
METADATA_KEY_DEFAULT_CONFIG
)
}
override
val
packageName
:
String
get
()
=
resolveInfo
.
resolvePackageName
override
val
packageName
:
String
get
()
=
resolveInfo
.
resolvePackageName
override
val
trusted
by
lazy
{
override
val
trusted
by
lazy
{
app
.
getPackageInfo
(
packageName
).
signatures
.
any
(
PluginManager
.
trustedSignatures
::
contains
)
app
.
getPackageInfo
(
packageName
).
signatures
Compat
.
any
(
PluginManager
.
trustedSignatures
::
contains
)
}
}
}
}
mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt
View file @
18107d7d
package
com.github.shadowsocks.utils
package
com.github.shadowsocks.utils
import
android.content.BroadcastReceiver
import
android.content.BroadcastReceiver
import
android.content.ContentResolver
import
android.content.Context
import
android.content.Context
import
android.content.Intent
import
android.content.Intent
import
android.content.pm.PackageInfo
import
android.content.res.Resources
import
android.content.res.Resources
import
android.graphics.Bitmap
import
android.graphics.BitmapFactory
import
android.graphics.ImageDecoder
import
android.net.Uri
import
android.os.Build
import
android.os.Build
import
android.support.annotation.AttrRes
import
android.support.annotation.AttrRes
import
android.support.v4.app.Fragment
import
android.support.v4.app.Fragment
import
android.support.v4.app.FragmentManager
import
android.support.v4.app.FragmentManager
import
android.support.v4.content.ContextCompat
import
android.support.v7.util.SortedList
import
android.support.v7.util.SortedList
import
android.util.TypedValue
import
android.util.TypedValue
import
com.github.shadowsocks.App.Companion.app
import
com.github.shadowsocks.App.Companion.app
...
@@ -50,6 +57,15 @@ fun thread(name: String? = null, start: Boolean = true, isDaemon: Boolean = fals
...
@@ -50,6 +57,15 @@ fun thread(name: String? = null, start: Boolean = true, isDaemon: Boolean = fals
val
URLConnection
.
responseLength
:
Long
val
URLConnection
.
responseLength
:
Long
get
()
=
if
(
Build
.
VERSION
.
SDK_INT
>=
24
)
contentLengthLong
else
contentLength
.
toLong
()
get
()
=
if
(
Build
.
VERSION
.
SDK_INT
>=
24
)
contentLengthLong
else
contentLength
.
toLong
()
inline
fun
<
reified
T
>
Context
.
systemService
()
=
ContextCompat
.
getSystemService
(
this
,
T
::
class
.
java
)
!!
fun
ContentResolver
.
openBitmap
(
uri
:
Uri
)
=
if
(
Build
.
VERSION
.
SDK_INT
>=
28
)
ImageDecoder
.
decodeBitmap
(
ImageDecoder
.
createSource
(
this
,
uri
))
else
BitmapFactory
.
decodeStream
(
openInputStream
(
uri
))
val
PackageInfo
.
signaturesCompat
get
()
=
if
(
Build
.
VERSION
.
SDK_INT
>=
28
)
signingInfo
.
apkContentsSigners
else
@Suppress
(
"DEPRECATION"
)
signatures
/**
/**
* Based on: https://stackoverflow.com/a/15656428/2245107
* Based on: https://stackoverflow.com/a/15656428/2245107
*/
*/
...
...
mobile/src/main/java/com/github/shadowsocks/widget/ShrinkUpwardBehavior.kt
View file @
18107d7d
...
@@ -22,18 +22,20 @@ package com.github.shadowsocks.widget
...
@@ -22,18 +22,20 @@ package com.github.shadowsocks.widget
import
android.animation.ValueAnimator
import
android.animation.ValueAnimator
import
android.content.Context
import
android.content.Context
import
android.support.design.animation.AnimationConsts
import
android.support.design.widget.CoordinatorLayout
import
android.support.design.widget.CoordinatorLayout
import
android.support.design.widget.Snackbar
import
android.support.design.widget.Snackbar
import
android.support.design.widget.Snackbar
Animation
import
android.support.design.widget.Snackbar
Consts
import
android.util.AttributeSet
import
android.util.AttributeSet
import
android.view.View
import
android.view.View
import
android.view.accessibility.AccessibilityManager
import
android.view.accessibility.AccessibilityManager
import
com.github.shadowsocks.utils.systemService
/**
/**
* Full credits go to: https://stackoverflow.com/a/35904421/2245107
* Full credits go to: https://stackoverflow.com/a/35904421/2245107
*/
*/
class
ShrinkUpwardBehavior
(
context
:
Context
,
attrs
:
AttributeSet
)
:
CoordinatorLayout
.
Behavior
<
View
>(
context
,
attrs
)
{
class
ShrinkUpwardBehavior
(
context
:
Context
,
attrs
:
AttributeSet
)
:
CoordinatorLayout
.
Behavior
<
View
>(
context
,
attrs
)
{
private
val
accessibility
=
context
.
getSystemService
(
Context
.
ACCESSIBILITY_SERVICE
)
as
AccessibilityManager
private
val
accessibility
=
context
.
systemService
<
AccessibilityManager
>()
override
fun
layoutDependsOn
(
parent
:
CoordinatorLayout
,
child
:
View
,
dependency
:
View
):
Boolean
=
override
fun
layoutDependsOn
(
parent
:
CoordinatorLayout
,
child
:
View
,
dependency
:
View
):
Boolean
=
dependency
is
Snackbar
.
SnackbarLayout
dependency
is
Snackbar
.
SnackbarLayout
...
@@ -52,8 +54,8 @@ class ShrinkUpwardBehavior(context: Context, attrs: AttributeSet) : CoordinatorL
...
@@ -52,8 +54,8 @@ class ShrinkUpwardBehavior(context: Context, attrs: AttributeSet) : CoordinatorL
val
animator
=
ValueAnimator
()
val
animator
=
ValueAnimator
()
val
start
=
child
.
height
val
start
=
child
.
height
animator
.
setIntValues
(
start
,
parent
.
height
)
animator
.
setIntValues
(
start
,
parent
.
height
)
animator
.
interpolator
=
SnackbarAnimation
.
FAST_OUT_SLOW_IN_INTERPOLATOR
animator
.
interpolator
=
AnimationConsts
.
FAST_OUT_SLOW_IN_INTERPOLATOR
animator
.
duration
=
Snackbar
Animation
.
ANIMATION_DURATION
animator
.
duration
=
Snackbar
Consts
.
ANIMATION_DURATION
@Suppress
(
"NAME_SHADOWING"
)
@Suppress
(
"NAME_SHADOWING"
)
animator
.
addUpdateListener
{
animator
->
animator
.
addUpdateListener
{
animator
->
child
.
layoutParams
.
height
=
animator
.
animatedValue
as
Int
child
.
layoutParams
.
height
=
animator
.
animatedValue
as
Int
...
...
mobile/src/main/res/drawable/ic_action_dns.xml
0 → 100644
View file @
18107d7d
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M20,13H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-6c0,-0.55 -0.45,-1 -1,-1zM7,19c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM20,3H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1zM7,9c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"
/>
</vector>
mobile/src/main/res/drawable/ic_action_lock.xml
0 → 100644
View file @
18107d7d
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z"
/>
</vector>
mobile/src/main/res/drawable/ic_action_offline_bolt.xml
0 → 100644
View file @
18107d7d
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24"
android:viewportHeight=
"24"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M12,2.02c-5.51,0 -9.98,4.47 -9.98,9.98s4.47,9.98 9.98,9.98 9.98,-4.47 9.98,-9.98S17.51,2.02 12,2.02zM11.48,20v-6.26H8L13,4v6.26h3.35L11.48,20z"
/>
</vector>
mobile/src/main/res/drawable/ic_action_settings.xml
View file @
18107d7d
...
@@ -2,7 +2,8 @@
...
@@ -2,7 +2,8 @@
android:width=
"24dp"
android:width=
"24dp"
android:height=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
android:viewportHeight=
"24.0"
android:tint=
"?attr/colorControlNormal"
>
<path
<path
android:fillColor=
"#FF000000"
android:fillColor=
"#FF000000"
android:pathData=
"M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"
/>
android:pathData=
"M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"
/>
...
...
mobile/src/main/res/drawable/ic_image_brightness_3.xml
0 → 100644
View file @
18107d7d
<vector
android:autoMirrored=
"true"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
android:width=
"24dp"
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M9,2c-1.05,0 -2.05,0.16 -3,0.46 4.06,1.27 7,5.06 7,9.54 0,4.48 -2.94,8.27 -7,9.54 0.95,0.3 1.95,0.46 3,0.46 5.52,0 10,-4.48 10,-10S14.52,2 9,2z"
/>
</vector>
mobile/src/main/res/drawable/ic_image_looks_6.xml
0 → 100644
View file @
18107d7d
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M11,15h2v-2h-2v2zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,9h-4v2h2c1.1,0 2,0.89 2,2v2c0,1.11 -0.9,2 -2,2h-2c-1.1,0 -2,-0.89 -2,-2L9,9c0,-1.11 0.9,-2 2,-2h4v2z"
/>
</vector>
mobile/src/main/res/drawable/ic_navigation_apps.xml
0 → 100644
View file @
18107d7d
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24"
android:viewportHeight=
"24"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"
/>
</vector>
mobile/src/main/res/drawable/ic_notification_enhanced_encryption.xml
0 → 100644
View file @
18107d7d
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
android:tint=
"?attr/colorControlNormal"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M18,8h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10c0,-1.1 -0.9,-2 -2,-2zM8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2H8.9V6zM16,16h-3v3h-2v-3H8v-2h3v-3h2v3h3v2z"
/>
</vector>
mobile/src/main/res/layout/layout_apps.xml
View file @
18107d7d
...
@@ -22,7 +22,7 @@
...
@@ -22,7 +22,7 @@
android:checked=
"true"
android:checked=
"true"
android:paddingBottom=
"12dp"
android:paddingBottom=
"12dp"
android:paddingEnd=
"@dimen/fastscroll__bubble_corner"
android:paddingEnd=
"@dimen/fastscroll__bubble_corner"
android:paddingStart=
"
60
dp"
android:paddingStart=
"
72
dp"
android:paddingTop=
"12dp"
android:paddingTop=
"12dp"
android:text=
"@string/on"
android:text=
"@string/on"
android:textColor=
"?android:attr/textColorSecondary"
android:textColor=
"?android:attr/textColorSecondary"
...
@@ -35,7 +35,7 @@
...
@@ -35,7 +35,7 @@
android:checked=
"true"
android:checked=
"true"
android:paddingBottom=
"12dp"
android:paddingBottom=
"12dp"
android:paddingEnd=
"@dimen/fastscroll__bubble_corner"
android:paddingEnd=
"@dimen/fastscroll__bubble_corner"
android:paddingStart=
"
60
dp"
android:paddingStart=
"
72
dp"
android:paddingTop=
"12dp"
android:paddingTop=
"12dp"
android:text=
"@string/bypass_apps"
android:text=
"@string/bypass_apps"
android:textColor=
"?android:attr/textColorSecondary"
android:textColor=
"?android:attr/textColorSecondary"
...
...
mobile/src/main/res/layout/layout_apps_item.xml
View file @
18107d7d
...
@@ -8,10 +8,10 @@
...
@@ -8,10 +8,10 @@
<ImageView
<ImageView
android:id=
"@+id/itemicon"
android:id=
"@+id/itemicon"
android:layout_width=
"
60
dp"
android:layout_width=
"
72
dp"
android:layout_height=
"5
2
dp"
android:layout_height=
"5
6
dp"
android:paddingBottom=
"4dp"
android:paddingBottom=
"4dp"
android:paddingEnd=
"
8
dp"
android:paddingEnd=
"
16
dp"
android:paddingStart=
"8dp"
android:paddingStart=
"8dp"
android:paddingTop=
"4dp"
android:paddingTop=
"4dp"
android:scaleType=
"fitCenter"
/>
android:scaleType=
"fitCenter"
/>
...
...
mobile/src/main/res/values/styles.xml
View file @
18107d7d
...
@@ -14,6 +14,15 @@
...
@@ -14,6 +14,15 @@
<item
name=
"material_drawer_header_selection_text"
>
@color/drawer_header_selection_text
</item>
<item
name=
"material_drawer_header_selection_text"
>
@color/drawer_header_selection_text
</item>
</style>
</style>
<style
name=
"Theme.Design.DayNight.BottomSheetDialog"
parent=
"@style/Theme.Design.Light.BottomSheetDialog"
/>
<style
name=
"Theme.Design.DayNight.BottomSheetDialog"
parent=
"@style/Theme.Design.Light.BottomSheetDialog"
/>
<!-- https://github.com/Gericop/Android-Support-Preference-V7-Fix/issues/111 -->
<style
name=
"Preference.SimpleMenuPreference"
>
<item
name=
"android:layout"
>
@layout/preference_simplemenu
</item>
<item
name=
"allowDividerAbove"
>
false
</item>
<item
name=
"allowDividerBelow"
>
true
</item>
<item
name=
"iconSpaceReserved"
>
@bool/config_materialPreferenceIconSpaceReserved
</item>
<item
name=
"pref_popupStyle"
>
@style/Preference.SimpleMenuPreference.Popup
</item>
</style>
<style
name=
"StyledScrollerTextAppearance"
parent=
"@android:style/TextAppearance"
>
<style
name=
"StyledScrollerTextAppearance"
parent=
"@android:style/TextAppearance"
>
<item
name=
"android:textSize"
>
24sp
</item>
<item
name=
"android:textSize"
>
24sp
</item>
<item
name=
"android:textStyle"
>
bold
</item>
<item
name=
"android:textStyle"
>
bold
</item>
...
...
mobile/src/main/res/xml/pref_global.xml
View file @
18107d7d
...
@@ -5,15 +5,19 @@
...
@@ -5,15 +5,19 @@
android:persistent=
"false"
android:persistent=
"false"
android:summary=
"@string/auto_connect_summary"
android:summary=
"@string/auto_connect_summary"
android:title=
"@string/auto_connect"
/>
android:title=
"@string/auto_connect"
/>
<!-- Direct Boot Aware alone doesn't do anything without auto connect -->
<SwitchPreference
<SwitchPreference
android:key=
"directBootAware"
android:key=
"directBootAware"
android:summary=
"@string/direct_boot_aware_summary"
android:icon=
"@drawable/ic_action_lock"
android:title=
"@string/direct_boot_aware"
/>
android:summary=
"@string/direct_boot_aware_summary"
<SwitchPreference
android:key=
"tcp_fastopen"
android:title=
"@string/direct_boot_aware"
/>
android:summary=
"@string/tcp_fastopen_summary"
<SwitchPreference
android:title=
"TCP Fast Open"
/>
android:key=
"tcp_fastopen"
android:icon=
"@drawable/ic_action_offline_bolt"
android:summary=
"@string/tcp_fastopen_summary"
android:title=
"TCP Fast Open"
/>
<SimpleMenuPreference
<SimpleMenuPreference
android:key=
"nightMode"
android:key=
"nightMode"
android:icon=
"@drawable/ic_image_brightness_3"
android:entries=
"@array/night_modes"
android:entries=
"@array/night_modes"
android:entryValues=
"@array/night_mode_values"
android:entryValues=
"@array/night_mode_values"
android:defaultValue=
"system"
android:defaultValue=
"system"
...
@@ -36,6 +40,7 @@
...
@@ -36,6 +40,7 @@
android:title=
"@string/port_proxy"
/>
android:title=
"@string/port_proxy"
/>
<AutoSummaryEditTextPreference
<AutoSummaryEditTextPreference
android:key=
"portLocalDns"
android:key=
"portLocalDns"
android:icon=
"@drawable/ic_action_dns"
android:inputType=
"number"
android:inputType=
"number"
android:maxLength=
"5"
android:maxLength=
"5"
app:pref_summaryHasText=
"%s"
app:pref_summaryHasText=
"%s"
...
...
mobile/src/main/res/xml/pref_profile.xml
View file @
18107d7d
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
android:title=
"@string/sitekey"
/>
android:title=
"@string/sitekey"
/>
<SimpleMenuPreference
<SimpleMenuPreference
android:key=
"encMethod"
android:key=
"encMethod"
android:icon=
"@drawable/ic_notification_enhanced_encryption"
android:entries=
"@array/enc_method_entry"
android:entries=
"@array/enc_method_entry"
android:entryValues=
"@array/enc_method_value"
android:entryValues=
"@array/enc_method_value"
android:summary=
"%s"
android:summary=
"%s"
...
@@ -48,18 +49,22 @@
...
@@ -48,18 +49,22 @@
android:title=
"@string/route_list"
/>
android:title=
"@string/route_list"
/>
<AutoSummaryEditTextPreference
<AutoSummaryEditTextPreference
android:key=
"remoteDns"
android:key=
"remoteDns"
android:icon=
"@drawable/ic_action_dns"
android:title=
"@string/remote_dns"
android:title=
"@string/remote_dns"
app:pref_summaryHasText=
"%s"
/>
app:pref_summaryHasText=
"%s"
/>
<SwitchPreference
<SwitchPreference
android:key=
"isIpv6"
android:key=
"isIpv6"
android:icon=
"@drawable/ic_image_looks_6"
android:summary=
"@string/ipv6_summary"
android:summary=
"@string/ipv6_summary"
android:title=
"@string/ipv6"
/>
android:title=
"@string/ipv6"
/>
<SwitchPreference
<SwitchPreference
android:key=
"isProxyApps"
android:key=
"isProxyApps"
android:icon=
"@drawable/ic_navigation_apps"
android:summary=
"@string/proxied_apps_summary"
android:summary=
"@string/proxied_apps_summary"
android:title=
"@string/proxied_apps"
/>
android:title=
"@string/proxied_apps"
/>
<SwitchPreference
<SwitchPreference
android:key=
"isUdpDns"
android:key=
"isUdpDns"
android:icon=
"@drawable/ic_action_dns"
android:summary=
"@string/udp_dns_summary"
android:summary=
"@string/udp_dns_summary"
android:title=
"@string/udp_dns"
/>
android:title=
"@string/udp_dns"
/>
...
@@ -75,6 +80,7 @@
...
@@ -75,6 +80,7 @@
android:title=
"@string/plugin"
/>
android:title=
"@string/plugin"
/>
<AutoSummaryEditTextPreference
<AutoSummaryEditTextPreference
android:key=
"plugin.configure"
android:key=
"plugin.configure"
android:icon=
"@drawable/ic_action_settings"
android:persistent=
"false"
android:persistent=
"false"
app:pref_summaryHasText=
"%s"
app:pref_summaryHasText=
"%s"
android:title=
"@string/plugin_configure"
/>
android:title=
"@string/plugin_configure"
/>
...
...
plugin/build.gradle
View file @
18107d7d
...
@@ -5,7 +5,7 @@ apply from: 'gradle-mvn-push.gradle'
...
@@ -5,7 +5,7 @@ apply from: 'gradle-mvn-push.gradle'
android
{
android
{
buildToolsVersion
rootProject
.
buildToolsVersion
buildToolsVersion
rootProject
.
buildToolsVersion
compileSdkVersion
rootProject
.
s
dkVersion
compileSdkVersion
rootProject
.
compileS
dkVersion
defaultConfig
{
defaultConfig
{
minSdkVersion
rootProject
.
minSdkVersion
minSdkVersion
rootProject
.
minSdkVersion
...
...
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