Skip to content

Commit

Permalink
优化多处扩展
Browse files Browse the repository at this point in the history
  • Loading branch information
你需要一台永动机 committed Feb 26, 2021
1 parent 32bb429 commit 2501f9a
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 107 deletions.
4 changes: 3 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
android:name=".base.AppData"
Expand All @@ -22,7 +24,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".module.base.snackbar.SnackbarActivity"></activity>
<activity android:name=".module.base.snackbar.SnackbarActivity"/>
<activity android:name=".module.base.fragment.viewpager.ViewPagerActivity" />
<activity android:name=".module.base.fragment.single.SingleFragmentActivity" />
<activity android:name=".module.test.TestActivity" />
Expand Down
18 changes: 16 additions & 2 deletions app/src/main/java/com/pmm/demo/module/test/TestActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.pmm.demo.module.test

import android.app.Activity
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
import by.kirich1409.viewbindingdelegate.viewBinding
import com.afollestad.assent.Permission
Expand Down Expand Up @@ -44,9 +45,7 @@ class TestActivity : BaseViewActivityV2(R.layout.activity_test) {

mVB.mBtn5.click {
this.requestPermission(
Permission.WRITE_EXTERNAL_STORAGE,
Permission.READ_EXTERNAL_STORAGE,
Permission.CAMERA,
allGrantedCallback = { toast("拿到权限了") },
allDeniedCallback = {
toast("所有权限都拒绝了")
Expand All @@ -66,4 +65,19 @@ class TestActivity : BaseViewActivityV2(R.layout.activity_test) {
super.onResume()
mVB.vNavigationBar.text = "导航条高度:${px2dip(getNavigationBarHeight().toFloat())}单位"
}


//检查定位权限
fun FragmentActivity.requestLocationPermissions(
allGrantedCallback: () -> Unit,
permanentlyDeniedCallback: (() -> Boolean)? = null
) {
requestPermission(
Permission.ACCESS_FINE_LOCATION,
Permission.ACCESS_COARSE_LOCATION,
allGrantedCallback = allGrantedCallback,
permanentlyDeniedCallback = permanentlyDeniedCallback,
message = "需要获取您的位置信息才能给你服务"
)
}
}
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ buildscript {
'metro_compiler': 'com.github.caoyanglee.Metro:compiler:0.3.2',//Metro路由 注解处理器
]
]
ext.kotlin_version = '1.4.21'
ext.kotlin_version = '1.4.30'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.1'
classpath 'com.android.tools.build:gradle:4.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
Expand Down
33 changes: 20 additions & 13 deletions lib/src/main/java/com/pmm/ui/ktx/DialogKt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.content.ContextWrapper
import androidx.fragment.app.FragmentActivity
import com.afollestad.assent.Permission
import com.afollestad.assent.askForPermissions
import com.afollestad.assent.isAllGranted
import com.afollestad.materialdialogs.DialogCallback
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.callbacks.onDismiss
Expand Down Expand Up @@ -70,22 +71,28 @@ fun FragmentActivity.requestPermission(
}
}
//开始请求权限
askForPermissions(*permissions) {
when {
it.isAllGranted(*permissions) -> {
allGrantedCallback?.invoke()
}
it.permanentlyDenied().isNotEmpty() -> {
if (permanentlyDeniedCallback?.invoke() == true) return@askForPermissions
showDialog(true)
}
else -> {
if (allDeniedCallback?.invoke() == true) return@askForPermissions
showDialog(false)

val permissionsGranted: Boolean = isAllGranted(*permissions)
if (permissionsGranted) {
allGrantedCallback?.invoke()
} else {
askForPermissions(*permissions) {
when {
it.isAllGranted(*permissions) -> {
allGrantedCallback?.invoke()
}
it.permanentlyDenied().isNotEmpty() -> {
if (permanentlyDeniedCallback?.invoke() == true) return@askForPermissions
showDialog(true)
}
else -> {
if (allDeniedCallback?.invoke() == true) return@askForPermissions
showDialog(false)
}
}
}
}

}
}

/**
Expand Down
19 changes: 11 additions & 8 deletions lib/src/main/java/com/pmm/ui/ktx/EditTextKt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -132,18 +132,21 @@ fun EditText.checkIsNullAndToast(): Boolean {
*/
fun EditText.addClearView(clearView: View? = null, keyWordListener: ((keyWord: String) -> Unit)? = null) {
//默认隐藏处理
clearView?.gone()
fun checkClearView(){
val keyword = this.text.toString().trim()
if (keyword.isNotBlank()) {
clearView?.visible()
} else {
clearView?.gone()
}
}

checkClearView()
this.addTextChangedListener(object : MyTextWatcher {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
val keyword = s.toString()

if (keyword.isNotBlank()) {
clearView?.visible()
} else {
clearView?.gone()
}

keyWordListener?.invoke(keyword)
checkClearView()
}
})

Expand Down
66 changes: 0 additions & 66 deletions lib/src/main/java/com/pmm/ui/ktx/ImageViewKt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -341,69 +341,3 @@ fun ImageView.loadBae64(base64Data: String) {
this.load(btm)
}

/**
* 加载gif
*/
fun ImageView.loadGif(@DrawableRes gif: Int, placeholder: Drawable? = null, completeListener:(()->Unit) ) {
Glide.with(context).asGif()
.load(gif)
.apply(RequestOptions.placeholderOf(placeholder).diskCacheStrategy(DiskCacheStrategy.ALL))
.listener(object : RequestListener<GifDrawable> {

override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<GifDrawable>?,
isFirstResource: Boolean
): Boolean {
completeListener.invoke()
return false
}

override fun onResourceReady(
resource: GifDrawable?,
model: Any?,
target: Target<GifDrawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
//resource?.setLoopCount(1)

val gifStateField =
GifDrawable::class.java.getDeclaredField(
"state"
)
gifStateField.isAccessible = true

val gifStateClass =
Class.forName("com.bumptech.glide.load.resource.gif.GifDrawable\$GifState")
val gifFrameLoaderField = gifStateClass.getDeclaredField("frameLoader")
gifFrameLoaderField.isAccessible = true

val gifFrameLoaderClass =
Class.forName("com.bumptech.glide.load.resource.gif.GifFrameLoader")
val gifDecoderField = gifFrameLoaderClass.getDeclaredField("gifDecoder")
gifDecoderField.isAccessible = true

val gifDecoderClass = Class.forName("com.bumptech.glide.gifdecoder.GifDecoder")
val gifDecoder = gifDecoderField[gifFrameLoaderField[gifStateField[resource]]]
val getDelayMethod =
gifDecoderClass.getDeclaredMethod("getDelay", Int::class.javaPrimitiveType)
getDelayMethod.isAccessible = true

//获得总帧数
val count: Int = resource?.frameCount ?: 0
var duration = 0
for (i in 0 until count) {
//计算每一帧所需要的时间进行累加
duration += getDelayMethod.invoke(gifDecoder, i) as Int
}
Handler().postDelayed({
completeListener.invoke()
}, duration.toLong())
return false
}

})
.into(this)
}
27 changes: 25 additions & 2 deletions lib/src/main/java/com/pmm/ui/ktx/TimeKt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ fun Long.formatDate2now(): String {
* 比较时间 是否超过几天
* 单位:毫秒
*/
fun Long.moreThanDays(day: Int = 7): Boolean {
fun Long.moreThanDays(day: Int = 1): Boolean {
val currentTime = Calendar.getInstance().time.time
val recordTime = this
if (recordTime == 0L) return true
Expand All @@ -98,7 +98,30 @@ fun Long.moreThanDays(day: Int = 7): Boolean {
* 比较时间 是否超过几天
* 单位:毫秒
*/
fun Date.moreThanDays(day: Int = 7): Boolean = this.time.moreThanDays(day)
fun Date.moreThanDays(day: Int = 1): Boolean = this.time.moreThanDays(day)


/**
* 比较时间 是否超过几天
* 单位:毫秒
*/
fun Long.lessThanDays(day: Int = 1): Boolean {
val currentTime = Calendar.getInstance().time.time
val recordTime = this
if (recordTime == 0L) return false
if (recordTime>currentTime)return false
val differ = currentTime - recordTime
if (differ < 1000 * 60 * 60 * 24 * day) {
return true
}
return false
}

/**
* 比较时间 是否超过几天
* 单位:毫秒
*/
fun Date.lessThanDays(day: Int = 1): Boolean = this.time.lessThanDays(day)


/**
Expand Down
55 changes: 42 additions & 13 deletions lib/src/main/java/com/pmm/ui/ktx/ViewKt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ package com.pmm.ui.ktx
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Rect
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.os.Looper
import android.view.*
import android.widget.FrameLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
Expand Down Expand Up @@ -153,16 +153,45 @@ fun View.getBitmap(handle: (viewBitmap: Bitmap) -> Unit) {
* 替代getDrawingCache方法
*
*/
fun View.screenShot(handle: (viewBitmap: Bitmap) -> Unit) {
try {
val screenshot: Bitmap = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.ARGB_8888)
val c = Canvas(screenshot)
c.translate((-this.scrollX).toFloat(), (-this.scrollY).toFloat())
this.draw(c)
handle(screenshot)
} catch (e: Exception) {
System.gc()
context.toast("保存错误,请重新点击")
fun View.screenShot(window: Window, callback: (viewBitmap: Bitmap) -> Unit) {
val view = this
// PixelCopy is available since API 24 but doesn't seem to work 100% until API 29.
// The build version statement can be adjusted according to how well PixelCopy
// works in your environment before "P".
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val locationOfView = IntArray(2)
view.getLocationInWindow(locationOfView)
val rect = Rect(
locationOfView[0],
locationOfView[1],
locationOfView[0] + view.width,
locationOfView[1] + view.height
)

try {
val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
PixelCopy.request(
window, rect, bitmap, { copyResult: Int ->
if (copyResult == PixelCopy.SUCCESS) {
callback(bitmap)
}
},
Handler(Looper.getMainLooper())
)
} catch (e: IllegalArgumentException) {
// PixelCopy may throw IllegalArgumentException, make sure to handle it
e.printStackTrace()
}
} else {
try {
val screenshot: Bitmap = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.ARGB_8888)
val c = Canvas(screenshot)
c.translate((-this.scrollX).toFloat(), (-this.scrollY).toFloat())
this.draw(c)
callback(screenshot)
} catch (e: Exception) {
System.gc()
}
}
}

Expand Down

0 comments on commit 2501f9a

Please sign in to comment.