GithubHelp home page GithubHelp logo

sakurajimamaii / android-vast-extension Goto Github PK

View Code? Open in Web Editor NEW
61.0 3.0 7.0 17.78 MB

Easy Quick Android Utils for you to faster project development.

Home Page: https://ave.entropy2020.cn

License: Apache License 2.0

Kotlin 97.93% Java 2.07%
kotlin android-library recyclerview-adapter logger toast android-package android-date-formatting wanandroid android-intent android databinding-android

android-vast-extension's Introduction

android-vast-extension's People

Contributors

dependabot[bot] avatar sakurajimamaii avatar sock-magic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

android-vast-extension's Issues

VastAdapter 点击事件设计需要优化

目前的设计如下:

// typealias click event.
typealias VAapClickEvent = ((view: View, pos: Int) -> Unit)?
// typealias long click event.
typealias VAdpLongClickEvent = ((view: View, pos: Int) -> Boolean)?

// item
interface VastAdapterItem {
    var vAdpClickEvent: VAapClickEvent

    var vAdpLongClickEvent: VAdpLongClickEvent

    fun getVAdpItemType(): String
}

这种情况下对于Kotlin的使用并无大碍,但是对于Java的使用有点麻烦,需要Function2,因此需要进行优化

VastActivity组件在初始化有参数ViewModel的时候会出现异常

FATAL EXCEPTION: main
    Process: com.gcode.vastutils, PID: 18377
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gcode.vastutils/com.gcode.vastutils.activity.BaseActivity}: java.lang.RuntimeException: Cannot create an instance of class com.gcode.vastutils.viewModel.MainSharedVM
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3732)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3906)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:210)
        at android.os.Looper.loop(Looper.java:299)
        at android.app.ActivityThread.main(ActivityThread.java:8105)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
    Caused by: java.lang.RuntimeException: Cannot create an instance of class com.gcode.vastutils.viewModel.MainSharedVM
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:201)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
        at com.gcode.vasttools.activity.VastVbVmActivity.createViewModel(VastVbVmActivity.kt:69)
        at com.gcode.vasttools.activity.VastVbVmActivity.onCreate(VastVbVmActivity.kt:56)
        at android.app.Activity.performCreate(Activity.java:8238)
        at android.app.Activity.performCreate(Activity.java:8206)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3705)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3906) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:210) 
        at android.os.Looper.loop(Looper.java:299) 
        at android.app.ActivityThread.main(ActivityThread.java:8105) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045) 
    Caused by: java.lang.InstantiationException: java.lang.Class<com.gcode.vastutils.viewModel.MainSharedVM> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:199)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:319) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:301) 
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:175) 
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:138) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) 
        at com.gcode.vasttools.activity.VastVbVmActivity.createViewModel(VastVbVmActivity.kt:69) 
        at com.gcode.vasttools.activity.VastVbVmActivity.onCreate(VastVbVmActivity.kt:56) 
        at android.app.Activity.performCreate(Activity.java:8238) 
        at android.app.Activity.performCreate(Activity.java:8206) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3705) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3906) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:210) 
        at android.os.Looper.loop(Looper.java:299) 
        at android.app.ActivityThread.main(ActivityThread.java:8105) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045) 

出问题的代码

private fun createViewModel(): VM {
    return ViewModelProvider(this).get(getVmClass(this, 1))
}

VastSkinResources在获取资源时会因为给定的资源id找不到而导致NotFoundException,使得应用闪退的问题

