提交 e3842d2a 编写于 作者: B Blankj

see 05/21 log

上级 0c5a6149
* `20/05/21` [add] Publish bus plugin v2.6. Publish api plugin v1.4. Publish. Publish 1.28.5.
* `20/05/19` [fix] FileUtils#copyOrMoveDird NPE.
* `20/05/18` [add] IntentUtils#getLaunchAppDetailsSettingsIntent support isNewTask.
* `20/05/17` [add] ImageUtils#save2Album, NetworkUtils#getSSID, UtilsTransActivity4MainProcess.
* `20/05/03` [add] Publish bus plugin v2.5. Publish api plugin v1.3. Publish. Publish 1.28.4.
* `20/04/30` [add] BaseItem support partialUpdate.
* `20/04/29` [add] Publish plugin lib com.blankj:base-transform:1.0.
......
......@@ -14,8 +14,8 @@ class Config {
static compileSdkVersion = 29
static minSdkVersion = 14
static targetSdkVersion = 29
static versionCode = 1_028_002
static versionName = '1.28.4'// E.g. 1.9.72 => 1,009,072
static versionCode = 1_028_005
static versionName = '1.28.5'// E.g. 1.9.72 => 1,009,072
// lib version
static gradlePluginVersion = '3.5.0'
......@@ -25,9 +25,9 @@ class Config {
static depConfig = [
/*Never delete this line*/
/*Generated by "config.json"*/
plugin_api_gradle_plugin : new DepConfig(false, true , ":plugin:api-gradle-plugin"),
plugin_bus_gradle_plugin : new DepConfig(false, true , ":plugin:bus-gradle-plugin"),
plugin_lib_base_transform : new DepConfig(false, true , ":plugin:lib:base-transform", "com.blankj:base-transform:1.0"),
plugin_api_gradle_plugin : new DepConfig(true , true , ":plugin:api-gradle-plugin"),
plugin_bus_gradle_plugin : new DepConfig(true , true , ":plugin:bus-gradle-plugin"),
plugin_lib_base_transform : new DepConfig(true , false, ":plugin:lib:base-transform", "com.blankj:base-transform:1.0"),
feature_mock : new DepConfig(false, true , ":feature:mock"),
feature_launcher_app : new DepConfig(true , true , ":feature:launcher:app"),
feature_main_app : new DepConfig(false, true , ":feature:main:app"),
......@@ -53,12 +53,12 @@ class Config {
// 上传新版本插件更新 pluginPath 中的版本号,并设置 isApply = false
// 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件
plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.3", pluginId: "com.blankj.api"),
//./gradlew clean plugin:plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean plugin:plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.5", pluginId: "com.blankj.bus"),
//./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.4", pluginId: "com.blankj.api"),
//./gradlew clean :plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean :plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.6", pluginId: "com.blankj.bus"),
//./gradlew clean :plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
support_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$supportVersion"),
support_design : new DepConfig("com.android.support:design:$supportVersion"),
......@@ -86,4 +86,4 @@ class Config {
test_robolectric : new DepConfig("org.robolectric:robolectric:4.3.1"),
]
}
//./gradlew clean lib:lib_utilcode:bintrayUpload
\ No newline at end of file
//./gradlew clean :lib_utilcode:bintrayUpload
\ No newline at end of file
......@@ -76,7 +76,7 @@ class DepConfig {
}
String getProjectPath() {
return localPath.substring(0, localPath.lastIndexOf(":")) + ":" + localPath.substring(1).replace(":", "_")
return ":" + localPath.substring(1).replace(":", "_")
}
@Override
......
......@@ -5,9 +5,9 @@
"pkgConfig": [],
"proConfigDesc": "proConfig 配置的是使用本地还是仓库,优先级低于 appConfig 和 pkgConfig",
"proConfig": [
{"isApply": false, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"},
{"isApply": false, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"},
{"isApply": false, "useLocal": true, "localPath": ":plugin:lib:base-transform", "remotePath": "com.blankj:base-transform:1.0"},
{"isApply": true, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"},
{"isApply": true, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"},
{"isApply": true, "useLocal": false, "localPath": ":plugin:lib:base-transform", "remotePath": "com.blankj:base-transform:1.0"},
{"isApply": true, "useLocal": true, "localPath": ":feature:mock"},
{"isApply": true, "useLocal": true, "localPath": ":feature:launcher:app"},
{"isApply": true, "useLocal": true, "localPath": ":feature:main:app"},
......
......@@ -3,13 +3,14 @@ package com.blankj.subutil.pkg.feature.dangerous
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemSwitch
import com.blankj.subutil.pkg.Config
import com.blankj.subutil.pkg.R
import com.blankj.subutil.pkg.helper.PermissionHelper
import com.blankj.subutil.util.DangerousUtils
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.*
/**
......@@ -24,16 +25,15 @@ class DangerousActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestStorageAndSms(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, DangerousActivity::class.java)
context.startActivity(starter)
}
}, object : PermissionHelper.OnPermissionDeniedListener {
override fun onPermissionDenied() {
start(context)
override fun onDenied() {
}
})
}, PermissionConstants.STORAGE, PermissionConstants.SMS)
}
}
......
......@@ -6,11 +6,13 @@ import android.content.Intent
import android.content.ServiceConnection
import android.os.IBinder
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.subutil.pkg.R
import com.blankj.subutil.pkg.helper.PermissionHelper
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.PermissionUtils
/**
* ```
......@@ -24,16 +26,15 @@ class LocationActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestLocation(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, LocationActivity::class.java)
context.startActivity(starter)
}
}, object : PermissionHelper.OnPermissionDeniedListener {
override fun onPermissionDenied() {
start(context)
override fun onDenied() {
}
})
}, PermissionConstants.LOCATION)
}
}
......
package com.blankj.subutil.pkg.helper
import android.content.Context
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.PermissionUtils
/**
* ```
* author: Blankj
* blog : http://blankj.com
* time : 2018/01/06
* desc : helper about permission
* ```
*/
object PermissionHelper {
fun requestStorageAndSms(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(context, listener, deniedListener, PermissionConstants.STORAGE, PermissionConstants.SMS)
}
fun requestLocation(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(context, listener, deniedListener, PermissionConstants.LOCATION)
}
private fun request(context: Context,
grantedListener: OnPermissionGrantedListener?,
deniedListener: OnPermissionDeniedListener?,
@PermissionConstants.Permission vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
grantedListener?.onPermissionGranted()
}
override fun onDenied(permissionsDeniedForever: List<String>, permissionsDenied: List<String>) {
LogUtils.d(permissionsDeniedForever, permissionsDenied)
if (!permissionsDeniedForever.isEmpty()) {
DialogHelper.showOpenAppSettingDialog(context)
return
}
deniedListener?.onPermissionDenied()
}
})
.request()
}
interface OnPermissionGrantedListener {
fun onPermissionGranted()
}
interface OnPermissionDeniedListener {
fun onPermissionDenied()
}
}
......@@ -47,6 +47,7 @@ import com.blankj.utilcode.pkg.feature.toast.ToastActivity
import com.blankj.utilcode.pkg.feature.uiMessage.UiMessageActivity
import com.blankj.utilcode.pkg.feature.vibrate.VibrateActivity
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.UtilsTransActivity
/**
......@@ -200,4 +201,9 @@ class CoreUtilActivity : CommonActivity() {
}
)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
LogUtils.e(requestCode, requestCode)
}
}
......@@ -3,13 +3,14 @@ package com.blankj.utilcode.pkg.feature.app
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemImage
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.pkg.Config
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.helper.PermissionHelper
import com.blankj.utilcode.util.*
/**
......@@ -24,16 +25,15 @@ class AppActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestStorage(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, AppActivity::class.java)
context.startActivity(starter)
}
}, object : PermissionHelper.OnPermissionDeniedListener {
override fun onPermissionDenied() {
start(context)
override fun onDenied() {
}
})
}, PermissionConstants.STORAGE)
}
}
......
......@@ -3,15 +3,13 @@ package com.blankj.utilcode.pkg.feature.flashlight
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemSwitch
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.helper.PermissionHelper
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.FlashlightUtils
import com.blankj.utilcode.util.ToastUtils
import com.blankj.utilcode.util.Utils
import com.blankj.utilcode.util.*
/**
* ```
......@@ -29,16 +27,16 @@ class FlashlightActivity : CommonActivity() {
ToastUtils.showLong("Didn't support flashlight.")
return
}
PermissionHelper.requestCamera(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, FlashlightActivity::class.java)
context.startActivity(starter)
}
}, object : PermissionHelper.OnPermissionDeniedListener {
override fun onPermissionDenied() {
start(context)
override fun onDenied() {
LogUtils.e("permission denied")
}
})
}, PermissionConstants.CAMERA)
}
}
......
......@@ -8,13 +8,16 @@ import android.os.Build
import android.os.Bundle
import android.view.View
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemImage
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.pkg.Config
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.*
import java.io.File
import java.util.*
/**
......@@ -32,8 +35,15 @@ class ImageActivity : CommonActivity() {
companion object {
fun start(context: Context) {
val starter = Intent(context, ImageActivity::class.java)
context.startActivity(starter)
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, ImageActivity::class.java)
context.startActivity(starter)
}
override fun onDenied() {
}
}, PermissionConstants.STORAGE)
}
}
......@@ -79,10 +89,31 @@ class ImageActivity : CommonActivity() {
.apply {
if (result) {
setMessage("save successful.")
.showSuccess()
.showSuccess(true)
} else {
setMessage("save failed.")
.showError(true)
}
}
}
})
})
add(CommonItemClick("Save to Album") {
ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask<File?>() {
override fun doInBackground(): File? {
return ImageUtils.save2Album(src, Bitmap.CompressFormat.JPEG)
}
override fun onSuccess(result: File?) {
SnackbarUtils.with(mContentView)
.setDuration(SnackbarUtils.LENGTH_LONG)
.apply {
if (result != null) {
setMessage("save successful.")
.showSuccess(true)
} else {
setMessage("save failed.")
.showError()
.showError(true)
}
}
}
......
......@@ -65,6 +65,7 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
CommonItemTitle("getGatewayByWifi", NetworkUtils.getGatewayByWifi()),
CommonItemTitle("getNetMaskByWifi", NetworkUtils.getNetMaskByWifi()),
CommonItemTitle("getServerAddressByWifi", NetworkUtils.getServerAddressByWifi()),
CommonItemTitle("getSSID", NetworkUtils.getSSID()),
CommonItemTitle("getIPv4Address", NetworkUtils.getIPAddress(true)),
CommonItemTitle("getIPv6Address", NetworkUtils.getIPAddress(false)),
......
......@@ -5,13 +5,13 @@ import android.content.Context
import android.content.Intent
import android.os.Build
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemSwitch
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.helper.DialogHelper
import com.blankj.utilcode.util.*
/**
......@@ -106,7 +106,7 @@ class PermissionActivity : CommonActivity() {
private fun requestCalendar() {
PermissionUtils.permission(PermissionConstants.CALENDAR)
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......@@ -131,7 +131,7 @@ class PermissionActivity : CommonActivity() {
private fun requestRecordAudio() {
PermissionUtils.permission(PermissionConstants.MICROPHONE)
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......@@ -155,7 +155,7 @@ class PermissionActivity : CommonActivity() {
private fun requestCalendarAndRecordAudio() {
PermissionUtils.permission(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE)
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......
......@@ -3,12 +3,14 @@ package com.blankj.utilcode.pkg.feature.phone
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.helper.PermissionHelper
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.PermissionUtils
import com.blankj.utilcode.util.PhoneUtils
/**
......@@ -23,16 +25,15 @@ class PhoneActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestPhone(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, PhoneActivity::class.java)
context.startActivity(starter)
}
}, object : PermissionHelper.OnPermissionDeniedListener {
override fun onPermissionDenied() {
start(context)
override fun onDenied() {
}
})
}, PermissionConstants.PHONE)
}
}
......
......@@ -6,7 +6,6 @@ import android.graphics.Bitmap
import android.graphics.drawable.ColorDrawable
import android.support.v4.app.FragmentActivity
import android.text.method.ScrollingMovementMethod
import android.util.Pair
import android.view.Gravity
import android.view.View
import android.view.Window
......@@ -16,9 +15,11 @@ import android.widget.ImageView
import android.widget.TextView
import com.blankj.base.dialog.BaseDialogFragment
import com.blankj.base.dialog.DialogLayoutCallback
import com.blankj.common.dialog.CommonDialogContent
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.*
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.KeyboardUtils
import com.blankj.utilcode.util.ScreenUtils
import com.blankj.utilcode.util.ToastUtils
/**
* ```
......@@ -30,30 +31,6 @@ import com.blankj.utilcode.util.*
*/
object DialogHelper {
fun showRationaleDialog(context: Context, shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_rationale_message),
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
shouldRequest.again(true)
}),
Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
shouldRequest.again(false)
})).show()
}
fun showOpenAppSettingDialog(context: Context) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_denied_forever_message),
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
PermissionUtils.launchAppDetailsSettings()
}),
Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
}))
.show()
}
fun showKeyboardDialog(context: Context) {
BaseDialogFragment().init(context, object : DialogLayoutCallback {
override fun bindTheme(): Int {
......
package com.blankj.utilcode.pkg.helper
import android.content.Context
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.PermissionUtils
/**
* ```
* author: Blankj
* blog : http://blankj.com
* time : 2018/01/06
* desc : helper about permission
* ```
*/
object PermissionHelper {
fun requestCamera(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(context, listener, deniedListener, PermissionConstants.CAMERA)
}
fun requestStorage(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(context, listener, deniedListener, PermissionConstants.STORAGE)
}
fun requestPhone(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(context, listener, deniedListener, PermissionConstants.PHONE)
}
private fun request(context: Context, grantedListener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener,
@PermissionConstants.Permission vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
grantedListener.onPermissionGranted()
}
override fun onDenied(permissionsDeniedForever: List<String>, permissionsDenied: List<String>) {
LogUtils.d(permissionsDeniedForever, permissionsDenied)
if (!permissionsDeniedForever.isEmpty()) {
DialogHelper.showOpenAppSettingDialog(context)
return
}
deniedListener.onPermissionDenied()
}
})
.request()
}
interface OnPermissionGrantedListener {
fun onPermissionGranted()
}
interface OnPermissionDeniedListener {
fun onPermissionDenied()
}
}
......@@ -2,8 +2,9 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:centerColor="@color/colorPrimary"
android:endColor="@android:color/transparent"
android:startColor="@android:color/transparent" />
android:angle="180"
android:centerColor="@android:color/transparent"
android:endColor="@color/colorPrimary"
android:startColor="@color/colorPrimary" />
</shape>
\ No newline at end of file
package com.blankj.subutil.pkg.helper
package com.blankj.common.helper
import android.content.Context
import android.util.Pair
import android.view.View
import com.blankj.common.R
import com.blankj.common.dialog.CommonDialogContent
import com.blankj.subutil.pkg.R
import com.blankj.utilcode.util.PermissionUtils
import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest
import com.blankj.utilcode.util.StringUtils
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.*
/**
* ```
* author: Blankj
* blog : http://blankj.com
* time : 2018/01/10
* desc : helper about dialog
* time : 2018/01/06
* desc : helper about permission
* ```
*/
object DialogHelper {
object PermissionHelper {
fun showRationaleDialog(context: Context, shouldRequest: ShouldRequest) {
fun request(context: Context, callback: PermissionUtils.SimpleCallback,
@PermissionConstants.Permission vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { activity, shouldRequest -> showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.SingleCallback {
override fun callback(isAllGranted: Boolean, granted: MutableList<String>,
deniedForever: MutableList<String>, denied: MutableList<String>) {
LogUtils.d(isAllGranted, granted, deniedForever, denied)
if (isAllGranted) {
callback.onGranted()
return
}
if (deniedForever.isNotEmpty()) {
showOpenAppSettingDialog(context)
return
}
val activity = ActivityUtils.getActivityByContext(context)
if (activity != null) {
SnackbarUtils.with(activity.findViewById(android.R.id.content))
.setMessage("Permission denied: ${permissions2String(denied)}")
.showError(true)
}
callback.onDenied()
}
fun permissions2String(permissions: MutableList<String>): String {
if (permissions.isEmpty()) return "[]"
val sb: StringBuilder = StringBuilder()
for (permission in permissions) {
sb.append(", " + permission.substring(permission.lastIndexOf('.') + 1))
}
return "[${sb.substring(2)}]"
}
})
.request()
}
fun showRationaleDialog(context: Context, shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_rationale_message),
......@@ -43,4 +79,4 @@ object DialogHelper {
}))
.show()
}
}
}
\ No newline at end of file
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.28.4'
implementation 'com.blankj:utilcode:1.28.5'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.28.4'
implementation 'com.blankj:utilcodex:1.28.5'
```
......@@ -1160,7 +1160,7 @@ removeListener: 移除消息监听器
res2Uri : res 转 uri
file2Uri : file 转 uri
uri2File : uri 转 file
uri2InputStream: uri 转 InputStream
uri2Bytes : uri 转 bytes
```
* ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.28.4'
implementation 'com.blankj:utilcode:1.28.5'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.28.4'
implementation 'com.blankj:utilcodex:1.28.5'
```
......
......@@ -3,6 +3,12 @@
<application>
<activity
android:name="com.blankj.utilcode.util.UtilsTransActivity4MainProcess"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/ActivityTranslucent"
android:windowSoftInputMode="stateHidden|stateAlwaysHidden" />
<activity
android:name="com.blankj.utilcode.util.UtilsTransActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
......
package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
......@@ -9,8 +10,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.util.Log;
......@@ -278,13 +277,37 @@ public final class AppUtils {
/**
* Launch the application's details settings.
*
* @param packageName The name of the package.
* @param pkgName The name of the package.
*/
public static void launchAppDetailsSettings(final String packageName) {
if (UtilsBridge.isSpace(packageName)) return;
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + packageName));
Utils.getApp().startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
public static void launchAppDetailsSettings(final String pkgName) {
if (UtilsBridge.isSpace(pkgName)) return;
Intent intent = UtilsBridge.getLaunchAppDetailsSettingsIntent(pkgName, true);
if (!UtilsBridge.isIntentAvailable(intent)) return;
Utils.getApp().startActivity(intent);
}
/**
* Launch the application's details settings.
*
* @param activity The activity.
* @param requestCode The requestCode.
*/
public static void launchAppDetailsSettings(final Activity activity, final int requestCode) {
launchAppDetailsSettings(activity, requestCode, Utils.getApp().getPackageName());
}
/**
* Launch the application's details settings.
*
* @param activity The activity.
* @param requestCode The requestCode.
* @param pkgName The name of the package.
*/
public static void launchAppDetailsSettings(final Activity activity, final int requestCode, final String pkgName) {
if (activity == null || UtilsBridge.isSpace(pkgName)) return;
Intent intent = UtilsBridge.getLaunchAppDetailsSettingsIntent(pkgName, false);
if (!UtilsBridge.isIntentAvailable(intent)) return;
activity.startActivityForResult(intent, requestCode);
}
/**
......
......@@ -376,7 +376,11 @@ public final class FileIOUtils {
final byte[] bytes,
final boolean append,
final boolean isForce) {
if (bytes == null || !UtilsBridge.createOrExistsFile(file)) {
if (bytes == null) {
Log.e("FileIOUtils", "bytes is null.");
return false;
}
if (!UtilsBridge.createOrExistsFile(file)) {
Log.e("FileIOUtils", "create file <" + file + "> failed.");
return false;
}
......
......@@ -430,12 +430,14 @@ public final class FileUtils {
if (!srcDir.exists() || !srcDir.isDirectory()) return false;
if (!createOrExistsDir(destDir)) return false;
File[] files = srcDir.listFiles();
for (File file : files) {
File oneDestFile = new File(destPath + file.getName());
if (file.isFile()) {
if (!copyOrMoveFile(file, oneDestFile, listener, isMove)) return false;
} else if (file.isDirectory()) {
if (!copyOrMoveDir(file, oneDestFile, listener, isMove)) return false;
if (files != null && files.length > 0) {
for (File file : files) {
File oneDestFile = new File(destPath + file.getName());
if (file.isFile()) {
if (!copyOrMoveFile(file, oneDestFile, listener, isMove)) return false;
} else if (file.isDirectory()) {
if (!copyOrMoveDir(file, oneDestFile, listener, isMove)) return false;
}
}
}
return !isMove || deleteDir(srcDir);
......@@ -506,7 +508,7 @@ public final class FileUtils {
// dir isn't a directory then return false
if (!dir.isDirectory()) return false;
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
if (files != null && files.length > 0) {
for (File file : files) {
if (file.isFile()) {
if (!file.delete()) return false;
......@@ -846,7 +848,7 @@ public final class FileUtils {
List<File> list = new ArrayList<>();
if (!isDir(dir)) return list;
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
if (files != null && files.length > 0) {
for (File file : files) {
if (filter.accept(file)) {
list.add(file);
......@@ -1169,7 +1171,7 @@ public final class FileUtils {
if (!isDir(dir)) return -1;
long len = 0;
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
if (files != null && files.length > 0) {
for (File file : files) {
if (file.isDirectory()) {
len += getDirLength(file);
......@@ -1398,8 +1400,7 @@ public final class FileUtils {
public static void notifySystemToScan(final File file) {
if (file == null || !file.exists()) return;
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(file);
intent.setData(uri);
intent.setData(Uri.parse("file://" + file.getAbsolutePath()));
Utils.getApp().sendBroadcast(intent);
}
......
package com.blankj.utilcode.util;
import android.Manifest;
import android.content.ContentValues;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
......@@ -22,7 +24,10 @@ import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
......@@ -32,6 +37,7 @@ import android.support.annotation.DrawableRes;
import android.support.annotation.FloatRange;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import android.util.Log;
......@@ -1501,7 +1507,7 @@ public final class ImageUtils {
public static boolean save(final Bitmap src,
final String filePath,
final CompressFormat format) {
return save(src, UtilsBridge.getFileByPath(filePath), format, false);
return save(src, filePath, format, 100, false);
}
/**
......@@ -1513,7 +1519,7 @@ public final class ImageUtils {
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src, final File file, final CompressFormat format) {
return save(src, file, format, false);
return save(src, file, format, 100, false);
}
/**
......@@ -1529,7 +1535,7 @@ public final class ImageUtils {
final String filePath,
final CompressFormat format,
final boolean recycle) {
return save(src, UtilsBridge.getFileByPath(filePath), format, recycle);
return save(src, filePath, format, 100, recycle);
}
/**
......@@ -1545,7 +1551,91 @@ public final class ImageUtils {
final File file,
final CompressFormat format,
final boolean recycle) {
if (isEmptyBitmap(src) || !UtilsBridge.createFileByDeleteOldFile(file)) {
return save(src, file, format, 100, recycle);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param filePath The path of file.
* @param format The format of the image.
* @param quality Hint to the compressor, 0-100. 0 meaning compress for
* small size, 100 meaning compress for max quality. Some
* formats, like PNG which is lossless, will ignore the
* quality setting
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final String filePath,
final CompressFormat format,
final int quality) {
return save(src, UtilsBridge.getFileByPath(filePath), format, quality, false);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param file The file.
* @param format The format of the image.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final File file,
final CompressFormat format,
final int quality) {
return save(src, file, format, quality, false);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param filePath The path of file.
* @param format The format of the image.
* @param quality Hint to the compressor, 0-100. 0 meaning compress for
* small size, 100 meaning compress for max quality. Some
* formats, like PNG which is lossless, will ignore the
* quality setting
* @param recycle True to recycle the source of bitmap, false otherwise.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final String filePath,
final CompressFormat format,
final int quality,
final boolean recycle) {
return save(src, UtilsBridge.getFileByPath(filePath), format, quality, recycle);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param file The file.
* @param format The format of the image.
* @param quality Hint to the compressor, 0-100. 0 meaning compress for
* small size, 100 meaning compress for max quality. Some
* formats, like PNG which is lossless, will ignore the
* quality setting
* @param recycle True to recycle the source of bitmap, false otherwise.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final File file,
final CompressFormat format,
final int quality,
final boolean recycle) {
if (isEmptyBitmap(src)) {
Log.e("ImageUtils", "bitmap is empty.");
return false;
}
if (src.isRecycled()) {
Log.e("ImageUtils", "bitmap is recycled.");
return false;
}
if (!UtilsBridge.createFileByDeleteOldFile(file)) {
Log.e("ImageUtils", "create or delete file <" + file + "> failed.");
return false;
}
......@@ -1553,7 +1643,7 @@ public final class ImageUtils {
boolean ret = false;
try {
os = new BufferedOutputStream(new FileOutputStream(file));
ret = src.compress(format, 100, os);
ret = src.compress(format, quality, os);
if (recycle && !src.isRecycled()) src.recycle();
} catch (IOException e) {
e.printStackTrace();
......@@ -1569,6 +1659,80 @@ public final class ImageUtils {
return ret;
}
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format) {
return save2Album(src, format, 100, false);
}
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format,
final boolean recycle) {
return save2Album(src, format, 100, recycle);
}
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format,
final int quality) {
return save2Album(src, format, quality, false);
}
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format,
final int quality,
final boolean recycle) {
String suffix = CompressFormat.JPEG.equals(format) ? "JPG" : format.name();
String fileName = System.currentTimeMillis() + "_" + quality + "." + suffix;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
if (!UtilsBridge.isGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Log.e("ImageUtils", "save to album need storage permission");
return null;
}
File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File destFile = new File(picDir, Utils.getApp().getPackageName() + "/" + fileName);
if (!save(src, destFile, format, quality, recycle)) {
return null;
}
UtilsBridge.notifySystemToScan(destFile);
return destFile;
} else {
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
Uri contentUri;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else {
contentUri = MediaStore.Images.Media.INTERNAL_CONTENT_URI;
}
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/" + Utils.getApp().getPackageName());
Uri uri = Utils.getApp().getContentResolver().insert(contentUri, contentValues);
if (uri == null) {
return null;
}
OutputStream os = null;
try {
os = Utils.getApp().getContentResolver().openOutputStream(uri);
src.compress(format, quality, os);
return UtilsBridge.uri2File(uri);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* Return whether it is a image according to the file name.
*
......
......@@ -117,9 +117,19 @@ public final class IntentUtils {
* @return the intent of launch app details settings
*/
public static Intent getLaunchAppDetailsSettingsIntent(final String pkgName) {
return getLaunchAppDetailsSettingsIntent(pkgName, false);
}
/**
* Return the intent of launch app details settings.
*
* @param pkgName The name of the package.
* @return the intent of launch app details settings
*/
public static Intent getLaunchAppDetailsSettingsIntent(final String pkgName, final boolean isNewTask) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + pkgName));
return getIntent(intent, true);
return getIntent(intent, isNewTask);
}
/**
......
......@@ -7,6 +7,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.support.annotation.NonNull;
......@@ -660,6 +661,27 @@ public final class NetworkUtils {
return Formatter.formatIpAddress(wm.getDhcpInfo().serverAddress);
}
/**
* Return the ssid.
*
* @return the ssid.
*/
@RequiresPermission(ACCESS_WIFI_STATE)
public static String getSSID() {
WifiManager wm = (WifiManager) Utils.getApp().getApplicationContext().getSystemService(WIFI_SERVICE);
if (wm == null) return "";
WifiInfo wi = wm.getConnectionInfo();
if (wi == null) return "";
String ssid = wi.getSSID();
if (TextUtils.isEmpty(ssid)) {
return "";
}
if (ssid.length() > 2 && ssid.charAt(0) == '"' && ssid.charAt(ssid.length() - 1) == '"') {
return ssid.substring(1, ssid.length() - 1);
}
return ssid;
}
/**
* Register the status of network changed listener.
*
......
......@@ -8,6 +8,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
......@@ -41,6 +42,7 @@ public final class PermissionUtils {
private String[] mPermissionsParam;
private OnRationaleListener mOnRationaleListener;
private SingleCallback mSingleCallback;
private SimpleCallback mSimpleCallback;
private FullCallback mFullCallback;
private ThemeCallback mThemeCallback;
......@@ -167,10 +169,9 @@ public final class PermissionUtils {
* Launch the application's details settings.
*/
public static void launchAppDetailsSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + Utils.getApp().getPackageName()));
Intent intent = UtilsBridge.getLaunchAppDetailsSettingsIntent(Utils.getApp().getPackageName(), true);
if (!UtilsBridge.isIntentAvailable(intent)) return;
Utils.getApp().startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
Utils.getApp().startActivity(intent);
}
/**
......@@ -199,6 +200,17 @@ public final class PermissionUtils {
return this;
}
/**
* Set the simple call back.
*
* @param callback the single call back
* @return the single {@link PermissionUtils} instance
*/
public PermissionUtils callback(final SingleCallback callback) {
mSingleCallback = callback;
return this;
}
/**
* Set the simple call back.
*
......@@ -237,7 +249,7 @@ public final class PermissionUtils {
*/
public void request() {
if (mPermissionsParam == null || mPermissionsParam.length <= 0) {
Log.e("PermissionUtils", "No permissions to request.");
Log.w("PermissionUtils", "No permissions to request.");
return;
}
......@@ -333,6 +345,11 @@ public final class PermissionUtils {
}
private void requestCallback() {
if (mSingleCallback != null) {
mSingleCallback.callback(mPermissionsDenied.isEmpty(),
mPermissionsGranted, mPermissionsDeniedForever, mPermissionsDenied);
mSingleCallback = null;
}
if (mSimpleCallback != null) {
if (mPermissionsDenied.isEmpty()) {
mSimpleCallback.onGranted();
......@@ -493,6 +510,12 @@ public final class PermissionUtils {
}
}
public interface SingleCallback {
void callback(boolean isAllGranted, @NonNull List<String> granted,
@NonNull List<String> deniedForever, @NonNull List<String> denied);
}
public interface SimpleCallback {
void onGranted();
......@@ -500,9 +523,9 @@ public final class PermissionUtils {
}
public interface FullCallback {
void onGranted(List<String> permissionsGranted);
void onGranted(@NonNull List<String> granted);
void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied);
void onDenied(@NonNull List<String> deniedForever, @NonNull List<String> denied);
}
public interface ThemeCallback {
......
......@@ -349,14 +349,22 @@ public final class ToastUtils {
static IToast makeToast(Context context, CharSequence text, int duration) {
if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {
return new SystemToast(makeNormalToast(context, text, duration));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!UtilsBridge.isGrantedDrawOverlays()) {
return new SystemToast(makeNormalToast(context, text, duration));
}
}
}
return new ToastWithoutNotification(makeNormalToast(context, text, duration));
}
static IToast newToast(Context context) {
if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {
return new SystemToast(new Toast(context));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!UtilsBridge.isGrantedDrawOverlays()) {
return new SystemToast(new Toast(context));
}
}
}
return new ToastWithoutNotification(new Toast(context));
}
......
......@@ -87,17 +87,36 @@ public final class UriUtils {
String scheme = uri.getScheme();
String path = uri.getPath();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && path != null) {
String[] externals = new String[]{"/external", "/external_path"};
String[] externals = new String[]{"/external/", "/external_path/"};
File file = null;
for (String external : externals) {
if (path.startsWith(external + "/")) {
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ path.replace(external, ""));
if (path.startsWith(external)) {
file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ path.replace(external, "/"));
if (file.exists()) {
Log.d("UriUtils", uri.toString() + " -> " + external);
return file;
}
}
}
file = null;
if (path.startsWith("/files_path/")) {
file = new File(Utils.getApp().getFilesDir().getAbsolutePath()
+ path.replace("/files_path/", "/"));
} else if (path.startsWith("/cache_path/")) {
file = new File(Utils.getApp().getCacheDir().getAbsolutePath()
+ path.replace("/cache_path/", "/"));
} else if (path.startsWith("/external_files_path/")) {
file = new File(Utils.getApp().getExternalFilesDir(null).getAbsolutePath()
+ path.replace("/external_files_path/", "/"));
} else if (path.startsWith("/external_cache_path/")) {
file = new File(Utils.getApp().getExternalCacheDir().getAbsolutePath()
+ path.replace("/external_cache_path/", "/"));
}
if (file != null && file.exists()) {
Log.d("UriUtils", uri.toString() + " -> " + path);
return file;
}
}
if (ContentResolver.SCHEME_FILE.equals(scheme)) {
if (path != null) return new File(path);
......@@ -277,10 +296,24 @@ public final class UriUtils {
private static File copyUri2Cache(Uri uri) {
Log.d("UriUtils", "copyUri2Cache() called");
InputStream is = uri2InputStream(uri);
File file = new File(Utils.getApp().getCacheDir(), "" + System.currentTimeMillis());
UtilsBridge.writeFileFromIS(file.getAbsolutePath(), is);
return file;
InputStream is = null;
try {
is = Utils.getApp().getContentResolver().openInputStream(uri);
File file = new File(Utils.getApp().getCacheDir(), "" + System.currentTimeMillis());
UtilsBridge.writeFileFromIS(file.getAbsolutePath(), is);
return file;
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
......@@ -289,14 +322,14 @@ public final class UriUtils {
* @param uri The uri.
* @return the input stream
*/
public static InputStream uri2InputStream(Uri uri) {
StringBuilder stringBuilder = new StringBuilder();
public static byte[] uri2Bytes(Uri uri) {
InputStream is = null;
try {
is = Utils.getApp().getContentResolver().openInputStream(uri);
return is;
return UtilsBridge.inputStream2Bytes(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.d("UriUtils", "uri to bytes failed.");
return null;
} finally {
if (is != null) {
......
......@@ -19,6 +19,7 @@ import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
......@@ -216,6 +217,10 @@ class UtilsBridge {
return ConvertUtils.inputStream2Bytes(is);
}
static ByteArrayOutputStream input2OutputStream(final InputStream is) {
return ConvertUtils.input2OutputStream(is);
}
static List<String> inputStream2Lines(final InputStream is, final String charsetName) {
return ConvertUtils.inputStream2Lines(is, charsetName);
}
......@@ -293,6 +298,10 @@ class UtilsBridge {
return FileUtils.getFsAvailableSize(path);
}
static void notifySystemToScan(File file) {
FileUtils.notifySystemToScan(file);
}
///////////////////////////////////////////////////////////////////////////
// GsonUtils
///////////////////////////////////////////////////////////////////////////
......@@ -379,6 +388,10 @@ class UtilsBridge {
return IntentUtils.getSendSmsIntent(phoneNumber, content);
}
static Intent getLaunchAppDetailsSettingsIntent(final String pkgName, final boolean isNewTask) {
return IntentUtils.getLaunchAppDetailsSettingsIntent(pkgName, isNewTask);
}
///////////////////////////////////////////////////////////////////////////
// JsonUtils
......@@ -404,6 +417,10 @@ class UtilsBridge {
///////////////////////////////////////////////////////////////////////////
// PermissionUtils
///////////////////////////////////////////////////////////////////////////
static boolean isGranted(final String... permissions) {
return PermissionUtils.isGranted(permissions);
}
@RequiresApi(api = Build.VERSION_CODES.M)
static boolean isGrantedDrawOverlays() {
return PermissionUtils.isGrantedDrawOverlays();
......@@ -540,4 +557,8 @@ class UtilsBridge {
static Uri file2Uri(final File file) {
return UriUtils.file2Uri(file);
}
static File uri2File(final Uri uri) {
return UriUtils.uri2File(uri);
}
}
......@@ -8,6 +8,7 @@ import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
......@@ -22,27 +23,36 @@ import java.util.Map;
public class UtilsTransActivity extends AppCompatActivity {
private static final Map<UtilsTransActivity, TransActivityDelegate> CALLBACK_MAP = new HashMap<>();
private static TransActivityDelegate sDelegate;
protected static final String EXTRA_DELEGATE = "extra_delegate";
public static void start(final TransActivityDelegate delegate) {
start(null, null, delegate);
start(null, null, delegate, UtilsTransActivity.class);
}
public static void start(final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate) {
start(null, consumer, delegate);
start(null, consumer, delegate, UtilsTransActivity.class);
}
public static void start(final Activity activity,
final TransActivityDelegate delegate) {
start(activity, null, delegate);
start(activity, null, delegate, UtilsTransActivity.class);
}
public static void start(final Activity activity,
final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate) {
start(activity, consumer, delegate, UtilsTransActivity.class);
}
protected static void start(final Activity activity,
final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate,
final Class<?> cls) {
if (delegate == null) return;
Intent starter = new Intent(Utils.getApp(), UtilsTransActivity.class);
Intent starter = new Intent(Utils.getApp(), cls);
starter.putExtra(EXTRA_DELEGATE, delegate);
if (consumer != null) {
consumer.accept(starter);
}
......@@ -52,22 +62,22 @@ public class UtilsTransActivity extends AppCompatActivity {
} else {
activity.startActivity(starter);
}
sDelegate = delegate;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
overridePendingTransition(0, 0);
if (sDelegate == null) {
Serializable extra = getIntent().getSerializableExtra(EXTRA_DELEGATE);
if (!(extra instanceof TransActivityDelegate)) {
super.onCreate(savedInstanceState);
finish();
return;
}
CALLBACK_MAP.put(this, sDelegate);
sDelegate.onCreateBefore(this, savedInstanceState);
TransActivityDelegate delegate = (TransActivityDelegate) extra;
CALLBACK_MAP.put(this, delegate);
delegate.onCreateBefore(this, savedInstanceState);
super.onCreate(savedInstanceState);
sDelegate.onCreated(this, savedInstanceState);
sDelegate = null;
delegate.onCreated(this, savedInstanceState);
}
@Override
......@@ -146,7 +156,7 @@ public class UtilsTransActivity extends AppCompatActivity {
return super.dispatchTouchEvent(ev);
}
public abstract static class TransActivityDelegate {
public abstract static class TransActivityDelegate implements Serializable {
public void onCreateBefore(@NonNull UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {/**/}
public void onCreated(@NonNull UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {/**/}
......
package com.blankj.utilcode.util;
import android.app.Activity;
import android.content.Intent;
/**
* <pre>
* author: blankj
* blog : http://blankj.com
* time : 2020/03/19
* desc :
* </pre>
*/
public class UtilsTransActivity4MainProcess extends UtilsTransActivity {
public static void start(final TransActivityDelegate delegate) {
start(null, null, delegate, UtilsTransActivity4MainProcess.class);
}
public static void start(final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate) {
start(null, consumer, delegate, UtilsTransActivity4MainProcess.class);
}
public static void start(final Activity activity,
final TransActivityDelegate delegate) {
start(activity, null, delegate, UtilsTransActivity4MainProcess.class);
}
public static void start(final Activity activity,
final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate) {
start(activity, consumer, delegate, UtilsTransActivity4MainProcess.class);
}
}
# Change Log
## v1.4(2020/05/19)
重新发布,因为上个版本从阿里云仓库拉取是有问题的
## v1.3(2020/04/29)
重构使用 base-transform
......
......@@ -30,7 +30,7 @@
buildscript {
dependencies {
...
classpath 'com.blankj:api-gradle-plugin:1.2'
classpath 'com.blankj:api-gradle-plugin:1.4'
}
}
```
......
......@@ -40,5 +40,5 @@ publish {
website = "https://github.com/Blankj/AndroidUtilCode"
}
//./gradlew clean plugin:plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean plugin:plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
//./gradlew clean :plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean :plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
# Change Log
## v2.6(2020/05/19)
重新发布,因为上个版本从阿里云仓库拉取是有问题的
## v2.5(2020/04/29)
重构使用 base-transform
......
......@@ -19,7 +19,7 @@
buildscript {
dependencies {
...
classpath 'com.blankj:bus-gradle-plugin:2.4'
classpath 'com.blankj:bus-gradle-plugin:2.6'
}
}
```
......
......@@ -40,5 +40,5 @@ publish {
website = "https://github.com/Blankj/AndroidUtilCode"
}
//./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
\ No newline at end of file
//./gradlew clean :plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
\ No newline at end of file
......@@ -27,8 +27,9 @@ for (def pro in config.proConfig) {
}
if (pro.useLocal && pro.isApply) {
include pro.localPath
project(pro.localPath).name = pro.localPath.substring(1).replace(":", "_")
def projectPath = ":" + localPath.substring(1).replace(":", "_")
include projectPath
project(projectPath).projectDir = file(localPath.substring(1).replace(":", "/"))
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册