FATAL EXCEPTION: main
                Process: com.tust.mecs, PID: 12919
                java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tust.mecs/com.tust.mecs.ui.activity.MainActivity}: android.view.InflateException: Binary XML file line #26 in com.tust.mecs:layout/abc_alert_dialog_material: Binary XML file line #36 in com.tust.mecs:layout/abc_alert_dialog_title_material: Error inflating class ImageView
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3721)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3895)
                at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
                at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259)
                at android.os.Handler.dispatchMessage(Handler.java:106)
                at android.os.Looper.loopOnce(Looper.java:210)
                at android.os.Looper.loop(Looper.java:299)
                at android.app.ActivityThread.main(ActivityThread.java:8087)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
                Caused by: android.view.InflateException: Binary XML file line #26 in com.tust.mecs:layout/abc_alert_dialog_material: Binary XML file line #36 in com.tust.mecs:layout/abc_alert_dialog_title_material: Error inflating class ImageView
                Caused by: android.view.InflateException: Binary XML file line #36 in com.tust.mecs:layout/abc_alert_dialog_title_material: Error inflating class ImageView
                Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0
                at android.content.res.ResourcesImpl.getResourceTypeName(ResourcesImpl.java:299)
                at android.content.res.Resources.getResourceTypeName(Resources.java:2327)
                at com.gcode.vasttools.skin.utils.VastSkinResources.getBackground(VastSkinResources.kt:123)
                at com.gcode.vasttools.skin.model.VastSkinView.applySkin(VastSkinView.kt:71)
                at com.gcode.vasttools.skin.VastSkinAttribute.look(VastSkinAttribute.kt:77)
                at com.gcode.vasttools.skin.VastSkinLayoutInflaterFactory.onCreateView(VastSkinLayoutInflaterFactory.kt:63)
                at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1088)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1024)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:988)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:1150)
                at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1111)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:1153)
                at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1111)
                at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1294)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:1146)
                at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1111)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:709)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:547)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:485)
                at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:706)
                at androidx.appcompat.app.AppCompatDialog.setContentView(AppCompatDialog.java:95)
                at androidx.appcompat.app.AlertController.installContent(AlertController.java:232)
                at androidx.appcompat.app.AlertDialog.onCreate(AlertDialog.java:279)
                at android.app.Dialog.dispatchOnCreate(Dialog.java:433)
                at android.app.Dialog.show(Dialog.java:327)
                at com.tust.mecs.ui.activity.MainActivity.isGpsOpen(MainActivity.kt:112)
                at com.tust.mecs.ui.activity.MainActivity.onCreate(MainActivity.kt:62)
                at android.app.Activity.performCreate(Activity.java:8238)
                at android.app.Activity.performCreate(Activity.java:8206)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)

ScreenSizeUtils屏幕高度获取存在问题

在这个方法中,屏幕是否是全面屏里 deviceTag 参数采用的是默认值,这是不合理的,需要改正。

fun getMobileScreenHeightApi31(context: Context) =
  if (isAllScreenDeviceApi31(context)) {
      // The full screen is needs to get the height through this method.
      getScreenRealHeightApi31(context)
  } else {
      getScreenHeight(context); }

VastBindAdapter的getItemViewType添加资源id鉴别方法

在之前的设计中,如果不加以判断,很容易产生下列报错:

// 当你的getVBAdpItemType方法返回值被错误的设置为0,而你没察觉到时
android.content.res.Resources$NotFoundException: Resource ID #0x0
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:279)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2310)
    at android.content.res.Resources.getLayout(Resources.java:1293)
    .......

IntentUtils启动逻辑优化

当前启动Activity的方式为

@RequiresPermission(Manifest.permission.CALL_PHONE)
fun Context.dialPhoneNumber(phoneNumber: String) {
    val intent = Intent(Intent.ACTION_DIAL).apply {
        data = Uri.parse("tel:$phoneNumber")
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    } else {
        resolveActivityNullHint()
    }
}

由于 resolveActivity 方法,会有警告,解决方法参考Consider adding a queries declaration to your manifest when calling this method when using intent.resolveActivity in android 11

VastBaseActivity在启动页迁移时发生的问题

目前设计如下:

final override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    initDataBind()
    mViewModel = createViewModel()
    initView(savedInstanceState)
    initSettings()
}

用户只能重写 initView 方法内的内容,但是我们如果想迁移到启动页会有以下要求:

在启动 activity 中,先调用 installSplashScreen ,然后再调用 super.onCreate()

class MainActivity : Activity() {

   override fun onCreate(savedInstanceState: Bundle?) {
       // Handle the splash screen transition.
       val splashScreen = installSplashScreen()

       super.onCreate(savedInstanceState)
       setContentView(R.layout.main_activity)
...

所以需要对该问题进行修复

VastAdapter 添加通用点击事件

目前的 VastAdapter 虽然支持自定义 item 点击事件,但是如果我们需要为所有 item 添加一个通用点击事件时, VastAdapter 却并没有为我们提供此功能,因此我们需要进行优化

ScreenSizeUtils切换横屏后屏幕宽度测量错误

// 竖屏
2022-03-16 11:40:40.396 20281-20281 cla...VmActivity.kt:25) com.gcode.vastutils                  I  method: initView() key: asdfg content: 1080 2400
// 横屏
2022-03-16 11:41:18.426 20281-20281 cla...VmActivity.kt:25) com.gcode.vastutils                  I  method: initView() key: asdfg content: 2320 1080

Activity或者Fragment组件ViewModel类型判断

目前逻辑是

mViewModel =
            ViewModelProvider(this, object : ViewModelProvider.Factory {
                override fun <T : ViewModel> create(modelClass: Class<T>): T {
                    val vm = cast<T>(createViewModel(modelClass))
                    if(vm::class.java != getVmClass(this@VastVbVmActivity, 1))
                        throw RuntimeException("Please check the return value of createViewModel method.")
                    return vm
                }
            })[getVmClass(this, 1)]

但该逻辑还存在异常

VastBindAdapter出现java.lang.NoSuchMethodError: No interface method getVBAapClickEventListener()的问题

VastBindAdapterItem 声明如下:

interface VastBindAdapterItem {

    fun setVBAapClickEventListener(l:VAapClickEventListener?)

    fun getVBAapClickEventListener():VAapClickEventListener?

    fun setVBAdpLongClickEventListener(l:VAdpLongClickEventListener?)

    fun getVBAdpLongClickEventListener():VAdpLongClickEventListener?

    /**
     * @return The item layout resource id.
     */
    fun getVBAdpItemType(): Int

}

VastBindAdapter 点击事件内:

private val dataSource: MutableList<VastBindAdapterItem>

val item = dataSource[position]

holder.itemView.setOnClickListener {
    if (null != item.getVBAapClickEventListener()) {
        item.getVBAapClickEventListener()!!.vAapClickEvent(holder.itemView,position)
    } else {
        onItemClickListener?.onItemClick(holder.itemView, position)
    }
}
holder.itemView.setOnLongClickListener {
    val res = if (null != item.getVBAdpLongClickEventListener()) {
        item.getVBAdpLongClickEventListener()!!.vAdpLongClickEvent(holder.itemView, position)
    } else {
        onItemLongClickListener?.onItemLongClick(holder.itemView, position)
    }
    return@setOnLongClickListener res ?: false
}

但在实际使用过程中会报错java.lang.NoSuchMethodError

DateUtils注释错误

getWeekEndTime 函数注解错误

/**
 * Get the **start** timestamp of the week.
 * **SUNDAY is the first day of the week.**
 *
 * @return WeekEndTime parsed in [yearFormat] format
 */
@JvmOverloads
fun getWeekEndTime(
    calendar: Calendar = Calendar.getInstance(),
    @DateFormat.YearFormatString yearFormat: String = DATE_FORMAT
): String {
    val simpleDateFormat = SimpleDateFormat(yearFormat, locale)
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY)
    return simpleDateFormat.format(calendar.time)
}

应该是Get the end timestamp of the week.

VastNetErrorView接口setRetryClickListener的改进

当前 VastNetErrorView 设计如下

interface VastNetErrorView {
    fun setRetryClickListener(@Nullable retryClickListener: VastRetryClickListener?)

    fun getView(context: Context?): View

    fun viewHide()

    fun viewShow()
}

我认为 setRetryClickListener 只是用来设置 SimpleNetErrorView 页面上的点击按钮事件,因此我决定将该方法单独分离出来。只让 SimpleNetErrorView 实现它

VastSwipeRecyclerView 菜单添加存在错误

现在的添加方式如下:

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    
    val itemView = holder.itemView as VastSwipeMenuLayout
    val leftMenu:VastSwipeMenuView = (itemView.getChildAt(0) as VastSwipeMenuView).apply {
        setManager(manager)
        setPosition(position)
    }
    val rightMenu:VastSwipeMenuView = (itemView.getChildAt(2) as VastSwipeMenuView).apply {
        setManager(manager)
        setPosition(position)
    }
    // 添加菜单
    manager.mSwipeMenuCreator?.onCreateMenu(leftMenu, rightMenu, position)

    mAdapter.onBindViewHolder(holder,position)

}

这样由于onBindViewHolder执行会导致菜单被重复添加

VastNetStateLayout的mNetErrorView和mNetLoadingView获取有问题

在设置 mNetErrorView 或者 mNetLoadingView 的时候,我设置了当给定的字段无法解析出对应的View时,将 SimpleNetErrorViewSimpleNetLoadingView 作为默认值,代码如下:

try {
    mNetLoadingView = if(netLoadingClassName != null){
        Class.forName(netLoadingClassName).newInstance() as VastNetLoadingView
    }else{
        SimpleNetLoadingView() //Avoid no corresponding interface display when netLoadingClassName
    }
    addView(mNetLoadingView!!.getView(context))
} catch (e: Exception) {
    e.printStackTrace()
}

但是我却忘记了关键的问题就是这个默认值不会在初始化的时候为 mNetErrorView 或者 mNetLoadingView 赋值,只有你设置contentState 时候才会赋值,这样就导致界面并不会显示相应的界面,因为初始化我只获取了对应的字段,即:

init {
    val ta = context.obtainStyledAttributes(attrs, R.styleable.VastNetStateLayout)
    netErrorClassName = ta.getString(R.styleable.VastNetStateLayout_net_error)
    netLoadingClassName = ta.getString(R.styleable.VastNetStateLayout_net_loading)
    ta.recycle()
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.