diff --git a/.gitignore b/.gitignore index 0c65a2d6..d342ae5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,11 @@ -/.gradle -/.idea -/build -*/build -/captures -/.cxx -*/.cxx -/.externalNativeBuild - -._* -*.iml -.DS_Store +.gradle +.idea +.cxx +.externalNativeBuild +build +captures + +._* +*.iml +.DS_Store local.properties \ No newline at end of file diff --git a/AndroidProject.apk b/AndroidProject.apk index e0ba28f1..5f163a78 100644 Binary files a/AndroidProject.apk and b/AndroidProject.apk differ diff --git a/HelpDoc.md b/HelpDoc.md index 7da90484..f6d9b40d 100644 --- a/HelpDoc.md +++ b/HelpDoc.md @@ -44,13 +44,13 @@ * [为什么没有关于列表多 type 的封装](#为什么没有关于列表多-type-的封装) -* [为什么没有用 Dagger 框架](#为什么没有用-dagger-框架) - * [这不就是一个模板工程换成我也能写一个](#这不就是一个模板工程换成我也能写一个) -* [轮子哥你怎么看待层出不穷的新技术](#轮子哥你怎么看待层出不穷的新技术) +* [假设 AndroidProject 更新了该怎么升级它](#假设-androidproject-更新了该怎么升级它) -* [为什么没有集成界面侧滑功能](#为什么没有集成界面侧滑功能) +* [为什么不用谷歌 ActivityResultContracts](#为什么不用谷歌-activityresultcontracts) + +* [轮子哥你怎么看待层出不穷的新技术](#轮子哥你怎么看待层出不穷的新技术) #### 为什么没有用 MVP @@ -68,7 +68,7 @@ * ButterKnife 最大的缺点是还会自动生成 ViewBinding 类,就算在类中只使用了一个 BindView,它也会生成这个类,其实这样是不太好的。 -* 另外一个点,将 Android Studio 升级到 4.1 之后,会出现以下提示,这个是因为 Gradle 插件在 5.0 之后的版本中,View ID 将不会以常量的形式存在,所以不能将其定义在 `BindView` 注解或者在 `switch case` 块中。 +* 另外一个点,将 Android Studio 升级到 4.1 之后,会出现以下提示,这个是因为 Gradle 在 5.0 之后的版本,View ID 将不会以常量的形式存在,所以不能将其定义在 `BindView` 注解或者在 `switch case` 块中。 ```text Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as annotation @@ -126,29 +126,31 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 关于屏幕适配方案,其实不能说头条的方案就是最好的,其实谷歌已经针对屏幕适配做了处理,就是 dp 和 sp ,而 dp 的计算转换是由屏幕的像素决定,系统只认 px 单位, dp 需要进行转换,比如 1dp 等于几个 px ,这个时候就需要基数进行转换,比如 1dp = 2px,这个基数就是 2。 - * ldpi:1dp=0.75px - - * mdpi:1dp=1px - - * hdpi:1dp=1.5px - - * xhdpi:1dp=2px - - * xxhdpi:1dp=3px - - * xxxhdpi:1dp=4px +```text +ldpi:1dp=0.75px + +mdpi:1dp=1px + +hdpi:1dp=1.5px + +xhdpi:1dp=2px + +xxhdpi:1dp=3px + +xxxhdpi:1dp=4px +``` * 这个是谷歌对屏幕适配的一种默认方式,厂商也可以根据需要去修改默认的基数,从而达到最优的显示效果。 -* 谷歌的屏幕适配方案也不是百分之一百完美的,其实会存在一些需求不能满足的问题。谷歌的设计理念是屏幕越大显示的东西越多,这种想法并没有错,但有些 APP 可能对这块会有要求,希望根据屏幕大小对控件进行百分比压缩。这个时候谷歌那套适配方案的设计已经和需求完全不一致了。 +* 谷歌的屏幕适配方案也不是百分之一百完美的,其实会存在一些需求不能满足的问题。谷歌的设计理念是屏幕越大显示的东西越多,这种想法并没有错,但有些 App 可能对这块会有要求,希望根据屏幕大小对控件进行百分比压缩。这个时候谷歌那套适配方案的设计已经和需求完全不一致了。 -* 那什么样的 App 才会有那样的需求呢?现在手机的屏幕大多在 5 - 6寸,而平板大多在 8 - 10 寸,也就是说我们只适配手机的话,只需要针对 5 - 6 寸的,并且它们的分辨率都差不多,其实用谷歌那种方案是最优的,如果我们需要适配平板的话,一般都会要求对控件进行百分比压缩,这个时候谷歌那套方案会把原先在手机显示的控件在平板上面变大一点,这样就会导致屏幕剩余的空间过大,导致控件显示出来的效果比较小,而如果采用百分比对控件压缩的方式,能比较好地控制 APP 在不同屏幕下显示的效果。 +* 那什么样的 App 才会有那样的需求呢?现在手机的屏幕大多在 5 - 6寸,而平板大多在 8 - 10 寸,也就是说我们只适配手机的话,只需要针对 5 - 6 寸的,并且它们的分辨率都差不多,其实用谷歌那种方案是最优的,如果我们需要适配平板的话,一般都会要求对控件进行百分比压缩,这个时候谷歌那套方案会把原先在手机显示的控件在平板上面变大一点,这样就会导致屏幕剩余的空间过大,导致控件显示出来的效果比较小,而如果采用百分比对控件压缩的方式,能比较好地控制 App 在不同屏幕下显示的效果。 -* 另外谈谈我的经历,我自己之前的公司主要是做平板上面的应用,所以也用过 [AutoSize 框架](https://github.com/JessYanCoding/AndroidAutoSize),一年多的使用体验下来,发现这个框架 Bug 还算是比较多的,例如框架会偶尔出现机型适配失效,重写了 **getResources** 方法情况之后出现的情况少了一些,但是仍然还有一些奇奇怪怪的问题,这里就不一一举例了,最后总结下来就是框架还不够成熟,但是框架的思想还是很不错的。我后面换了一家公司,也是做平板应用,项目用的是用[通配符的适配方案](https://github.com/wildma/ScreenAdaptation),跟 AutoSize 相对比,没有了那些奇奇怪怪的问题,但是对项目的侵入性高。这两种方案各有优缺点,大家看着选择。 +* 另外谈谈我的经历,我自己之前的公司主要是做平板上面的应用,所以也用过 [AutoSize 框架](https://github.com/JessYanCoding/AndroidAutoSize),一年多的使用体验下来,发现这个框架 Bug 还算是比较多的,例如框架会偶尔出现机型适配失效,重写了 **getResources** 方法情况之后出现的情况少了一些,但是仍然还有一些奇奇怪怪的问题,这里就不一一举例了,最后总结下来就是框架还不够成熟,但是框架的思想还是很不错的。我后面换了一家公司,也是做平板应用,项目用的是用[通配符的适配方案](https://github.com/wildma/ScreenAdaptation),跟 AutoSize 相对比,没有了那些奇奇怪怪的问题,但是代码的侵入性比较高。这两种方案各有优缺点,大家看着选择。 -* 最后我对屏幕适配方案进行了总结,如果我们不适配平板的情况下,使用谷歌原生那套方案的效果是最优的;如果需要适配平板,并且在要求手机和平板显示的效果一致的时候,可以换成百分比那种适配方案。 +![](picture/help/vote2.jpg) -* 这个是我认为比较好的方式,手机和平板的应用我也都做过,尽管这样我说得也不一定是最好的,大家如果有更好的想法也欢迎和我交流。 +* 在这块我也发起过群投票,相比谷歌的适配方案,大多数人更认同那种百分比适配方案,秉承着少数服从多数的理念,我在 AndroidProject [v13.0 版本](https://github.com/getActivity/AndroidProject/releases/tag/13.0) 加入了通配符的适配方案。虽然有一部分人不认同,但是我想跟这些人说的是:我的每一个决定都是十分谨慎的,因为这其中涉及到许多人的利益,AndroidProject 虽然是我创造的,但是它早就不是我一个人的了,而是大家的,每个重要的决定我都会考虑再三才会去做,在做决定的时候我会把大众的利益放在第一位,把自己的利益放在最后一位,所以大家唯一能做的是,相信我的选择。或许你可能觉得这样不太对,也随时欢迎你提出不同的意见给到我,我不认为自己做的决定一定都是对的,但是我会一直朝着对的方向前进。 #### 字体大小为什么不用 dp 而用 sp @@ -160,14 +162,14 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti #### 为什么没有用 DialogFragment 来防止内存泄漏 -* DialogFragment 的出现就是为了解决 Dialog 和 Activity 生命周期不同步导致的内存泄漏问题,在 AndroidProject 曾经引入过,也经过了很多个版本的更新迭代,不过在 [10.0](https://github.com/getActivity/AndroidProject/releases/tag/10.0) 版本后就被移除了,原因是 Dialog 虽然有坑,但是 DialogFragment 也有坑,可以说解决了一个问题又引发了各种问题。先来细数 我在 DialogFragment 上踩过的各种坑: +* DialogFragment 的出现就是为了解决 Dialog 和 Activity 生命周期不同步导致的内存泄漏问题,在 AndroidProject 曾经引入过,也经过了很多个版本的更新迭代,不过在 [10.0](https://github.com/getActivity/AndroidProject/releases/tag/10.0) 版本后就被移除了,原因是 Dialog 虽然有坑,但是 DialogFragment 也有坑,可以说解决了一个问题又引发了各种问题。先来细数我在 DialogFragment 上踩过的各种坑: 1. DialogFragment 会占用 Dialog 的 Cancel 和 Dismiss 监听,为了就是在 Dialog 消失之后将自己(Fragment)从 Activity 上移除,这样的操作看起很合理,但是会引发一个问题,那么就是会导致我们原先给 Dialog 设置的 Cancel 和 Dismiss 监听被覆盖掉,间接导致我们无法使用这个监听,因为 Dialog 的监听器只能有一个观察者,而 AndroidProject 前期解决这个问题的方式是:将 Dialog 的监听器使用的观察者模式,从一对一改造成一对多,也就是一个被观察者可以有很多个观察者,由此来解决这个问题。 2. DialogFragment 的显示和隐藏操作都不能在后台中进行,否则会出现一个报错 `java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState`,这个是因为 DialogFragment 的 show 和 dismiss 方法使用了 FragmentTransaction.commit 方法,这个 commit 方法会触发对 Activity 状态的检查,如果 Activity 的状态已经保存了(即已经调用了 onSaveInstanceState 方法),这个时候把 Fragment commit 到 Activity 上会抛出异常,这种场景在执行异步操作(例如请求网络)未结束前,用户手动将 App 返回到桌面,然后异步操作执行完毕,下一步就是回调异步监听器,这个时候我们的 App 已经处于后台状态,那么我们如果在监听回调中 show 或 dismiss DialogFragment,那么就会触发这个异常。AndroidProject 前期对于这个问题的解决方案是重写 DialogFragment.show 方法,加一个对 Activity 的状态判断,如果 Activity 处于后台状态,那么不去调用 super.show(),但是这样会导致一个问题,虽然解决了崩溃的问题,但是又会导致 Dialog 没显示出来,而重写 DialogFragment.dismiss 方法,直接调用 dismissAllowingStateLoss 方法,因为这个方法不会去检查 Activity 的状态。虽然这种解决方式不够完美,但却是我那个时候能想到的最好方法。 - + 3. 最后一个问题是关于 DialogFragment 屏幕旋转的问题,首先 DialogFragment 是通过自身 onCreateDialog 方法来获取 Dialog 对象的,但是如果我们直接通过外层给 DialogFragment 传入 Dialog 的对象时,这样的代码逻辑貌似没有问题,但是在用户进行屏幕旋转,而刚好我们的应用没有固定屏幕方向时,DialogFragment 对象会跟随 Activity 销毁重建,因为它本身就是一个 Fragment,但是会导致之前的外层传入 Dialog 对象被回收并置空,然后再调用到 onCreateDialog 方法时,返回的是一个空对象的 Dialog,那么就会直接 DialogFragment 内部引发空指针异常,而 AndroidProject 前期解决这个问题的方案是,重写 onActivityCreated,赶在 onCreateDialog 方法调用之前,先判断 DialogFragment 对象内部持有的 Dialog 是否为空,如果是一个空对象,那么就将自己 dismissAllowingStateLoss 掉。 - + * 看过这些问题,你是不是和我一样,感觉这 DialogFragment 不是一般的坑,不过最终我放弃了使用 DialogFragment,并不是因为 DialogFragment 又出现了新问题,而是我想到了更好的方案来代替 DialogFragment,方案就是 Application.registerActivityLifecycleCallbacks,想必大家现在已经猜到我想干啥,和 DialogFragment 的作用一样,通过监听 Activity 的方式来管控 Dialog 的生命周期,但唯一不同的是,它不会出现刚刚说过 DialogFragment 的那些问题,这种方式在 AndroidProject 上迭代了几个版本过后,这期间没有发现新的问题,也没有收到别人反馈过这块的问题,证明这种方式是可行的。 #### 为什么没有用腾讯 X5 WebView @@ -185,11 +187,11 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 这个问题在前几年是一个比较火热的话题,我表示很能理解,因为新鲜的事物总是能勾起人的好奇,让人忍不住试一试,但是我先问大家一个问题,单 Activity 多 Fragment 和写多个 Activity 有什么优点?大家第一个反应应该是每写一个页面都不需要在清单文件中注册了,但是这个真的是优点吗?我可以很明确地告诉大家,我已经写了那么多句代码,不差那句在清单文件注册的代码。那么究竟什么才是对我们有价值的?我觉得就两点,一是减少前期开发的工作量,二是降低后续维护的难度。所以省那一两句有前途吗?我们是差那一两句代码的人吗?如果这种模式能够帮助我们写好代码,这个当然是有价值的,非常值得一试的,否则就是纯属瞎扯淡。不仅如此,我个人觉得这种模式有很大的弊端,会引发很多问题,例如: 1. 有的页面是全屏有的页面是非全屏,有的页面是固定竖屏有的页面是横屏,进入时怎么切换?返回时怎么切换回来?然后又该怎么去做统一的封装? - + 2. 不同 Fragment 之间应该怎样通讯?Activity 有 onActivityResult 方法可以用,但是 Fragment 有什么方法可以用?还是全用 EventBus 来处理?如果是这样做会不会太低效了?每次都要写一个 Event 类,并且在代码中找起来是不是也不太好找? - + 3. 如何保证这个 Activity 被系统回收之后,然后引发重建操作,又该如何保证这个 Activity 中的多个 Fragment 之间的回退栈是否正常?假设这个 Activity 里面有 10 个Fragment,一下子引发 10 个 Fragment 创建是否会对内存和性能造成影响呢? - + * 如果单 Activity 多 Fragment 不能为我们创造太大的价值时,这种模式根本就不值得我们去做,因为我们最终得到的,永远抵不上付出的。 #### 为什么没有用 ConstraintLayout 来写布局 @@ -197,7 +199,7 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 大家如果有仔细观察的话,会发现 AndroidProject 其实没有用到 ConstraintLayout 布局,在这里谈谈我对这个布局的看法,约束布局有一个优点,没有布局嵌套,所以能减少测量次数,从而提升布局绘制的速度,但是优点也是它的缺点,正是因为没有布局嵌套,View 也就没有层级概念,所以它需要定义很多 ViewID 来约束相邻的 View 的位置,就算这个 View 我们在 Java 代码中没有用到,但是在约束布局中还是要定义。这样带来的弊端有几个: 1. 我们每次都要想好这个 ViewID 的名称叫什么,这个就有点烧脑筋了,既要符合代码规范,也要明确和突出其作用。 - + 2. 要考虑好每个 View 上下左右之间的约束关系,否则就会容易出现越界的情况,例如一个 TextView 设计图上有 5 个字,但是后台返回了 10 个字,这个时候 TextView 的控件宽度会被拉长,如果没有设置好右边的约束,极有可能出现遮盖右边 View 的情况。 3. View 之间的关系会变得复杂起来,具体表现为布局一旦发生变更,例如删除或增加某一个 View,都会影响整个 ConstraintLayout 布局,因为很多约束关系会因此发生改变,并且在布局预览中就会变得错乱起来,简单通俗点来讲就是,你拆了一块瓦,很可能会导致房倒屋塌。 @@ -213,9 +215,9 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * AndroidProject 其实一直有这样做,把很多组件都拆成了独立的框架,例如:权限请求框架 [XXPermissions](https://github.com/getActivity/XXPermissions),网络请求框架 [EasyHttp](https://github.com/getActivity/EasyHttp)、吐司框架 [ToastUtils](https://github.com/getActivity/ToastUtils) 等等,我都是将它抽离在 AndroidProject 之外,作为一个单独的开源项目进行开发和维护,至于说为什么还有一些代码没有抽取出来,主要原因有几点: 1. 和业务的耦合性高,例如 Dialog 组件引用了很多项目的基类,例如 **BaseDialog**、**BaseAdapter** 等 - + 2. 业务有定制化需求,因为 Dialog 的 UI 风格要跟随项目的设计走,所以代码如果在项目中,修改起来会非常方便,如果抽取到框架中,要怎么修改和统一 UI 风格呢?我个人认为框架不适合做 UI 定制化,因为每个产品的设计风格都不一样,就算开放再多的 API 给外部调用的人设置 UI 风格,也无法满足所有人的需求。 - + * 基于以上几点,我并不认为所有的东西都适合抽取成框架给大家用,有些东西还是跟随 **AndroidProject** 一起更新比较好。当然像权限请求这种东西,我个人觉得抽成框架是比较合适的,因为它和业务的关联性不大,更重要的是,如果某一天你觉得 **XXPermissions** 做得不够好,你随时可以在 **AndroidProject** 替换掉它,并且整个过程不需要太大的改动。 #### 为什么最低兼容到 Android 5 @@ -237,7 +239,7 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 我想问大家一个问题,这两个框架搭配起来好用吗?可能大家的回答都不一致,但是我个人觉得不好用,接下来让我们分析一下 Retrofit 有什么问题: 1. 功能太少:如果你用过 Retrofit,一说到功能这个词,我相信你的脑海中第一个想到能不能用 OkHttp 的拦截器来实现,没错常用的功能 Retrofit 都没有封装,例如最常用的功能有:添加通用请求头和参数、请求和响应的日志打印、动态 Host 及多域名配置,Retrofit 统统都没有,需要自己去实现。有时候我在想,如果 Retrofit 没有 **Square 公司背书**,现在应该估计不会有多少人用吧。 - + 2. 不够灵活:Retrofit 其实是支持上传的,但是有一个缺点,不能获取进度监听,只能获取到成功和失败。当然网上也有一些解决方案,例如通过设置拦截器,来对 RequestBody 进行二次包装来获取上传进度,但是整个实现的过程十分地麻烦,在 Retrofit 上也没有给出一个好的方案,明明可以由 Retrofit 来做的事,为什么要分发到每个开发者上面。 3. 学习成本高:Retrofit 主要的学习成本来源于它的注解,我现在把它里面所有注解罗列出来:@Url、@Body、@Field、@FieldMap、@FormUrlEncoded、@Header、@HeaderMap、@Headers、@HTTP、@Multipart、@Part、@PartMap、@Path、@Query、@QueryMap、@QueryName、@Streaming。我们了解过多少个注解的作用?这个时候大多数人肯定会说,我都是按照别人的写法复制一遍,具体有什么作用我还真的不知道。其实这个是学习成本高带来的弊端,人们往往只会记住最常用的那几个。 @@ -260,7 +262,7 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 常用的图片加载框架无非就两种,最常用的是 Glide,其次是 Fresco。我曾做过一个技术调研: -![](picture/help/image.jpg) +![](picture/help/vote1.jpg) * 无疑 Glide 已成大家最喜爱的图片加载框架,当然也有人使用 Fresco,但是占比极少。 @@ -280,10 +282,6 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 原生的 RecyclerView.Adapter 本身就支持多 type,只需要重写适配器的 getItemType 方法即可,具体用法不做过多介绍。 -#### 为什么没有用 Dagger 框架 - -* 框架的学习和使用成本极高,但总体收益不高,不适用于大部分人,所以不会考虑加入。 - #### 这不就是一个模板工程换成我也能写一个 * 想把 AndroidProject 做出来并不难,我当时只花了一两个星期,而做好它需要无限的时间和精力,我花了两年多的时间仍然还在半路之上,尽管有很多人认为它很好用,没有任何 Bug,但是在我看来还不够,因为每个人衡量标准的程度不同,我的标准是随着时间的推移和技术的提升而不断提高。具体付出了多少努力,[可以先让我们看一组数据](https://github.com/getActivity/AndroidProject/graphs/contributors): @@ -292,9 +290,108 @@ ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.acti * 与其说 AndroidProject 做的是模板工程,但实际我在架构设计上花费的时间和精力会更多,其实这两者我都有在做,因为我的目的只有一个,能够帮助大家更好地开发和维护项目。具体 AndroidProject 在代码设计上有什么亮点,这里我建议你看一下里面的代码,我相信你看完后会有收获的,后面我可能也会出一篇文章具体讲述 AndroidProject 的亮点。 +#### 假设 AndroidProject 更新了该怎么升级它 + +* 原因和解释:首先纠正一点,AndroidProject 严格意义上来说,不是框架一种,而属于架构一种,架构升级本身就是一件大事,并且存在很多未知的风险点,我不推荐已使用 AndroidProject 开发的项目去做升级,因为开发和测试的成本极其高,间接能为业务带来价值其实很低,很多时候我知道大家很喜欢 AndroidProject 的代码,想用到公司项目中去,但是我仍然不推荐你那么做,假设这是你的个人项目可以那么做,但是公司项目最好不要,因为公司和你都是要靠这个项目赚钱,谁也不希望项目出现问题,如果是公司要开发人员重构公司项目,也可以考虑那么做,毕竟这个时候的风险公司已经承担了大部分了,接下来的话只需要服从公司安排即可。 + +* 更新的方式:由于 AndroidProject 不是一个单独的框架那么简单,无法通过更新远程依赖的方式进行升级,所以只能通过替换代码的形式进行更新,需要注意的是,代码覆盖完需要经过严格的自测及测试,测试是做这件事情的关键流程,需要重视起来,对每一处功能进行详细测试,一定要详细,特别涉及到主流程的功能。 + +#### 为什么不用谷歌 ActivityResultContracts + +* ActivityResultContract是 Activity 1.2.0-alpha02 和 Fragment 1.3.0-alpha02 中新追加的新 API,但是在此之前 AndroidProject 早已经对 onActivityResult 回调进行了封装,详情请见 BaseActivity + +```java +public abstract class BaseActivity extends AppCompatActivity { + + /** Activity 回调集合 */ + private SparseArray mActivityCallbacks; + + /** + * startActivityForResult 方法优化 + */ + + public void startActivityForResult(Class clazz, OnActivityCallback callback) { + startActivityForResult(new Intent(this, clazz), null, callback); + } + + public void startActivityForResult(Intent intent, OnActivityCallback callback) { + startActivityForResult(intent, null, callback); + } + + public void startActivityForResult(Intent intent, @Nullable Bundle options, OnActivityCallback callback) { + if (mActivityCallbacks == null) { + mActivityCallbacks = new SparseArray<>(1); + } + // 请求码必须在 2 的 16 次方以内 + int requestCode = new Random().nextInt((int) Math.pow(2, 16)); + mActivityCallbacks.put(requestCode, callback); + startActivityForResult(intent, requestCode, options); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + OnActivityCallback callback; + if (mActivityCallbacks != null && (callback = mActivityCallbacks.get(requestCode)) != null) { + callback.onActivityResult(resultCode, data); + mActivityCallbacks.remove(requestCode); + return; + } + super.onActivityResult(requestCode, resultCode, data); + } + + public interface OnActivityCallback { + + /** + * 结果回调 + * + * @param resultCode 结果码 + * @param data 数据 + */ + void onActivityResult(int resultCode, @Nullable Intent data); + } +} +``` + +* 至于要不要换成谷歌出的那种呢?我们先来对比这两种的方式的用法 + +```java +// Google 的用法 +registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { + @Override + public void onActivityResult(ActivityResult result) { + Intent data = result.getData(); + int resultCode = result.getResultCode(); + } +}).launch(new Intent(this, HomeActivity.class)); +``` + +--- + +```java +// AndroidProject 的用法 +startActivityForResult(HomeActivity.class, new OnActivityCallback() { + @Override + public void onActivityResult(int resultCode, @Nullable Intent data) { + + } +}); +``` + +* 对这两种经过对比,得出结论如下: + + 1. 谷歌原生的没有 AndroidProject 封装得那么人性化,谷歌那种方式调用稍微麻烦一点 + + 2. 谷歌那种方式直接集成进 AndroidX 包的,要比直接在 BaseActivity 中封装要好 + + 3. AndroidProject 封装 onActivityResult 回调至少要比谷歌要早一两年,并非谷歌之后的产物 + + 4. 之前使用 AndroidProject 的人群已经习惯和记忆了那种方式,所以 API 不能删也不能改 + +* 所以并不是我不想用,而是谷歌封装得还不够好,至少在我看来还不够好,抛去 AndroidProject 封装的时间早不说,谷歌封装出来的效果也是强差人意,我感觉谷歌工程师的封装得越来越敷衍了,看起来像是在完成任务,而不是在做好一件事。 + #### 轮子哥你怎么看待层出不穷的新技术 -* 新东西的出现总能引起别人的好奇和尝试,但是我建议有兴趣的人可以学一下,但是如果要应用到项目中,我个人建议还是慎重,因为纵观历史,我们不难发现,技术创新虽然很受欢迎,但是大多数都经不住时间的考验,最终一个个气尽倒下,这是因为很多新技术,表面看起来很美好,但实际上一入坑深似海。当然也有一些优秀的技术创新活了下来,但是毕竟占的是少数。 +* 新东西的出现总能引起别人的好奇和尝试,但是我建议有兴趣的人可以学一下,但是如果要应用到项目中,我个人建议还是要慎重,因为纵观历史,我们不难发现,技术创新虽然很受欢迎,但是大多数都经不住时间的考验,最终一个个气尽倒下,这是因为很多新技术,表面看起来很美好,但实际上一入坑深似海。当然也有一些优秀的技术创新活了下来,但是毕竟占的是少数。 * 谈谈我对新技术的看法,首先我会思考这种新技术能解决什么痛点,这点非常重要,再好的技术创新,也必须得创造价值,否则就是在扯淡。有人肯定会问,什么样的技术才算有价值?对于我们 Android 程序员来讲,无非就围绕两点,开发和维护。要么在前期开发上,能发挥很大的作用,要么在后续维护上面,能体现它的优势。 diff --git a/LICENSE b/LICENSE index dc141f96..4b7bce0a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ Apache License - Version 2.0, January 2004 + Version 2.0, October 2018 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION diff --git a/README.md b/README.md index f3133942..96e1ed0e 100644 --- a/README.md +++ b/README.md @@ -1,141 +1,149 @@ -# 安卓技术中台 - -* 码云地址:[Gitee](https://gitee.com/getActivity/AndroidProject) - -* Kotlin 版本:[AndroidProject-Kotlin](https://github.com/getActivity/AndroidProject-Kotlin) - -* 博客地址:[但愿人长久,搬砖不再有](https://www.jianshu.com/p/77dd326f21dc) - -* 当我们日复一日年复一年的搬砖的时候,你是否曾想过提升一下开发效率,如果一个通用的架构摆在你的面前,你还会选择自己搭架构么,但是搭建出一个好的架构并非易事,有多少人愿意选择去做,还有多少人选择努力去做好,可能寥寥无几,但是你今天看到的,正是你所想要的,一个真正能解决你开发新项目时最大痛点的架构工程,你不需要再麻木 Copy 原有旧项目的代码,只需改动少量代码就能得到想要的效果,你会发现开发新项目其实是一件很快乐的事。 - -* AndroidProject 已维护两年多的时间,几乎耗尽我所有的业余时间,里面的代码改了再改,改了又改,不断 Review、不断创新、不断改进、不断测试、不断优化,每天都在重复这些枯燥的步骤,但是只有这样才能把这件事做好,因为我相信把同样一件事重复做,迟早有一天可以做好。 - -* 已经正式投入到多个公司项目实践中,暂时没有发现任何问题或者 Bug,[点击下载 Apk 体验](AndroidProject.apk),又或者扫码下载 - -![](picture/demo_code.png) - -#### 常用界面 - -![](picture/activity/1.jpg) ![](picture/activity/2.jpg) ![](picture/activity/3.jpg) - -![](picture/activity/4.jpg) ![](picture/activity/5.jpg) ![](picture/activity/6.jpg) - -![](picture/activity/7.jpg) ![](picture/activity/8.jpg) ![](picture/activity/9.jpg) - -![](picture/activity/10.jpg) ![](picture/activity/11.jpg) ![](picture/activity/12.jpg) - -![](picture/activity/13.jpg) ![](picture/activity/14.jpg) ![](picture/activity/15.jpg) - -![](picture/activity/16.jpg) ![](picture/activity/17.jpg) ![](picture/activity/18.jpg) - -![](picture/activity/19.jpg) ![](picture/activity/20.jpg) ![](picture/activity/21.jpg) - -![](picture/activity/22.jpg) ![](picture/activity/23.jpg) ![](picture/activity/24.jpg) - -![](picture/activity/25.jpg) ![](picture/activity/26.jpg) ![](picture/activity/27.jpg) - -![](picture/activity/28.jpg) ![](picture/activity/29.jpg) - ------- - -![](picture/activity/30.jpg) - -![](picture/activity/31.jpg) - -![](picture/activity/32.jpg) - -![](picture/activity/33.jpg) - -![](picture/activity/34.jpg) - -![](picture/activity/35.jpg) - -![](picture/activity/36.jpg) - -![](picture/activity/37.jpg) - -#### 常用对话框 - -![](picture/dialog/1.jpg) ![](picture/dialog/2.jpg) ![](picture/dialog/3.jpg) - -![](picture/dialog/4.jpg) ![](picture/dialog/5.jpg) ![](picture/dialog/6.jpg) - -![](picture/dialog/7.jpg) ![](picture/dialog/8.jpg) ![](picture/dialog/9.jpg) - -![](picture/dialog/10.jpg) ![](picture/dialog/11.jpg) ![](picture/dialog/12.jpg) - -![](picture/dialog/13.jpg) ![](picture/dialog/14.jpg) ![](picture/dialog/15.jpg) - -![](picture/dialog/16.jpg) ![](picture/dialog/17.jpg) ![](picture/dialog/18.jpg) - -#### 动图欣赏 - -![](picture/gif/1.gif) ![](picture/gif/2.gif) ![](picture/gif/3.gif) - -![](picture/gif/4.gif) ![](picture/gif/5.gif) ![](picture/gif/6.gif) - -#### 项目亮点 - -* App 优化:已经进行了全面的内存优化、布局优化、代码优化、瘦身优化,并且对结果进行了严格的长久测试。 - -* 代码规范:参照 Android SDK 、Support 源码和参考阿里巴巴的代码规范文档对代码进行命名,并对难点代码进行了注释,对重点代码进行了说明。 - -* 代码统一:对项目中常见的代码进行了封装,或是封装到基类中、或是封装到工具类中、或者封装到框架中,不追求过度封装,根据实际场景和代码维护性考虑,尽量保证同一个功能的代码在项目中不重复。 - -* 敏捷开发:一个 App 大概率会出现的功能已经写好,对项目的敏捷开发起到了至关重要的作用,可用于新项目开发或者旧项目重构,可将开发周期缩短近一半的时间,并且后续不会因为前期的快速开发而留下成堆的技术遗留问题,万丈高楼平地起,AndroidProject 属于基建工程,而在软件行业我们称之为技术中台。 - -* 无任何瑕疵:对小屏手机、全面屏手机、带虚拟按键手机进行了适配和优化,确保每一个界面细节都能处理到位、每一个功能细节都能符合大众的需求、乃至每一行代码都能贴合 Android 程序员的审美观。 - +# 安卓技术中台 + +* 项目地址:[Github](https://github.com/getActivity/AndroidProject)、[码云](https://gitee.com/getActivity/AndroidProject) + +* Kotlin 版本:[AndroidProject-Kotlin](https://github.com/getActivity/AndroidProject-Kotlin) + +* 博客地址:[但愿人长久,搬砖不再有](https://www.jianshu.com/p/77dd326f21dc) + +* 当我们日复一日年复一年的搬砖的时候,你是否曾想过提升一下开发效率,如果一个通用的架构摆在你的面前,你还会选择自己搭架构么,但是搭建出一个好的架构并非易事,有多少人愿意选择去做,还有多少人选择努力去做好,可能寥寥无几,但是你今天看到的,正是你所想要的,一个真正能解决你开发新项目时最大痛点的架构工程,你不需要再麻木 Copy 原有旧项目的代码,只需改动少量代码就能得到想要的效果,你会发现开发新项目其实是一件很快乐的事。 + +* AndroidProject 已维护三年多的时间,几乎耗尽我所有的业余时间,里面的代码改了再改,改了又改,不断 Review、不断创新、不断改进、不断测试、不断优化,每天都在重复这些枯燥的步骤,但是只有这样才能把这件事做好,因为我相信把同样一件事重复做,迟早有一天可以做好。 + +* 已经正式投入到多个公司项目实践中,暂时没有发现任何问题或者 Bug,[点击下载 Apk 体验](AndroidProject.apk),又或者扫码下载 + +![](picture/demo_code.png) + +#### 常用界面 + +![](picture/activity/1.jpg) ![](picture/activity/2.jpg) ![](picture/activity/3.jpg) + +![](picture/activity/4.jpg) ![](picture/activity/5.jpg) ![](picture/activity/6.jpg) + +![](picture/activity/7.jpg) ![](picture/activity/8.jpg) ![](picture/activity/9.jpg) + +![](picture/activity/10.jpg) ![](picture/activity/11.jpg) ![](picture/activity/12.jpg) + +![](picture/activity/13.jpg) ![](picture/activity/14.jpg) ![](picture/activity/15.jpg) + +![](picture/activity/16.jpg) ![](picture/activity/17.jpg) ![](picture/activity/18.jpg) + +![](picture/activity/19.jpg) ![](picture/activity/20.jpg) ![](picture/activity/21.jpg) + +![](picture/activity/22.jpg) ![](picture/activity/23.jpg) ![](picture/activity/24.jpg) + +![](picture/activity/25.jpg) ![](picture/activity/26.jpg) ![](picture/activity/27.jpg) + +------ + +![](picture/activity/28.jpg) + +![](picture/activity/29.jpg) + +![](picture/activity/30.jpg) + +![](picture/activity/31.jpg) + +![](picture/activity/32.jpg) + +![](picture/activity/33.jpg) + +![](picture/activity/34.jpg) + +![](picture/activity/35.jpg) + +![](picture/activity/36.jpg) + +#### 常用对话框 + +![](picture/dialog/1.jpg) ![](picture/dialog/2.jpg) ![](picture/dialog/3.jpg) + +![](picture/dialog/4.jpg) ![](picture/dialog/5.jpg) ![](picture/dialog/6.jpg) + +![](picture/dialog/7.jpg) ![](picture/dialog/8.jpg) ![](picture/dialog/9.jpg) + +![](picture/dialog/10.jpg) ![](picture/dialog/11.jpg) ![](picture/dialog/12.jpg) + +![](picture/dialog/13.jpg) ![](picture/dialog/14.jpg) ![](picture/dialog/15.jpg) + +![](picture/dialog/16.jpg) ![](picture/dialog/17.jpg) ![](picture/dialog/18.jpg) + +#### 动图欣赏 + +![](picture/gif/1.gif) ![](picture/gif/2.gif) ![](picture/gif/3.gif) + +![](picture/gif/4.gif) ![](picture/gif/5.gif) ![](picture/gif/6.gif) + +![](picture/gif/7.gif) ![](picture/gif/8.gif) ![](picture/gif/9.gif) + +![](picture/gif/10.gif) ![](picture/gif/11.gif) ![](picture/gif/12.gif) + +#### 项目亮点 + +* App 优化:已经进行了全面的内存优化、布局优化、代码优化、瘦身优化,并且对结果进行了严格的长久测试。 + +* 代码规范:参照 Android SDK 、Support 源码和参考阿里巴巴的代码规范文档对代码进行命名,并对难点代码进行了注释,对重点代码进行了说明。 + +* 代码统一:对项目中常见的代码进行了封装,或是封装到基类中、或是封装到工具类中、或者封装到框架中,不追求过度封装,根据实际场景和代码维护性考虑,尽量保证同一个功能的代码在项目中不重复。 + +* 敏捷开发:一个 App 大概率会出现的功能已经写好,对项目的敏捷开发起到了至关重要的作用,可用于新项目开发或者旧项目重构,可将开发周期缩短近一半的时间,并且后续不会因为前期的快速开发而留下成堆的技术遗留问题,万丈高楼平地起,AndroidProject 属于基建工程,而在软件行业我们称之为技术中台。 + +* 无任何瑕疵:对小屏手机、全面屏手机、带虚拟按键手机进行了适配和优化,确保每一个界面细节都能处理到位、每一个功能细节都能符合大众的需求、乃至每一行代码都能贴合 Android 程序员的审美观。 + * 兼容性优良:在此感谢开源道路上给予我支持和帮助的小伙伴,一个人一台机在兼容性面前无能为力,而在几百人几百台机面前却不是问题。如果没有这些的测试,有些问题我一个人可能这辈子都发现不了,纵使代码写得再好,逻辑再严谨,没有经过大众的验证,无异于纸上谈兵。 -#### [代码规范文档请点击这里查看](https://github.com/getActivity/AndroidCodeStandard) - -#### [常见问题解答请点击这里查看](HelpDoc.md) - -#### 作者的其他开源项目 - -* 网络框架:[EasyHttp](https://github.com/getActivity/EasyHttp) (已集成) - -* 权限框架:[XXPermissions](https://github.com/getActivity/XXPermissions) (已集成) - -* 吐司框架:[ToastUtils](https://github.com/getActivity/ToastUtils) (已集成) - -* 标题栏框架:[TitleBar](https://github.com/getActivity/TitleBar) (已集成) - -* Gson 解析容错:[GsonFactory](https://github.com/getActivity/GsonFactory) (已集成) - -* 悬浮窗框架:[XToast](https://github.com/getActivity/XToast) (未集成) - -* 国际化框架:[MultiLanguages](https://github.com/getActivity/MultiLanguages) (未集成) - -* 日志查看框架:[Logcat](https://github.com/getActivity/Logcat) (未集成) - +* 优秀的代码设计:AndroidProject 对 startActivityForResult 的设计进行了改良,使得可以直接在方法上传入监听对象,这样我们就不需要重写 onActivityResult 方法来拿到回调,另外原生的 startActivityForResult 还需要传 requestCode 参数,而 AndroidProject 会自动帮你生成这个 requestCode 码,并在 onActivityResult 进行判断,如果满足条件,那么就会回调外层传入的监听对象。然而这只是冰山一角,更多优秀的代码设计还需要你通过阅读 AndroidProject 源码的形式来发掘,在这里不再细说。 + +#### [代码规范文档请点击这里查看](https://github.com/getActivity/AndroidCodeStandard) + +#### [常见问题解答请点击这里查看](HelpDoc.md) + +#### 作者的其他开源项目 + +* 网络框架:[EasyHttp](https://github.com/getActivity/EasyHttp) (已集成) + +* 权限框架:[XXPermissions](https://github.com/getActivity/XXPermissions) (已集成) + +* 吐司框架:[ToastUtils](https://github.com/getActivity/ToastUtils) (已集成) + +* 标题栏框架:[TitleBar](https://github.com/getActivity/TitleBar) (已集成) + +* Gson 解析容错:[GsonFactory](https://github.com/getActivity/GsonFactory) (已集成) + +* Shape 框架:[ShapeView](https://github.com/getActivity/ShapeView) (已集成) + +* 悬浮窗框架:[XToast](https://github.com/getActivity/XToast) (未集成) + +* 国际化框架:[MultiLanguages](https://github.com/getActivity/MultiLanguages) (未集成) + +* 日志查看框架:[Logcat](https://github.com/getActivity/Logcat) (未集成) + #### 微信公众号:Android轮子哥 ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/official_ccount.png) -#### Android 技术分享 QQ 群:78797078 - -#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat: - -![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_ali.png) ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_wechat.png) - -#### [点击查看捐赠列表](https://github.com/getActivity/Donate) - -## License - -```text -Copyright 2018 Huang JinQun - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +#### Android 技术分享 QQ 群:78797078 + +#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat: + +![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_ali.png) ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_wechat.png) + +#### [点击查看捐赠列表](https://github.com/getActivity/Donate) + +## License + +```text +Copyright 2018 Huang JinQun + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1e2bb51b..3f6193b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,211 +1,216 @@ -apply plugin : 'com.android.application' -apply plugin : 'android-aspectjx' -apply from : '../config.gradle' - -// Android 代码规范文档:https://github.com/getActivity/AndroidCodeStandard -android { - - // 资源目录存放指引:https://developer.android.google.cn/guide/topics/resources/providing-resources - defaultConfig { - - // 无痛修改包名:https://www.jianshu.com/p/17327e191d2e - applicationId 'com.hjq.demo' - - // 仅保留中文语种的资源 - resConfigs 'zh' - - // 仅保留 xxhdpi 图片资源(目前主流分辨率 1920 * 1080) - resConfig 'xxhdpi' - - // 混淆配置 - proguardFiles 'proguard-sdk.pro', 'proguard-app.pro' - } - - // Apk 签名的那些事:https://www.jianshu.com/p/a1f8e5896aa2 - signingConfigs { - config { - storeFile file(StoreFile) - storePassword StorePassword - keyAlias KeyAlias - keyPassword KeyPassword - } - } - - buildTypes { - - debug { - // 给包名添加后缀 - applicationIdSuffix '.debug' - // 调试模式开关 - debuggable true - jniDebuggable true - // 压缩对齐开关 - zipAlignEnabled false - // 移除无用的资源 - shrinkResources false - // 代码混淆开关 - minifyEnabled false - // 签名信息配置 - signingConfig signingConfigs.config - // 日志打印开关 - buildConfigField('boolean', 'LOG_ENABLE', 'true') - // 测试包下的 BuglyId - buildConfigField('String', 'BUGLY_ID', '"请自行替换 Bugly 上面的 AppID"') - // 测试服务器的主机地址 - buildConfigField('String', 'HOST_URL', '"https://www.test.baidu.com/"') - // 设置清单占位符 - manifestPlaceholders = ['app_name' : '安卓技术中台 Debug 版'] - // 调试模式下只保留一种架构的 so 库,提升打包速度 - ndk { - abiFilters 'armeabi-v7a' - } - } - - preview.initWith(debug) - preview { - applicationIdSuffix '' - // 设置清单占位符 - manifestPlaceholders = ['app_name' : '安卓技术中台 Preview 版'] - } - - release { - // 调试模式开关 - debuggable false - jniDebuggable false - // 压缩对齐开关 - zipAlignEnabled true - // 移除无用的资源 - shrinkResources true - // 代码混淆开关 - minifyEnabled true - // 签名信息配置 - signingConfig signingConfigs.config - // 日志打印开关 - buildConfigField('boolean', 'LOG_ENABLE', 'false') - // 正式包下的 BuglyId - buildConfigField('String', 'BUGLY_ID', '"请自行替换 Bugly 上面的 AppID"') - // 正式服务器的主机地址 - buildConfigField('String', 'HOST_URL', '"https://www.baidu.com/"') - // 设置清单占位符 - manifestPlaceholders = ['app_name' : '@string/app_name'] - // 仅保留两种架构的 so 库,根据 Bugly 统计得出 - ndk { - // armeabi:万金油架构平台(占用率:0%) - // armeabi-v7a:曾经主流的架构平台(占用率:10%) - // arm64-v8a:目前主流架构平台(占用率:95%) - abiFilters 'armeabi-v7a', 'arm64-v8a' - } - } - } - - packagingOptions { - // 剔除这个包下的所有文件(不会移除签名信息) - exclude 'META-INF/*******' - } - - // AOP 配置(exclude 和 include 二选一) - aspectjx { - // 排除一些第三方库的包名(Gson、 LeakCanary 和 AOP 有冲突) - // exclude 'androidx', 'com.google', 'com.squareup', 'org.apache', 'com.alipay', 'com.taobao', 'versions.9' - // 只对以下包名做 AOP 处理 - include 'com.hjq.demo' - // 否则就会引发冲突,具体表现为: - // 编译不过去,报错:java.util.zip.ZipException:Cause: zip file is empty - // 编译能过去,但运行时报错:ClassNotFoundException: Didn't find class on path: DexPathList - } - - applicationVariants.all { variant -> - - // Apk 输出文件名配置 - variant.outputs.all { output -> - outputFileName = rootProject.getName() + '_v' + variant.versionName + '_' + variant.buildType.name - if (variant.buildType.name == buildTypes.release.getName()) { - outputFileName += '_' + new Date().format('MMdd') - } - outputFileName += '.apk' - } - } -} - -// api 与 implementation 的区别:https://www.jianshu.com/p/8962d6ba936e -dependencies { - // 基类封装 - implementation project(':base') - // 控件封装 - implementation project(':widget') - // 友盟封装 - implementation project(':umeng') - - // 权限请求框架:https://github.com/getActivity/XXPermissions - implementation 'com.hjq:xxpermissions:9.8' - - // 标题栏框架:https://github.com/getActivity/TitleBar - implementation 'com.hjq:titlebar:8.2' - - // 吐司框架:https://github.com/getActivity/ToastUtils - implementation 'com.hjq:toast:8.8' - - // 网络请求框架:https://github.com/getActivity/EasyHttp - implementation 'com.hjq:http:9.0' - // OkHttp 框架:https://github.com/square/okhttp - // noinspection GradleDependency - implementation 'com.squareup.okhttp3:okhttp:3.12.12' - - // Json 解析框架:https://github.com/google/gson - implementation 'com.google.code.gson:gson:2.8.6' - // Gson 解析容错:https://github.com/getActivity/GsonFactory - implementation 'com.hjq.gson:factory:3.0' - - // AOP 插件库:https://mvnrepository.com/artifact/org.aspectj/aspectjrt - implementation 'org.aspectj:aspectjrt:1.9.6' - - // 图片加载框架:https://github.com/bumptech/glide - // 官方使用文档:https://muyangmin.github.io/glide-docs-cn/ - implementation 'com.github.bumptech.glide:glide:4.12.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' - - // 沉浸式框架:https://github.com/gyf-dev/ImmersionBar - implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - - // 手势 ImageView:https://github.com/chrisbanes/PhotoView - implementation 'com.github.chrisbanes:PhotoView:2.3.0' - - // Bugly 异常捕捉:https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20190418140644 - implementation 'com.tencent.bugly:crashreport:3.3.3' - implementation 'com.tencent.bugly:nativecrashreport:3.7.700' - - // 动画解析库:https://github.com/airbnb/lottie-android - // 动画资源:https://lottiefiles.com、https://icons8.com/animated-icons - implementation 'com.airbnb.android:lottie:3.6.1' - - // 刷新框架:https://github.com/scwang90/SmartRefreshLayout - implementation 'com.scwang.smart:refresh-layout-kernel:2.0.3' - implementation 'com.scwang.smart:refresh-header-material:2.0.3' - - // 日志打印框架:https://github.com/JakeWharton/timber - implementation 'com.jakewharton.timber:timber:4.7.1' - - // 指示器框架:https://github.com/ongakuer/CircleIndicator - implementation 'me.relex:circleindicator:2.1.4' - - // 内存泄漏监测框架:https://github.com/square/leakcanary - // noinspection GradleDependency - debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5' - // noinspection GradleDependency - previewImplementation 'com.squareup.leakcanary:leakcanary-android:2.5' - - // 国际化:https://github.com/getActivity/MultiLanguages - // 悬浮窗:https://github.com/getActivity/XToast - // 日志输出:https://github.com/getActivity/Logcat - // 工具类:https://github.com/Blankj/AndroidUtilCode - // 轮播图:https://github.com/bingoogolapple/BGABanner-Android - // 二维码:https://github.com/bingoogolapple/BGAQRCode-Android - // 跑马灯:https://github.com/sunfusheng/MarqueeView - // 对象注解:https://www.jianshu.com/p/f1f888e4a35f - // 平板适配:https://github.com/JessYanCoding/AndroidAutoSize - // 图片压缩:https://github.com/Curzibn/Luban - // 对象存储:https://github.com/leavesC/DoKV - // 第三方支付:https://github.com/Cuieney/RxPay - // 多渠道打包:https://github.com/Meituan-Dianping/walle - // 设备唯一标识:http://msa-alliance.cn/col.jsp?id=120 +apply plugin : 'com.android.application' +apply plugin : 'android-aspectjx' +apply from : '../common.gradle' + +// Android 代码规范文档:https://github.com/getActivity/AndroidCodeStandard +android { + + // 资源目录存放指引:https://developer.android.google.cn/guide/topics/resources/providing-resources + defaultConfig { + + // 无痛修改包名:https://www.jianshu.com/p/17327e191d2e + applicationId 'com.hjq.demo' + + // 仅保留中文语种的资源 + resConfigs 'zh' + + // 仅保留 xxhdpi 图片资源(目前主流分辨率 1920 * 1080) + resConfigs 'xxhdpi' + + // 混淆配置 + proguardFiles 'proguard-sdk.pro', 'proguard-app.pro' + + // 日志打印开关 + buildConfigField('boolean', 'LOG_ENABLE', '' + LOG_ENABLE + '') + // 测试包下的 BuglyId + buildConfigField('String', 'BUGLY_ID', '"' + BUGLY_ID + '"') + // 测试服务器的主机地址 + buildConfigField('String', 'HOST_URL', '"' + HOST_URL + '"') + } + + // Apk 签名的那些事:https://www.jianshu.com/p/a1f8e5896aa2 + signingConfigs { + config { + storeFile file(StoreFile) + storePassword StorePassword + keyAlias KeyAlias + keyPassword KeyPassword + } + } + + // 构建配置:https://developer.android.google.cn/studio/build/build-variants + buildTypes { + + debug { + // 给包名添加后缀 + applicationIdSuffix '.debug' + // 调试模式开关 + debuggable true + jniDebuggable true + // 压缩对齐开关 + zipAlignEnabled false + // 移除无用的资源 + shrinkResources false + // 代码混淆开关 + minifyEnabled false + // 签名信息配置 + signingConfig signingConfigs.config + // 添加清单占位符 + addManifestPlaceholders([ + 'app_name' : '安卓技术中台 Debug 版' + ]) + // 调试模式下只保留一种架构的 so 库,提升打包速度 + ndk { + abiFilters 'armeabi-v7a' + } + } + + preview.initWith(debug) + preview { + applicationIdSuffix '' + // 添加清单占位符 + addManifestPlaceholders([ + 'app_name' : '安卓技术中台 Preview 版' + ]) + } + + release { + // 调试模式开关 + debuggable false + jniDebuggable false + // 压缩对齐开关 + zipAlignEnabled true + // 移除无用的资源 + shrinkResources true + // 代码混淆开关 + minifyEnabled true + // 签名信息配置 + signingConfig signingConfigs.config + // 添加清单占位符 + addManifestPlaceholders([ + 'app_name' : '@string/app_name' + ]) + // 仅保留两种架构的 so 库,根据 Bugly 统计得出 + ndk { + // armeabi:万金油架构平台(占用率:0%) + // armeabi-v7a:曾经主流的架构平台(占用率:10%) + // arm64-v8a:目前主流架构平台(占用率:95%) + abiFilters 'armeabi-v7a', 'arm64-v8a' + } + } + } + + packagingOptions { + // 剔除这个包下的所有文件(不会移除签名信息) + exclude 'META-INF/*******' + } + + // AOP 配置(exclude 和 include 二选一) + // 需要进行配置,否则就会引发冲突,具体表现为: + // 第一种:编译不过去,报错:java.util.zip.ZipException:Cause: zip file is empty + // 第二种:编译能过去,但运行时报错:ClassNotFoundException: Didn't find class on path: DexPathList + aspectjx { + // 排除一些第三方库的包名(Gson、 LeakCanary 和 AOP 有冲突) + // exclude 'androidx', 'com.google', 'com.squareup', 'org.apache', 'com.alipay', 'com.taobao', 'versions.9' + // 只对以下包名做 AOP 处理 + include android.defaultConfig.applicationId + } + + applicationVariants.all { variant -> + // apk 输出文件名配置 + variant.outputs.all { output -> + outputFileName = rootProject.getName() + '_v' + variant.versionName + '_' + variant.buildType.name + if (variant.buildType.name == buildTypes.release.getName()) { + outputFileName += '_' + new Date().format('MMdd') + } + outputFileName += '.apk' + } + } +} + +// 添加构建依赖项:https://developer.android.google.cn/studio/build/dependencies +// api 与 implementation 的区别:https://www.jianshu.com/p/8962d6ba936e +dependencies { + // 基类封装 + implementation project(':library:base') + // 控件封装 + implementation project(':library:widget') + // 友盟封装 + implementation project(':library:umeng') + + // 权限请求框架:https://github.com/getActivity/XXPermissions + implementation 'com.github.getActivity:XXPermissions:12.3' + + // 标题栏框架:https://github.com/getActivity/TitleBar + implementation 'com.github.getActivity:TitleBar:9.2' + + // 吐司框架:https://github.com/getActivity/ToastUtils + implementation 'com.github.getActivity:ToastUtils:9.5' + + // 网络请求框架:https://github.com/getActivity/EasyHttp + implementation 'com.github.getActivity:EasyHttp:10.2' + // OkHttp 框架:https://github.com/square/okhttp + // noinspection GradleDependency + implementation 'com.squareup.okhttp3:okhttp:3.12.13' + + // Json 解析框架:https://github.com/google/gson + implementation 'com.google.code.gson:gson:2.8.8' + // Gson 解析容错:https://github.com/getActivity/GsonFactory + implementation 'com.github.getActivity:GsonFactory:5.2' + + // Shape 框架:https://github.com/getActivity/ShapeView + implementation 'com.github.getActivity:ShapeView:6.0' + + // AOP 插件库:https://mvnrepository.com/artifact/org.aspectj/aspectjrt + implementation 'org.aspectj:aspectjrt:1.9.6' + + // 图片加载框架:https://github.com/bumptech/glide + // 官方使用文档:https://github.com/Muyangmin/glide-docs-cn + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + + // 沉浸式框架:https://github.com/gyf-dev/ImmersionBar + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + + // 手势 ImageView:https://github.com/Baseflow/PhotoView + implementation 'com.github.Baseflow:PhotoView:2.3.0' + + // Bugly 异常捕捉:https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20190418140644 + implementation 'com.tencent.bugly:crashreport:3.4.4' + implementation 'com.tencent.bugly:nativecrashreport:3.9.2' + + // 动画解析库:https://github.com/airbnb/lottie-android + // 动画资源:https://lottiefiles.com、https://icons8.com/animated-icons + implementation 'com.airbnb.android:lottie:4.1.0' + + // 上拉刷新下拉加载框架:https://github.com/scwang90/SmartRefreshLayout + implementation 'com.scwang.smart:refresh-layout-kernel:2.0.3' + implementation 'com.scwang.smart:refresh-header-material:2.0.3' + + // 日志打印框架:https://github.com/JakeWharton/timber + implementation 'com.jakewharton.timber:timber:4.7.1' + + // 指示器框架:https://github.com/ongakuer/CircleIndicator + implementation 'me.relex:circleindicator:2.1.6' + + // 腾讯 MMKV:https://github.com/Tencent/MMKV + implementation 'com.tencent:mmkv-static:1.2.10' + + // 内存泄漏监测框架:https://github.com/square/leakcanary + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' + previewImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' + + // 多语种:https://github.com/getActivity/MultiLanguages + // 悬浮窗:https://github.com/getActivity/XToast + // 日志输出:https://github.com/getActivity/Logcat + // 工具类:https://github.com/Blankj/AndroidUtilCode + // 轮播图:https://github.com/bingoogolapple/BGABanner-Android + // 二维码:https://github.com/bingoogolapple/BGAQRCode-Android + // 跑马灯:https://github.com/sunfusheng/MarqueeView + // 对象注解:https://www.jianshu.com/p/f1f888e4a35f + // 对象存储:https://github.com/leavesC/DoKV + // 多渠道打包:https://github.com/Meituan-Dianping/walle + // 设备唯一标识:http://msa-alliance.cn/col.jsp?id=120 + // 嵌套滚动容器:https://github.com/donkingliang/ConsecutiveScroller + // 隐私调用监控:https://github.com/huage2580/PermissionMonitor } \ No newline at end of file diff --git a/app/proguard-app.pro b/app/proguard-app.pro index b42258f2..58761e46 100644 --- a/app/proguard-app.pro +++ b/app/proguard-app.pro @@ -2,20 +2,20 @@ #-ignorewarning # 混淆保护自己项目的部分代码以及引用的第三方jar包 -#-libraryjars libs/umeng-analytics-v5.2.4.jar +#-libraryjars libs/xxxxxxxxx.jar -# 不混淆这些包下的字段名 --keepclassmembernames class com.hjq.demo.http.request.** { +# 不混淆这个包下的类 +-keep class com.hjq.demo.http.api.** { ; } --keepclassmembernames class com.hjq.demo.http.response.** { +-keep class com.hjq.demo.http.response.** { ; } --keepclassmembernames class com.hjq.demo.http.model.** { +-keep class com.hjq.demo.http.model.** { ; } -# 不混淆被 DebugLog 注解的方法信息 +# 不混淆被 Log 注解的方法信息 -keepclassmembernames class ** { - @com.hjq.demo.aop.DebugLog ; + @com.hjq.demo.aop.Log ; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d90ecb6d..d4b70b41 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,240 +1,280 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/action/StatusAction.java b/app/src/main/java/com/hjq/demo/action/StatusAction.java index aa5e6498..da9f09ba 100644 --- a/app/src/main/java/com/hjq/demo/action/StatusAction.java +++ b/app/src/main/java/com/hjq/demo/action/StatusAction.java @@ -4,7 +4,6 @@ import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.view.View; import androidx.annotation.DrawableRes; import androidx.annotation.RawRes; @@ -39,7 +38,7 @@ default void showLoading(@RawRes int id) { layout.show(); layout.setAnimResource(id); layout.setHint(""); - layout.setOnClickListener(null); + layout.setOnRetryListener(null); } /** @@ -63,7 +62,7 @@ default void showEmpty() { /** * 显示错误提示 */ - default void showError(View.OnClickListener listener) { + default void showError(StatusLayout.OnRetryListener listener) { StatusLayout layout = getStatusLayout(); Context context = layout.getContext(); ConnectivityManager manager = ContextCompat.getSystemService(context, ConnectivityManager.class); @@ -81,17 +80,17 @@ default void showError(View.OnClickListener listener) { /** * 显示自定义提示 */ - default void showLayout(@DrawableRes int drawableId, @StringRes int stringId, View.OnClickListener listener) { + default void showLayout(@DrawableRes int drawableId, @StringRes int stringId, StatusLayout.OnRetryListener listener) { StatusLayout layout = getStatusLayout(); Context context = layout.getContext(); showLayout(ContextCompat.getDrawable(context, drawableId), context.getString(stringId), listener); } - default void showLayout(Drawable drawable, CharSequence hint, View.OnClickListener listener) { + default void showLayout(Drawable drawable, CharSequence hint, StatusLayout.OnRetryListener listener) { StatusLayout layout = getStatusLayout(); layout.show(); layout.setIcon(drawable); layout.setHint(hint); - layout.setOnClickListener(listener); + layout.setOnRetryListener(listener); } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/action/TitleBarAction.java b/app/src/main/java/com/hjq/demo/action/TitleBarAction.java index b67219bf..65c7d732 100644 --- a/app/src/main/java/com/hjq/demo/action/TitleBarAction.java +++ b/app/src/main/java/com/hjq/demo/action/TitleBarAction.java @@ -20,7 +20,7 @@ public interface TitleBarAction extends OnTitleBarListener { @Nullable TitleBar getTitleBar(); - + /** * 左项被点击 * @@ -157,11 +157,16 @@ default Drawable getRightIcon() { * 递归获取 ViewGroup 中的 TitleBar 对象 */ default TitleBar obtainTitleBar(ViewGroup group) { + if (group == null) { + return null; + } for (int i = 0; i < group.getChildCount(); i++) { View view = group.getChildAt(i); if ((view instanceof TitleBar)) { return (TitleBar) view; - } else if (view instanceof ViewGroup) { + } + + if (view instanceof ViewGroup) { TitleBar titleBar = obtainTitleBar((ViewGroup) view); if (titleBar != null) { return titleBar; diff --git a/app/src/main/java/com/hjq/demo/aop/DebugLog.java b/app/src/main/java/com/hjq/demo/aop/Log.java similarity index 86% rename from app/src/main/java/com/hjq/demo/aop/DebugLog.java rename to app/src/main/java/com/hjq/demo/aop/Log.java index e9863b11..e3ec4ab9 100644 --- a/app/src/main/java/com/hjq/demo/aop/DebugLog.java +++ b/app/src/main/java/com/hjq/demo/aop/Log.java @@ -13,7 +13,7 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) -public @interface DebugLog { +public @interface Log { - String value() default "DebugLog"; + String value() default "AppLog"; } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/aop/DebugLogAspect.java b/app/src/main/java/com/hjq/demo/aop/LogAspect.java similarity index 83% rename from app/src/main/java/com/hjq/demo/aop/DebugLogAspect.java rename to app/src/main/java/com/hjq/demo/aop/LogAspect.java index f659b5b7..4dca9b38 100644 --- a/app/src/main/java/com/hjq/demo/aop/DebugLogAspect.java +++ b/app/src/main/java/com/hjq/demo/aop/LogAspect.java @@ -24,41 +24,40 @@ * desc : Debug 日志切面 */ @Aspect -public class DebugLogAspect { +public class LogAspect { /** * 构造方法切入点 */ - @Pointcut("execution(@com.hjq.demo.aop.DebugLog *.new(..))") + @Pointcut("execution(@com.hjq.demo.aop.Log *.new(..))") public void constructor() {} /** * 方法切入点 */ - @Pointcut("execution(@com.hjq.demo.aop.DebugLog * *(..))") + @Pointcut("execution(@com.hjq.demo.aop.Log * *(..))") public void method() {} /** * 在连接点进行方法替换 */ - @Around("(method() || constructor()) && @annotation(debugLog)") - public Object aroundJoinPoint(ProceedingJoinPoint joinPoint, DebugLog debugLog) throws Throwable { - enterMethod(joinPoint, debugLog); + @Around("(method() || constructor()) && @annotation(log)") + public Object aroundJoinPoint(ProceedingJoinPoint joinPoint, Log log) throws Throwable { + enterMethod(joinPoint, log); long startNanos = System.nanoTime(); Object result = joinPoint.proceed(); long stopNanos = System.nanoTime(); - exitMethod(joinPoint, debugLog, result, TimeUnit.NANOSECONDS.toMillis(stopNanos - startNanos)); + exitMethod(joinPoint, log, result, TimeUnit.NANOSECONDS.toMillis(stopNanos - startNanos)); return result; } - /** * 方法执行前切入 */ - private void enterMethod(ProceedingJoinPoint joinPoint, DebugLog debugLog) { + private void enterMethod(ProceedingJoinPoint joinPoint, Log log) { CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature(); // 方法所在类 @@ -73,9 +72,9 @@ private void enterMethod(ProceedingJoinPoint joinPoint, DebugLog debugLog) { //记录并打印方法的信息 StringBuilder builder = getMethodLogInfo(className, methodName, parameterNames, parameterValues); - log(debugLog.value(), builder.toString()); + log(log.value(), builder.toString()); - final String section = builder.toString().substring(2); + final String section = builder.substring(2); Trace.beginSection(section); } @@ -116,7 +115,7 @@ private StringBuilder getMethodLogInfo(String className, String methodName, Stri * @param result 方法执行后的结果 * @param lengthMillis 执行方法所需要的时间 */ - private void exitMethod(ProceedingJoinPoint joinPoint, DebugLog debugLog, Object result, long lengthMillis) { + private void exitMethod(ProceedingJoinPoint joinPoint, Log log, Object result, long lengthMillis) { Trace.endSection(); Signature signature = joinPoint.getSignature(); @@ -138,7 +137,7 @@ private void exitMethod(ProceedingJoinPoint joinPoint, DebugLog debugLog, Object builder.append(result.toString()); } - log(debugLog.value(), builder.toString()); + log(log.value(), builder.toString()); } private void log(String tag, String msg) { diff --git a/app/src/main/java/com/hjq/demo/aop/PermissionsAspect.java b/app/src/main/java/com/hjq/demo/aop/PermissionsAspect.java index 5fc29ec4..09b7d1cc 100644 --- a/app/src/main/java/com/hjq/demo/aop/PermissionsAspect.java +++ b/app/src/main/java/com/hjq/demo/aop/PermissionsAspect.java @@ -5,6 +5,7 @@ import com.hjq.demo.manager.ActivityManager; import com.hjq.demo.other.PermissionCallback; import com.hjq.permissions.XXPermissions; +import com.tencent.bugly.crashreport.CrashReport; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -13,6 +14,8 @@ import java.util.List; +import timber.log.Timber; + /** * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject @@ -32,14 +35,34 @@ public void method() {} * 在连接点进行方法替换 */ @Around("method() && @annotation(permissions)") - public void aroundJoinPoint(final ProceedingJoinPoint joinPoint, Permissions permissions) { - Activity activity = ActivityManager.getInstance().getTopActivity(); + public void aroundJoinPoint(ProceedingJoinPoint joinPoint, Permissions permissions) { + Activity activity = null; + + // 方法参数值集合 + Object[] parameterValues = joinPoint.getArgs(); + for (Object arg : parameterValues) { + if (!(arg instanceof Activity)) { + continue; + } + activity = (Activity) arg; + break; + } + if (activity == null || activity.isFinishing() || activity.isDestroyed()) { + activity = ActivityManager.getInstance().getTopActivity(); + } + + if (activity == null || activity.isFinishing() || activity.isDestroyed()) { + Timber.e("The activity has been destroyed and permission requests cannot be made"); return; } + requestPermissions(joinPoint, activity, permissions.value()); + } + + private void requestPermissions(ProceedingJoinPoint joinPoint, Activity activity, String[] permissions) { XXPermissions.with(activity) - .permission(permissions.value()) + .permission(permissions) .request(new PermissionCallback() { @Override @@ -49,7 +72,7 @@ public void onGranted(List permissions, boolean all) { // 获得权限,执行原方法 joinPoint.proceed(); } catch (Throwable e) { - e.printStackTrace(); + CrashReport.postCatchedException(e); } } } diff --git a/app/src/main/java/com/hjq/demo/app/AppActivity.java b/app/src/main/java/com/hjq/demo/app/AppActivity.java index bc5f9d73..0669b74a 100644 --- a/app/src/main/java/com/hjq/demo/app/AppActivity.java +++ b/app/src/main/java/com/hjq/demo/app/AppActivity.java @@ -25,7 +25,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : 业务 Activity 基类 + * desc : Activity 业务基类 */ public abstract class AppActivity extends BaseActivity implements ToastAction, TitleBarAction, OnHttpListener { @@ -38,7 +38,7 @@ public abstract class AppActivity extends BaseActivity /** 加载对话框 */ private BaseDialog mDialog; /** 对话框数量 */ - private int mDialogTotal; + private int mDialogCount; /** * 当前加载对话框是否在显示中 @@ -51,9 +51,13 @@ public boolean isShowDialog() { * 显示加载对话框 */ public void showDialog() { - mDialogTotal++; + if (isFinishing() || isDestroyed()) { + return; + } + + mDialogCount++; postDelayed(() -> { - if (mDialogTotal <= 0 || isFinishing() || isDestroyed()) { + if (mDialogCount <= 0 || isFinishing() || isDestroyed()) { return; } @@ -72,13 +76,19 @@ public void showDialog() { * 隐藏加载对话框 */ public void hideDialog() { - if (mDialogTotal > 0) { - mDialogTotal--; + if (isFinishing() || isDestroyed()) { + return; } - if (mDialogTotal == 0 && mDialog != null && mDialog.isShowing() && !isFinishing()) { - mDialog.dismiss(); + if (mDialogCount > 0) { + mDialogCount--; } + + if (mDialogCount != 0 || mDialog == null || !mDialog.isShowing()) { + return; + } + + mDialog.dismiss(); } @Override @@ -134,7 +144,7 @@ protected ImmersionBar createStatusBarConfig() { // 默认状态栏字体颜色为黑色 .statusBarDarkFont(isStatusBarDarkFont()) // 指定导航栏背景颜色 - .navigationBarColor(android.R.color.white) + .navigationBarColor(R.color.white) // 状态栏字体和导航栏内容自动变色,必须指定状态栏颜色和导航栏颜色才可以自动变色 .autoDarkModeEnable(true, 0.2f); } diff --git a/app/src/main/java/com/hjq/demo/app/AppAdapter.java b/app/src/main/java/com/hjq/demo/app/AppAdapter.java index 85bda3e4..7a02a725 100644 --- a/app/src/main/java/com/hjq/demo/app/AppAdapter.java +++ b/app/src/main/java/com/hjq/demo/app/AppAdapter.java @@ -18,7 +18,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/12/19 - * desc : 业务 RecyclerView 适配器基类 + * desc : RecyclerView 适配器业务基类 */ public abstract class AppAdapter extends BaseAdapter.ViewHolder> { @@ -95,10 +95,30 @@ public void clearData() { notifyDataSetChanged(); } + /** + * 是否包含了某个位置上的条目数据 + */ + public boolean containsItem(@IntRange(from = 0) int position) { + return containsItem(getItem(position)); + } + + /** + * 是否包含某个条目数据 + */ + public boolean containsItem(T item) { + if (mDataSet == null || item == null) { + return false; + } + return mDataSet.contains(item); + } + /** * 获取某个位置上的数据 */ public T getItem(@IntRange(from = 0) int position) { + if (mDataSet == null) { + return null; + } return mDataSet.get(position); } @@ -120,7 +140,6 @@ public void addItem(@NonNull T item) { if (mDataSet == null) { mDataSet = new ArrayList<>(); } - addItem(mDataSet.size(), item); } diff --git a/app/src/main/java/com/hjq/demo/app/AppApplication.java b/app/src/main/java/com/hjq/demo/app/AppApplication.java index ff0c5ac4..8662e829 100644 --- a/app/src/main/java/com/hjq/demo/app/AppApplication.java +++ b/app/src/main/java/com/hjq/demo/app/AppApplication.java @@ -3,23 +3,18 @@ import android.app.Activity; import android.app.Application; import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.Network; import android.os.Build; -import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.widget.AppCompatTextView; import androidx.core.content.ContextCompat; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; import com.hjq.bar.TitleBar; -import com.hjq.bar.initializer.LightBarInitializer; import com.hjq.demo.R; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.http.glide.GlideApp; import com.hjq.demo.http.model.RequestHandler; import com.hjq.demo.http.model.RequestServer; @@ -27,16 +22,23 @@ import com.hjq.demo.other.AppConfig; import com.hjq.demo.other.CrashHandler; import com.hjq.demo.other.DebugLoggerTree; +import com.hjq.demo.other.MaterialHeader; import com.hjq.demo.other.SmartBallPulseFooter; -import com.hjq.demo.other.ToastInterceptor; +import com.hjq.demo.other.TitleBarStyle; +import com.hjq.demo.other.ToastLogInterceptor; +import com.hjq.demo.other.ToastStyle; +import com.hjq.gson.factory.GsonFactory; import com.hjq.http.EasyConfig; +import com.hjq.http.config.IRequestApi; +import com.hjq.http.config.IRequestInterceptor; +import com.hjq.http.model.HttpHeaders; +import com.hjq.http.model.HttpParams; import com.hjq.permissions.XXPermissions; import com.hjq.toast.ToastUtils; -import com.hjq.toast.style.ToastBlackStyle; import com.hjq.umeng.UmengClient; -import com.scwang.smart.refresh.header.MaterialHeader; import com.scwang.smart.refresh.layout.SmartRefreshLayout; import com.tencent.bugly.crashreport.CrashReport; +import com.tencent.mmkv.MMKV; import okhttp3.OkHttpClient; import timber.log.Timber; @@ -49,13 +51,18 @@ */ public final class AppApplication extends Application { - @DebugLog("启动耗时") + @Log("启动耗时") @Override public void onCreate() { super.onCreate(); initSdk(this); } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + } + @Override public void onLowMemory() { super.onLowMemory(); @@ -74,56 +81,16 @@ public void onTrimMemory(int level) { * 初始化一些第三方框架 */ public static void initSdk(Application application) { - // 设置调试模式 - XXPermissions.setDebugMode(AppConfig.isDebug()); - - // 初始化吐司 - ToastUtils.init(application, new ToastBlackStyle(application) { - - @Override - public int getCornerRadius() { - return (int) application.getResources().getDimension(R.dimen.button_round_size); - } - }); - - // 设置 Toast 拦截器 - ToastUtils.setToastInterceptor(new ToastInterceptor()); - // 设置标题栏初始化器 - TitleBar.setDefaultInitializer(new LightBarInitializer() { - - @Override - public Drawable getBackgroundDrawable(Context context) { - return new ColorDrawable(ContextCompat.getColor(application, R.color.common_primary_color)); - } - - @Override - public Drawable getBackIcon(Context context) { - return ContextCompat.getDrawable(context, R.drawable.arrows_left_ic); - } - - @Override - protected TextView createTextView(Context context) { - return new AppCompatTextView(context); - } - }); - - // 本地异常捕捉 - CrashHandler.register(application); - - // 友盟统计、登录、分享 SDK - UmengClient.init(application); - - // Bugly 异常捕捉 - CrashReport.initCrashReport(application, AppConfig.getBuglyId(), AppConfig.isDebug()); + TitleBar.setDefaultStyle(new TitleBarStyle()); // 设置全局的 Header 构建器 - SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, layout) -> - new MaterialHeader(context).setColorSchemeColors(ContextCompat.getColor(context, R.color.common_accent_color))); + SmartRefreshLayout.setDefaultRefreshHeaderCreator((cx, layout) -> + new MaterialHeader(application).setColorSchemeColors(ContextCompat.getColor(application, R.color.common_accent_color))); // 设置全局的 Footer 构建器 - SmartRefreshLayout.setDefaultRefreshFooterCreator((context, layout) -> new SmartBallPulseFooter(context)); + SmartRefreshLayout.setDefaultRefreshFooterCreator((cx, layout) -> new SmartBallPulseFooter(application)); // 设置全局初始化器 - SmartRefreshLayout.setDefaultRefreshInitializer((context, layout) -> { + SmartRefreshLayout.setDefaultRefreshInitializer((cx, layout) -> { // 刷新头部是否跟随内容偏移 layout.setEnableHeaderTranslationContent(true) // 刷新尾部是否跟随内容偏移 @@ -136,9 +103,28 @@ protected TextView createTextView(Context context) { .setEnableOverScrollDrag(false); }); + // 初始化吐司 + ToastUtils.init(application, new ToastStyle()); + // 设置调试模式 + ToastUtils.setDebugMode(AppConfig.isDebug()); + // 设置 Toast 拦截器 + ToastUtils.setInterceptor(new ToastLogInterceptor()); + + // 本地异常捕捉 + CrashHandler.register(application); + + // 友盟统计、登录、分享 SDK + UmengClient.init(application, AppConfig.isLogEnable()); + + // Bugly 异常捕捉 + CrashReport.initCrashReport(application, AppConfig.getBuglyId(), AppConfig.isDebug()); + // Activity 栈管理初始化 ActivityManager.getInstance().init(application); + // MMKV 初始化 + MMKV.initialize(application); + // 网络请求框架初始化 OkHttpClient okHttpClient = new OkHttpClient.Builder() .build(); @@ -152,13 +138,24 @@ protected TextView createTextView(Context context) { .setHandler(new RequestHandler(application)) // 设置请求重试次数 .setRetryCount(1) - // 添加全局请求参数 - //.addParam("token", "6666666") - // 添加全局请求头 - //.addHeader("time", "20191030") - // 启用配置 + .setInterceptor((api, params, headers) -> { + // 添加全局请求头 + headers.put("token", "66666666666"); + headers.put("deviceOaid", UmengClient.getDeviceOaid()); + headers.put("versionName", AppConfig.getVersionName()); + headers.put("versionCode", String.valueOf(AppConfig.getVersionCode())); + // 添加全局请求参数 + // params.put("6666666", "6666666"); + }) .into(); + // 设置 Json 解析容错监听 + GsonFactory.setJsonCallback((typeToken, fieldName, jsonToken) -> { + // 上报到 Bugly 错误列表 + CrashReport.postCatchedException(new IllegalArgumentException( + "类型解析异常:" + typeToken + "#" + fieldName + ",后台返回的类型为:" + jsonToken)); + }); + // 初始化日志打印 if (AppConfig.isLogEnable()) { Timber.plant(new DebugLoggerTree()); @@ -171,12 +168,16 @@ protected TextView createTextView(Context context) { @Override public void onLost(@NonNull Network network) { Activity topActivity = ActivityManager.getInstance().getTopActivity(); - if (topActivity instanceof LifecycleOwner) { - LifecycleOwner lifecycleOwner = ((LifecycleOwner) topActivity); - if (lifecycleOwner.getLifecycle().getCurrentState() == Lifecycle.State.RESUMED) { - ToastUtils.show(R.string.common_network_error); - } + if (!(topActivity instanceof LifecycleOwner)) { + return; + } + + LifecycleOwner lifecycleOwner = ((LifecycleOwner) topActivity); + if (lifecycleOwner.getLifecycle().getCurrentState() != Lifecycle.State.RESUMED) { + return; } + + ToastUtils.show(R.string.common_network_error); } }); } diff --git a/app/src/main/java/com/hjq/demo/app/AppFragment.java b/app/src/main/java/com/hjq/demo/app/AppFragment.java index 3f6a8071..d2ceeea4 100644 --- a/app/src/main/java/com/hjq/demo/app/AppFragment.java +++ b/app/src/main/java/com/hjq/demo/app/AppFragment.java @@ -11,7 +11,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : 业务 Fragment 基类 + * desc : Fragment 业务基类 */ public abstract class AppFragment extends BaseFragment implements ToastAction, OnHttpListener { @@ -21,11 +21,10 @@ public abstract class AppFragment extends BaseFragment */ public boolean isShowDialog() { A activity = getAttachActivity(); - if (activity != null) { - return activity.isShowDialog(); + if (activity == null) { + return false; } - - return false; + return activity.isShowDialog(); } /** @@ -33,9 +32,10 @@ public boolean isShowDialog() { */ public void showDialog() { A activity = getAttachActivity(); - if (activity != null) { - activity.showDialog(); + if (activity == null) { + return; } + activity.showDialog(); } /** @@ -43,9 +43,10 @@ public void showDialog() { */ public void hideDialog() { A activity = getAttachActivity(); - if (activity != null) { - activity.hideDialog(); + if (activity == null) { + return; } + activity.hideDialog(); } /** @@ -59,9 +60,10 @@ public void onStart(Call call) { @Override public void onSucceed(Object result) { - if (result instanceof HttpData) { - toast(((HttpData) result).getMessage()); + if (!(result instanceof HttpData)) { + return; } + toast(((HttpData) result).getMessage()); } @Override diff --git a/app/src/main/java/com/hjq/demo/app/TitleBarFragment.java b/app/src/main/java/com/hjq/demo/app/TitleBarFragment.java index 0e7f82cc..bb393bba 100644 --- a/app/src/main/java/com/hjq/demo/app/TitleBarFragment.java +++ b/app/src/main/java/com/hjq/demo/app/TitleBarFragment.java @@ -9,13 +9,14 @@ import com.gyf.immersionbar.ImmersionBar; import com.hjq.bar.TitleBar; +import com.hjq.demo.R; import com.hjq.demo.action.TitleBarAction; /** * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2020/10/31 - * desc : 带标题栏的 Fragment 基类 + * desc : 带标题栏的 Fragment 业务基类 */ public abstract class TitleBarFragment extends AppFragment implements TitleBarAction { @@ -28,18 +29,20 @@ public abstract class TitleBarFragment extends AppFragmen @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - // 设置标题栏沉浸 - if (isStatusBarEnabled() && getTitleBar() != null) { - ImmersionBar.setTitleBar(this, getTitleBar()); - } + // 设置标题栏点击监听 if (getTitleBar() != null) { getTitleBar().setOnTitleBarListener(this); } - // 初始化沉浸式状态栏 if (isStatusBarEnabled()) { + // 初始化沉浸式状态栏 getStatusBarConfig().init(); + + if (getTitleBar() != null) { + // 设置标题栏沉浸 + ImmersionBar.setTitleBar(this, getTitleBar()); + } } } @@ -79,7 +82,7 @@ protected ImmersionBar createStatusBarConfig() { // 默认状态栏字体颜色为黑色 .statusBarDarkFont(isStatusBarDarkFont()) // 指定导航栏背景颜色 - .navigationBarColor(android.R.color.white) + .navigationBarColor(R.color.white) // 状态栏字体和导航栏内容自动变色,必须指定状态栏颜色和导航栏颜色才可以自动变色 .autoDarkModeEnable(true, 0.2f); } diff --git a/app/src/main/java/com/hjq/demo/http/request/CopyApi.java b/app/src/main/java/com/hjq/demo/http/api/CopyApi.java similarity index 81% rename from app/src/main/java/com/hjq/demo/http/request/CopyApi.java rename to app/src/main/java/com/hjq/demo/http/api/CopyApi.java index 3712604c..81aad20b 100644 --- a/app/src/main/java/com/hjq/demo/http/request/CopyApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/CopyApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; @@ -14,4 +14,8 @@ public final class CopyApi implements IRequestApi { public String getApi() { return ""; } + + public final static class Bean { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/request/GetCodeApi.java b/app/src/main/java/com/hjq/demo/http/api/GetCodeApi.java similarity index 93% rename from app/src/main/java/com/hjq/demo/http/request/GetCodeApi.java rename to app/src/main/java/com/hjq/demo/http/api/GetCodeApi.java index e80e759f..01ab4825 100644 --- a/app/src/main/java/com/hjq/demo/http/request/GetCodeApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/GetCodeApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; diff --git a/app/src/main/java/com/hjq/demo/http/request/LoginApi.java b/app/src/main/java/com/hjq/demo/http/api/LoginApi.java similarity index 78% rename from app/src/main/java/com/hjq/demo/http/request/LoginApi.java rename to app/src/main/java/com/hjq/demo/http/api/LoginApi.java index a15912e5..78b6c893 100644 --- a/app/src/main/java/com/hjq/demo/http/request/LoginApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/LoginApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; @@ -29,4 +29,13 @@ public LoginApi setPassword(String password) { this.password = password; return this; } + + public final static class Bean { + + private String token; + + public String getToken() { + return token; + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/request/LogoutApi.java b/app/src/main/java/com/hjq/demo/http/api/LogoutApi.java similarity index 90% rename from app/src/main/java/com/hjq/demo/http/request/LogoutApi.java rename to app/src/main/java/com/hjq/demo/http/api/LogoutApi.java index 148f66b4..1d62a70e 100644 --- a/app/src/main/java/com/hjq/demo/http/request/LogoutApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/LogoutApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; diff --git a/app/src/main/java/com/hjq/demo/http/request/PasswordApi.java b/app/src/main/java/com/hjq/demo/http/api/PasswordApi.java similarity index 95% rename from app/src/main/java/com/hjq/demo/http/request/PasswordApi.java rename to app/src/main/java/com/hjq/demo/http/api/PasswordApi.java index 31115213..2593bd05 100644 --- a/app/src/main/java/com/hjq/demo/http/request/PasswordApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/PasswordApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; diff --git a/app/src/main/java/com/hjq/demo/http/request/PhoneApi.java b/app/src/main/java/com/hjq/demo/http/api/PhoneApi.java similarity index 96% rename from app/src/main/java/com/hjq/demo/http/request/PhoneApi.java rename to app/src/main/java/com/hjq/demo/http/api/PhoneApi.java index a893fed3..17f7ae1f 100644 --- a/app/src/main/java/com/hjq/demo/http/request/PhoneApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/PhoneApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; diff --git a/app/src/main/java/com/hjq/demo/http/request/RegisterApi.java b/app/src/main/java/com/hjq/demo/http/api/RegisterApi.java similarity index 91% rename from app/src/main/java/com/hjq/demo/http/request/RegisterApi.java rename to app/src/main/java/com/hjq/demo/http/api/RegisterApi.java index 30ea1b1a..3c14fc40 100644 --- a/app/src/main/java/com/hjq/demo/http/request/RegisterApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/RegisterApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; @@ -36,4 +36,8 @@ public RegisterApi setPassword(String password) { this.password = password; return this; } + + public final static class Bean { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/request/UpdateImageApi.java b/app/src/main/java/com/hjq/demo/http/api/UpdateImageApi.java similarity index 93% rename from app/src/main/java/com/hjq/demo/http/request/UpdateImageApi.java rename to app/src/main/java/com/hjq/demo/http/api/UpdateImageApi.java index 5f823116..e54c33bf 100644 --- a/app/src/main/java/com/hjq/demo/http/request/UpdateImageApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/UpdateImageApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; diff --git a/app/src/main/java/com/hjq/demo/http/request/UserInfoApi.java b/app/src/main/java/com/hjq/demo/http/api/UserInfoApi.java similarity index 83% rename from app/src/main/java/com/hjq/demo/http/request/UserInfoApi.java rename to app/src/main/java/com/hjq/demo/http/api/UserInfoApi.java index d7d75a8c..8aa37cb6 100644 --- a/app/src/main/java/com/hjq/demo/http/request/UserInfoApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/UserInfoApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; @@ -14,4 +14,8 @@ public final class UserInfoApi implements IRequestApi { public String getApi() { return "user/info"; } + + public final class Bean { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/request/VerifyCodeApi.java b/app/src/main/java/com/hjq/demo/http/api/VerifyCodeApi.java similarity index 94% rename from app/src/main/java/com/hjq/demo/http/request/VerifyCodeApi.java rename to app/src/main/java/com/hjq/demo/http/api/VerifyCodeApi.java index aae82701..935cd599 100644 --- a/app/src/main/java/com/hjq/demo/http/request/VerifyCodeApi.java +++ b/app/src/main/java/com/hjq/demo/http/api/VerifyCodeApi.java @@ -1,4 +1,4 @@ -package com.hjq.demo.http.request; +package com.hjq.demo.http.api; import com.hjq.http.config.IRequestApi; diff --git a/app/src/main/java/com/hjq/demo/http/glide/GlideConfig.java b/app/src/main/java/com/hjq/demo/http/glide/GlideConfig.java index 200f1dd9..2d554a77 100644 --- a/app/src/main/java/com/hjq/demo/http/glide/GlideConfig.java +++ b/app/src/main/java/com/hjq/demo/http/glide/GlideConfig.java @@ -62,9 +62,9 @@ public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder builder.setDefaultRequestOptions(new RequestOptions() // 设置默认加载中占位图 - .placeholder(R.drawable.image_loading_bg) + .placeholder(R.drawable.image_loading_ic) // 设置默认加载出错占位图 - .error(R.drawable.image_error_bg)); + .error(R.drawable.image_error_ic)); } @Override diff --git a/app/src/main/java/com/hjq/demo/http/glide/OkHttpFetcher.java b/app/src/main/java/com/hjq/demo/http/glide/OkHttpFetcher.java index a901ba3a..657f7d34 100644 --- a/app/src/main/java/com/hjq/demo/http/glide/OkHttpFetcher.java +++ b/app/src/main/java/com/hjq/demo/http/glide/OkHttpFetcher.java @@ -77,7 +77,9 @@ public void cleanup() { if (mInputStream != null) { mInputStream.close(); } - } catch (IOException ignored) {} + } catch (IOException e) { + e.printStackTrace(); + } if (mResponseBody != null) { mResponseBody.close(); @@ -87,9 +89,10 @@ public void cleanup() { @Override public void cancel() { - if (mCall != null) { - mCall.cancel(); + if (mCall == null) { + return; } + mCall.cancel(); } @NonNull diff --git a/app/src/main/java/com/hjq/demo/http/glide/OkHttpLoader.java b/app/src/main/java/com/hjq/demo/http/glide/OkHttpLoader.java index 31bb1d36..3afcb5c0 100644 --- a/app/src/main/java/com/hjq/demo/http/glide/OkHttpLoader.java +++ b/app/src/main/java/com/hjq/demo/http/glide/OkHttpLoader.java @@ -53,4 +53,4 @@ public ModelLoader build(@NonNull MultiModelLoaderFactory @Override public void teardown() {} } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/model/HttpData.java b/app/src/main/java/com/hjq/demo/http/model/HttpData.java index 08199f4f..802f6f4d 100644 --- a/app/src/main/java/com/hjq/demo/http/model/HttpData.java +++ b/app/src/main/java/com/hjq/demo/http/model/HttpData.java @@ -26,4 +26,18 @@ public String getMessage() { public T getData() { return data; } + + /** + * 是否请求成功 + */ + public boolean isRequestSucceed() { + return code == 200; + } + + /** + * 是否 Token 失效 + */ + public boolean isTokenFailure() { + return code == 1001; + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/model/RequestHandler.java b/app/src/main/java/com/hjq/demo/http/model/RequestHandler.java index 3a128da0..0326dcdd 100644 --- a/app/src/main/java/com/hjq/demo/http/model/RequestHandler.java +++ b/app/src/main/java/com/hjq/demo/http/model/RequestHandler.java @@ -14,6 +14,7 @@ import com.hjq.demo.ui.activity.LoginActivity; import com.hjq.gson.factory.GsonFactory; import com.hjq.http.EasyLog; +import com.hjq.http.config.IRequestApi; import com.hjq.http.config.IRequestHandler; import com.hjq.http.exception.CancelException; import com.hjq.http.exception.DataException; @@ -24,6 +25,7 @@ import com.hjq.http.exception.ServerException; import com.hjq.http.exception.TimeoutException; import com.hjq.http.exception.TokenException; +import com.tencent.mmkv.MMKV; import org.json.JSONArray; import org.json.JSONException; @@ -48,13 +50,15 @@ public final class RequestHandler implements IRequestHandler { private final Application mApplication; + private final MMKV mMmkv; public RequestHandler(Application application) { mApplication = application; + mMmkv = MMKV.mmkvWithID("http_cache_id"); } @Override - public Object requestSucceed(LifecycleOwner lifecycle, Response response, Type type) throws Exception { + public Object requestSucceed(LifecycleOwner lifecycle, IRequestApi api, Response response, Type type) throws Exception { if (Response.class.equals(type)) { return response; @@ -122,12 +126,15 @@ public Object requestSucceed(LifecycleOwner lifecycle, Response response, Type t if (result instanceof HttpData) { HttpData model = (HttpData) result; - if (model.getCode() == 0) { + + if (model.isRequestSucceed()) { // 代表执行成功 return result; - } else if (model.getCode() == 1001) { + } + + if (model.isTokenFailure()) { // 代表登录失效,需要重新登录 - throw new TokenException(mApplication.getString(R.string.http_account_error)); + throw new TokenException(mApplication.getString(R.string.http_token_error)); } // 代表执行失败 @@ -137,7 +144,7 @@ public Object requestSucceed(LifecycleOwner lifecycle, Response response, Type t } @Override - public Exception requestFail(LifecycleOwner lifecycle, Exception e) { + public Exception requestFail(LifecycleOwner lifecycle, IRequestApi api, Exception e) { // 判断这个异常是不是自己抛的 if (e instanceof HttpException) { if (e instanceof TokenException) { @@ -146,7 +153,7 @@ public Exception requestFail(LifecycleOwner lifecycle, Exception e) { Intent intent = new Intent(application, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); application.startActivity(intent); - // 销毁除了登录页之外的界面 + // 销毁除了登录页之外的 Activity ActivityManager.getInstance().finishAllActivities(LoginActivity.class); } return e; @@ -159,13 +166,13 @@ public Exception requestFail(LifecycleOwner lifecycle, Exception e) { if (e instanceof UnknownHostException) { NetworkInfo info = ((ConnectivityManager) mApplication.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); // 判断网络是否连接 - if (info != null && info.isConnected()) { - // 有连接就是服务器的问题 - return new ServerException(mApplication.getString(R.string.http_server_error), e); + if (info == null || !info.isConnected()) { + // 没有连接就是网络异常 + return new NetworkException(mApplication.getString(R.string.http_network_error), e); } - // 没有连接就是网络异常 - return new NetworkException(mApplication.getString(R.string.http_network_error), e); + // 有连接就是服务器的问题 + return new ServerException(mApplication.getString(R.string.http_server_error), e); } if (e instanceof IOException) { @@ -175,4 +182,32 @@ public Exception requestFail(LifecycleOwner lifecycle, Exception e) { return new HttpException(e.getMessage(), e); } + + @Override + public Object readCache(LifecycleOwner lifecycle, IRequestApi api, Type type) { + String cacheKey = GsonFactory.getSingletonGson().toJson(api); + String cacheValue = mMmkv.getString(cacheKey, null); + if (cacheValue == null || "".equals(cacheValue) || "{}".equals(cacheValue)) { + return null; + } + EasyLog.print("---------- cacheKey ----------"); + EasyLog.json(cacheKey); + EasyLog.print("---------- cacheValue ----------"); + EasyLog.json(cacheValue); + return GsonFactory.getSingletonGson().fromJson(cacheValue, type); + } + + @Override + public boolean writeCache(LifecycleOwner lifecycle, IRequestApi api, Response response, Object result) { + String cacheKey = GsonFactory.getSingletonGson().toJson(api); + String cacheValue = GsonFactory.getSingletonGson().toJson(result); + if (cacheValue == null || "".equals(cacheValue) || "{}".equals(cacheValue)) { + return false; + } + EasyLog.print("---------- cacheKey ----------"); + EasyLog.json(cacheKey); + EasyLog.print("---------- cacheValue ----------"); + EasyLog.json(cacheValue); + return mMmkv.putString(cacheKey, cacheValue).commit(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/response/CopyBean.java b/app/src/main/java/com/hjq/demo/http/response/CopyBean.java deleted file mode 100644 index a3b9c8fa..00000000 --- a/app/src/main/java/com/hjq/demo/http/response/CopyBean.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hjq.demo.http.response; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/12/07 - * desc : 可进行拷贝的副本 - */ -public final class CopyBean { - -} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/response/LoginBean.java b/app/src/main/java/com/hjq/demo/http/response/LoginBean.java deleted file mode 100644 index f0604099..00000000 --- a/app/src/main/java/com/hjq/demo/http/response/LoginBean.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hjq.demo.http.response; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/12/07 - * desc : 登录返回 - */ -public final class LoginBean { - - private String token; - - public String getToken() { - return token; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/response/RegisterBean.java b/app/src/main/java/com/hjq/demo/http/response/RegisterBean.java deleted file mode 100644 index 2600a53e..00000000 --- a/app/src/main/java/com/hjq/demo/http/response/RegisterBean.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hjq.demo.http.response; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/12/07 - * desc : 注册返回 - */ -public final class RegisterBean { - -} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/http/response/UserInfoBean.java b/app/src/main/java/com/hjq/demo/http/response/UserInfoBean.java deleted file mode 100644 index b0463187..00000000 --- a/app/src/main/java/com/hjq/demo/http/response/UserInfoBean.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hjq.demo.http.response; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/12/07 - * desc : 用户信息 - */ -public final class UserInfoBean { - -} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/manager/ActivityManager.java b/app/src/main/java/com/hjq/demo/manager/ActivityManager.java index 42da82cd..14d1ac5d 100644 --- a/app/src/main/java/com/hjq/demo/manager/ActivityManager.java +++ b/app/src/main/java/com/hjq/demo/manager/ActivityManager.java @@ -8,6 +8,8 @@ import androidx.annotation.Nullable; import androidx.collection.ArrayMap; +import java.util.ArrayList; + import timber.log.Timber; /** @@ -20,14 +22,18 @@ public final class ActivityManager implements Application.ActivityLifecycleCallb private static volatile ActivityManager sInstance; + /** Activity 存放集合 */ private final ArrayMap mActivitySet = new ArrayMap<>(); + /** 应用生命周期回调 */ + private final ArrayList mLifecycleCallbacks = new ArrayList<>(); + /** 当前应用上下文对象 */ private Application mApplication; - /** 最后一个可见 Activity 标记 */ - private String mLastVisibleTag; - /** 最后一个不可见 Activity 标记 */ - private String mLastInvisibleTag; + /** 栈顶的 Activity 对象 */ + private Activity mTopActivity; + /** 前台并且可见的 Activity 对象 */ + private Activity mResumedActivity; private ActivityManager() {} @@ -57,20 +63,60 @@ public Application getApplication() { /** * 获取栈顶的 Activity */ + @Nullable public Activity getTopActivity() { - return mActivitySet.get(mLastVisibleTag); + return mTopActivity; + } + + /** + * 获取前台并且可见的 Activity + */ + @Nullable + public Activity getResumedActivity() { + return mResumedActivity; } /** * 判断当前应用是否处于前台状态 */ public boolean isForeground() { - // 如果最后一个可见的 Activity 和最后一个不可见的 Activity 是同一个的话 - if (mLastVisibleTag.equals(mLastInvisibleTag)) { - return false; + return getResumedActivity() != null; + } + + /** + * 注册应用生命周期回调 + */ + public void registerApplicationLifecycleCallback(ApplicationLifecycleCallback callback) { + mLifecycleCallbacks.add(callback); + } + + /** + * 取消注册应用生命周期回调 + */ + public void unregisterApplicationLifecycleCallback(ApplicationLifecycleCallback callback) { + mLifecycleCallbacks.remove(callback); + } + + /** + * 销毁指定的 Activity + */ + public void finishActivity(Class clazz) { + if (clazz == null) { + return; + } + String[] keys = mActivitySet.keySet().toArray(new String[]{}); + for (String key : keys) { + Activity activity = mActivitySet.get(key); + if (activity == null || activity.isFinishing()) { + continue; + } + + if (activity.getClass().equals(clazz)) { + activity.finish(); + mActivitySet.remove(key); + break; + } } - Activity activity = getTopActivity(); - return activity != null; } /** @@ -81,60 +127,86 @@ public void finishAllActivities() { } /** - * 销毁所有的 Activity,除这些 Class 之外的 Activity + * 销毁所有的 Activity + * + * @param classArray 白名单 Activity */ @SafeVarargs public final void finishAllActivities(Class... classArray) { String[] keys = mActivitySet.keySet().toArray(new String[]{}); for (String key : keys) { Activity activity = mActivitySet.get(key); - if (activity != null && !activity.isFinishing()) { - boolean whiteClazz = false; - if (classArray != null) { - for (Class clazz : classArray) { - if (activity.getClass() == clazz) { - whiteClazz = true; - } + if (activity == null || activity.isFinishing()) { + continue; + } + + boolean whiteClazz = false; + if (classArray != null) { + for (Class clazz : classArray) { + if (activity.getClass().equals(clazz)) { + whiteClazz = true; } } - // 如果不是白名单上面的 Activity 就销毁掉 - if (!whiteClazz) { - activity.finish(); - mActivitySet.remove(key); - } } + + if (whiteClazz) { + continue; + } + + // 如果不是白名单上面的 Activity 就销毁掉 + activity.finish(); + mActivitySet.remove(key); } } @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { Timber.i("%s - onCreate", activity.getClass().getSimpleName()); - mLastVisibleTag = getObjectTag(activity); + if (mActivitySet.size() == 0) { + for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) { + callback.onApplicationCreate(activity); + } + Timber.i("%s - onApplicationCreate", activity.getClass().getSimpleName()); + } mActivitySet.put(getObjectTag(activity), activity); + mTopActivity = activity; } @Override public void onActivityStarted(@NonNull Activity activity) { Timber.i("%s - onStart", activity.getClass().getSimpleName()); - mLastVisibleTag = getObjectTag(activity); } @Override public void onActivityResumed(@NonNull Activity activity) { Timber.i("%s - onResume", activity.getClass().getSimpleName()); - mLastVisibleTag = getObjectTag(activity); + if (mTopActivity == activity && mResumedActivity == null) { + for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) { + callback.onApplicationForeground(activity); + } + Timber.i("%s - onApplicationForeground", activity.getClass().getSimpleName()); + } + mTopActivity = activity; + mResumedActivity = activity; } @Override public void onActivityPaused(@NonNull Activity activity) { Timber.i("%s - onPause", activity.getClass().getSimpleName()); - mLastInvisibleTag = getObjectTag(activity); } @Override public void onActivityStopped(@NonNull Activity activity) { Timber.i("%s - onStop", activity.getClass().getSimpleName()); - mLastInvisibleTag = getObjectTag(activity); + if (mResumedActivity == activity) { + mResumedActivity = null; + } + if (mResumedActivity == null) { + for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) { + callback.onApplicationBackground(activity); + } + Timber.i("%s - onApplicationBackground", activity.getClass().getSimpleName()); + } } @Override @@ -146,10 +218,14 @@ public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bun public void onActivityDestroyed(@NonNull Activity activity) { Timber.i("%s - onDestroy", activity.getClass().getSimpleName()); mActivitySet.remove(getObjectTag(activity)); - mLastInvisibleTag = getObjectTag(activity); - if (getObjectTag(activity).equals(mLastVisibleTag)) { - // 清除当前标记 - mLastVisibleTag = null; + if (mTopActivity == activity) { + mTopActivity = null; + } + if (mActivitySet.size() == 0) { + for (ApplicationLifecycleCallback callback : mLifecycleCallbacks) { + callback.onApplicationDestroy(activity); + } + Timber.i("%s - onApplicationDestroy", activity.getClass().getSimpleName()); } } @@ -160,4 +236,30 @@ private static String getObjectTag(Object object) { // 对象所在的包名 + 对象的内存地址 return object.getClass().getName() + Integer.toHexString(object.hashCode()); } + + /** + * 应用生命周期回调 + */ + public interface ApplicationLifecycleCallback { + + /** + * 第一个 Activity 创建了 + */ + void onApplicationCreate(Activity activity); + + /** + * 最后一个 Activity 销毁了 + */ + void onApplicationDestroy(Activity activity); + + /** + * 应用从前台进入到后台 + */ + void onApplicationBackground(Activity activity); + + /** + * 应用从后台进入到前台 + */ + void onApplicationForeground(Activity activity); + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/manager/CacheDataManager.java b/app/src/main/java/com/hjq/demo/manager/CacheDataManager.java index 11e4aa46..0631d0f7 100644 --- a/app/src/main/java/com/hjq/demo/manager/CacheDataManager.java +++ b/app/src/main/java/com/hjq/demo/manager/CacheDataManager.java @@ -3,6 +3,8 @@ import android.content.Context; import android.os.Environment; +import com.tencent.bugly.crashreport.CrashReport; + import java.io.File; import java.math.BigDecimal; @@ -39,17 +41,19 @@ public static void clearAllCache(Context context) { * 删除文件夹 */ private static boolean deleteDir(File dir) { - if (dir != null) { - if (dir.isDirectory()) { - String[] children = dir.list(); - if (children != null) { - for (String child : children) { - deleteDir(new File(dir, child)); - } - } - } else { - return dir.delete(); - } + if (dir == null) { + return false; + } + if (!dir.isDirectory()) { + return dir.delete(); + } + + String[] children = dir.list(); + if (children == null) { + return false; + } + for (String child : children) { + deleteDir(new File(dir, child)); } return false; } @@ -61,18 +65,19 @@ private static long getFolderSize(File file) { long size = 0; try { File[] list = file.listFiles(); - if (list != null) { - for (File temp : list) { - // 如果下面还有文件 - if (temp.isDirectory()) { - size = size + getFolderSize(temp); - } else { - size = size + temp.length(); - } + if (list == null) { + return 0; + } + for (File temp : list) { + // 如果下面还有文件 + if (temp.isDirectory()) { + size = size + getFolderSize(temp); + } else { + size = size + temp.length(); } } } catch (Exception e) { - e.printStackTrace(); + CrashReport.postCatchedException(e); } return size; } @@ -89,26 +94,19 @@ public static String getFormatSize(double size) { double megaByte = kiloByte / 1024; if (megaByte < 1) { - BigDecimal result1 = new BigDecimal(Double.toString(kiloByte)); - return result1.setScale(2, BigDecimal.ROUND_HALF_UP) - .toPlainString() + "K"; + return new BigDecimal(kiloByte).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "K"; } double gigaByte = megaByte / 1024; if (gigaByte < 1) { - BigDecimal result2 = new BigDecimal(Double.toString(megaByte)); - return result2.setScale(2, BigDecimal.ROUND_HALF_UP) - .toPlainString() + "M"; + return new BigDecimal(megaByte).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "M"; } double teraBytes = gigaByte / 1024; if (teraBytes < 1) { - BigDecimal result3 = new BigDecimal(Double.toString(gigaByte)); - return result3.setScale(2, BigDecimal.ROUND_HALF_UP) - .toPlainString() + "GB"; + return new BigDecimal(gigaByte).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB"; } - BigDecimal result4 = new BigDecimal(teraBytes); - return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() - + "TB"; + + return new BigDecimal(teraBytes).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"; } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/manager/InputTextManager.java b/app/src/main/java/com/hjq/demo/manager/InputTextManager.java index 9a7fcce5..976ca670 100644 --- a/app/src/main/java/com/hjq/demo/manager/InputTextManager.java +++ b/app/src/main/java/com/hjq/demo/manager/InputTextManager.java @@ -10,6 +10,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -18,7 +19,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : 文本输入管理类,通过管理多个 TextView 输入是否为空来启用或者禁用按钮的点击事件 + * desc : 文本输入管理类,通过管理多个 EditText 输入是否为空来启用或者禁用按钮的点击事件 * blog : https://www.jianshu.com/p/fd3795e8a6b3 */ public final class InputTextManager implements TextWatcher { @@ -32,6 +33,7 @@ public final class InputTextManager implements TextWatcher { private List mViewSet; /** 输入监听器 */ + @Nullable private OnInputTextListener mListener; /** @@ -108,14 +110,16 @@ public void addViews(TextView... views) { * 移除 TextView 监听,避免内存泄露 */ public void removeViews(TextView... views) { - if (mViewSet != null && mViewSet.size() > 0) { - for (TextView view : views) { - view.removeTextChangedListener(this); - mViewSet.remove(view); - } - // 触发一次监听 - notifyChanged(); + if (mViewSet == null || mViewSet.isEmpty()) { + return; + } + + for (TextView view : views) { + view.removeTextChangedListener(this); + mViewSet.remove(view); } + // 触发一次监听 + notifyChanged(); } /** @@ -136,7 +140,7 @@ public void removeAllViews() { /** * 设置输入监听 */ - public void setListener(OnInputTextListener listener) { + public void setListener(@Nullable OnInputTextListener listener) { mListener = listener; } @@ -171,11 +175,12 @@ public void notifyChanged() { } } - if (mListener != null) { - setEnabled(mListener.onInputChange(this)); - } else { + if (mListener == null) { setEnabled(true); + return; } + + setEnabled(mListener.onInputChange(this)); } /** @@ -215,10 +220,10 @@ public static final class Builder { private boolean isAlpha; /** TextView集合 */ private final List mViewSet = new ArrayList<>(); - /** 文本 */ + /** 输入变化监听 */ private OnInputTextListener mListener; - private Builder(Activity activity) { + private Builder(@NonNull Activity activity) { mActivity = activity; } @@ -246,12 +251,7 @@ public InputTextManager build() { InputTextManager helper = new InputTextManager(mView, isAlpha); helper.addViews(mViewSet); helper.setListener(mListener); - TextInputLifecycle lifecycle = new TextInputLifecycle(mActivity, helper); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - mActivity.registerActivityLifecycleCallbacks(lifecycle); - } else { - mActivity.getApplication().registerActivityLifecycleCallbacks(lifecycle); - } + TextInputLifecycle.register(mActivity, helper); return helper; } } @@ -266,6 +266,15 @@ private TextInputLifecycle(Activity activity, InputTextManager helper) { mTextHelper = helper; } + private static void register(Activity activity, InputTextManager helper) { + TextInputLifecycle lifecycle = new TextInputLifecycle(activity, helper); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + activity.registerActivityLifecycleCallbacks(lifecycle); + } else { + activity.getApplication().registerActivityLifecycleCallbacks(lifecycle); + } + } + @Override public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {} @@ -286,16 +295,17 @@ public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bun @Override public void onActivityDestroyed(@NonNull Activity activity) { - if (mActivity != null && mActivity == activity) { - mTextHelper.removeAllViews(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - mActivity.unregisterActivityLifecycleCallbacks(this); - } else { - mActivity.getApplication().unregisterActivityLifecycleCallbacks(this); - } - mTextHelper = null; - mActivity = null; + if (mActivity != activity) { + return; + } + mTextHelper.removeAllViews(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + mActivity.unregisterActivityLifecycleCallbacks(this); + } else { + mActivity.getApplication().unregisterActivityLifecycleCallbacks(this); } + mTextHelper = null; + mActivity = null; } } diff --git a/app/src/main/java/com/hjq/demo/manager/PickerLayoutManager.java b/app/src/main/java/com/hjq/demo/manager/PickerLayoutManager.java index aae88216..34e30136 100644 --- a/app/src/main/java/com/hjq/demo/manager/PickerLayoutManager.java +++ b/app/src/main/java/com/hjq/demo/manager/PickerLayoutManager.java @@ -4,6 +4,7 @@ import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearSnapHelper; @@ -24,6 +25,7 @@ public final class PickerLayoutManager extends LinearLayoutManager { private final boolean mAlpha; private RecyclerView mRecyclerView; + @Nullable private OnPickerListener mListener; private PickerLayoutManager(Context context, int orientation, boolean reverseLayout, int maxItem, float scale, boolean alpha) { @@ -89,11 +91,13 @@ public void onMeasure(@NonNull RecyclerView.Recycler recycler, @NonNull Recycler public void onScrollStateChanged(int state) { super.onScrollStateChanged(state); // 当 RecyclerView 停止滚动时 - if (state == RecyclerView.SCROLL_STATE_IDLE) { - if (mListener != null) { - mListener.onPicked(mRecyclerView, getPickedPosition()); - } + if (state != RecyclerView.SCROLL_STATE_IDLE) { + return; + } + if (mListener == null) { + return; } + mListener.onPicked(mRecyclerView, getPickedPosition()); } @Override @@ -129,14 +133,15 @@ private void scaleHorizontalChildView() { float mid = getWidth() / 2.0f; for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); - if (childView != null) { - float childMid = (getDecoratedLeft(childView) + getDecoratedRight(childView)) / 2.0f; - float scale = 1.0f + (-1 * (1 - mScale)) * (Math.min(mid, Math.abs(mid - childMid))) / mid; - childView.setScaleX(scale); - childView.setScaleY(scale); - if (mAlpha) { - childView.setAlpha(scale); - } + if (childView == null) { + continue; + } + float childMid = (getDecoratedLeft(childView) + getDecoratedRight(childView)) / 2.0f; + float scale = 1.0f + (-1 * (1 - mScale)) * (Math.min(mid, Math.abs(mid - childMid))) / mid; + childView.setScaleX(scale); + childView.setScaleY(scale); + if (mAlpha) { + childView.setAlpha(scale); } } } @@ -148,14 +153,15 @@ private void scaleVerticalChildView() { float mid = getHeight() / 2.0f; for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); - if (childView != null) { - float childMid = (getDecoratedTop(childView) + getDecoratedBottom(childView)) / 2.0f; - float scale = 1.0f + (-1 * (1 - mScale)) * (Math.min(mid, Math.abs(mid - childMid))) / mid; - childView.setScaleX(scale); - childView.setScaleY(scale); - if (mAlpha) { - childView.setAlpha(scale); - } + if (childView == null) { + continue; + } + float childMid = (getDecoratedTop(childView) + getDecoratedBottom(childView)) / 2.0f; + float scale = 1.0f + (-1 * (1 - mScale)) * (Math.min(mid, Math.abs(mid - childMid))) / mid; + childView.setScaleX(scale); + childView.setScaleY(scale); + if (mAlpha) { + childView.setAlpha(scale); } } } @@ -165,16 +171,16 @@ private void scaleVerticalChildView() { */ public int getPickedPosition() { View itemView = mLinearSnapHelper.findSnapView(this); - if(itemView != null) { - return getPosition(itemView); + if(itemView == null) { + return 0; } - return 0; + return getPosition(itemView); } /** * 设置监听器 */ - public void setOnPickerListener(OnPickerListener listener) { + public void setOnPickerListener(@Nullable OnPickerListener listener) { mListener = listener; } @@ -254,9 +260,7 @@ public Builder setOnPickerListener(OnPickerListener listener) { */ public PickerLayoutManager build() { PickerLayoutManager layoutManager = new PickerLayoutManager(mContext, mOrientation, mReverseLayout, mMaxItem, mScale, mAlpha); - if (mListener != null) { - layoutManager.setOnPickerListener(mListener); - } + layoutManager.setOnPickerListener(mListener); return layoutManager; } diff --git a/app/src/main/java/com/hjq/demo/manager/ThreadPoolManager.java b/app/src/main/java/com/hjq/demo/manager/ThreadPoolManager.java index 80772b4e..24754c9a 100644 --- a/app/src/main/java/com/hjq/demo/manager/ThreadPoolManager.java +++ b/app/src/main/java/com/hjq/demo/manager/ThreadPoolManager.java @@ -1,5 +1,7 @@ package com.hjq.demo.manager; +import com.hjq.base.action.HandlerAction; + import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -15,14 +17,18 @@ public final class ThreadPoolManager extends ThreadPoolExecutor { private static volatile ThreadPoolManager sInstance; public ThreadPoolManager() { - super(0, Integer.MAX_VALUE, - 30L, TimeUnit.SECONDS, + // 这里最大线程数为什么不是 Int 最大值?因为在华为荣耀机子上面有最大线程数限制 + // 经过测试华为荣耀手机不能超过 300 个线程,否则会出现内存溢出 + // java.lang.OutOfMemoryError:pthread_create (1040KB stack) failed: Out of memory + // 由于应用自身占用了一些线程数,故减去 300 - 100 = 200 个 + super(0, 200, + 30L, TimeUnit.MILLISECONDS, new SynchronousQueue<>()); } public static ThreadPoolManager getInstance() { if(sInstance == null) { - synchronized (ActivityManager.class) { + synchronized (ThreadPoolManager.class) { if(sInstance == null) { sInstance = new ThreadPoolManager(); } diff --git a/app/src/main/java/com/hjq/demo/other/ArrowDrawable.java b/app/src/main/java/com/hjq/demo/other/ArrowDrawable.java index a70b0d15..60bdf66c 100644 --- a/app/src/main/java/com/hjq/demo/other/ArrowDrawable.java +++ b/app/src/main/java/com/hjq/demo/other/ArrowDrawable.java @@ -12,7 +12,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; -import android.util.TypedValue; import android.view.Gravity; import android.view.View; @@ -20,6 +19,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.hjq.demo.R; + /** * author : 王浩 & Android 轮子哥 * github : https://github.com/bingoogolapple/BGATransformersTip-Android @@ -41,16 +42,17 @@ private ArrowDrawable(Builder builder) { @Override public void draw(@NonNull Canvas canvas) { - if (mPath != null) { - if (mBuilder.mShadowSize > 0) { - mPaint.setMaskFilter(new BlurMaskFilter(mBuilder.mShadowSize, BlurMaskFilter.Blur.OUTER)); - mPaint.setColor(mBuilder.mShadowColor); - canvas.drawPath(mPath, mPaint); - } - mPaint.setMaskFilter(null); - mPaint.setColor(mBuilder.mBackgroundColor); + if (mPath == null) { + return; + } + if (mBuilder.mShadowSize > 0) { + mPaint.setMaskFilter(new BlurMaskFilter(mBuilder.mShadowSize, BlurMaskFilter.Blur.OUTER)); + mPaint.setColor(mBuilder.mShadowColor); canvas.drawPath(mPath, mPaint); } + mPaint.setMaskFilter(null); + mPaint.setColor(mBuilder.mBackgroundColor); + canvas.drawPath(mPath, mPaint); } @Override @@ -205,8 +207,8 @@ public Builder(Context context) { mContext = context; mBackgroundColor = 0xFF000000; mShadowColor = 0x33000000; - mArrowHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 6, mContext.getResources().getDisplayMetrics()); - mRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, mContext.getResources().getDisplayMetrics()); + mArrowHeight = (int) context.getResources().getDimension(R.dimen.dp_6); + mRadius = (int) context.getResources().getDimension(R.dimen.dp_4); mShadowSize = 0; mArrowOffsetX = 0; mArrowOffsetY = 0; diff --git a/app/src/main/java/com/hjq/demo/other/CrashHandler.java b/app/src/main/java/com/hjq/demo/other/CrashHandler.java index 6432eba7..824568e6 100644 --- a/app/src/main/java/com/hjq/demo/other/CrashHandler.java +++ b/app/src/main/java/com/hjq/demo/other/CrashHandler.java @@ -8,14 +8,7 @@ import androidx.annotation.NonNull; import com.hjq.demo.ui.activity.CrashActivity; -import com.hjq.demo.ui.activity.HomeActivity; -import com.hjq.demo.ui.activity.LoginActivity; import com.hjq.demo.ui.activity.RestartActivity; -import com.hjq.demo.ui.activity.SplashActivity; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; /** * author : Android 轮子哥 @@ -29,14 +22,14 @@ public final class CrashHandler implements Thread.UncaughtExceptionHandler { private static final String CRASH_FILE_NAME = "crash_file"; /** Crash 时间记录 */ private static final String KEY_CRASH_TIME = "key_crash_time"; - + /** * 注册 Crash 监听 */ public static void register(Application application) { Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(application)); } - + private final Application mApplication; private final Thread.UncaughtExceptionHandler mNextHandler; @@ -61,11 +54,13 @@ public void uncaughtException(@NonNull Thread thread, @NonNull Throwable throwab // 致命异常标记:如果上次崩溃的时间距离当前崩溃小于 5 分钟,那么判定为致命异常 boolean deadlyCrash = currentCrashTime - lastCrashTime < 1000 * 60 * 5; - // 如果是致命的异常,或者是调试模式下 - if (deadlyCrash || AppConfig.isDebug()) { + if (AppConfig.isDebug()) { CrashActivity.start(mApplication, throwable); } else { - RestartActivity.start(mApplication); + if (!deadlyCrash) { + // 如果不是致命的异常就自动重启应用 + RestartActivity.start(mApplication); + } } // 不去触发系统的崩溃处理(com.android.internal.os.RuntimeInit$KillApplicationHandler) diff --git a/app/src/main/java/com/hjq/demo/other/IntentKey.java b/app/src/main/java/com/hjq/demo/other/IntentKey.java deleted file mode 100644 index 90cf2f5c..00000000 --- a/app/src/main/java/com/hjq/demo/other/IntentKey.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.hjq.demo.other; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/05/09 - * desc : Intent Key 管理 - */ -public final class IntentKey { - - // 常用相关 - - /** id */ - public static final String ID = "id"; - /** token */ - public static final String TOKEN = "token"; - /** 标题 */ - public static final String TITLE = "title"; - /** 索引 */ - public static final String INDEX = "index"; - /** 位置 */ - public static final String POSITION = "position"; - /** 状态 */ - public static final String STATUS = "status"; - /** 类型 */ - public static final String TYPE = "type"; - /** 订单 */ - public static final String ORDER = "order"; - /** 余额 */ - public static final String BALANCE = "balance"; - /** 时间 */ - public static final String TIME = "time"; - /** 代码 */ - public static final String CODE = "code"; - /** URL */ - public static final String URL = "url"; - /** 路径 */ - public static final String PATH = "path"; - /** 数量 */ - public static final String AMOUNT = "amount"; - /** 总数 */ - public static final String COUNT = "count"; - /** 标记 */ - public static final String FLAG = "flag"; - /** 其他 */ - public static final String OTHER = "other"; - - // 个人信息 - - /** 姓名 */ - public static final String NAME = "name"; - /** 年龄 */ - public static final String AGE = "age"; - /** 性别 */ - public static final String SEX = "sex"; - /** 手机 */ - public static final String PHONE = "phone"; - /** 密码 */ - public static final String PASSWORD = "password"; - /** 会员 */ - public static final String VIP = "vip"; - /** 描述 */ - public static final String DESCRIBE = "describe"; - /** 备注 */ - public static final String REMARK = "remark"; - /** 星座 */ - public static final String CONSTELLATION = "constellation"; - - // 地方 - - /** 地址 */ - public static final String ADDRESS = "address"; - /** 省 */ - public static final String PROVINCE = "province"; - /** 市 */ - public static final String CITY = "city"; - /** 区 */ - public static final String AREA = "area"; - - // 文件类型相关 - - /** 文件 */ - public static final String FILE = "file"; - /** 文本 */ - public static final String TEXT = "text"; - /** 图片 */ - public static final String IMAGE = "picture"; - /** 音频 */ - public static final String VOICE = "voice"; - /** 视频 */ - public static final String VIDEO = "video"; - - // 支付相关 - - /** 余额支付 */ - public static final String BALANCE_PAY = "balance_pay"; - /** 微信支付 */ - public static final String WECHAT_PAY = "wechat_pay"; - /** 支付宝支付 */ - public static final String ALI_PAY = "ali_pay"; - /** 银联支付 */ - public static final String UNION_PAY = "union_pay"; -} diff --git a/app/src/main/java/com/hjq/demo/other/KeyboardWatcher.java b/app/src/main/java/com/hjq/demo/other/KeyboardWatcher.java index 7c333ea2..ff935755 100644 --- a/app/src/main/java/com/hjq/demo/other/KeyboardWatcher.java +++ b/app/src/main/java/com/hjq/demo/other/KeyboardWatcher.java @@ -11,6 +11,7 @@ import android.view.WindowManager; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** * author : Android 轮子哥 @@ -24,8 +25,9 @@ public final class KeyboardWatcher implements private Activity mActivity; private View mContentView; + @Nullable private SoftKeyboardStateListener mListeners; - private boolean isSoftKeyboardOpened; + private boolean mSoftKeyboardOpened; private int mStatusBarHeight; public static KeyboardWatcher with(Activity activity) { @@ -62,30 +64,29 @@ public void onGlobalLayout() { mContentView.getWindowVisibleDisplayFrame(r); final int heightDiff = mContentView.getRootView().getHeight() - (r.bottom - r.top); - if (!isSoftKeyboardOpened && heightDiff > mContentView.getRootView().getHeight() / 4) { - isSoftKeyboardOpened = true; + if (!mSoftKeyboardOpened && heightDiff > mContentView.getRootView().getHeight() / 4) { + mSoftKeyboardOpened = true; + if (mListeners == null) { + return; + } if ((mActivity.getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != WindowManager.LayoutParams.FLAG_FULLSCREEN) { - if (mListeners != null) { - mListeners.onSoftKeyboardOpened(heightDiff - mStatusBarHeight); - } + mListeners.onSoftKeyboardOpened(heightDiff - mStatusBarHeight); } else { - if (mListeners != null) { - mListeners.onSoftKeyboardOpened(heightDiff); - } + mListeners.onSoftKeyboardOpened(heightDiff); } - - } else if (isSoftKeyboardOpened && heightDiff < mContentView.getRootView().getHeight() / 4) { - isSoftKeyboardOpened = false; - if (mListeners != null) { - mListeners.onSoftKeyboardClosed(); + } else if (mSoftKeyboardOpened && heightDiff < mContentView.getRootView().getHeight() / 4) { + mSoftKeyboardOpened = false; + if (mListeners == null) { + return; } + mListeners.onSoftKeyboardClosed(); } } /** * 设置软键盘弹出监听 */ - public void setListener(SoftKeyboardStateListener listener) { + public void setListener(@Nullable SoftKeyboardStateListener listener) { mListeners = listener; } diff --git a/app/src/main/java/com/hjq/demo/other/MaterialHeader.java b/app/src/main/java/com/hjq/demo/other/MaterialHeader.java new file mode 100644 index 00000000..ea4657c9 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/other/MaterialHeader.java @@ -0,0 +1,300 @@ +package com.hjq.demo.other; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.util.AttributeSet; +import android.widget.ImageView; + +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; + +import com.hjq.demo.R; +import com.scwang.smart.refresh.header.material.CircleImageView; +import com.scwang.smart.refresh.header.material.MaterialProgressDrawable; +import com.scwang.smart.refresh.layout.api.RefreshHeader; +import com.scwang.smart.refresh.layout.api.RefreshKernel; +import com.scwang.smart.refresh.layout.api.RefreshLayout; +import com.scwang.smart.refresh.layout.constant.RefreshState; +import com.scwang.smart.refresh.layout.constant.SpinnerStyle; +import com.scwang.smart.refresh.layout.simple.SimpleComponent; + +import static android.view.View.MeasureSpec.getSize; + +/** + * author : 树朾 & Android 轮子哥 + * github : https://github.com/scwang90/SmartRefreshLayout/tree/master/refresh-header-material + * time : 2021/02/28 + * desc : Material 风格的刷新球,参考 {@link com.scwang.smart.refresh.header.MaterialHeader} + */ +public final class MaterialHeader extends SimpleComponent implements RefreshHeader { + + /** 刷新球大样式 */ + public static final int BALL_STYLE_LARGE = 0; + /** 刷新球默认样式 */ + public static final int BALL_STYLE_DEFAULT = 1; + + protected static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA; + protected static final float MAX_PROGRESS_ANGLE = 0.8f; + + protected boolean mFinished; + protected int mCircleDiameter; + protected ImageView mCircleView; + protected MaterialProgressDrawable mProgressDrawable; + + protected int mWaveHeight; + protected int mHeadHeight; + protected Path mBezierPath; + protected Paint mBezierPaint; + protected RefreshState mRefreshState; + protected boolean mShowBezierWave = false; + protected boolean mScrollableWhenRefreshing = true; + + public MaterialHeader(Context context) { + this(context, null); + } + + public MaterialHeader(Context context, AttributeSet attrs) { + super(context, attrs, 0); + + mSpinnerStyle = SpinnerStyle.MatchLayout; + setMinimumHeight((int) getResources().getDimension(R.dimen.dp_100)); + + mProgressDrawable = new MaterialProgressDrawable(this); + mProgressDrawable.setColorSchemeColors(0xff0099cc, 0xffff4444, 0xff669900, 0xffaa66cc, 0xffff8800); + mCircleView = new CircleImageView(context, CIRCLE_BG_LIGHT); + mCircleView.setImageDrawable(mProgressDrawable); + mCircleView.setAlpha(0f); + addView(mCircleView); + + mCircleDiameter = (int) getResources().getDimension(R.dimen.dp_40); + + mBezierPath = new Path(); + mBezierPaint = new Paint(); + mBezierPaint.setAntiAlias(true); + mBezierPaint.setStyle(Paint.Style.FILL); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MaterialHeader); + mShowBezierWave = typedArray.getBoolean(R.styleable.MaterialHeader_srlShowBezierWave, mShowBezierWave); + mScrollableWhenRefreshing = typedArray.getBoolean(R.styleable.MaterialHeader_srlScrollableWhenRefreshing, mScrollableWhenRefreshing); + mBezierPaint.setColor(typedArray.getColor(R.styleable.MaterialHeader_srlPrimaryColor, 0xff11bbff)); + if (typedArray.hasValue(R.styleable.MaterialHeader_srlShadowRadius)) { + int radius = typedArray.getDimensionPixelOffset(R.styleable.MaterialHeader_srlShadowRadius, 0); + int color = typedArray.getColor(R.styleable.MaterialHeader_mhShadowColor, 0xff000000); + mBezierPaint.setShadowLayer(radius, 0, 0, color); + setLayerType(LAYER_TYPE_SOFTWARE, null); + } + + mShowBezierWave = typedArray.getBoolean(R.styleable.MaterialHeader_mhShowBezierWave, mShowBezierWave); + mScrollableWhenRefreshing = typedArray.getBoolean(R.styleable.MaterialHeader_mhScrollableWhenRefreshing, mScrollableWhenRefreshing); + if (typedArray.hasValue(R.styleable.MaterialHeader_mhPrimaryColor)) { + mBezierPaint.setColor(typedArray.getColor(R.styleable.MaterialHeader_mhPrimaryColor, 0xff11bbff)); + } + if (typedArray.hasValue(R.styleable.MaterialHeader_mhShadowRadius)) { + int radius = typedArray.getDimensionPixelOffset(R.styleable.MaterialHeader_mhShadowRadius, 0); + int color = typedArray.getColor(R.styleable.MaterialHeader_mhShadowColor, 0xff000000); + mBezierPaint.setShadowLayer(radius, 0, 0, color); + setLayerType(LAYER_TYPE_SOFTWARE, null); + } + + typedArray.recycle(); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.setMeasuredDimension(getSize(widthMeasureSpec), getSize(heightMeasureSpec)); + mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleDiameter, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(mCircleDiameter, MeasureSpec.EXACTLY)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (getChildCount() == 0) { + return; + } + final int width = getMeasuredWidth(); + int circleWidth = mCircleView.getMeasuredWidth(); + int circleHeight = mCircleView.getMeasuredHeight(); + + if (isInEditMode() && mHeadHeight > 0) { + int circleTop = mHeadHeight - circleHeight / 2; + mCircleView.layout((width / 2 - circleWidth / 2), circleTop, + (width / 2 + circleWidth / 2), circleTop + circleHeight); + + mProgressDrawable.showArrow(true); + mProgressDrawable.setStartEndTrim(0f, MAX_PROGRESS_ANGLE); + mProgressDrawable.setArrowScale(1); + mCircleView.setAlpha(1f); + mCircleView.setVisibility(VISIBLE); + } else { + mCircleView.layout((width / 2 - circleWidth / 2), -circleHeight, (width / 2 + circleWidth / 2), 0); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (mShowBezierWave) { + // 重置画笔 + mBezierPath.reset(); + mBezierPath.lineTo(0, mHeadHeight); + // 绘制贝塞尔曲线 + mBezierPath.quadTo(getMeasuredWidth() / 2f, mHeadHeight + mWaveHeight * 1.9f, getMeasuredWidth(), mHeadHeight); + mBezierPath.lineTo(getMeasuredWidth(), 0); + canvas.drawPath(mBezierPath, mBezierPaint); + } + super.dispatchDraw(canvas); + } + + @Override + public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) { + if (!mShowBezierWave) { + kernel.requestDefaultTranslationContentFor(this, false); + } + if (isInEditMode()) { + mWaveHeight = mHeadHeight = height / 2; + } + } + + @Override + public void onMoving(boolean dragging, float percent, int offset, int height, int maxDragHeight) { + if (mRefreshState == RefreshState.Refreshing) { + return; + } + + if (mShowBezierWave) { + mHeadHeight = Math.min(offset, height); + mWaveHeight = Math.max(0, offset - height); + postInvalidate(); + } + + if (dragging || (!mProgressDrawable.isRunning() && !mFinished)) { + + if (mRefreshState != RefreshState.Refreshing) { + float originalDragPercent = 1f * offset / height; + + float dragPercent = Math.min(1f, Math.abs(originalDragPercent)); + float adjustedPercent = (float) Math.max(dragPercent - .4, 0) * 5 / 3; + float extraOs = Math.abs(offset) - height; + float tensionSlingshotPercent = Math.max(0, Math.min(extraOs, (float) height * 2) + / (float) height); + float tensionPercent = (float) ((tensionSlingshotPercent / 4) - Math.pow( + (tensionSlingshotPercent / 4), 2)) * 2f; + float strokeStart = adjustedPercent * .8f; + mProgressDrawable.showArrow(true); + mProgressDrawable.setStartEndTrim(0f, Math.min(MAX_PROGRESS_ANGLE, strokeStart)); + mProgressDrawable.setArrowScale(Math.min(1f, adjustedPercent)); + + float rotation = (-0.25f + .4f * adjustedPercent + tensionPercent * 2) * .5f; + mProgressDrawable.setProgressRotation(rotation); + } + + float targetY = offset / 2f + mCircleDiameter / 2f; + mCircleView.setTranslationY(Math.min(offset, targetY)); + mCircleView.setAlpha(Math.min(1f, 4f * offset / mCircleDiameter)); + } + } + + @Override + public void onReleased(@NonNull RefreshLayout layout, int height, int maxDragHeight) { + mProgressDrawable.start(); + } + + @Override + public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) { + mRefreshState = newState; + if (newState == RefreshState.PullDownToRefresh) { + mFinished = false; + mCircleView.setVisibility(VISIBLE); + mCircleView.setTranslationY(0); + mCircleView.setScaleX(1); + mCircleView.setScaleY(1); + } + } + + @Override + public int onFinish(@NonNull RefreshLayout layout, boolean success) { + mProgressDrawable.stop(); + mCircleView.animate().scaleX(0).scaleY(0); + mFinished = true; + return 0; + } + + /** + * 设置背景色 + */ + public MaterialHeader setProgressBackgroundResource(@ColorRes int id) { + setProgressBackgroundColor(ContextCompat.getColor(getContext(), id)); + return this; + } + + public MaterialHeader setProgressBackgroundColor(@ColorInt int color) { + mCircleView.setBackgroundColor(color); + return this; + } + + /** + * 设置 ColorScheme + * + * @param colors ColorScheme + */ + public MaterialHeader setColorSchemeColors(@ColorInt int... colors) { + mProgressDrawable.setColorSchemeColors(colors); + return this; + } + + /** + * 设置 ColorScheme + * + * @param ids ColorSchemeResources + */ + public MaterialHeader setColorSchemeResources(@ColorRes int... ids) { + int[] colors = new int[ids.length]; + for (int i = 0; i < ids.length; i++) { + colors[i] = ContextCompat.getColor(getContext(), ids[i]); + } + return setColorSchemeColors(colors); + } + + /** + * 设置刷新球样式 + * + * @param style 可传入:{@link #BALL_STYLE_LARGE,#BALL_STYLE_DEFAULT} + */ + public MaterialHeader setBallStyle(int style) { + if (style != BALL_STYLE_LARGE && style != BALL_STYLE_DEFAULT) { + return this; + } + if (style == BALL_STYLE_LARGE) { + mCircleDiameter = (int) getResources().getDimension(R.dimen.dp_56); + } else { + mCircleDiameter = (int) getResources().getDimension(R.dimen.dp_40); + } + // force the bounds of the progress circle inside the circle view to + // update by setting it to null before updating its size and then + // re-setting it + mCircleView.setImageDrawable(null); + mProgressDrawable.updateSizes(style); + mCircleView.setImageDrawable(mProgressDrawable); + return this; + } + + /** + * 是否显示贝塞尔图形 + */ + public MaterialHeader setShowBezierWave(boolean show) { + mShowBezierWave = show; + return this; + } + + /** + * 设置实在正在刷新的时候可以上下滚动 Header + */ + public MaterialHeader setScrollableWhenRefreshing(boolean scrollable) { + mScrollableWhenRefreshing = scrollable; + return this; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/other/SmartBallPulseFooter.java b/app/src/main/java/com/hjq/demo/other/SmartBallPulseFooter.java index 542a256a..fcff3644 100644 --- a/app/src/main/java/com/hjq/demo/other/SmartBallPulseFooter.java +++ b/app/src/main/java/com/hjq/demo/other/SmartBallPulseFooter.java @@ -6,7 +6,6 @@ import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; -import android.util.TypedValue; import android.view.animation.AccelerateDecelerateInterpolator; import androidx.annotation.ColorInt; @@ -19,7 +18,6 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.constant.SpinnerStyle; import com.scwang.smart.refresh.layout.simple.SimpleComponent; -import com.scwang.smart.refresh.layout.util.SmartUtil; /** * author : 树朾 & Android 轮子哥 @@ -55,7 +53,7 @@ public SmartBallPulseFooter(Context context) { public SmartBallPulseFooter(Context context, @Nullable AttributeSet attrs) { super(context, attrs, 0); - setMinimumHeight(SmartUtil.dp2px(60)); + setMinimumHeight((int) getResources().getDimension(R.dimen.dp_60)); mPaint = new Paint(); mPaint.setColor(Color.WHITE); @@ -64,8 +62,8 @@ public SmartBallPulseFooter(Context context, @Nullable AttributeSet attrs) { mSpinnerStyle = SpinnerStyle.Translate; - mCircleSpacing = SmartUtil.dp2px(2); - mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics())); + mCircleSpacing = getResources().getDimension(R.dimen.dp_2); + mPaint.setTextSize(getResources().getDimension(R.dimen.sp_14)); mTextWidth = mPaint.measureText(getContext().getString(R.string.common_no_more_data)); } @@ -76,7 +74,7 @@ protected void dispatchDraw(Canvas canvas) { if (mNoMoreData) { mPaint.setColor(0xFF898989); canvas.drawText(getContext().getString(R.string.common_no_more_data),(width - mTextWidth) / 2,(height - mPaint.getTextSize()) / 2, mPaint); - } else{ + } else { float radius = (Math.min(width, height) - mCircleSpacing * 2) / 7; float x = width / 2f - (radius * 2 + mCircleSpacing); float y = height / 2f; @@ -172,4 +170,4 @@ public SmartBallPulseFooter setAnimatingColor(@ColorInt int color) { } return this; } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/other/TitleBarStyle.java b/app/src/main/java/com/hjq/demo/other/TitleBarStyle.java new file mode 100644 index 00000000..5a5954ef --- /dev/null +++ b/app/src/main/java/com/hjq/demo/other/TitleBarStyle.java @@ -0,0 +1,98 @@ +package com.hjq.demo.other; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.view.Gravity; +import android.widget.TextView; + +import androidx.appcompat.widget.AppCompatTextView; +import androidx.core.content.ContextCompat; + +import com.hjq.bar.style.LightBarStyle; +import com.hjq.demo.R; +import com.hjq.widget.view.PressAlphaTextView; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/02/27 + * desc : 标题栏初始器 + */ +public final class TitleBarStyle extends LightBarStyle { + + @Override + public TextView newTitleView(Context context) { + return new AppCompatTextView(context); + } + + @Override + public TextView newLeftView(Context context) { + return new PressAlphaTextView(context); + } + + @Override + public TextView newRightView(Context context) { + return new PressAlphaTextView(context); + } + + @Override + public Drawable getTitleBarBackground(Context context) { + return new ColorDrawable(ContextCompat.getColor(context, R.color.common_primary_color)); + } + + @Override + public Drawable getBackButtonDrawable(Context context) { + return ContextCompat.getDrawable(context, R.drawable.arrows_left_ic); + } + + @Override + public Drawable getLeftTitleBackground(Context context) { + return null; + } + + @Override + public Drawable getRightTitleBackground(Context context) { + return null; + } + + @Override + public int getChildHorizontalPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.dp_12); + } + + @Override + public int getChildVerticalPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.dp_14); + } + + @Override + public float getTitleSize(Context context) { + return context.getResources().getDimension(R.dimen.sp_15); + } + + @Override + public float getLeftTitleSize(Context context) { + return context.getResources().getDimension(R.dimen.sp_13); + } + + @Override + public float getRightTitleSize(Context context) { + return context.getResources().getDimension(R.dimen.sp_13); + } + + @Override + public int getTitleIconPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.dp_2); + } + + @Override + public int getLeftIconPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.dp_2); + } + + @Override + public int getRightIconPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.dp_2); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/other/ToastInterceptor.java b/app/src/main/java/com/hjq/demo/other/ToastLogInterceptor.java similarity index 86% rename from app/src/main/java/com/hjq/demo/other/ToastInterceptor.java rename to app/src/main/java/com/hjq/demo/other/ToastLogInterceptor.java index f89a40e3..46dfcadf 100644 --- a/app/src/main/java/com/hjq/demo/other/ToastInterceptor.java +++ b/app/src/main/java/com/hjq/demo/other/ToastLogInterceptor.java @@ -1,10 +1,9 @@ package com.hjq.demo.other; -import android.widget.Toast; import com.hjq.demo.action.ToastAction; -import com.hjq.toast.IToastInterceptor; import com.hjq.toast.ToastUtils; +import com.hjq.toast.config.IToastInterceptor; import timber.log.Timber; @@ -14,10 +13,10 @@ * time : 2020/11/04 * desc : 自定义 Toast 拦截器(用于追踪 Toast 调用的位置) */ -public final class ToastInterceptor implements IToastInterceptor { +public final class ToastLogInterceptor implements IToastInterceptor { @Override - public boolean intercept(Toast toast, CharSequence text) { + public boolean intercept(CharSequence text) { if (AppConfig.isLogEnable()) { // 获取调用的堆栈信息 StackTraceElement[] stackTrace = new Throwable().getStackTrace(); diff --git a/app/src/main/java/com/hjq/demo/other/ToastStyle.java b/app/src/main/java/com/hjq/demo/other/ToastStyle.java new file mode 100644 index 00000000..418e903d --- /dev/null +++ b/app/src/main/java/com/hjq/demo/other/ToastStyle.java @@ -0,0 +1,43 @@ +package com.hjq.demo.other; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.util.TypedValue; + +import com.hjq.demo.R; +import com.hjq.toast.style.BlackToastStyle; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/02/27 + * desc : Toast 样式配置 + */ +public final class ToastStyle extends BlackToastStyle { + + @Override + protected Drawable getBackgroundDrawable(Context context) { + GradientDrawable drawable = new GradientDrawable(); + // 设置颜色 + drawable.setColor(0X88000000); + // 设置圆角 + drawable.setCornerRadius(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (int) context.getResources().getDimension(R.dimen.button_circle_size), context.getResources().getDisplayMetrics())); + return drawable; + } + + @Override + protected float getTextSize(Context context) { + return context.getResources().getDimension(R.dimen.sp_14); + } + + @Override + protected int getHorizontalPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.sp_24); + } + + @Override + protected int getVerticalPadding(Context context) { + return (int) context.getResources().getDimension(R.dimen.sp_16); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java index e17efe76..476ee77f 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/AboutActivity.java @@ -17,12 +17,8 @@ protected int getLayoutId() { } @Override - protected void initView() { - - } + protected void initView() {} @Override - protected void initData() { - - } + protected void initData() {} } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/BrowserActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/BrowserActivity.java index aa5576de..5662873d 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/BrowserActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/BrowserActivity.java @@ -16,9 +16,8 @@ import com.hjq.demo.R; import com.hjq.demo.action.StatusAction; import com.hjq.demo.aop.CheckNet; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.app.AppActivity; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.widget.BrowserView; import com.hjq.demo.widget.StatusLayout; import com.scwang.smart.refresh.layout.SmartRefreshLayout; @@ -34,14 +33,16 @@ public final class BrowserActivity extends AppActivity implements StatusAction, OnRefreshListener { + private static final String INTENT_KEY_IN_URL = "url"; + @CheckNet - @DebugLog + @Log public static void start(Context context, String url) { if (TextUtils.isEmpty(url)) { return; } Intent intent = new Intent(context, BrowserActivity.class); - intent.putExtra(IntentKey.URL, url); + intent.putExtra(INTENT_KEY_IN_URL, url); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -75,9 +76,9 @@ protected void initView() { protected void initData() { showLoading(); - mBrowserView.setBrowserViewClient(new MyBrowserViewClient()); - mBrowserView.setBrowserChromeClient(new MyBrowserChromeClient(mBrowserView)); - mBrowserView.loadUrl(getString(IntentKey.URL)); + mBrowserView.setBrowserViewClient(new AppBrowserViewClient()); + mBrowserView.setBrowserChromeClient(new AppBrowserChromeClient(mBrowserView)); + mBrowserView.loadUrl(getString(INTENT_KEY_IN_URL)); } @Override @@ -117,7 +118,7 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { reload(); } - private class MyBrowserViewClient extends BrowserView.BrowserViewClient { + private class AppBrowserViewClient extends BrowserView.BrowserViewClient { /** * 网页加载错误时回调,这个方法会在 onPageFinished 之前调用 @@ -125,7 +126,7 @@ private class MyBrowserViewClient extends BrowserView.BrowserViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // 这里为什么要用延迟呢?因为加载出错之后会先调用 onReceivedError 再调用 onPageFinished - post(() -> showError(v -> reload())); + post(() -> showError(listener -> reload())); } /** @@ -147,9 +148,9 @@ public void onPageFinished(WebView view, String url) { } } - private class MyBrowserChromeClient extends BrowserView.BrowserChromeClient { + private class AppBrowserChromeClient extends BrowserView.BrowserChromeClient { - private MyBrowserChromeClient(BrowserView view) { + private AppBrowserChromeClient(BrowserView view) { super(view); } @@ -158,16 +159,18 @@ private MyBrowserChromeClient(BrowserView view) { */ @Override public void onReceivedTitle(WebView view, String title) { - if (title != null) { - setTitle(title); + if (title == null) { + return; } + setTitle(title); } @Override public void onReceivedIcon(WebView view, Bitmap icon) { - if (icon != null) { - setRightIcon(new BitmapDrawable(getResources(), icon)); + if (icon == null) { + return; } + setRightIcon(new BitmapDrawable(getResources(), icon)); } /** diff --git a/app/src/main/java/com/hjq/demo/ui/activity/CameraActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/CameraActivity.java index 7b4b325c..26d1db1e 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/CameraActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/CameraActivity.java @@ -11,11 +11,10 @@ import com.hjq.base.BaseActivity; import com.hjq.demo.R; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.Permissions; import com.hjq.demo.app.AppActivity; import com.hjq.demo.other.AppConfig; -import com.hjq.demo.other.IntentKey; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; @@ -32,28 +31,47 @@ */ public final class CameraActivity extends AppActivity { + public static final String INTENT_KEY_IN_FILE = "file"; + public static final String INTENT_KEY_IN_VIDEO = "video"; + + public static final String INTENT_KEY_OUT_ERROR = "error"; + public static void start(BaseActivity activity, OnCameraListener listener) { start(activity, false, listener); } - @DebugLog - @Permissions({Permission.MANAGE_EXTERNAL_STORAGE, Permission.CAMERA}) + @Log + @Permissions({Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE, Permission.CAMERA}) public static void start(BaseActivity activity, boolean video, OnCameraListener listener) { File file = createCameraFile(video); Intent intent = new Intent(activity, CameraActivity.class); - intent.putExtra(IntentKey.FILE, file); - intent.putExtra(IntentKey.VIDEO, video); + intent.putExtra(INTENT_KEY_IN_FILE, file); + intent.putExtra(INTENT_KEY_IN_VIDEO, video); activity.startActivityForResult(intent, (resultCode, data) -> { - if (listener == null) { return; } - if (resultCode == RESULT_OK && file.isFile()) { - listener.onSelected(file); - return; + switch (resultCode) { + case RESULT_OK: + if (file.isFile()) { + listener.onSelected(file); + } else { + listener.onCancel(); + } + break; + case RESULT_ERROR: + String details; + if (data == null || (details = data.getStringExtra(INTENT_KEY_OUT_ERROR)) == null) { + details = activity.getString(R.string.common_unknown_error); + } + listener.onError(details); + break; + case RESULT_CANCELED: + default: + listener.onCancel(); + break; } - listener.onCancel(); }); } @@ -63,58 +81,57 @@ protected int getLayoutId() { } @Override - protected void initView() { - - } + protected void initView() {} @Override protected void initData() { - Intent intent; + Intent intent = new Intent(); // 启动系统相机 - if (getBoolean(IntentKey.VIDEO)) { + if (getBoolean(INTENT_KEY_IN_VIDEO)) { // 录制视频 - intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); + intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); } else { // 拍摄照片 - intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); } - if (XXPermissions.isGrantedPermission(this, new String[]{Permission.MANAGE_EXTERNAL_STORAGE, Permission.CAMERA}) - && intent.resolveActivity(getPackageManager()) != null) { - File file = getSerializable(IntentKey.FILE); - if (file == null) { - toast(R.string.camera_image_error); - setResult(RESULT_CANCELED); - finish(); - return; - } - Uri imageUri; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - // 通过 FileProvider 创建一个 Content 类型的 Uri 文件 - imageUri = FileProvider.getUriForFile(this, AppConfig.getPackageName() + ".provider", file); - } else { - imageUri = Uri.fromFile(file); - } - // 对目标应用临时授权该 Uri 所代表的文件 - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - // 将拍取的照片保存到指定 Uri - intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); - startActivityForResult(intent, (resultCode, data) -> { - if (resultCode == RESULT_OK) { - // 通知系统多媒体扫描该文件,否则会导致拍摄出来的图片或者视频没有及时显示到相册中,而需要通过重启手机才能看到 - MediaScannerConnection.scanFile(getApplicationContext(), new String[]{file.getPath()}, null, null); - } - setResult(resultCode); - finish(); - }); - } else { - toast(R.string.camera_launch_fail); + if (intent.resolveActivity(getPackageManager()) == null || + !XXPermissions.isGranted(this, Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE, Permission.CAMERA)) { + setResult(RESULT_ERROR, new Intent().putExtra(INTENT_KEY_OUT_ERROR, getString(R.string.camera_launch_fail))); finish(); + return; } + + File file = getSerializable(INTENT_KEY_IN_FILE); + if (file == null) { + setResult(RESULT_ERROR, new Intent().putExtra(INTENT_KEY_OUT_ERROR, getString(R.string.camera_image_error))); + finish(); + return; + } + + Uri imageUri; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + // 通过 FileProvider 创建一个 Content 类型的 Uri 文件 + imageUri = FileProvider.getUriForFile(this, AppConfig.getPackageName() + ".provider", file); + } else { + imageUri = Uri.fromFile(file); + } + // 对目标应用临时授权该 Uri 所代表的文件 + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + // 将拍取的照片保存到指定 Uri + intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); + startActivityForResult(intent, (resultCode, data) -> { + if (resultCode == RESULT_OK) { + // 通知系统多媒体扫描该文件,否则会导致拍摄出来的图片或者视频没有及时显示到相册中,而需要通过重启手机才能看到 + MediaScannerConnection.scanFile(getApplicationContext(), new String[]{file.getPath()}, null, null); + } + setResult(resultCode); + finish(); + }); } /** - * 创建一个拍照图片文件对象 + * 创建一个拍照图片文件路径 */ private static File createCameraFile(boolean video) { File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "Camera"); @@ -141,6 +158,13 @@ public interface OnCameraListener { */ void onSelected(File file); + /** + * 错误回调 + * + * @param details 错误详情 + */ + void onError(String details); + /** * 取消回调 */ diff --git a/app/src/main/java/com/hjq/demo/ui/activity/CrashActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/CrashActivity.java index 2f1a7bf8..fbb1dee9 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/CrashActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/CrashActivity.java @@ -6,16 +6,17 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.content.res.Resources; import android.os.Build; import android.text.SpannableStringBuilder; import android.text.Spanned; +import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.text.style.UnderlineSpan; import android.util.DisplayMetrics; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; @@ -25,9 +26,9 @@ import com.hjq.demo.app.AppActivity; import com.hjq.demo.manager.ThreadPoolManager; import com.hjq.demo.other.AppConfig; -import com.hjq.demo.other.IntentKey; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; +import com.tencent.bugly.crashreport.CrashReport; import java.io.PrintWriter; import java.io.StringWriter; @@ -49,6 +50,12 @@ */ public final class CrashActivity extends AppActivity { + private static final String INTENT_KEY_IN_THROWABLE = "throwable"; + + /** 系统包前缀列表 */ + private static final String[] SYSTEM_PACKAGE_PREFIX_LIST = new String[] + {"android", "com.android", "androidx", "com.google.android", "java", "javax", "dalvik", "kotlin"}; + /** 报错代码行数正则表达式 */ private static final Pattern CODE_REGEX = Pattern.compile("\\(\\w+\\.\\w+:\\d+\\)"); @@ -57,7 +64,7 @@ public static void start(Application application, Throwable throwable) { return; } Intent intent = new Intent(application, CrashActivity.class); - intent.putExtra(IntentKey.OTHER, throwable); + intent.putExtra(INTENT_KEY_IN_THROWABLE, throwable); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); application.startActivity(intent); } @@ -89,7 +96,7 @@ protected void initView() { @SuppressWarnings("ResultOfMethodCallIgnored") @Override protected void initData() { - Throwable throwable = getSerializable(IntentKey.OTHER); + Throwable throwable = getSerializable(INTENT_KEY_IN_THROWABLE); if (throwable == null) { return; } @@ -107,23 +114,45 @@ protected void initData() { Matcher matcher = CODE_REGEX.matcher(mStackTrace); SpannableStringBuilder spannable = new SpannableStringBuilder(mStackTrace); if (spannable.length() > 0) { - for (int index = 0; matcher.find(); index++) { + while (matcher.find()) { // 不包含左括号( int start = matcher.start() + "(".length(); // 不包含右括号 ) int end = matcher.end() - ")".length(); + + // 代码信息颜色 + int codeColor = 0xFF999999; + int lineIndex = mStackTrace.lastIndexOf("at ", start); + if (lineIndex != -1) { + String lineData = spannable.subSequence(lineIndex, start).toString(); + if (TextUtils.isEmpty(lineData)) { + continue; + } + // 是否高亮代码行数 + boolean highlight = true; + for (String packagePrefix : SYSTEM_PACKAGE_PREFIX_LIST) { + if (lineData.startsWith("at " + packagePrefix)) { + highlight = false; + break; + } + } + if (highlight) { + codeColor = 0xFF287BDE; + } + } + // 设置前景 - spannable.setSpan(new ForegroundColorSpan(index < 3 ? 0xFF287BDE : 0xFF999999), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannable.setSpan(new ForegroundColorSpan(codeColor), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置下划线 spannable.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } mMessageView.setText(spannable); } - Resources res = getResources(); - DisplayMetrics displayMetrics = res.getDisplayMetrics(); + DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); int screenWidth = displayMetrics.widthPixels; int screenHeight = displayMetrics.heightPixels; + float smallestWidth = Math.min(screenWidth, screenHeight) / displayMetrics.density; String targetResource; if (displayMetrics.densityDpi > 480) { @@ -147,7 +176,9 @@ protected void initData() { builder.append("\n屏幕宽高:\t").append(screenWidth).append(" x ").append(screenHeight) .append("\n屏幕密度:\t").append(displayMetrics.densityDpi) - .append("\n目标资源:\t").append(targetResource); + .append("\n密度像素:\t").append(displayMetrics.density) + .append("\n目标资源:\t").append(targetResource) + .append("\n最小宽度:\t").append((int) smallestWidth); builder.append("\n安卓版本:\t").append(Build.VERSION.RELEASE) .append("\nAPI 版本:\t").append(Build.VERSION.SDK_INT) @@ -165,18 +196,18 @@ protected void initData() { List permissions = Arrays.asList(packageInfo.requestedPermissions); - if (permissions.contains(Permission.MANAGE_EXTERNAL_STORAGE)) { - builder.append("\n存储权限:\t").append(XXPermissions.isGrantedPermission(this, Permission.MANAGE_EXTERNAL_STORAGE) ? "已获得" : "未获得"); + if (permissions.contains(Permission.READ_EXTERNAL_STORAGE) || permissions.contains(Permission.WRITE_EXTERNAL_STORAGE)) { + builder.append("\n存储权限:\t").append(XXPermissions.isGranted(this, Permission.Group.STORAGE) ? "已获得" : "未获得"); } if (permissions.contains(Permission.ACCESS_FINE_LOCATION) || permissions.contains(Permission.ACCESS_COARSE_LOCATION)) { builder.append("\n定位权限:\t"); - if (XXPermissions.isGrantedPermission(this, Permission.Group.LOCATION)) { + if (XXPermissions.isGranted(this, Permission.ACCESS_FINE_LOCATION, Permission.ACCESS_COARSE_LOCATION)) { builder.append("精确、粗略"); } else { - if (XXPermissions.isGrantedPermission(this, Permission.ACCESS_FINE_LOCATION)) { + if (XXPermissions.isGranted(this, Permission.ACCESS_FINE_LOCATION)) { builder.append("精确"); - } else if (XXPermissions.isGrantedPermission(this, Permission.ACCESS_COARSE_LOCATION)) { + } else if (XXPermissions.isGranted(this, Permission.ACCESS_COARSE_LOCATION)) { builder.append("粗略"); } else { builder.append("未获得"); @@ -185,19 +216,19 @@ protected void initData() { } if (permissions.contains(Permission.CAMERA)) { - builder.append("\n相机权限:\t").append(XXPermissions.isGrantedPermission(this, Permission.CAMERA) ? "已获得" : "未获得"); + builder.append("\n相机权限:\t").append(XXPermissions.isGranted(this, Permission.CAMERA) ? "已获得" : "未获得"); } if (permissions.contains(Permission.RECORD_AUDIO)) { - builder.append("\n录音权限:\t").append(XXPermissions.isGrantedPermission(this, Permission.RECORD_AUDIO) ? "已获得" : "未获得"); + builder.append("\n录音权限:\t").append(XXPermissions.isGranted(this, Permission.RECORD_AUDIO) ? "已获得" : "未获得"); } if (permissions.contains(Permission.SYSTEM_ALERT_WINDOW)) { - builder.append("\n悬浮窗权限:\t").append(XXPermissions.isGrantedPermission(this, Permission.SYSTEM_ALERT_WINDOW) ? "已获得" : "未获得"); + builder.append("\n悬浮窗权限:\t").append(XXPermissions.isGranted(this, Permission.SYSTEM_ALERT_WINDOW) ? "已获得" : "未获得"); } if (permissions.contains(Permission.REQUEST_INSTALL_PACKAGES)) { - builder.append("\n安装包权限:\t").append(XXPermissions.isGrantedPermission(this, Permission.REQUEST_INSTALL_PACKAGES) ? "已获得" : "未获得"); + builder.append("\n安装包权限:\t").append(XXPermissions.isGranted(this, Permission.REQUEST_INSTALL_PACKAGES) ? "已获得" : "未获得"); } if (permissions.contains(Manifest.permission.INTERNET)) { @@ -217,7 +248,9 @@ protected void initData() { mInfoView.setText(builder); } - } catch (PackageManager.NameNotFoundException ignored) {} + } catch (PackageManager.NameNotFoundException e) { + CrashReport.postCatchedException(e); + } } @SingleClick @@ -233,16 +266,23 @@ public void onClick(View view) { intent.putExtra(Intent.EXTRA_TEXT, mStackTrace); startActivity(Intent.createChooser(intent, "")); } else if (viewId == R.id.iv_crash_restart) { - // 重启应用 - RestartActivity.restart(this); - finish(); + onBackPressed(); } } @Override public void onBackPressed() { - // 按返回键重启应用 - onClick(findViewById(R.id.iv_crash_restart)); + // 重启应用 + RestartActivity.restart(this); + finish(); + } + + @NonNull + @Override + protected ImmersionBar createStatusBarConfig() { + return super.createStatusBarConfig() + // 指定导航栏背景颜色 + .navigationBarColor(R.color.white); } /** diff --git a/app/src/main/java/com/hjq/demo/ui/activity/DialogActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/DialogActivity.java index 98f32221..860bcb0a 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/DialogActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/DialogActivity.java @@ -14,7 +14,6 @@ import com.hjq.demo.manager.DialogManager; import com.hjq.demo.ui.dialog.AddressDialog; import com.hjq.demo.ui.dialog.DateDialog; -import com.hjq.demo.ui.dialog.HintDialog; import com.hjq.demo.ui.dialog.InputDialog; import com.hjq.demo.ui.dialog.MenuDialog; import com.hjq.demo.ui.dialog.MessageDialog; @@ -23,13 +22,15 @@ import com.hjq.demo.ui.dialog.SelectDialog; import com.hjq.demo.ui.dialog.ShareDialog; import com.hjq.demo.ui.dialog.TimeDialog; +import com.hjq.demo.ui.dialog.TipsDialog; import com.hjq.demo.ui.dialog.UpdateDialog; import com.hjq.demo.ui.dialog.WaitDialog; import com.hjq.demo.ui.popup.ListPopup; -import com.hjq.demo.wxapi.WXEntryActivity; import com.hjq.umeng.Platform; import com.hjq.umeng.UmengClient; import com.hjq.umeng.UmengShare; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.media.UMWeb; import java.util.ArrayList; import java.util.Calendar; @@ -239,24 +240,24 @@ public void onCancel(BaseDialog dialog) { } else if (viewId == R.id.btn_dialog_succeed_toast) { // 成功对话框 - new HintDialog.Builder(this) - .setIcon(HintDialog.ICON_FINISH) + new TipsDialog.Builder(this) + .setIcon(TipsDialog.ICON_FINISH) .setMessage("完成") .show(); } else if (viewId == R.id.btn_dialog_fail_toast) { // 失败对话框 - new HintDialog.Builder(this) - .setIcon(HintDialog.ICON_ERROR) + new TipsDialog.Builder(this) + .setIcon(TipsDialog.ICON_ERROR) .setMessage("错误") .show(); } else if (viewId == R.id.btn_dialog_warn_toast) { // 警告对话框 - new HintDialog.Builder(this) - .setIcon(HintDialog.ICON_WARNING) + new TipsDialog.Builder(this) + .setIcon(TipsDialog.ICON_WARNING) .setMessage("警告") .show(); @@ -407,18 +408,16 @@ public void onCancel(BaseDialog dialog) { } else if (viewId == R.id.btn_dialog_share) { - toast("记得改好第三方 AppID 和 AppKey,否则会调不起来哦"); - toast("也别忘了改微信 " + WXEntryActivity.class.getSimpleName() + " 类所在的包名哦"); + toast("记得改好第三方 AppID 和 Secret,否则会调不起来哦"); + + UMWeb content = new UMWeb("https://github.com/getActivity/AndroidProject"); + content.setTitle("Github"); + content.setThumb(new UMImage(this, R.mipmap.launcher_ic)); + content.setDescription(getString(R.string.app_name)); + // 分享对话框 new ShareDialog.Builder(this) - // 分享标题 - .setShareTitle("Github") - // 分享描述 - .setShareDescription("AndroidProject") - // 分享缩略图 - .setShareLogo(R.mipmap.launcher_ic) - // 分享链接 - .setShareUrl("https://github.com/getActivity/AndroidProject") + .setShareLink(content) .setListener(new UmengShare.OnShareListener() { @Override @@ -428,7 +427,7 @@ public void onSucceed(Platform platform) { @Override public void onError(Platform platform, Throwable t) { - toast("分享出错"); + toast(t.getMessage()); } @Override @@ -447,11 +446,11 @@ public void onCancel(Platform platform) { // 是否强制更新 .setForceUpdate(false) // 更新日志 - .setUpdateLog("到底更新了啥\n到底更新了啥\n到底更新了啥\n到底更新了啥\n到底更新了啥") + .setUpdateLog("到底更新了啥\n到底更新了啥\n到底更新了啥\n到底更新了啥\n到底更新了啥\n到底更新了啥") // 下载 URL - .setDownloadUrl("https://dldir1.qq.com/weixin/android/weixin7014android1660.apk") + .setDownloadUrl("https://dldir1.qq.com/weixin/android/weixin807android1920_arm64.apk") // 文件 MD5 - .setFileMd5("6ec99cb762ffd9158e8b27dc33d9680d") + .setFileMd5("df2f045dfa854d8461d9cefe08b813c8") .show(); } else if (viewId == R.id.btn_dialog_safe) { @@ -511,13 +510,6 @@ public void onCancel(BaseDialog dialog) { } } - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - // 友盟分享回调 - UmengClient.onActivityResult(this, requestCode, resultCode, data); - } - @Override public void onRightClick(View view) { // 菜单弹窗 @@ -528,4 +520,11 @@ public void onRightClick(View view) { .setListener((ListPopup.OnListener) (popupWindow, position, s) -> toast("点击了:" + s)) .showAsDropDown(view); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + // 友盟回调 + UmengClient.onActivityResult(this, requestCode, resultCode, data); + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/GuideActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/GuideActivity.java index 0062ae8e..a03a4a2b 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/GuideActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/GuideActivity.java @@ -1,9 +1,13 @@ package com.hjq.demo.ui.activity; import android.view.View; +import android.view.animation.Animation; +import android.view.animation.ScaleAnimation; +import androidx.annotation.NonNull; import androidx.viewpager2.widget.ViewPager2; +import com.gyf.immersionbar.ImmersionBar; import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; @@ -41,9 +45,6 @@ protected void initView() { @Override protected void initData() { mAdapter = new GuideAdapter(this); - mAdapter.addItem(R.drawable.guide_1_bg); - mAdapter.addItem(R.drawable.guide_2_bg); - mAdapter.addItem(R.drawable.guide_3_bg); mViewPager.setAdapter(mAdapter); mViewPager.registerOnPageChangeCallback(mCallback); mIndicatorView.setViewPager(mViewPager); @@ -64,22 +65,44 @@ protected void onDestroy() { mViewPager.unregisterOnPageChangeCallback(mCallback); } + @NonNull + @Override + protected ImmersionBar createStatusBarConfig() { + return super.createStatusBarConfig() + // 指定导航栏背景颜色 + .navigationBarColor(R.color.white); + } + private final ViewPager2.OnPageChangeCallback mCallback = new ViewPager2.OnPageChangeCallback() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if (mViewPager.getCurrentItem() == mAdapter.getItemCount() - 1 && positionOffsetPixels > 0) { - mIndicatorView.setVisibility(View.VISIBLE); - mCompleteView.setVisibility(View.INVISIBLE); + if (mViewPager.getCurrentItem() != mAdapter.getCount() - 1 || positionOffsetPixels <= 0) { + return; } + + mIndicatorView.setVisibility(View.VISIBLE); + mCompleteView.setVisibility(View.INVISIBLE); + mCompleteView.clearAnimation(); } @Override public void onPageScrollStateChanged(int state) { - if (state == ViewPager2.SCROLL_STATE_IDLE) { - boolean last = mViewPager.getCurrentItem() == mAdapter.getItemCount() - 1; - mIndicatorView.setVisibility(last ? View.INVISIBLE : View.VISIBLE); - mCompleteView.setVisibility(last ? View.VISIBLE : View.INVISIBLE); + if (state != ViewPager2.SCROLL_STATE_IDLE) { + return; + } + + boolean lastItem = mViewPager.getCurrentItem() == mAdapter.getCount() - 1; + mIndicatorView.setVisibility(lastItem ? View.INVISIBLE : View.VISIBLE); + mCompleteView.setVisibility(lastItem ? View.VISIBLE : View.INVISIBLE); + if (lastItem) { + // 按钮呼吸动效 + ScaleAnimation animation = new ScaleAnimation(1.0f, 1.1f, 1.0f, 1.1f, + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + animation.setDuration(350); + animation.setRepeatMode(Animation.REVERSE); + animation.setRepeatCount(Animation.INFINITE); + mCompleteView.startAnimation(animation); } } }; diff --git a/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java index 5771b20a..4d02b33c 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/HomeActivity.java @@ -3,24 +3,25 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.view.Menu; -import android.view.MenuItem; +import android.os.Bundle; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; -import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.gyf.immersionbar.ImmersionBar; import com.hjq.base.FragmentPagerAdapter; import com.hjq.demo.R; import com.hjq.demo.app.AppActivity; import com.hjq.demo.app.AppFragment; import com.hjq.demo.manager.ActivityManager; import com.hjq.demo.other.DoubleClickHelper; -import com.hjq.demo.other.IntentKey; +import com.hjq.demo.ui.adapter.NavigationAdapter; import com.hjq.demo.ui.fragment.FindFragment; import com.hjq.demo.ui.fragment.HomeFragment; -import com.hjq.demo.ui.fragment.MeFragment; import com.hjq.demo.ui.fragment.MessageFragment; +import com.hjq.demo.ui.fragment.MineFragment; /** * author : Android 轮子哥 @@ -29,11 +30,15 @@ * desc : 首页界面 */ public final class HomeActivity extends AppActivity - implements BottomNavigationView.OnNavigationItemSelectedListener { + implements NavigationAdapter.OnNavigationListener { + + private static final String INTENT_KEY_IN_FRAGMENT_INDEX = "fragmentIndex"; + private static final String INTENT_KEY_IN_FRAGMENT_CLASS = "fragmentClass"; private ViewPager mViewPager; - private BottomNavigationView mBottomNavigationView; + private RecyclerView mNavigationView; + private NavigationAdapter mNavigationAdapter; private FragmentPagerAdapter> mPagerAdapter; public static void start(Context context) { @@ -42,7 +47,7 @@ public static void start(Context context) { public static void start(Context context, Class> fragmentClass) { Intent intent = new Intent(context, HomeActivity.class); - intent.putExtra(IntentKey.INDEX, fragmentClass); + intent.putExtra(INTENT_KEY_IN_FRAGMENT_CLASS, fragmentClass); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -57,18 +62,19 @@ protected int getLayoutId() { @Override protected void initView() { mViewPager = findViewById(R.id.vp_home_pager); - mBottomNavigationView = findViewById(R.id.bv_home_navigation); - - // 不使用图标默认变色 - mBottomNavigationView.setItemIconTintList(null); - // 设置导航栏条目点击事件 - mBottomNavigationView.setOnNavigationItemSelectedListener(this); - - // 屏蔽底部导航栏长按文本提示 - Menu menu = mBottomNavigationView.getMenu(); - for (int i = 0; i < menu.size(); i++) { - mBottomNavigationView.findViewById(menu.getItem(i).getItemId()).setOnLongClickListener(v -> true); - } + mNavigationView = findViewById(R.id.rv_home_navigation); + + mNavigationAdapter = new NavigationAdapter(this); + mNavigationAdapter.addItem(new NavigationAdapter.MenuItem(getString(R.string.home_nav_index), + ContextCompat.getDrawable(this, R.drawable.home_home_selector))); + mNavigationAdapter.addItem(new NavigationAdapter.MenuItem(getString(R.string.home_nav_found), + ContextCompat.getDrawable(this, R.drawable.home_found_selector))); + mNavigationAdapter.addItem(new NavigationAdapter.MenuItem(getString(R.string.home_nav_message), + ContextCompat.getDrawable(this, R.drawable.home_message_selector))); + mNavigationAdapter.addItem(new NavigationAdapter.MenuItem(getString(R.string.home_nav_me), + ContextCompat.getDrawable(this, R.drawable.home_me_selector))); + mNavigationAdapter.setOnNavigationListener(this); + mNavigationView.setAdapter(mNavigationAdapter); } @Override @@ -77,7 +83,7 @@ protected void initData() { mPagerAdapter.addFragment(HomeFragment.newInstance()); mPagerAdapter.addFragment(FindFragment.newInstance()); mPagerAdapter.addFragment(MessageFragment.newInstance()); - mPagerAdapter.addFragment(MeFragment.newInstance()); + mPagerAdapter.addFragment(MineFragment.newInstance()); mViewPager.setAdapter(mPagerAdapter); onNewIntent(getIntent()); @@ -86,24 +92,35 @@ protected void initData() { @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - int fragmentIndex = mPagerAdapter.getFragmentIndex(getSerializable(IntentKey.INDEX)); + switchFragment(mPagerAdapter.getFragmentIndex(getSerializable(INTENT_KEY_IN_FRAGMENT_CLASS))); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + // 保存当前 Fragment 索引位置 + outState.putInt(INTENT_KEY_IN_FRAGMENT_INDEX, mViewPager.getCurrentItem()); + } + + @Override + protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + // 恢复当前 Fragment 索引位置 + switchFragment(savedInstanceState.getInt(INTENT_KEY_IN_FRAGMENT_INDEX)); + } + + private void switchFragment(int fragmentIndex) { if (fragmentIndex == -1) { return; } - mViewPager.setCurrentItem(fragmentIndex); switch (fragmentIndex) { case 0: - mBottomNavigationView.setSelectedItemId(R.id.menu_home); - break; case 1: - mBottomNavigationView.setSelectedItemId(R.id.home_found); - break; case 2: - mBottomNavigationView.setSelectedItemId(R.id.home_message); - break; case 3: - mBottomNavigationView.setSelectedItemId(R.id.home_me); + mViewPager.setCurrentItem(fragmentIndex); + mNavigationAdapter.setSelectedPosition(fragmentIndex); break; default: break; @@ -111,26 +128,29 @@ protected void onNewIntent(Intent intent) { } /** - * {@link BottomNavigationView.OnNavigationItemSelectedListener} + * {@link NavigationAdapter.OnNavigationListener} */ @Override - public boolean onNavigationItemSelected(@NonNull MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.menu_home) { - mViewPager.setCurrentItem(0); - return true; - } else if (itemId == R.id.home_found) { - mViewPager.setCurrentItem(1); - return true; - } else if (itemId == R.id.home_message) { - mViewPager.setCurrentItem(2); - return true; - } else if (itemId == R.id.home_me) { - mViewPager.setCurrentItem(3); - return true; + public boolean onNavigationItemSelected(int position) { + switch (position) { + case 0: + case 1: + case 2: + case 3: + mViewPager.setCurrentItem(position); + return true; + default: + return false; } - return false; + } + + @NonNull + @Override + protected ImmersionBar createStatusBarConfig() { + return super.createStatusBarConfig() + // 指定导航栏背景颜色 + .navigationBarColor(R.color.white); } @Override @@ -154,6 +174,7 @@ public void onBackPressed() { protected void onDestroy() { super.onDestroy(); mViewPager.setAdapter(null); - mBottomNavigationView.setOnNavigationItemSelectedListener(null); + mNavigationView.setAdapter(null); + mNavigationAdapter.setOnNavigationListener(null); } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/ImageCropActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/ImageCropActivity.java new file mode 100644 index 00000000..f84e390b --- /dev/null +++ b/app/src/main/java/com/hjq/demo/ui/activity/ImageCropActivity.java @@ -0,0 +1,232 @@ +package com.hjq.demo.ui.activity; + +import android.content.ActivityNotFoundException; +import android.content.ContentValues; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.MediaStore; + +import androidx.core.content.FileProvider; + +import com.hjq.base.BaseActivity; +import com.hjq.demo.R; +import com.hjq.demo.aop.Log; +import com.hjq.demo.aop.Permissions; +import com.hjq.demo.app.AppActivity; +import com.hjq.demo.other.AppConfig; +import com.hjq.permissions.Permission; +import com.tencent.bugly.crashreport.CrashReport; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/09/19 + * desc : 图片裁剪 + */ +public final class ImageCropActivity extends AppActivity { + + private static final String INTENT_KEY_IN_SOURCE_IMAGE_PATH = "imagePath"; + private static final String INTENT_KEY_IN_CROP_RATIO_X = "cropRatioX"; + private static final String INTENT_KEY_IN_CROP_RATIO_Y = "cropRatioY"; + + public static final String INTENT_KEY_OUT_FILE_URI = "fileUri"; + public static final String INTENT_KEY_OUT_FILE_NAME = "fileName"; + public static final String INTENT_KEY_OUT_ERROR = "error"; + + public static void start(BaseActivity activity, File file, OnCropListener listener) { + start(activity, file, 0, 0, listener); + } + + @Log + @Permissions({Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE}) + public static void start(BaseActivity activity, File file, int cropRatioX, int cropRatioY, OnCropListener listener) { + Intent intent = new Intent(activity, ImageCropActivity.class); + intent.putExtra(INTENT_KEY_IN_SOURCE_IMAGE_PATH, file.toString()); + intent.putExtra(INTENT_KEY_IN_CROP_RATIO_X, cropRatioX); + intent.putExtra(INTENT_KEY_IN_CROP_RATIO_Y, cropRatioY); + activity.startActivityForResult(intent, (resultCode, data) -> { + if (listener == null) { + return; + } + + switch (resultCode) { + case RESULT_OK: + Uri uri = null; + if (data != null) { + uri = data.getParcelableExtra(INTENT_KEY_OUT_FILE_URI); + } + if (uri != null) { + listener.onSucceed(uri, data.getStringExtra(INTENT_KEY_OUT_FILE_NAME)); + } else { + listener.onCancel(); + } + break; + case RESULT_ERROR: + String details; + if (data == null || (details = data.getStringExtra(INTENT_KEY_OUT_ERROR)) == null) { + details = activity.getString(R.string.common_unknown_error); + } + listener.onError(details); + break; + case RESULT_CANCELED: + default: + listener.onCancel(); + break; + } + }); + } + + @Override + protected int getLayoutId() { + return 0; + } + + @Override + protected void initView() {} + + @Override + protected void initData() { + File sourceFile = new File(getString(INTENT_KEY_IN_SOURCE_IMAGE_PATH)); + int cropRatioX = getInt(INTENT_KEY_IN_CROP_RATIO_X); + int cropRatioY = getInt(INTENT_KEY_IN_CROP_RATIO_Y); + + Intent intent = new Intent("com.android.camera.action.CROP"); + Uri sourceUri; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + sourceUri = FileProvider.getUriForFile(getContext(), AppConfig.getPackageName() + ".provider", sourceFile); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + } else { + sourceUri = Uri.fromFile(sourceFile); + } + + String fileName = "CROP_" + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()) + + "." + getImageFormat(sourceFile).toString().toLowerCase(); + String subFolderName = "CropImage"; + + intent.setDataAndType(sourceUri, "image/*"); + // 是否进行裁剪 + intent.putExtra("crop", String.valueOf(true)); + // 是否裁剪成圆形(注意:在某些手机上没有任何效果,例如华为机) + //intent.putExtra("circleCrop", true); + // 宽高裁剪大小 + //intent.putExtra("outputX", builder.getCropWidth()); + //intent.putExtra("outputY", builder.getCropHeight()); + + if (cropRatioX != 0 && cropRatioY != 0) { + // 宽高裁剪比例 + if (cropRatioX == cropRatioY && + Build.MANUFACTURER.toUpperCase().contains("HUAWEI")) { + // 华为手机特殊处理,否则不会显示正方形裁剪区域,而是显示圆形裁剪区域 + // https://blog.csdn.net/wapchief/article/details/80669647 + intent.putExtra("aspectX", 9998); + intent.putExtra("aspectY", 9999); + } else { + intent.putExtra("aspectX", cropRatioX); + intent.putExtra("aspectY", cropRatioY); + } + } + + // 是否保持比例不变 + intent.putExtra("scale", true); + + // 裁剪区域小于输出大小时,是否放大图像 + intent.putExtra("scaleUpIfNeeded", true); + // 是否将数据以 Bitmap 的形式保存 + intent.putExtra("return-data", false); + // 设置裁剪后保存的文件路径 + Uri outputUri; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // 适配 Android 10 分区存储特性 + ContentValues values = new ContentValues(); + // 设置显示的文件名 + values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); + // 设置输出的路径信息 + values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + File.separator + subFolderName); + // 生成一个新的 uri 路径 + outputUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); + } else { + File folderFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + subFolderName); + if (!folderFile.isDirectory()) { + folderFile.delete(); + } + if (!folderFile.exists()) { + folderFile.mkdirs(); + } + outputUri = Uri.fromFile(new File(folderFile, fileName)); + } + intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); + // 设置裁剪后保存的文件格式 + intent.putExtra("outputFormat", getImageFormat(sourceFile).toString()); + + try { + // 因为有人反馈 Intent.resolveActivity 在某些手机上判断不准确 + // 手机明明有裁剪界面,但是系统偏偏就告诉应用没有 + // 出现这个问题的机型信息:一加手机 8,Android 11 + startActivityForResult(intent, (resultCode, data) -> { + if (resultCode == RESULT_OK) { + setResult(RESULT_OK, new Intent() + .putExtra(INTENT_KEY_OUT_FILE_URI, outputUri) + .putExtra(INTENT_KEY_OUT_FILE_NAME, fileName)); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // 删除这个 uri,避免重复占用 + getContentResolver().delete(outputUri, null, null); + } + setResult(RESULT_CANCELED); + } + finish(); + }); + } catch (ActivityNotFoundException e) { + CrashReport.postCatchedException(e); + setResult(RESULT_ERROR, new Intent().putExtra(INTENT_KEY_OUT_ERROR, getString(R.string.image_crop_error_not_support))); + finish(); + } + } + + /** + * 获取图片文件的格式 + */ + private static Bitmap.CompressFormat getImageFormat(File file) { + String fileName = file.getName().toLowerCase(); + if (fileName.endsWith(".png")) { + return Bitmap.CompressFormat.PNG; + } else if (fileName.endsWith(".webp")) { + return Bitmap.CompressFormat.WEBP; + } + return Bitmap.CompressFormat.JPEG; + } + + /** + * 裁剪图片监听 + */ + public interface OnCropListener { + + /** + * 裁剪成功回调 + * + * @param fileUri 文件路径 + * @param fileName 文件名称 + */ + void onSucceed(Uri fileUri, String fileName); + + /** + * 错误回调 + * + * @param details 错误详情 + */ + void onError(String details); + + /** + * 取消回调 + */ + default void onCancel() {} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/ImagePreviewActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/ImagePreviewActivity.java index f2f5597c..f5facaf1 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/ImagePreviewActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/ImagePreviewActivity.java @@ -16,10 +16,8 @@ import com.hjq.base.BaseAdapter; import com.hjq.base.RecyclerPagerAdapter; import com.hjq.demo.R; -import com.hjq.demo.aop.CheckNet; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.app.AppActivity; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.ui.adapter.ImagePreviewAdapter; import java.util.ArrayList; @@ -38,6 +36,9 @@ public final class ImagePreviewActivity extends AppActivity implements ViewPager.OnPageChangeListener, BaseAdapter.OnItemClickListener { + private static final String INTENT_KEY_IN_IMAGE_LIST = "imageList"; + private static final String INTENT_KEY_IN_IMAGE_INDEX = "imageIndex"; + public static void start(Context context, String url) { ArrayList images = new ArrayList<>(1); images.add(url); @@ -48,27 +49,26 @@ public static void start(Context context, List urls) { start(context, urls, 0); } - @CheckNet - @DebugLog + @Log public static void start(Context context, List urls, int index) { if (urls == null || urls.isEmpty()) { return; } Intent intent = new Intent(context, ImagePreviewActivity.class); - if (urls.size() > 2500) { + if (urls.size() > 2000) { // 请注意:如果传输的数据量过大,会抛出此异常,并且这种异常是不能被捕获的 // 所以当图片数量过多的时候,我们应当只显示一张,这种一般是手机图片过多导致的 - // 经过测试,传入 3121 张图片集合的时候会抛出此异常,所以保险值应当是 2500 + // 经过测试,传入 3121 张图片集合的时候会抛出此异常,所以保险值应当是 2000 // android.os.TransactionTooLargeException: data parcel size 521984 bytes urls = Collections.singletonList(urls.get(index)); } if (urls instanceof ArrayList) { - intent.putExtra(IntentKey.IMAGE, (ArrayList) urls); + intent.putExtra(INTENT_KEY_IN_IMAGE_LIST, (ArrayList) urls); } else { - intent.putExtra(IntentKey.IMAGE, new ArrayList<>(urls)); + intent.putExtra(INTENT_KEY_IN_IMAGE_LIST, new ArrayList<>(urls)); } - intent.putExtra(IntentKey.INDEX, index); + intent.putExtra(INTENT_KEY_IN_IMAGE_INDEX, index); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -97,7 +97,7 @@ protected void initView() { @Override protected void initData() { - ArrayList images = getStringArrayList(IntentKey.IMAGE); + ArrayList images = getStringArrayList(INTENT_KEY_IN_IMAGE_LIST); if (images == null || images.isEmpty()) { finish(); return; @@ -117,7 +117,7 @@ protected void initData() { mViewPager.addOnPageChangeListener(this); } - int index = getInt(IntentKey.INDEX); + int index = getInt(INTENT_KEY_IN_IMAGE_INDEX); if (index < images.size()) { mViewPager.setCurrentItem(index); onPageSelected(index); @@ -148,7 +148,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @SuppressLint("SetTextI18n") @Override public void onPageSelected(int position) { - mTextIndicatorView.setText((position + 1) + "/" + mAdapter.getItemCount()); + mTextIndicatorView.setText((position + 1) + "/" + mAdapter.getCount()); } @Override @@ -168,9 +168,10 @@ protected void onDestroy() { */ @Override public void onItemClick(RecyclerView recyclerView, View itemView, int position) { - // 单击图片退出当前的 Activity - if (!isFinishing()) { - finish(); + if (isFinishing() || isDestroyed()) { + return; } + // 单击图片退出当前的 Activity + finish(); } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/ImageSelectActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/ImageSelectActivity.java index 22402fb8..9aaef71e 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/ImageSelectActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/ImageSelectActivity.java @@ -6,29 +6,28 @@ import android.net.Uri; import android.provider.MediaStore; import android.text.TextUtils; -import android.util.TypedValue; import android.view.View; import android.view.animation.AnimationUtils; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.hjq.base.BaseActivity; import com.hjq.base.BaseAdapter; import com.hjq.demo.R; import com.hjq.demo.action.StatusAction; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.Permissions; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; import com.hjq.demo.manager.ThreadPoolManager; import com.hjq.demo.other.GridSpaceDecoration; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.ui.adapter.ImageSelectAdapter; import com.hjq.demo.ui.dialog.AlbumDialog; import com.hjq.demo.widget.StatusLayout; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; +import com.hjq.widget.view.FloatActionButton; import java.io.File; import java.util.ArrayList; @@ -49,26 +48,35 @@ public final class ImageSelectActivity extends AppActivity BaseAdapter.OnItemLongClickListener, BaseAdapter.OnChildClickListener { + private static final String INTENT_KEY_IN_MAX_SELECT = "maxSelect"; + + private static final String INTENT_KEY_OUT_IMAGE_LIST = "imageList"; + public static void start(BaseActivity activity, OnPhotoSelectListener listener) { start(activity, 1, listener); } - @DebugLog - @Permissions({Permission.MANAGE_EXTERNAL_STORAGE}) + @Log + @Permissions({Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE}) public static void start(BaseActivity activity, int maxSelect, OnPhotoSelectListener listener) { if (maxSelect < 1) { // 最少要选择一个图片 throw new IllegalArgumentException("are you ok?"); } Intent intent = new Intent(activity, ImageSelectActivity.class); - intent.putExtra(IntentKey.AMOUNT, maxSelect); + intent.putExtra(INTENT_KEY_IN_MAX_SELECT, maxSelect); activity.startActivityForResult(intent, (resultCode, data) -> { - if (listener == null || data == null) { + if (listener == null) { return; } - ArrayList list = data.getStringArrayListExtra(IntentKey.IMAGE); + if (data == null) { + listener.onCancel(); + return; + } + + ArrayList list = data.getStringArrayListExtra(INTENT_KEY_OUT_IMAGE_LIST); if (list == null || list.isEmpty()) { listener.onCancel(); return; @@ -91,7 +99,7 @@ public static void start(BaseActivity activity, int maxSelect, OnPhotoSelectList private StatusLayout mStatusLayout; private RecyclerView mRecyclerView; - private FloatingActionButton mFloatingView; + private FloatActionButton mFloatingView; private ImageSelectAdapter mAdapter; @@ -128,13 +136,29 @@ protected void initView() { // 禁用动画效果 mRecyclerView.setItemAnimator(null); // 添加分割线 - mRecyclerView.addItemDecoration(new GridSpaceDecoration((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, getResources().getDisplayMetrics()))); + mRecyclerView.addItemDecoration(new GridSpaceDecoration((int) getResources().getDimension(R.dimen.dp_3))); + // 设置滚动监听 + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + switch (newState) { + case RecyclerView.SCROLL_STATE_DRAGGING: + mFloatingView.hide(); + break; + case RecyclerView.SCROLL_STATE_IDLE: + mFloatingView.show(); + break; + default: + break; + } + } + }); } @Override protected void initData() { // 获取最大的选择数 - mMaxSelect = getInt(IntentKey.AMOUNT, mMaxSelect); + mMaxSelect = getInt(INTENT_KEY_IN_MAX_SELECT, mMaxSelect); // 显示加载进度条 showLoading(); @@ -160,10 +184,11 @@ public void onRightClick(View view) { Set keys = mAllAlbum.keySet(); for (String key : keys) { List list = mAllAlbum.get(key); - if (list != null && !list.isEmpty()) { - count += list.size(); - data.add(new AlbumDialog.AlbumInfo(list.get(0), key, String.format(getString(R.string.image_select_total), list.size()), mAdapter.getData() == list)); + if (list == null || list.isEmpty()) { + continue; } + count += list.size(); + data.add(new AlbumDialog.AlbumInfo(list.get(0), key, String.format(getString(R.string.image_select_total), list.size()), mAdapter.getData() == list)); } data.add(0, new AlbumDialog.AlbumInfo(mAllImage.get(0), getString(R.string.image_select_all), String.format(getString(R.string.image_select_total), count), mAdapter.getData() == mAllImage)); @@ -180,7 +205,7 @@ public void onRightClick(View view) { mAdapter.setData(mAllAlbum.get(bean.getName())); } // 执行列表动画 - mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.from_right_layout)); + mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.layout_from_right)); mRecyclerView.scheduleLayoutAnimation(); }); } @@ -204,18 +229,20 @@ protected void onRestart() { mAllImage.remove(path); File parentFile = file.getParentFile(); - if (parentFile != null) { - List data = mAllAlbum.get(parentFile.getName()); - if (data != null) { - data.remove(path); - } - mAdapter.notifyDataSetChanged(); + if (parentFile == null) { + continue; + } - if (mSelectImage.isEmpty()) { - mFloatingView.setImageResource(R.drawable.camera_ic); - } else { - mFloatingView.setImageResource(R.drawable.succeed_ic); - } + List data = mAllAlbum.get(parentFile.getName()); + if (data != null) { + data.remove(path); + } + mAdapter.notifyDataSetChanged(); + + if (mSelectImage.isEmpty()) { + mFloatingView.setImageResource(R.drawable.camera_ic); + } else { + mFloatingView.setImageResource(R.drawable.succeed_ic); } } } @@ -226,24 +253,31 @@ public void onClick(View view) { if (view.getId() == R.id.fab_image_select_floating) { if (mSelectImage.isEmpty()) { // 点击拍照 - CameraActivity.start(this, file -> { + CameraActivity.start(this, new CameraActivity.OnCameraListener() { + @Override + public void onSelected(File file) { + // 当前选中图片的数量必须小于最大选中数 + if (mSelectImage.size() < mMaxSelect) { + mSelectImage.add(file.getPath()); + } - // 当前选中图片的数量必须小于最大选中数 - if (mSelectImage.size() < mMaxSelect) { - mSelectImage.add(file.getPath()); + // 这里需要延迟刷新,否则可能会找不到拍照的图片 + postDelayed(() -> { + // 重新加载图片列表 + ThreadPoolManager.getInstance().execute(ImageSelectActivity.this); + }, 1000); } - // 这里需要延迟刷新,否则可能会找不到拍照的图片 - postDelayed(() -> { - // 重新加载图片列表 - ThreadPoolManager.getInstance().execute(ImageSelectActivity.this); - }, 1000); + @Override + public void onError(String details) { + toast(details); + } }); return; } // 完成选择 - setResult(RESULT_OK, new Intent().putStringArrayListExtra(IntentKey.IMAGE, mSelectImage)); + setResult(RESULT_OK, new Intent().putStringArrayListExtra(INTENT_KEY_OUT_IMAGE_LIST, mSelectImage)); finish(); } } @@ -296,11 +330,7 @@ public void onChildClick(RecyclerView recyclerView, View childView, int position mSelectImage.remove(path); if (mSelectImage.isEmpty()) { - mFloatingView.hide(); - postDelayed(() -> { - mFloatingView.setImageResource(R.drawable.camera_ic); - mFloatingView.show(); - }, 200); + mFloatingView.setImageResource(R.drawable.camera_ic); } mAdapter.notifyItemChanged(position); @@ -323,11 +353,7 @@ public void onChildClick(RecyclerView recyclerView, View childView, int position mSelectImage.add(path); if (mSelectImage.size() == 1) { - mFloatingView.hide(); - postDelayed(() -> { - mFloatingView.setImageResource(R.drawable.succeed_ic); - mFloatingView.show(); - }, 200); + mFloatingView.setImageResource(R.drawable.succeed_ic); } } else { toast(String.format(getString(R.string.image_select_max_hint), mMaxSelect)); @@ -352,7 +378,7 @@ public void run() { MediaStore.MediaColumns.HEIGHT, MediaStore.MediaColumns.SIZE}; Cursor cursor = null; - if (XXPermissions.isGrantedPermission(this, Permission.MANAGE_EXTERNAL_STORAGE)) { + if (XXPermissions.isGranted(this, Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE)) { cursor = contentResolver.query(contentUri, projections, selection, new String[]{String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE)}, sortOrder); } if (cursor != null && cursor.moveToFirst()) { @@ -380,17 +406,19 @@ public void run() { } File parentFile = file.getParentFile(); - if (parentFile != null) { - // 获取目录名作为专辑名称 - String albumName = parentFile.getName(); - List data = mAllAlbum.get(albumName); - if (data == null) { - data = new ArrayList<>(); - mAllAlbum.put(albumName, data); - } - data.add(path); - mAllImage.add(path); + if (parentFile == null) { + continue; + } + + // 获取目录名作为专辑名称 + String albumName = parentFile.getName(); + List data = mAllAlbum.get(albumName); + if (data == null) { + data = new ArrayList<>(); + mAllAlbum.put(albumName, data); } + data.add(path); + mAllImage.add(path); } while (cursor.moveToNext()); @@ -410,7 +438,7 @@ public void run() { } // 执行列表动画 - mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.fall_down_layout)); + mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.layout_fall_down)); mRecyclerView.scheduleLayoutAnimation(); if (mAllImage.isEmpty()) { diff --git a/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java index baef3dee..59d18998 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/LoginActivity.java @@ -15,20 +15,20 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.gyf.immersionbar.ImmersionBar; import com.hjq.demo.R; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.LoginApi; import com.hjq.demo.http.glide.GlideApp; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.LoginApi; -import com.hjq.demo.http.response.LoginBean; import com.hjq.demo.manager.InputTextManager; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.other.KeyboardWatcher; -import com.hjq.demo.ui.fragment.MeFragment; +import com.hjq.demo.ui.fragment.MineFragment; import com.hjq.demo.wxapi.WXEntryActivity; import com.hjq.http.EasyConfig; import com.hjq.http.EasyHttp; @@ -51,11 +51,14 @@ public final class LoginActivity extends AppActivity KeyboardWatcher.SoftKeyboardStateListener, TextView.OnEditorActionListener { - @DebugLog + private static final String INTENT_KEY_IN_PHONE = "phone"; + private static final String INTENT_KEY_IN_PASSWORD = "password"; + + @Log public static void start(Context context, String phone, String password) { Intent intent = new Intent(context, LoginActivity.class); - intent.putExtra(IntentKey.PHONE, phone); - intent.putExtra(IntentKey.PASSWORD, password); + intent.putExtra(INTENT_KEY_IN_PHONE, phone); + intent.putExtra(INTENT_KEY_IN_PASSWORD, password); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -131,14 +134,15 @@ protected void initData() { } // 自动填充手机号和密码 - mPhoneView.setText(getString(IntentKey.PHONE)); - mPasswordView.setText(getString(IntentKey.PASSWORD)); + mPhoneView.setText(getString(INTENT_KEY_IN_PHONE)); + mPasswordView.setText(getString(INTENT_KEY_IN_PASSWORD)); } @Override public void onRightClick(View view) { // 跳转到注册界面 - RegisterActivity.start(this, mPhoneView.getText().toString(), mPasswordView.getText().toString(), (phone, password) -> { + RegisterActivity.start(this, mPhoneView.getText().toString(), + mPasswordView.getText().toString(), (phone, password) -> { // 如果已经注册成功,就执行登录操作 mPhoneView.setText(phone); mPasswordView.setText(password); @@ -172,7 +176,7 @@ public void onClick(View view) { postDelayed(() -> { mCommitView.showSucceed(); postDelayed(() -> { - HomeActivity.start(getContext(), MeFragment.class); + HomeActivity.start(getContext(), MineFragment.class); finish(); }, 1000); }, 2000); @@ -183,7 +187,7 @@ public void onClick(View view) { .api(new LoginApi() .setPhone(mPhoneView.getText().toString()) .setPassword(mPasswordView.getText().toString())) - .request(new HttpCallback>(this) { + .request(new HttpCallback>(this) { @Override public void onStart(Call call) { @@ -194,7 +198,7 @@ public void onStart(Call call) { public void onEnd(Call call) {} @Override - public void onSucceed(HttpData data) { + public void onSucceed(HttpData data) { // 更新 Token EasyConfig.getInstance() .addParam("token", data.getData().getToken()); @@ -202,7 +206,7 @@ public void onSucceed(HttpData data) { mCommitView.showSucceed(); postDelayed(() -> { // 跳转到首页 - HomeActivity.start(getContext(), MeFragment.class); + HomeActivity.start(getContext(), MineFragment.class); finish(); }, 1000); }, 1000); @@ -220,7 +224,7 @@ public void onFail(Exception e) { } if (view == mQQView || view == mWeChatView) { - toast("记得改好第三方 AppID 和 AppKey,否则会调不起来哦"); + toast("记得改好第三方 AppID 和 Secret,否则会调不起来哦"); Platform platform; if (view == mQQView) { platform = Platform.QQ; @@ -237,7 +241,7 @@ public void onFail(Exception e) { @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); - // 友盟登录回调 + // 友盟回调 UmengClient.onActivityResult(this, requestCode, resultCode, data); } @@ -273,9 +277,10 @@ public void onSucceed(Platform platform, UmengLogin.LoginData data) { .circleCrop() .into(mLogoView); - toast("昵称:" + data.getName() + "\n" + "性别:" + data.getSex()); - toast("id:" + data.getId()); - toast("token:" + data.getToken()); + toast("昵称:" + data.getName() + "\n" + + "性别:" + data.getSex() + "\n" + + "id:" + data.getId() + "\n" + + "token:" + data.getToken()); } /** @@ -289,16 +294,6 @@ public void onError(Platform platform, Throwable t) { toast("第三方登录出错:" + t.getMessage()); } - /** - * 授权取消的回调 - * - * @param platform 平台名称 - */ - @Override - public void onCancel(Platform platform) { - toast("取消第三方登录"); - } - /** * {@link KeyboardWatcher.SoftKeyboardStateListener} */ @@ -359,4 +354,12 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { } return false; } + + @NonNull + @Override + protected ImmersionBar createStatusBarConfig() { + return super.createStatusBarConfig() + // 指定导航栏背景颜色 + .navigationBarColor(R.color.white); + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/PasswordForgetActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/PasswordForgetActivity.java index 328ec9d0..2f21e6d0 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/PasswordForgetActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/PasswordForgetActivity.java @@ -11,9 +11,9 @@ import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.GetCodeApi; +import com.hjq.demo.http.api.VerifyCodeApi; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.GetCodeApi; -import com.hjq.demo.http.request.VerifyCodeApi; import com.hjq.demo.manager.InputTextManager; import com.hjq.http.EasyHttp; import com.hjq.http.listener.HttpCallback; diff --git a/app/src/main/java/com/hjq/demo/ui/activity/PasswordResetActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/PasswordResetActivity.java index f22e6170..e7b86943 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/PasswordResetActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/PasswordResetActivity.java @@ -12,14 +12,13 @@ import android.widget.TextView; import com.hjq.demo.R; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.PasswordApi; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.PasswordApi; import com.hjq.demo.manager.InputTextManager; -import com.hjq.demo.other.IntentKey; -import com.hjq.demo.ui.dialog.HintDialog; +import com.hjq.demo.ui.dialog.TipsDialog; import com.hjq.http.EasyHttp; import com.hjq.http.listener.HttpCallback; @@ -32,11 +31,14 @@ public final class PasswordResetActivity extends AppActivity implements TextView.OnEditorActionListener { - @DebugLog + private static final String INTENT_KEY_IN_PHONE = "phone"; + private static final String INTENT_KEY_IN_CODE = "code"; + + @Log public static void start(Context context, String phone, String code) { Intent intent = new Intent(context, PasswordResetActivity.class); - intent.putExtra(IntentKey.PHONE, phone); - intent.putExtra(IntentKey.CODE, code); + intent.putExtra(INTENT_KEY_IN_PHONE, phone); + intent.putExtra(INTENT_KEY_IN_CODE, code); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -76,8 +78,8 @@ protected void initView() { @Override protected void initData() { - mPhoneNumber = getString(IntentKey.PHONE); - mVerifyCode = getString(IntentKey.CODE); + mPhoneNumber = getString(INTENT_KEY_IN_PHONE); + mVerifyCode = getString(INTENT_KEY_IN_CODE); } @SingleClick @@ -96,8 +98,8 @@ public void onClick(View view) { hideKeyboard(getCurrentFocus()); if (true) { - new HintDialog.Builder(this) - .setIcon(HintDialog.ICON_FINISH) + new TipsDialog.Builder(this) + .setIcon(TipsDialog.ICON_FINISH) .setMessage(R.string.password_reset_success) .setDuration(2000) .addOnDismissListener(dialog -> finish()) @@ -115,8 +117,8 @@ public void onClick(View view) { @Override public void onSucceed(HttpData data) { - new HintDialog.Builder(getActivity()) - .setIcon(HintDialog.ICON_FINISH) + new TipsDialog.Builder(getActivity()) + .setIcon(TipsDialog.ICON_FINISH) .setMessage(R.string.password_reset_success) .setDuration(2000) .addOnDismissListener(dialog -> finish()) diff --git a/app/src/main/java/com/hjq/demo/ui/activity/PersonalDataActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/PersonalDataActivity.java index 715dd816..79ec574f 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/PersonalDataActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/PersonalDataActivity.java @@ -1,37 +1,30 @@ package com.hjq.demo.ui.activity; -import android.content.Intent; -import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; -import android.provider.MediaStore; -import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import androidx.core.content.FileProvider; - import com.bumptech.glide.load.MultiTransformation; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.UpdateImageApi; import com.hjq.demo.http.glide.GlideApp; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.UpdateImageApi; -import com.hjq.demo.other.AppConfig; import com.hjq.demo.ui.dialog.AddressDialog; import com.hjq.demo.ui.dialog.InputDialog; import com.hjq.http.EasyHttp; import com.hjq.http.listener.HttpCallback; +import com.hjq.http.model.FileContentResolver; import com.hjq.widget.layout.SettingBar; import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; +import java.net.URI; +import java.net.URISyntaxException; /** * author : Android 轮子哥 @@ -55,7 +48,7 @@ public final class PersonalDataActivity extends AppActivity { private String mArea = "天河区"; /** 头像地址 */ - private String mAvatarUrl; + private Uri mAvatarUrl; @Override protected int getLayoutId() { @@ -94,12 +87,12 @@ public void onClick(View view) { if (view == mAvatarLayout) { ImageSelectActivity.start(this, data -> { // 裁剪头像 - cropImage(new File(data.get(0))); + cropImageFile(new File(data.get(0))); }); } else if (view == mAvatarView) { - if (!TextUtils.isEmpty(mAvatarUrl)) { + if (mAvatarUrl != null) { // 查看头像 - ImagePreviewActivity.start(getActivity(), mAvatarUrl); + ImagePreviewActivity.start(getActivity(), mAvatarUrl.toString()); } else { // 选择头像 onClick(mAvatarLayout); @@ -146,74 +139,44 @@ public void onClick(View view) { /** * 裁剪图片 */ - private void cropImage(File sourceFile) { - Intent intent = new Intent("com.android.camera.action.CROP"); - Uri uri; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - uri = FileProvider.getUriForFile(getContext(), AppConfig.getPackageName() + ".provider", sourceFile); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - } else { - uri = Uri.fromFile(sourceFile); - } - - String regex = "^(.+)(\\..+)$"; - String fileName = sourceFile.getName().replaceFirst(regex, "$1_crop_" + new SimpleDateFormat("HHmmss", Locale.getDefault()).format(new Date())+ "$2"); - - File outputFile = new File(sourceFile.getParent(), fileName); - if (outputFile.exists()) { - outputFile.delete(); - } - - intent.setDataAndType(uri, "image/*"); - // 是否进行裁剪 - intent.putExtra("crop", String.valueOf(true)); - // 宽高裁剪比例 - if (Build.MANUFACTURER.toUpperCase().contains("HUAWEI")) { - // 华为手机特殊处理,否则不会显示正方形裁剪区域,而是显示圆形裁剪区域 - // https://blog.csdn.net/wapchief/article/details/80669647 - intent.putExtra("aspectX", 9998); - intent.putExtra("aspectY", 9999); - } else { - intent.putExtra("aspectX", 1); - intent.putExtra("aspectY", 1); - } - // 是否裁剪成圆形(注:在华为手机上没有任何效果) - // intent.putExtra("circleCrop", false); - // 宽高裁剪大小 - // intent.putExtra("outputX", 200); - // intent.putExtra("outputY", 200); - // 是否保持比例不变 - intent.putExtra("scale", true); - // 裁剪区域小于输出大小时,是否放大图像 - intent.putExtra("scaleUpIfNeeded", true); - // 是否将数据以 Bitmap 的形式保存 - intent.putExtra("return-data", false); - // 设置裁剪后保存的文件路径 - intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outputFile)); - // 设置裁剪后保存的文件格式 - intent.putExtra("outputFormat", getImageFormat(sourceFile).toString()); - - // 判断手机是否有裁剪功能 - if (intent.resolveActivity(getPackageManager()) != null) { - startActivityForResult(intent, (resultCode, data) -> { - if (resultCode == RESULT_OK) { - updateImage(outputFile, true); + private void cropImageFile(File sourceFile) { + ImageCropActivity.start(this, sourceFile, 1, 1, new ImageCropActivity.OnCropListener() { + + @Override + public void onSucceed(Uri fileUri, String fileName) { + File outputFile; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + outputFile = new FileContentResolver(getActivity(), fileUri, fileName); + } else { + try { + outputFile = new File(new URI(fileUri.toString())); + } catch (URISyntaxException e) { + e.printStackTrace(); + outputFile = new File(fileUri.toString()); + } } - }); - return; - } + updateCropImage(outputFile, true); + } - // 没有的话就不裁剪,直接上传原图片 - // 但是这种情况极其少见,可以忽略不计 - updateImage(sourceFile, false); + @Override + public void onError(String details) { + // 没有的话就不裁剪,直接上传原图片 + // 但是这种情况极其少见,可以忽略不计 + updateCropImage(sourceFile, false); + } + }); } /** - * 上传图片 + * 上传裁剪后的图片 */ - private void updateImage(File file, boolean deleteFile) { + private void updateCropImage(File file, boolean deleteFile) { if (true) { - mAvatarUrl = file.getPath(); + if (file instanceof FileContentResolver) { + mAvatarUrl = ((FileContentResolver) file).getContentUri(); + } else { + mAvatarUrl = Uri.fromFile(file); + } GlideApp.with(getActivity()) .load(mAvatarUrl) .transform(new MultiTransformation<>(new CenterCrop(), new CircleCrop())) @@ -224,11 +187,11 @@ private void updateImage(File file, boolean deleteFile) { EasyHttp.post(this) .api(new UpdateImageApi() .setImage(file)) - .request(new HttpCallback>(PersonalDataActivity.this) { + .request(new HttpCallback>(this) { @Override public void onSucceed(HttpData data) { - mAvatarUrl = data.getData(); + mAvatarUrl = Uri.parse(data.getData()); GlideApp.with(getActivity()) .load(mAvatarUrl) .transform(new MultiTransformation<>(new CenterCrop(), new CircleCrop())) @@ -239,17 +202,4 @@ public void onSucceed(HttpData data) { } }); } - - /** - * 获取图片文件的格式 - */ - private Bitmap.CompressFormat getImageFormat(File file) { - String fileName = file.getName().toLowerCase(); - if (fileName.endsWith(".png")) { - return Bitmap.CompressFormat.PNG; - } else if (fileName.endsWith(".webp")) { - return Bitmap.CompressFormat.WEBP; - } - return Bitmap.CompressFormat.JPEG; - } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/activity/PhoneResetActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/PhoneResetActivity.java index e4e236e5..e218ea51 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/PhoneResetActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/PhoneResetActivity.java @@ -12,15 +12,14 @@ import android.widget.TextView; import com.hjq.demo.R; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.GetCodeApi; +import com.hjq.demo.http.api.PhoneApi; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.GetCodeApi; -import com.hjq.demo.http.request.PhoneApi; import com.hjq.demo.manager.InputTextManager; -import com.hjq.demo.other.IntentKey; -import com.hjq.demo.ui.dialog.HintDialog; +import com.hjq.demo.ui.dialog.TipsDialog; import com.hjq.http.EasyHttp; import com.hjq.http.listener.HttpCallback; import com.hjq.toast.ToastUtils; @@ -35,10 +34,12 @@ public final class PhoneResetActivity extends AppActivity implements TextView.OnEditorActionListener { - @DebugLog + private static final String INTENT_KEY_IN_CODE = "code"; + + @Log public static void start(Context context, String code) { Intent intent = new Intent(context, PhoneResetActivity.class); - intent.putExtra(IntentKey.CODE, code); + intent.putExtra(INTENT_KEY_IN_CODE, code); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @@ -78,7 +79,7 @@ protected void initView() { @Override protected void initData() { - mVerifyCode = getString(IntentKey.CODE); + mVerifyCode = getString(INTENT_KEY_IN_CODE); } @SingleClick @@ -127,8 +128,8 @@ public void onSucceed(HttpData data) { hideKeyboard(getCurrentFocus()); if (true) { - new HintDialog.Builder(this) - .setIcon(HintDialog.ICON_FINISH) + new TipsDialog.Builder(this) + .setIcon(TipsDialog.ICON_FINISH) .setMessage(R.string.phone_reset_commit_succeed) .setDuration(2000) .addOnDismissListener(dialog -> finish()) @@ -146,8 +147,8 @@ public void onSucceed(HttpData data) { @Override public void onSucceed(HttpData data) { - new HintDialog.Builder(getActivity()) - .setIcon(HintDialog.ICON_FINISH) + new TipsDialog.Builder(getActivity()) + .setIcon(TipsDialog.ICON_FINISH) .setMessage(R.string.phone_reset_commit_succeed) .setDuration(2000) .addOnDismissListener(dialog -> finish()) diff --git a/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java index d3fbf0b9..657c9fb0 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/RegisterActivity.java @@ -13,15 +13,13 @@ import com.gyf.immersionbar.ImmersionBar; import com.hjq.base.BaseActivity; import com.hjq.demo.R; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.GetCodeApi; +import com.hjq.demo.http.api.RegisterApi; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.GetCodeApi; -import com.hjq.demo.http.request.RegisterApi; -import com.hjq.demo.http.response.RegisterBean; import com.hjq.demo.manager.InputTextManager; -import com.hjq.demo.other.IntentKey; import com.hjq.http.EasyHttp; import com.hjq.http.listener.HttpCallback; import com.hjq.widget.view.CountdownView; @@ -38,11 +36,14 @@ public final class RegisterActivity extends AppActivity implements TextView.OnEditorActionListener { - @DebugLog + private static final String INTENT_KEY_PHONE = "phone"; + private static final String INTENT_KEY_PASSWORD = "password"; + + @Log public static void start(BaseActivity activity, String phone, String password, OnRegisterListener listener) { Intent intent = new Intent(activity, RegisterActivity.class); - intent.putExtra(IntentKey.PHONE, phone); - intent.putExtra(IntentKey.PASSWORD, password); + intent.putExtra(INTENT_KEY_PHONE, phone); + intent.putExtra(INTENT_KEY_PASSWORD, password); activity.startActivityForResult(intent, (resultCode, data) -> { if (listener == null || data == null) { @@ -50,7 +51,7 @@ public static void start(BaseActivity activity, String phone, String password, O } if (resultCode == RESULT_OK) { - listener.onSucceed(data.getStringExtra(IntentKey.PHONE), data.getStringExtra(IntentKey.PASSWORD)); + listener.onSucceed(data.getStringExtra(INTENT_KEY_PHONE), data.getStringExtra(INTENT_KEY_PASSWORD)); } else { listener.onCancel(); } @@ -100,9 +101,9 @@ protected void initView() { @Override protected void initData() { // 自动填充手机号和密码 - mPhoneView.setText(getString(IntentKey.PHONE)); - mFirstPassword.setText(getString(IntentKey.PASSWORD)); - mSecondPassword.setText(getString(IntentKey.PASSWORD)); + mPhoneView.setText(getString(INTENT_KEY_PHONE)); + mFirstPassword.setText(getString(INTENT_KEY_PASSWORD)); + mSecondPassword.setText(getString(INTENT_KEY_PASSWORD)); } @SingleClick @@ -171,8 +172,8 @@ public void onFail(Exception e) { mCommitView.showSucceed(); postDelayed(() -> { setResult(RESULT_OK, new Intent() - .putExtra(IntentKey.PHONE, mPhoneView.getText().toString()) - .putExtra(IntentKey.PASSWORD, mFirstPassword.getText().toString())); + .putExtra(INTENT_KEY_PHONE, mPhoneView.getText().toString()) + .putExtra(INTENT_KEY_PASSWORD, mFirstPassword.getText().toString())); finish(); }, 1000); }, 2000); @@ -185,7 +186,7 @@ public void onFail(Exception e) { .setPhone(mPhoneView.getText().toString()) .setCode(mCodeView.getText().toString()) .setPassword(mFirstPassword.getText().toString())) - .request(new HttpCallback>(this) { + .request(new HttpCallback>(this) { @Override public void onStart(Call call) { @@ -196,13 +197,13 @@ public void onStart(Call call) { public void onEnd(Call call) {} @Override - public void onSucceed(HttpData data) { + public void onSucceed(HttpData data) { postDelayed(() -> { mCommitView.showSucceed(); postDelayed(() -> { setResult(RESULT_OK, new Intent() - .putExtra(IntentKey.PHONE, mPhoneView.getText().toString()) - .putExtra(IntentKey.PASSWORD, mFirstPassword.getText().toString())); + .putExtra(INTENT_KEY_PHONE, mPhoneView.getText().toString()) + .putExtra(INTENT_KEY_PASSWORD, mFirstPassword.getText().toString())); finish(); }, 1000); }, 1000); @@ -223,6 +224,8 @@ public void onFail(Exception e) { @Override protected ImmersionBar createStatusBarConfig() { return super.createStatusBarConfig() + // 指定导航栏背景颜色 + .navigationBarColor(R.color.white) // 不要把整个布局顶上去 .keyboardEnable(true); } diff --git a/app/src/main/java/com/hjq/demo/ui/activity/RestartActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/RestartActivity.java index 0e08d6aa..afe8209a 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/RestartActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/RestartActivity.java @@ -29,9 +29,7 @@ protected int getLayoutId() { } @Override - protected void initView() { - - } + protected void initView() {} @Override protected void initData() { diff --git a/app/src/main/java/com/hjq/demo/ui/activity/SettingActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/SettingActivity.java index 0dfaa163..f903db7c 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/SettingActivity.java @@ -7,12 +7,12 @@ import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.LogoutApi; import com.hjq.demo.http.glide.GlideApp; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.LogoutApi; import com.hjq.demo.manager.ActivityManager; -import com.hjq.demo.manager.ThreadPoolManager; import com.hjq.demo.manager.CacheDataManager; +import com.hjq.demo.manager.ThreadPoolManager; import com.hjq.demo.other.AppConfig; import com.hjq.demo.ui.dialog.MenuDialog; import com.hjq.demo.ui.dialog.SafeDialog; @@ -116,7 +116,7 @@ public void onClick(View view) { } else if (viewId == R.id.sb_setting_agreement) { - BrowserActivity.start(this, "https://github.com/getActivity/AndroidProject"); + BrowserActivity.start(this, "https://github.com/getActivity/Donate"); } else if (viewId == R.id.sb_setting_about) { diff --git a/app/src/main/java/com/hjq/demo/ui/activity/SplashActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/SplashActivity.java index 38c9a16f..29344b86 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/SplashActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/SplashActivity.java @@ -12,9 +12,8 @@ import com.gyf.immersionbar.ImmersionBar; import com.hjq.demo.R; import com.hjq.demo.app.AppActivity; +import com.hjq.demo.http.api.UserInfoApi; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.UserInfoApi; -import com.hjq.demo.http.response.UserInfoBean; import com.hjq.demo.other.AppConfig; import com.hjq.http.EasyHttp; import com.hjq.http.listener.HttpCallback; @@ -67,10 +66,10 @@ protected void initData() { // 刷新用户信息 EasyHttp.post(this) .api(new UserInfoApi()) - .request(new HttpCallback>(this) { + .request(new HttpCallback>(this) { @Override - public void onSucceed(HttpData data) { + public void onSucceed(HttpData data) { } }); diff --git a/app/src/main/java/com/hjq/demo/ui/activity/StatusActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/StatusActivity.java index 4dd3d2aa..01b05c78 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/StatusActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/StatusActivity.java @@ -41,7 +41,7 @@ protected void initData() { postDelayed(this::showComplete, 2500); break; case 1: - showError(v -> { + showError(listener -> { showLoading(); postDelayed(this::showEmpty, 2500); }); diff --git a/app/src/main/java/com/hjq/demo/ui/activity/VideoPlayActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/VideoPlayActivity.java index 94a7e147..a96c7c01 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/VideoPlayActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/VideoPlayActivity.java @@ -3,6 +3,8 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -12,7 +14,6 @@ import com.gyf.immersionbar.ImmersionBar; import com.hjq.demo.R; import com.hjq.demo.app.AppActivity; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.widget.PlayerView; import java.io.File; @@ -23,8 +24,10 @@ * time : 2020/02/16 * desc : 视频播放界面 */ -public final class VideoPlayActivity extends AppActivity - implements PlayerView.onPlayListener { +public class VideoPlayActivity extends AppActivity + implements PlayerView.OnPlayListener { + + public static final String INTENT_KEY_PARAMETERS = "parameters"; private PlayerView mPlayerView; private VideoPlayActivity.Builder mBuilder; @@ -43,20 +46,22 @@ protected void initView() { @Override protected void initData() { - mBuilder = getParcelable(IntentKey.VIDEO); + mBuilder = getParcelable(INTENT_KEY_PARAMETERS); if (mBuilder == null) { throw new IllegalArgumentException("are you ok?"); } + mPlayerView.setVideoTitle(mBuilder.getVideoTitle()); mPlayerView.setVideoSource(mBuilder.getVideoSource()); mPlayerView.setGestureEnabled(mBuilder.isGestureEnabled()); + if (mBuilder.isAutoPlay()) { mPlayerView.start(); } } /** - * {@link PlayerView.onPlayListener} + * {@link PlayerView.OnPlayListener} */ @Override public void onClickBack(PlayerView view) { @@ -71,12 +76,21 @@ public void onPlayStart(PlayerView view) { } } + @Override + public void onPlayProgress(PlayerView view) { + // 记录播放进度 + mBuilder.setPlayProgress(view.getProgress()); + } + @Override public void onPlayEnd(PlayerView view) { if (mBuilder.isLoopPlay()) { mPlayerView.setProgress(0); mPlayerView.start(); - } else if (mBuilder.isAutoOver()) { + return; + } + + if (mBuilder.isAutoOver()) { finish(); } } @@ -89,119 +103,161 @@ protected ImmersionBar createStatusBarConfig() { .hideBar(BarHide.FLAG_HIDE_BAR); } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + // 保存播放进度 + outState.putParcelable(INTENT_KEY_PARAMETERS, mBuilder); + } + + @Override + protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + // 读取播放进度 + mBuilder = savedInstanceState.getParcelable(INTENT_KEY_PARAMETERS); + } + + /** 竖屏播放 */ + public static final class Portrait extends VideoPlayActivity {} + + /** 横屏播放 */ + public static final class Landscape extends VideoPlayActivity {} + /** * 播放参数构建 */ public static final class Builder implements Parcelable { /** 视频源 */ - private String mVideoSource; + private String videoSource; /** 视频标题 */ - private String mVideoTitle; + private String videoTitle; + /** 播放进度 */ - private int mPlayProgress; + private int playProgress; /** 手势开关 */ - private boolean mGestureEnabled = true; + private boolean gestureEnabled = true; /** 循环播放 */ - private boolean mLoopPlay = false; + private boolean loopPlay = false; /** 自动播放 */ - private boolean mAutoPlay = true; + private boolean autoPlay = true; /** 播放完关闭 */ - private boolean mAutoOver = true; + private boolean autoOver = true; + + /** 播放方向 */ + private int activityOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; public Builder() {} protected Builder(Parcel in) { - mVideoSource = in.readString(); - mVideoTitle = in.readString(); - mPlayProgress = in.readInt(); - mGestureEnabled = in.readByte() != 0; - mLoopPlay = in.readByte() != 0; - mAutoPlay = in.readByte() != 0; - mAutoOver = in.readByte() != 0; + videoSource = in.readString(); + videoTitle = in.readString(); + activityOrientation = in.readInt(); + + playProgress = in.readInt(); + gestureEnabled = in.readByte() != 0; + loopPlay = in.readByte() != 0; + autoPlay = in.readByte() != 0; + autoOver = in.readByte() != 0; } public Builder setVideoSource(File file) { - mVideoSource = file.getPath(); - if (mVideoTitle == null) { - mVideoTitle = file.getName(); + videoSource = file.getPath(); + if (videoTitle == null) { + videoTitle = file.getName(); } return this; } public Builder setVideoSource(String url) { - mVideoSource = url; + videoSource = url; return this; } private String getVideoSource() { - return mVideoSource; + return videoSource; } public Builder setVideoTitle(String title) { - mVideoTitle = title; + videoTitle = title; return this; } private String getVideoTitle() { - return mVideoTitle; + return videoTitle; } public Builder setPlayProgress(int progress) { - mPlayProgress = progress; + playProgress = progress; return this; } private int getPlayProgress() { - return mPlayProgress; + return playProgress; } public Builder setGestureEnabled(boolean enabled) { - mGestureEnabled = enabled; + gestureEnabled = enabled; return this; } private boolean isGestureEnabled() { - return mGestureEnabled; + return gestureEnabled; } public Builder setLoopPlay(boolean enabled) { - mLoopPlay = enabled; + loopPlay = enabled; return this; } private boolean isLoopPlay() { - return mLoopPlay; + return loopPlay; } public Builder setAutoPlay(boolean enabled) { - mAutoPlay = enabled; + autoPlay = enabled; return this; } public boolean isAutoPlay() { - return mAutoPlay; + return autoPlay; } public Builder setAutoOver(boolean enabled) { - mAutoOver = enabled; + autoOver = enabled; return this; } private boolean isAutoOver() { - return mAutoOver; + return autoOver; + } + + public Builder setActivityOrientation(int orientation) { + activityOrientation = orientation; + return this; } public void start(Context context) { - Intent intent = new Intent(context, VideoPlayActivity.class); - intent.putExtra(IntentKey.VIDEO, this); + Intent intent = new Intent(); + switch (activityOrientation) { + case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE: + intent.setClass(context, VideoPlayActivity.Landscape.class); + break; + case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT: + intent.setClass(context, VideoPlayActivity.Portrait.class); + break; + default: + intent.setClass(context, VideoPlayActivity.class); + break; + } + + intent.putExtra(INTENT_KEY_PARAMETERS, this); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } context.startActivity(intent); } - @Override public int describeContents() { return 0; @@ -209,13 +265,14 @@ public int describeContents() { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mVideoSource); - dest.writeString(mVideoTitle); - dest.writeInt(mPlayProgress); - dest.writeByte(mGestureEnabled ? (byte) 1 : (byte) 0); - dest.writeByte(mLoopPlay ? (byte) 1 : (byte) 0); - dest.writeByte(mAutoPlay ? (byte) 1 : (byte) 0); - dest.writeByte(mAutoOver ? (byte) 1 : (byte) 0); + dest.writeString(videoSource); + dest.writeString(videoTitle); + dest.writeInt(activityOrientation); + dest.writeInt(playProgress); + dest.writeByte(gestureEnabled ? (byte) 1 : (byte) 0); + dest.writeByte(loopPlay ? (byte) 1 : (byte) 0); + dest.writeByte(autoPlay ? (byte) 1 : (byte) 0); + dest.writeByte(autoOver ? (byte) 1 : (byte) 0); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/app/src/main/java/com/hjq/demo/ui/activity/VideoSelectActivity.java b/app/src/main/java/com/hjq/demo/ui/activity/VideoSelectActivity.java index ba104a6c..c5909648 100644 --- a/app/src/main/java/com/hjq/demo/ui/activity/VideoSelectActivity.java +++ b/app/src/main/java/com/hjq/demo/ui/activity/VideoSelectActivity.java @@ -2,6 +2,7 @@ import android.content.ContentResolver; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.database.Cursor; import android.media.MediaMetadataRetriever; import android.net.Uri; @@ -9,7 +10,6 @@ import android.os.Parcelable; import android.provider.MediaStore; import android.text.TextUtils; -import android.util.TypedValue; import android.view.View; import android.view.animation.AnimationUtils; @@ -17,23 +17,23 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.hjq.base.BaseActivity; import com.hjq.base.BaseAdapter; import com.hjq.demo.R; import com.hjq.demo.action.StatusAction; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.aop.Permissions; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppActivity; import com.hjq.demo.manager.ThreadPoolManager; import com.hjq.demo.other.GridSpaceDecoration; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.ui.adapter.VideoSelectAdapter; import com.hjq.demo.ui.dialog.AlbumDialog; import com.hjq.demo.widget.StatusLayout; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; +import com.hjq.widget.view.FloatActionButton; +import com.tencent.bugly.crashreport.CrashReport; import java.io.File; import java.util.ArrayList; @@ -54,26 +54,35 @@ public final class VideoSelectActivity extends AppActivity BaseAdapter.OnItemLongClickListener, BaseAdapter.OnChildClickListener { + private static final String INTENT_KEY_IN_MAX_SELECT = "maxSelect"; + + private static final String INTENT_KEY_OUT_VIDEO_LIST = "videoList"; + public static void start(BaseActivity activity, OnVideoSelectListener listener) { start(activity, 1, listener); } - @DebugLog - @Permissions({Permission.MANAGE_EXTERNAL_STORAGE}) + @Log + @Permissions({Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE}) public static void start(BaseActivity activity, int maxSelect, OnVideoSelectListener listener) { if (maxSelect < 1) { // 最少要选择一个视频 throw new IllegalArgumentException("are you ok?"); } Intent intent = new Intent(activity, VideoSelectActivity.class); - intent.putExtra(IntentKey.AMOUNT, maxSelect); + intent.putExtra(INTENT_KEY_IN_MAX_SELECT, maxSelect); activity.startActivityForResult(intent, (resultCode, data) -> { - if (listener == null || data == null) { + if (listener == null) { return; } - ArrayList list = data.getParcelableArrayListExtra(IntentKey.VIDEO); + if (data == null) { + listener.onCancel(); + return; + } + + ArrayList list = data.getParcelableArrayListExtra(INTENT_KEY_OUT_VIDEO_LIST); if (list == null || list.isEmpty()) { listener.onCancel(); return; @@ -96,7 +105,7 @@ public static void start(BaseActivity activity, int maxSelect, OnVideoSelectList private StatusLayout mStatusLayout; private RecyclerView mRecyclerView; - private FloatingActionButton mFloatingView; + private FloatActionButton mFloatingView; private VideoSelectAdapter mAdapter; @@ -133,19 +142,34 @@ protected void initView() { // 禁用动画效果 mRecyclerView.setItemAnimator(null); // 添加分割线 - mRecyclerView.addItemDecoration(new GridSpaceDecoration((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()))); + mRecyclerView.addItemDecoration(new GridSpaceDecoration((int) getResources().getDimension(R.dimen.dp_5))); + // 设置滚动监听 + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + switch (newState) { + case RecyclerView.SCROLL_STATE_DRAGGING: + mFloatingView.hide(); + break; + case RecyclerView.SCROLL_STATE_IDLE: + mFloatingView.show(); + break; + default: + break; + } + } + }); } - @SuppressWarnings("all") @Override protected void initData() { // 获取最大的选择数 - mMaxSelect = getInt(IntentKey.AMOUNT, mMaxSelect); + mMaxSelect = getInt(INTENT_KEY_IN_MAX_SELECT, mMaxSelect); // 显示加载进度条 showLoading(); // 加载视频列表 - ThreadPoolManager.getInstance().execute(VideoSelectActivity.this); + ThreadPoolManager.getInstance().execute(this); } @Override @@ -166,10 +190,11 @@ public void onRightClick(View view) { Set keys = mAllAlbum.keySet(); for (String key : keys) { List list = mAllAlbum.get(key); - if (list != null && !list.isEmpty()) { - count += list.size(); - data.add(new AlbumDialog.AlbumInfo(list.get(0).getVideoPath(), key, String.format(getString(R.string.video_select_total), list.size()), mAdapter.getData() == list)); + if (list == null || list.isEmpty()) { + continue; } + count += list.size(); + data.add(new AlbumDialog.AlbumInfo(list.get(0).getVideoPath(), key, String.format(getString(R.string.video_select_total), list.size()), mAdapter.getData() == list)); } data.add(0, new AlbumDialog.AlbumInfo(mAllVideo.get(0).getVideoPath(), getString(R.string.video_select_all), String.format(getString(R.string.video_select_total), count), mAdapter.getData() == mAllVideo)); @@ -186,7 +211,7 @@ public void onRightClick(View view) { mAdapter.setData(mAllAlbum.get(bean.getName())); } // 执行列表动画 - mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.from_right_layout)); + mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.layout_from_right)); mRecyclerView.scheduleLayoutAnimation(); }); } @@ -211,18 +236,20 @@ protected void onRestart() { mAllVideo.remove(bean); File parentFile = file.getParentFile(); - if (parentFile != null) { - List data = mAllAlbum.get(parentFile.getName()); - if (data != null) { - data.remove(bean); - } - mAdapter.notifyDataSetChanged(); + if (parentFile == null) { + continue; + } - if (mSelectVideo.isEmpty()) { - mFloatingView.setImageResource(R.drawable.videocam_ic); - } else { - mFloatingView.setImageResource(R.drawable.succeed_ic); - } + List data = mAllAlbum.get(parentFile.getName()); + if (data != null) { + data.remove(bean); + } + mAdapter.notifyDataSetChanged(); + + if (mSelectVideo.isEmpty()) { + mFloatingView.setImageResource(R.drawable.videocam_ic); + } else { + mFloatingView.setImageResource(R.drawable.succeed_ic); } } } @@ -233,24 +260,31 @@ public void onClick(View view) { if (view.getId() == R.id.fab_video_select_floating) { if (mSelectVideo.isEmpty()) { // 点击拍照 - CameraActivity.start(this, true, file -> { + CameraActivity.start(this, true, new CameraActivity.OnCameraListener() { + @Override + public void onSelected(File file) { + // 当前选中视频的数量必须小于最大选中数 + if (mSelectVideo.size() < mMaxSelect) { + mSelectVideo.add(VideoBean.newInstance(file.getPath())); + } - // 当前选中视频的数量必须小于最大选中数 - if (mSelectVideo.size() < mMaxSelect) { - mSelectVideo.add(VideoBean.newInstance(file.getPath())); + // 这里需要延迟刷新,否则可能会找不到拍照的视频 + postDelayed(() -> { + // 重新加载视频列表 + ThreadPoolManager.getInstance().execute(VideoSelectActivity.this); + }, 1000); } - // 这里需要延迟刷新,否则可能会找不到拍照的视频 - postDelayed(() -> { - // 重新加载视频列表 - ThreadPoolManager.getInstance().execute(VideoSelectActivity.this); - }, 1000); + @Override + public void onError(String details) { + toast(details); + } }); return; } // 完成选择 - setResult(RESULT_OK, new Intent().putParcelableArrayListExtra(IntentKey.VIDEO, mSelectVideo)); + setResult(RESULT_OK, new Intent().putParcelableArrayListExtra(INTENT_KEY_OUT_VIDEO_LIST, mSelectVideo)); finish(); } } @@ -263,8 +297,11 @@ public void onClick(View view) { */ @Override public void onItemClick(RecyclerView recyclerView, View itemView, int position) { + VideoBean bean = mAdapter.getItem(position); new VideoPlayActivity.Builder() - .setVideoSource(new File(mAdapter.getItem(position).getVideoPath())) + .setVideoSource(new File(bean.getVideoPath())) + .setActivityOrientation(bean.getVideoWidth() > bean.getVideoHeight() ? + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) .start(getActivity()); } @@ -305,11 +342,7 @@ public void onChildClick(RecyclerView recyclerView, View childView, int position mSelectVideo.remove(bean); if (mSelectVideo.isEmpty()) { - mFloatingView.hide(); - postDelayed(() -> { - mFloatingView.setImageResource(R.drawable.videocam_ic); - mFloatingView.show(); - }, 200); + mFloatingView.setImageResource(R.drawable.videocam_ic); } mAdapter.notifyItemChanged(position); @@ -332,11 +365,7 @@ public void onChildClick(RecyclerView recyclerView, View childView, int position mSelectVideo.add(bean); if (mSelectVideo.size() == 1) { - mFloatingView.hide(); - postDelayed(() -> { - mFloatingView.setImageResource(R.drawable.succeed_ic); - mFloatingView.show(); - }, 200); + mFloatingView.setImageResource(R.drawable.succeed_ic); } } else { toast(String.format(getString(R.string.video_select_max_hint), mMaxSelect)); @@ -361,7 +390,7 @@ public void run() { MediaStore.MediaColumns.HEIGHT, MediaStore.MediaColumns.SIZE, MediaStore.Video.Media.DURATION}; Cursor cursor = null; - if (XXPermissions.isGrantedPermission(this, Permission.MANAGE_EXTERNAL_STORAGE)) { + if (XXPermissions.isGranted(this, Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE)) { cursor = contentResolver.query(contentUri, projections, selection, new String[]{String.valueOf(MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO)}, sortOrder); } if (cursor != null && cursor.moveToFirst()) { @@ -370,6 +399,8 @@ public void run() { int mimeTypeIndex = cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE); int sizeIndex = cursor.getColumnIndex(MediaStore.MediaColumns.SIZE); int durationIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DURATION); + int widthIndex = cursor.getColumnIndex(MediaStore.MediaColumns.WIDTH); + int heightIndex = cursor.getColumnIndex(MediaStore.MediaColumns.HEIGHT); do { long duration = cursor.getLong(durationIndex); @@ -396,20 +427,25 @@ public void run() { } File parentFile = file.getParentFile(); - if (parentFile != null) { - // 获取目录名作为专辑名称 - String albumName = parentFile.getName(); - List data = mAllAlbum.get(albumName); - if (data == null) { - data = new ArrayList<>(); - mAllAlbum.put(albumName, data); - } + if (parentFile == null) { + continue; + } - VideoBean bean = new VideoBean(path, duration, size); - data.add(bean); - mAllVideo.add(bean); + // 获取目录名作为专辑名称 + String albumName = parentFile.getName(); + List data = mAllAlbum.get(albumName); + if (data == null) { + data = new ArrayList<>(); + mAllAlbum.put(albumName, data); } + int width = cursor.getInt(widthIndex); + int height = cursor.getInt(heightIndex); + + VideoBean bean = new VideoBean(path, width, height, duration, size); + data.add(bean); + mAllVideo.add(bean); + } while (cursor.moveToNext()); cursor.close(); @@ -428,7 +464,7 @@ public void run() { } // 执行列表动画 - mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.fall_down_layout)); + mRecyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.layout_fall_down)); mRecyclerView.scheduleLayoutAnimation(); if (mAllVideo.isEmpty()) { @@ -450,49 +486,79 @@ public void run() { */ public static class VideoBean implements Parcelable { - private final String videoPath; - private final long duration; - private final long size; + private final String mVideoPath; + private final int mVideoWidth; + private final int mVideoHeight; + private final long mVideoDuration; + private final long mVideoSize; public static VideoBean newInstance(String videoPath) { - int duration = 0; + int videoWidth = 0; + int videoHeight = 0; + long videoDuration = 0; try { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - // 荣耀 LLD AL20 Android 8.0 出现:java.lang.IllegalArgumentException - // 荣耀 HLK AL00 Android 10.0 出现:java.lang.RuntimeException:setDataSource failed: status = 0x80000000 retriever.setDataSource(videoPath); - duration = Integer.parseInt(retriever.extractMetadata - (MediaMetadataRetriever.METADATA_KEY_DURATION)); + + String widthMetadata = retriever.extractMetadata + (MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); + if (widthMetadata != null && !"".equals(widthMetadata)) { + videoWidth = Integer.parseInt(widthMetadata); + } + + String heightMetadata = retriever.extractMetadata + (MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); + if (heightMetadata != null && !"".equals(heightMetadata)) { + videoHeight = Integer.parseInt(heightMetadata); + } + + String durationMetadata = retriever.extractMetadata + (MediaMetadataRetriever.METADATA_KEY_DURATION); + if (durationMetadata != null && !"".equals(durationMetadata)) { + videoDuration = Long.parseLong(durationMetadata); + } } catch (RuntimeException e) { - e.printStackTrace(); + // 荣耀 LLD AL20 Android 8.0 出现:java.lang.IllegalArgumentException + // 荣耀 HLK AL00 Android 10.0 出现:java.lang.RuntimeException:setDataSource failed: status = 0x80000000 + CrashReport.postCatchedException(e); } - long size = new File(videoPath).length(); - return new VideoBean(videoPath, duration, size); + long videoSize = new File(videoPath).length(); + return new VideoBean(videoPath, videoWidth, videoHeight, videoDuration, videoSize); + } + + public VideoBean(String path, int width, int height, long duration, long size) { + mVideoPath = path; + mVideoWidth = width; + mVideoHeight = height; + mVideoDuration = duration; + mVideoSize = size; + } + + public int getVideoWidth() { + return mVideoWidth; } - public VideoBean(String videoPath, long videoDuration, long videoSize) { - this.videoPath = videoPath; - this.duration = videoDuration; - this.size = videoSize; + public int getVideoHeight() { + return mVideoHeight; } public String getVideoPath() { - return videoPath; + return mVideoPath; } public long getVideoDuration() { - return duration; + return mVideoDuration; } public long getVideoSize() { - return size; + return mVideoSize; } @Override public boolean equals(@Nullable Object obj) { if (obj instanceof VideoBean) { - return videoPath.equals(((VideoBean) obj).videoPath); + return mVideoPath.equals(((VideoBean) obj).mVideoPath); } return false; } @@ -500,7 +566,7 @@ public boolean equals(@Nullable Object obj) { @NonNull @Override public String toString() { - return videoPath; + return mVideoPath; } @Override @@ -510,15 +576,19 @@ public int describeContents() { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeString(this.videoPath); - dest.writeLong(this.duration); - dest.writeLong(this.size); + dest.writeString(mVideoPath); + dest.writeInt(mVideoWidth); + dest.writeInt(mVideoHeight); + dest.writeLong(mVideoDuration); + dest.writeLong(mVideoSize); } protected VideoBean(Parcel in) { - this.videoPath = in.readString(); - this.duration = in.readLong(); - this.size = in.readLong(); + mVideoPath = in.readString(); + mVideoWidth = in.readInt(); + mVideoHeight = in.readInt(); + mVideoDuration = in.readLong(); + mVideoSize = in.readLong(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/app/src/main/java/com/hjq/demo/ui/adapter/GuideAdapter.java b/app/src/main/java/com/hjq/demo/ui/adapter/GuideAdapter.java index 4dcd021a..888ed3df 100644 --- a/app/src/main/java/com/hjq/demo/ui/adapter/GuideAdapter.java +++ b/app/src/main/java/com/hjq/demo/ui/adapter/GuideAdapter.java @@ -19,6 +19,9 @@ public final class GuideAdapter extends AppAdapter { public GuideAdapter(Context context) { super(context); + addItem(R.drawable.guide_1_bg); + addItem(R.drawable.guide_2_bg); + addItem(R.drawable.guide_3_bg); } @NonNull diff --git a/app/src/main/java/com/hjq/demo/ui/adapter/NavigationAdapter.java b/app/src/main/java/com/hjq/demo/ui/adapter/NavigationAdapter.java new file mode 100644 index 00000000..627f2a84 --- /dev/null +++ b/app/src/main/java/com/hjq/demo/ui/adapter/NavigationAdapter.java @@ -0,0 +1,133 @@ +package com.hjq.demo.ui.adapter; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.hjq.base.BaseAdapter; +import com.hjq.demo.R; +import com.hjq.demo.app.AppAdapter; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/02/28 + * desc : 导航栏适配器 + */ +public final class NavigationAdapter extends AppAdapter + implements BaseAdapter.OnItemClickListener { + + /** 当前选中条目位置 */ + private int mSelectedPosition = 0; + + /** 导航栏点击监听 */ + @Nullable + private OnNavigationListener mListener; + + public NavigationAdapter(Context context) { + super(context); + setOnItemClickListener(this); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(); + } + + @Override + protected RecyclerView.LayoutManager generateDefaultLayoutManager(Context context) { + return new GridLayoutManager(context, getCount(), RecyclerView.VERTICAL, false); + } + + public int getSelectedPosition() { + return mSelectedPosition; + } + + public void setSelectedPosition(int position) { + mSelectedPosition = position; + notifyDataSetChanged(); + } + + /** + * 设置导航栏监听 + */ + public void setOnNavigationListener(@Nullable OnNavigationListener listener) { + mListener = listener; + } + + /** + * {@link BaseAdapter.OnItemClickListener} + */ + + @Override + public void onItemClick(RecyclerView recyclerView, View itemView, int position) { + if (mSelectedPosition == position) { + return; + } + + if (mListener == null) { + mSelectedPosition = position; + notifyDataSetChanged(); + return; + } + + if (mListener.onNavigationItemSelected(position)) { + mSelectedPosition = position; + notifyDataSetChanged(); + } + } + + private final class ViewHolder extends AppAdapter.ViewHolder { + + private final ImageView mIconView; + private final TextView mTitleView; + + private ViewHolder() { + super(R.layout.home_navigation_item); + mIconView = findViewById(R.id.iv_home_navigation_icon); + mTitleView = findViewById(R.id.tv_home_navigation_title); + } + + @Override + public void onBindView(int position) { + MenuItem item = getItem(position); + mIconView.setImageDrawable(item.getDrawable()); + mTitleView.setText(item.getText()); + mIconView.setSelected(mSelectedPosition == position); + mTitleView.setSelected(mSelectedPosition == position); + } + } + + public static class MenuItem { + + private final String mText; + private final Drawable mDrawable; + + public MenuItem(String text, Drawable drawable) { + mText = text; + mDrawable = drawable; + } + + public String getText() { + return mText; + } + + public Drawable getDrawable() { + return mDrawable; + } + } + + public interface OnNavigationListener { + + boolean onNavigationItemSelected(int position); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/adapter/TabAdapter.java b/app/src/main/java/com/hjq/demo/ui/adapter/TabAdapter.java new file mode 100644 index 00000000..42e347ab --- /dev/null +++ b/app/src/main/java/com/hjq/demo/ui/adapter/TabAdapter.java @@ -0,0 +1,276 @@ +package com.hjq.demo.ui.adapter; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.hjq.base.BaseAdapter; +import com.hjq.demo.R; +import com.hjq.demo.app.AppAdapter; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/02/28 + * desc : Tab 适配器 + */ +public final class TabAdapter extends AppAdapter implements BaseAdapter.OnItemClickListener { + + public static final int TAB_MODE_DESIGN = 1; + public static final int TAB_MODE_SLIDING = 2; + + /** 当前选中条目位置 */ + private int mSelectedPosition = 0; + + /** 导航栏监听对象 */ + @Nullable + private OnTabListener mListener; + + /** Tab 样式 */ + private final int mTabMode; + + /** Tab 宽度是否固定 */ + private final boolean mFixed; + + public TabAdapter(Context context) { + this(context, TAB_MODE_DESIGN, true); + } + + public TabAdapter(Context context, int tabMode, boolean fixed) { + super(context); + mTabMode = tabMode; + mFixed = fixed; + setOnItemClickListener(this); + registerAdapterDataObserver(new TabAdapterDataObserver()); + } + + @Override + public int getItemViewType(int position) { + return mTabMode; + } + + @NonNull + @Override + public BaseAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + switch (viewType) { + case TAB_MODE_DESIGN: + return new DesignViewHolder(); + case TAB_MODE_SLIDING: + return new SlidingViewHolder(); + default: + throw new IllegalArgumentException("are you ok?"); + } + } + + @Override + protected RecyclerView.LayoutManager generateDefaultLayoutManager(Context context) { + if (mFixed) { + int count = getCount(); + if (count < 1) { + count = 1; + } + return new GridLayoutManager(context, count, RecyclerView.VERTICAL, false); + } else { + return new LinearLayoutManager(context, RecyclerView.HORIZONTAL, false); + } + } + + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + // 禁用 RecyclerView 条目动画 + recyclerView.setItemAnimator(null); + } + + public int getSelectedPosition() { + return mSelectedPosition; + } + + public void setSelectedPosition(int position) { + if (mSelectedPosition == position) { + return; + } + notifyItemChanged(mSelectedPosition); + mSelectedPosition = position; + notifyItemChanged(position); + } + + /** + * 设置导航栏监听 + */ + public void setOnTabListener(@Nullable OnTabListener listener) { + mListener = listener; + } + + /** + * {@link BaseAdapter.OnItemClickListener} + */ + + @Override + public void onItemClick(RecyclerView recyclerView, View itemView, int position) { + if (mSelectedPosition == position) { + return; + } + + if (mListener == null) { + mSelectedPosition = position; + notifyDataSetChanged(); + return; + } + + if (mListener.onTabSelected(recyclerView, position)) { + mSelectedPosition = position; + notifyDataSetChanged(); + } + } + + private final class DesignViewHolder extends AppAdapter.ViewHolder { + + private final TextView mTitleView; + private final View mLineView; + + private DesignViewHolder() { + super(R.layout.tab_item_design); + mTitleView = findViewById(R.id.tv_tab_design_title); + mLineView = findViewById(R.id.v_tab_design_line); + if (!mFixed) { + return; + } + View itemView = getItemView(); + ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams(); + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + itemView.setLayoutParams(layoutParams); + } + + @Override + public void onBindView(int position) { + mTitleView.setText(getItem(position)); + mTitleView.setSelected(mSelectedPosition == position); + mLineView.setVisibility(mSelectedPosition == position ? View.VISIBLE : View.INVISIBLE); + } + } + + private final class SlidingViewHolder extends AppAdapter.ViewHolder + implements ValueAnimator.AnimatorUpdateListener { + + private final int mDefaultTextSize; + private final int mSelectedTextSize; + + private final TextView mTitleView; + private final View mLineView; + + private SlidingViewHolder() { + super(R.layout.tab_item_sliding); + mTitleView = findViewById(R.id.tv_tab_sliding_title); + mLineView = findViewById(R.id.v_tab_sliding_line); + + mDefaultTextSize = (int) getResources().getDimension(R.dimen.sp_14); + mSelectedTextSize = (int) getResources().getDimension(R.dimen.sp_15); + + mTitleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultTextSize); + + if (!mFixed) { + return; + } + View itemView = getItemView(); + ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams(); + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + itemView.setLayoutParams(layoutParams); + } + + @Override + public void onBindView(int position) { + mTitleView.setText(getItem(position)); + mTitleView.setSelected(mSelectedPosition == position); + mLineView.setVisibility(mSelectedPosition == position ? View.VISIBLE : View.INVISIBLE); + + int textSize = (int) mTitleView.getTextSize(); + if (mSelectedPosition == position) { + if (textSize != mSelectedTextSize) { + startAnimator(mDefaultTextSize, mSelectedTextSize); + } + return; + } + + if (textSize != mDefaultTextSize) { + startAnimator(mSelectedTextSize, mDefaultTextSize); + } + } + + private void startAnimator(int start, int end) { + ValueAnimator valueAnimator = ValueAnimator.ofInt(start, end); + valueAnimator.addUpdateListener(this); + valueAnimator.setDuration(100); + valueAnimator.start(); + } + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mTitleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, (int) animation.getAnimatedValue()); + } + } + + /** + * 数据改变监听器 + */ + private final class TabAdapterDataObserver extends RecyclerView.AdapterDataObserver { + + @Override + public void onChanged() { + refreshLayoutManager(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {} + + @Override + public void onItemRangeChanged(int positionStart, int itemCount) {} + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + refreshLayoutManager(); + } + + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + refreshLayoutManager(); + if (getSelectedPosition() > positionStart - itemCount) { + setSelectedPosition(positionStart - itemCount); + } + } + + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {} + + private void refreshLayoutManager() { + if (!mFixed) { + return; + } + RecyclerView recyclerView = getRecyclerView(); + if (recyclerView == null) { + return; + } + recyclerView.setLayoutManager(generateDefaultLayoutManager(getContext())); + } + } + + /** + * Tab 监听器 + */ + public interface OnTabListener { + + /** + * Tab 被选中了 + */ + boolean onTabSelected(RecyclerView recyclerView, int position); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/AddressDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/AddressDialog.java index 2ce044e7..db509719 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/AddressDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/AddressDialog.java @@ -10,15 +10,17 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.widget.ViewPager2; -import com.google.android.material.tabs.TabLayout; import com.hjq.base.BaseDialog; import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; import com.hjq.demo.app.AppAdapter; +import com.hjq.demo.ui.adapter.TabAdapter; +import com.tencent.bugly.crashreport.CrashReport; import org.json.JSONArray; import org.json.JSONException; @@ -30,7 +32,6 @@ import java.util.ArrayList; import java.util.List; -import static androidx.viewpager.widget.ViewPager.SCROLL_STATE_DRAGGING; import static androidx.viewpager.widget.ViewPager.SCROLL_STATE_IDLE; import static androidx.viewpager.widget.ViewPager.SCROLL_STATE_SETTLING; @@ -45,18 +46,21 @@ public final class AddressDialog { public static final class Builder extends BaseDialog.Builder - implements TabLayout.OnTabSelectedListener, + implements TabAdapter.OnTabListener, Runnable, RecyclerViewAdapter.OnSelectListener, BaseDialog.OnShowListener, BaseDialog.OnDismissListener { private final TextView mTitleView; private final ImageView mCloseView; - private final TabLayout mTabLayout; + private final RecyclerView mTabView; private final ViewPager2 mViewPager; + + private final TabAdapter mTabAdapter; private final RecyclerViewAdapter mAdapter; private final ViewPager2.OnPageChangeCallback mCallback; + @Nullable private OnListener mListener; private String mProvince = null; @@ -78,11 +82,13 @@ public Builder(Context context) { mTitleView = findViewById(R.id.tv_address_title); mCloseView = findViewById(R.id.iv_address_closer); - mTabLayout = findViewById(R.id.tb_address_tab); + mTabView = findViewById(R.id.rv_address_tab); setOnClickListener(mCloseView); - mTabLayout.addTab(mTabLayout.newTab().setText(getString(R.string.address_hint)), true); - mTabLayout.addOnTabSelectedListener(this); + mTabAdapter = new TabAdapter(context, TabAdapter.TAB_MODE_SLIDING, false); + mTabAdapter.addItem(getString(R.string.address_hint)); + mTabAdapter.setOnTabListener(this); + mTabView.setAdapter(mTabAdapter); mCallback = new ViewPager2.OnPageChangeCallback() { @@ -92,18 +98,14 @@ public Builder(Context context) { public void onPageScrollStateChanged(int state) { mPreviousScrollState = mScrollState; mScrollState = state; - if (state == ViewPager2.SCROLL_STATE_IDLE && mTabLayout.getSelectedTabPosition() != mViewPager.getCurrentItem()) { + if (state == ViewPager2.SCROLL_STATE_IDLE && mTabAdapter.getSelectedPosition() != mViewPager.getCurrentItem()) { final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE || (mScrollState == SCROLL_STATE_SETTLING && mPreviousScrollState == SCROLL_STATE_IDLE); - mTabLayout.selectTab(mTabLayout.getTabAt(mViewPager.getCurrentItem()), updateIndicator); + onTabSelected(mTabView, mViewPager.getCurrentItem()); } } @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - final boolean updateText = mScrollState != SCROLL_STATE_SETTLING || mPreviousScrollState == SCROLL_STATE_DRAGGING; - final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING && mPreviousScrollState == SCROLL_STATE_IDLE); - mTabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator); - } + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} }; // 显示省份列表 @@ -124,16 +126,21 @@ public Builder setTitle(CharSequence text) { * 设置默认省份 */ public Builder setProvince(String province) { - if (!TextUtils.isEmpty(province)) { - List data = mAdapter.getItem(0); - if (data != null && !data.isEmpty()) { - for (int i = 0; i < data.size(); i++) { - if (province.equals(data.get(i).getName())) { - selectedAddress(0, i, false); - break; - } - } + if (TextUtils.isEmpty(province)) { + return this; + } + + List data = mAdapter.getItem(0); + if (data == null || data.isEmpty()) { + return this; + } + + for (int i = 0; i < data.size(); i++) { + if (!province.equals(data.get(i).getName())) { + continue; } + selectedAddress(0, i, false); + break; } return this; } @@ -146,19 +153,24 @@ public Builder setCity(String city) { // 已经忽略了县级区域的选择,不能选定指定的城市 throw new IllegalStateException("The selection of county-level regions has been ignored. The designated city cannot be selected"); } - if (!TextUtils.isEmpty(city)) { - List data = mAdapter.getItem(1); - if (data != null && !data.isEmpty()) { - for (int i = 0; i < data.size(); i++) { - if (city.equals(data.get(i).getName())) { - // 避开直辖市,因为选择省的时候已经自动跳过市区了 - if (mAdapter.getItem(1).size() > 1) { - selectedAddress(1, i, false); - } - break; - } - } + if (TextUtils.isEmpty(city)) { + return this; + } + + List data = mAdapter.getItem(1); + if (data == null || data.isEmpty()) { + return this; + } + + for (int i = 0; i < data.size(); i++) { + if (!city.equals(data.get(i).getName())) { + continue; } + // 避开直辖市,因为选择省的时候已经自动跳过市区了 + if (mAdapter.getItem(1).size() > 1) { + selectedAddress(1, i, false); + } + break; } return this; } @@ -167,7 +179,7 @@ public Builder setCity(String city) { * 不选择县级区域 */ public Builder setIgnoreArea() { - if (mAdapter.getItemCount() == 3) { + if (mAdapter.getCount() == 3) { // 已经指定了城市,则不能忽略县级区域 throw new IllegalStateException("Cities have been designated and county-level areas can no longer be ignored"); } @@ -201,9 +213,10 @@ private void selectedAddress(int type, int position, boolean smoothScroll) { case 0: // 记录当前选择的省份 mProvince = mAdapter.getItem(type).get(position).getName(); - mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).setText(mProvince); + mTabAdapter.setItem(type, mProvince); - mTabLayout.addTab(mTabLayout.newTab().setText(getString(R.string.address_hint)), true); + mTabAdapter.addItem(getString(R.string.address_hint)); + mTabAdapter.setSelectedPosition(type + 1); mAdapter.addItem(AddressManager.getCityList(mAdapter.getItem(type).get(position).getNext())); mViewPager.setCurrentItem(type + 1, smoothScroll); @@ -215,7 +228,7 @@ private void selectedAddress(int type, int position, boolean smoothScroll) { case 1: // 记录当前选择的城市 mCity = mAdapter.getItem(type).get(position).getName(); - mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).setText(mCity); + mTabAdapter.setItem(type, mCity); if (mIgnoreArea) { @@ -227,7 +240,8 @@ private void selectedAddress(int type, int position, boolean smoothScroll) { postDelayed(this::dismiss, 300); } else { - mTabLayout.addTab(mTabLayout.newTab().setText(getString(R.string.address_hint)), true); + mTabAdapter.addItem(getString(R.string.address_hint)); + mTabAdapter.setSelectedPosition(type + 1); mAdapter.addItem(AddressManager.getAreaList(mAdapter.getItem(type).get(position).getNext())); mViewPager.setCurrentItem(type + 1, smoothScroll); } @@ -236,7 +250,7 @@ private void selectedAddress(int type, int position, boolean smoothScroll) { case 2: // 记录当前选择的区域 mArea = mAdapter.getItem(type).get(position).getName(); - mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).setText(mArea); + mTabAdapter.setItem(type, mArea); if (mListener != null) { mListener.onSelected(getDialog(), mProvince, mCity, mArea); @@ -262,40 +276,42 @@ public void run() { public void onClick(View view) { if (view == mCloseView) { dismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } /** - * {@link TabLayout.OnTabSelectedListener} + * {@link TabAdapter.OnTabListener} */ @Override - public void onTabSelected(TabLayout.Tab tab) { + public boolean onTabSelected(RecyclerView recyclerView, int position) { synchronized (this) { - if (mViewPager.getCurrentItem() != tab.getPosition()) { - mViewPager.setCurrentItem(tab.getPosition()); + if (mViewPager.getCurrentItem() != position) { + mViewPager.setCurrentItem(position); } - tab.setText(getString(R.string.address_hint)); - switch (tab.getPosition()) { + mTabAdapter.setItem(position, getString(R.string.address_hint)); + switch (position) { case 0: mProvince = mCity = mArea = null; - if (mTabLayout.getTabAt(2) != null) { - mTabLayout.removeTabAt(2); + if (mTabAdapter.getCount() > 2) { + mTabAdapter.removeItem(2); mAdapter.removeItem(2); } - if (mTabLayout.getTabAt(1) != null) { - mTabLayout.removeTabAt(1); + + if (mTabAdapter.getCount() > 1) { + mTabAdapter.removeItem(1); mAdapter.removeItem(1); } break; case 1: mCity = mArea = null; - if (mTabLayout.getTabAt(2) != null) { - mTabLayout.removeTabAt(2); + if (mTabAdapter.getCount() > 2) { + mTabAdapter.removeItem(2); mAdapter.removeItem(2); } break; @@ -306,14 +322,9 @@ public void onTabSelected(TabLayout.Tab tab) { break; } } + return true; } - @Override - public void onTabUnselected(TabLayout.Tab tab) {} - - @Override - public void onTabReselected(TabLayout.Tab tab) {} - /** * {@link BaseDialog.OnShowListener} */ @@ -337,6 +348,7 @@ public void onDismiss(BaseDialog dialog) { private final static class RecyclerViewAdapter extends AppAdapter> { + @Nullable private OnSelectListener mListener; private RecyclerViewAdapter(Context context) { @@ -370,13 +382,14 @@ public void onBindView(int position) { @Override public void onItemClick(RecyclerView recyclerView, View itemView, int position) { - if (mListener != null) { - mListener.onSelected(getViewHolderPosition(), position); + if (mListener == null) { + return; } + mListener.onSelected(getViewHolderPosition(), position); } } - private void setOnSelectListener(OnSelectListener listener) { + private void setOnSelectListener(@Nullable OnSelectListener listener) { mListener = listener; } @@ -399,12 +412,12 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) { textView.setGravity(Gravity.CENTER_VERTICAL); textView.setBackgroundResource(R.drawable.transparent_selector); textView.setTextColor(0xFF222222); - textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.sp_14)); textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - textView.setPadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics())); + textView.setPadding((int) getResources().getDimension(R.dimen.dp_20), + (int) getResources().getDimension(R.dimen.dp_10), + (int) getResources().getDimension(R.dimen.dp_20), + (int) getResources().getDimension(R.dimen.dp_10)); return new ViewHolder(textView); } @@ -458,20 +471,21 @@ private static List getProvinceList(Context context) { // 省市区Json数据文件来源:https://github.com/getActivity/ProvinceJson JSONArray jsonArray = getProvinceJson(context); - if (jsonArray != null) { - - int length = jsonArray.length(); - ArrayList list = new ArrayList<>(length); - for (int i = 0; i < length; i++) { - JSONObject jsonObject = jsonArray.getJSONObject(i); - list.add(new AddressBean(jsonObject.getString("name"), jsonObject)); - } + if (jsonArray == null) { + return null; + } - return list; + int length = jsonArray.length(); + ArrayList list = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + list.add(new AddressBean(jsonObject.getString("name"), jsonObject)); } + return list; + } catch (JSONException e) { - e.printStackTrace(); + CrashReport.postCatchedException(e); } return null; } @@ -494,7 +508,7 @@ private static List getCityList(JSONObject jsonObject) { return list; } catch (JSONException e) { - e.printStackTrace(); + CrashReport.postCatchedException(e); return null; } } @@ -517,7 +531,7 @@ private static List getAreaList(JSONObject jsonObject) { } return list; } catch (JSONException e) { - e.printStackTrace(); + CrashReport.postCatchedException(e); return null; } } @@ -538,7 +552,7 @@ private static JSONArray getProvinceJson(Context context) { inputStream.close(); return new JSONArray(outStream.toString()); } catch (IOException | JSONException e) { - e.printStackTrace(); + CrashReport.postCatchedException(e); } return null; } diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/AlbumDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/AlbumDialog.java index 9bd7a2b4..a7cc8f0f 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/AlbumDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/AlbumDialog.java @@ -8,6 +8,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import com.hjq.base.BaseAdapter; @@ -31,6 +32,7 @@ public static final class Builder extends BaseDialog.Builder implements BaseAdapter.OnItemClickListener { + @Nullable private OnListener mListener; private final RecyclerView mRecyclerView; diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/DateDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/DateDialog.java index 6d2b1173..24473505 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/DateDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/DateDialog.java @@ -30,7 +30,8 @@ public final class DateDialog { public static final class Builder extends CommonDialog.Builder - implements PickerLayoutManager.OnPickerListener { + implements Runnable, + PickerLayoutManager.OnPickerListener { private final int mStartYear; @@ -162,11 +163,11 @@ public Builder setYear(int year) { int index = year - mStartYear; if (index < 0) { index = 0; - } else if (index > mYearAdapter.getItemCount() - 1) { - index = mYearAdapter.getItemCount() - 1; + } else if (index > mYearAdapter.getCount() - 1) { + index = mYearAdapter.getCount() - 1; } mYearView.scrollToPosition(index); - onPicked(mYearView, index); + refreshMonthMaximumDay(); return this; } @@ -178,11 +179,11 @@ public Builder setMonth(int month) { int index = month - 1; if (index < 0) { index = 0; - } else if (index > mMonthAdapter.getItemCount() - 1) { - index = mMonthAdapter.getItemCount() - 1; + } else if (index > mMonthAdapter.getCount() - 1) { + index = mMonthAdapter.getCount() - 1; } mMonthView.scrollToPosition(index); - onPicked(mMonthView, index); + refreshMonthMaximumDay(); return this; } @@ -194,28 +195,55 @@ public Builder setDay(int day) { int index = day - 1; if (index < 0) { index = 0; - } else if (index > mDayAdapter.getItemCount() - 1) { - index = mDayAdapter.getItemCount() - 1; + } else if (index > mDayAdapter.getCount() - 1) { + index = mDayAdapter.getCount() - 1; } mDayView.scrollToPosition(index); - onPicked(mDayView, index); + refreshMonthMaximumDay(); return this; } + @SingleClick + @Override + public void onClick(View view) { + int viewId = view.getId(); + if (viewId == R.id.tv_ui_confirm) { + autoDismiss(); + if (mListener == null) { + return; + } + mListener.onSelected(getDialog(), + mStartYear + mYearManager.getPickedPosition(), + mMonthManager.getPickedPosition() + 1, + mDayManager.getPickedPosition() + 1); + } else if (viewId == R.id.tv_ui_cancel) { + autoDismiss(); + if (mListener == null) { + return; + } + mListener.onCancel(getDialog()); + } + } + /** * {@link PickerLayoutManager.OnPickerListener} - * + * * @param recyclerView RecyclerView 对象 * @param position 当前滚动的位置 */ @Override public void onPicked(RecyclerView recyclerView, int position) { + refreshMonthMaximumDay(); + } + + @Override + public void run() { // 获取这个月最多有多少天 Calendar calendar = Calendar.getInstance(Locale.CHINA); calendar.set(mStartYear + mYearManager.getPickedPosition(), mMonthManager.getPickedPosition(), 1); int day = calendar.getActualMaximum(Calendar.DATE); - if (mDayAdapter.getItemCount() != day) { + if (mDayAdapter.getCount() != day) { ArrayList dayData = new ArrayList<>(day); for (int i = 1; i <= day; i++) { dayData.add(i + " " + getString(R.string.common_day)); @@ -224,21 +252,12 @@ public void onPicked(RecyclerView recyclerView, int position) { } } - @SingleClick - @Override - public void onClick(View view) { - int viewId = view.getId(); - if (viewId == R.id.tv_ui_confirm) { - autoDismiss(); - if (mListener != null) { - mListener.onSelected(getDialog(), mStartYear + mYearManager.getPickedPosition(), mMonthManager.getPickedPosition() + 1, mDayManager.getPickedPosition() + 1); - } - } else if (viewId == R.id.tv_ui_cancel) { - autoDismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); - } - } + /** + * 刷新每个月天最大天数 + */ + private void refreshMonthMaximumDay() { + mYearView.removeCallbacks(this); + mYearView.post(this); } private static final class PickerAdapter extends AppAdapter { @@ -259,7 +278,7 @@ private final class ViewHolder extends AppAdapter.ViewHolder { ViewHolder() { super(R.layout.picker_item); - mPickerView = (TextView) findViewById(R.id.tv_picker_name); + mPickerView = findViewById(R.id.tv_picker_name); } @Override diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/InputDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/InputDialog.java index 4aaf6466..e2159a0d 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/InputDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/InputDialog.java @@ -1,17 +1,19 @@ package com.hjq.demo.ui.dialog; import android.content.Context; +import android.text.Editable; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; -import android.widget.EditText; import android.widget.TextView; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.hjq.base.BaseDialog; import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; +import com.hjq.widget.view.RegexEditText; /** * author : Android 轮子哥 @@ -26,8 +28,9 @@ public static final class Builder implements BaseDialog.OnShowListener, TextView.OnEditorActionListener { + @Nullable private OnListener mListener; - private final EditText mInputView; + private final RegexEditText mInputView; public Builder(Context context) { super(context); @@ -52,11 +55,21 @@ public Builder setContent(@StringRes int id) { } public Builder setContent(CharSequence text) { mInputView.setText(text); - int index = mInputView.getText().toString().length(); - if (index > 0) { - mInputView.requestFocus(); - mInputView.setSelection(index); + Editable editable = mInputView.getText(); + if (editable == null) { + return this; } + int index = editable.length(); + if (index <= 0) { + return this; + } + mInputView.requestFocus(); + mInputView.setSelection(index); + return this; + } + + public Builder setInputRegex(String regex) { + mInputView.setInputRegex(regex); return this; } @@ -79,14 +92,17 @@ public void onClick(View view) { int viewId = view.getId(); if (viewId == R.id.tv_ui_confirm) { autoDismiss(); - if (mListener != null) { - mListener.onConfirm(getDialog(), mInputView.getText().toString()); + if (mListener == null) { + return; } + Editable editable = mInputView.getText(); + mListener.onConfirm(getDialog(), editable != null ? editable.toString() : ""); } else if (viewId == R.id.tv_ui_cancel) { autoDismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/MenuDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/MenuDialog.java index 7fad8c07..1f386fe3 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/MenuDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/MenuDialog.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.recyclerview.widget.RecyclerView; @@ -36,6 +37,7 @@ public static final class Builder View.OnLayoutChangeListener, Runnable { @SuppressWarnings("rawtypes") + @Nullable private OnListener mListener; private boolean mAutoDismiss = true; @@ -122,9 +124,10 @@ public void onClick(View view) { } if (view == mCancelView) { - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } @@ -138,9 +141,10 @@ public void onItemClick(RecyclerView recyclerView, View itemView, int position) dismiss(); } - if (mListener != null) { - mListener.onSelected(getDialog(), position, mAdapter.getItem(position)); + if (mListener == null) { + return; } + mListener.onSelected(getDialog(), position, mAdapter.getItem(position)); } /** @@ -162,11 +166,12 @@ public void run() { params.height = maxHeight; mRecyclerView.setLayoutParams(params); } - } else { - if (params.height != ViewGroup.LayoutParams.WRAP_CONTENT) { - params.height = ViewGroup.LayoutParams.WRAP_CONTENT; - mRecyclerView.setLayoutParams(params); - } + return; + } + + if (params.height != ViewGroup.LayoutParams.WRAP_CONTENT) { + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + mRecyclerView.setLayoutParams(params); } } @@ -199,7 +204,7 @@ private final class ViewHolder extends AppAdapter.ViewHolder { ViewHolder() { super(R.layout.menu_item); - mTextView = (TextView) findViewById(R.id.tv_menu_text); + mTextView = findViewById(R.id.tv_menu_text); mLineView = findViewById(R.id.v_menu_line); } @@ -209,12 +214,12 @@ public void onBindView(int position) { if (position == 0) { // 当前是否只有一个条目 - if (getItemCount() == 1) { + if (getCount() == 1) { mLineView.setVisibility(View.GONE); } else { mLineView.setVisibility(View.VISIBLE); } - } else if (position == getItemCount() - 1) { + } else if (position == getCount() - 1) { mLineView.setVisibility(View.GONE); } else { mLineView.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/MessageDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/MessageDialog.java index 26e00f50..5d67cb80 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/MessageDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/MessageDialog.java @@ -4,6 +4,7 @@ import android.view.View; import android.widget.TextView; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.hjq.base.BaseDialog; @@ -21,6 +22,7 @@ public final class MessageDialog { public static final class Builder extends CommonDialog.Builder { + @Nullable private OnListener mListener; private final TextView mMessageView; @@ -59,14 +61,16 @@ public void onClick(View view) { int viewId = view.getId(); if (viewId == R.id.tv_ui_confirm) { autoDismiss(); - if (mListener != null) { - mListener.onConfirm(getDialog()); + if (mListener == null) { + return; } + mListener.onConfirm(getDialog()); } else if (viewId == R.id.tv_ui_cancel) { autoDismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } } diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/PayPasswordDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/PayPasswordDialog.java index 2c25cc1b..1113ad3a 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/PayPasswordDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/PayPasswordDialog.java @@ -7,6 +7,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -36,6 +37,7 @@ public static final class Builder /** 输入键盘文本 */ private static final String[] KEYBOARD_TEXT = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", ""}; + @Nullable private OnListener mListener; private boolean mAutoDismiss = true; private final LinkedList mRecordList = new LinkedList<>(); @@ -139,9 +141,10 @@ public void onItemClick(RecyclerView recyclerView, View itemView, int position) for (String s : mRecordList) { password.append(s); } - if (mListener != null) { - mListener.onCompleted(getDialog(), password.toString()); + if (mListener == null) { + return; } + mListener.onCompleted(getDialog(), password.toString()); }, 300); } break; @@ -157,9 +160,10 @@ public void onClick(View view) { dismiss(); } - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } } diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/SafeDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/SafeDialog.java index dc31356f..bb047a83 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/SafeDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/SafeDialog.java @@ -5,12 +5,14 @@ import android.widget.EditText; import android.widget.TextView; +import androidx.annotation.Nullable; + import com.hjq.base.BaseDialog; import com.hjq.demo.R; import com.hjq.demo.aop.SingleClick; +import com.hjq.demo.http.api.GetCodeApi; +import com.hjq.demo.http.api.VerifyCodeApi; import com.hjq.demo.http.model.HttpData; -import com.hjq.demo.http.request.GetCodeApi; -import com.hjq.demo.http.request.VerifyCodeApi; import com.hjq.http.EasyHttp; import com.hjq.http.listener.OnHttpListener; import com.hjq.toast.ToastUtils; @@ -31,6 +33,7 @@ public static final class Builder private final EditText mCodeView; private final CountdownView mCountdownView; + @Nullable private OnListener mListener; /** 当前手机号 */ @@ -98,9 +101,10 @@ public void onFail(Exception e) { if (true) { autoDismiss(); - if (mListener != null) { - mListener.onConfirm(getDialog(), mPhoneNumber, mCodeView.getText().toString()); + if (mListener == null) { + return; } + mListener.onConfirm(getDialog(), mPhoneNumber, mCodeView.getText().toString()); return; } @@ -114,9 +118,10 @@ public void onFail(Exception e) { @Override public void onSucceed(HttpData data) { autoDismiss(); - if (mListener != null) { - mListener.onConfirm(getDialog(), mPhoneNumber, mCodeView.getText().toString()); + if (mListener == null) { + return; } + mListener.onConfirm(getDialog(), mPhoneNumber, mCodeView.getText().toString()); } @Override @@ -126,9 +131,10 @@ public void onFail(Exception e) { }); } else if (viewId == R.id.tv_ui_cancel) { autoDismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } } diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/SelectDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/SelectDialog.java index 121b830d..a5c1ad1f 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/SelectDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/SelectDialog.java @@ -10,6 +10,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import com.hjq.base.BaseAdapter; @@ -37,6 +38,7 @@ public static final class Builder implements View.OnLayoutChangeListener, Runnable { @SuppressWarnings("rawtypes") + @Nullable private OnListener mListener; private final RecyclerView mRecyclerView; @@ -119,17 +121,19 @@ public void onClick(View view) { HashMap data = mAdapter.getSelectSet(); if (data.size() >= mAdapter.getMinSelect()) { autoDismiss(); - if (mListener != null) { - mListener.onSelected(getDialog(), data); + if (mListener == null) { + return; } + mListener.onSelected(getDialog(), data); } else { ToastUtils.show(String.format(getString(R.string.select_min_hint), mAdapter.getMinSelect())); } } else if (viewId == R.id.tv_ui_cancel) { autoDismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } @@ -259,8 +263,8 @@ private final class ViewHolder extends AppAdapter.ViewHolder { ViewHolder() { super(R.layout.select_item); - mTextView = (TextView) findViewById(R.id.tv_select_text); - mCheckBox = (CheckBox) findViewById(R.id.tv_select_checkbox); + mTextView = findViewById(R.id.tv_select_text); + mCheckBox = findViewById(R.id.tv_select_checkbox); } @Override diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/ShareDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/ShareDialog.java index 3e5f296f..634253fd 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/ShareDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/ShareDialog.java @@ -1,5 +1,6 @@ package com.hjq.demo.ui.dialog; +import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -9,8 +10,8 @@ import android.widget.ImageView; import android.widget.TextView; -import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -22,6 +23,15 @@ import com.hjq.umeng.Platform; import com.hjq.umeng.UmengClient; import com.hjq.umeng.UmengShare; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.ShareContent; +import com.umeng.socialize.media.UMEmoji; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.media.UMMin; +import com.umeng.socialize.media.UMQQMini; +import com.umeng.socialize.media.UMVideo; +import com.umeng.socialize.media.UMWeb; +import com.umeng.socialize.media.UMusic; import java.util.ArrayList; import java.util.List; @@ -38,14 +48,17 @@ public static final class Builder extends BaseDialog.Builder implements BaseAdapter.OnItemClickListener { + private final RecyclerView mRecyclerView; private final ShareAdapter mAdapter; - private final UmengShare.ShareData mData; + private final ShareAction mShareAction; + private final ShareBean mCopyLink; + @Nullable private UmengShare.OnShareListener mListener; - public Builder(Context context) { - super(context); + public Builder(Activity activity) { + super(activity); setContentView(R.layout.share_dialog); @@ -54,44 +67,95 @@ public Builder(Context context) { data.add(new ShareBean(getDrawable(R.drawable.share_moment_ic), getString(R.string.share_platform_moment), Platform.CIRCLE)); data.add(new ShareBean(getDrawable(R.drawable.share_qq_ic), getString(R.string.share_platform_qq), Platform.QQ)); data.add(new ShareBean(getDrawable(R.drawable.share_qzone_ic), getString(R.string.share_platform_qzone), Platform.QZONE)); - data.add(new ShareBean(getDrawable(R.drawable.share_link_ic), getString(R.string.share_platform_link), null)); - mAdapter = new ShareAdapter(context); + mCopyLink = new ShareBean(getDrawable(R.drawable.share_link_ic), getString(R.string.share_platform_link), null); + + mAdapter = new ShareAdapter(activity); mAdapter.setData(data); mAdapter.setOnItemClickListener(this); - RecyclerView recyclerView = findViewById(R.id.rv_share_list); - recyclerView.setLayoutManager(new GridLayoutManager(context, data.size())); - recyclerView.setAdapter(mAdapter); + mRecyclerView = findViewById(R.id.rv_share_list); + mRecyclerView.setLayoutManager(new GridLayoutManager(activity, data.size())); + mRecyclerView.setAdapter(mAdapter); - mData = new UmengShare.ShareData(context); + mShareAction = new ShareAction(activity); } - public Builder setShareTitle(String title) { - mData.setShareTitle(title); + /** + * 分享网页链接:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu7F51u9875u94FEu63A51 + */ + public Builder setShareLink(UMWeb content) { + mShareAction.withMedia(content); + refreshShareOptions(); return this; } - public Builder setShareDescription(String description) { - mData.setShareDescription(description); + /** + * 分享图片:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu56FEu72473 + */ + public Builder setShareImage(UMImage content) { + mShareAction.withMedia(content); + refreshShareOptions(); return this; } - public Builder setShareLogo(String url) { - mData.setShareLogo(url); + /** + * 分享纯文本:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu7EAFu6587u672C5 + */ + public Builder setShareText(String content) { + mShareAction.withText(content); + refreshShareOptions(); return this; } - public Builder setShareLogo(@DrawableRes int id) { - mData.setShareLogo(id); + /** + * 分享音乐:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu97F3u4E507 + */ + public Builder setShareMusic(UMusic content) { + mShareAction.withMedia(content); + refreshShareOptions(); return this; } - public Builder setShareUrl(String url) { - mData.setShareUrl(url); + /** + * 分享视频:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu89C6u98916 + */ + public Builder setShareVideo(UMVideo content) { + mShareAction.withMedia(content); + refreshShareOptions(); + return this; + } + + /** + * 分享 Gif 表情:https://developer.umeng.com/docs/128606/detail/193883#h2--gif-8 + */ + public Builder setShareEmoji(UMEmoji content) { + mShareAction.withMedia(content); + refreshShareOptions(); return this; } + /** + * 分享微信小程序:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu5C0Fu7A0Bu5E8F2 + */ + public Builder setShareMin(UMMin content) { + mShareAction.withMedia(content); + refreshShareOptions(); + return this; + } + + /** + * 分享 QQ 小程序:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4EABu5C0Fu7A0Bu5E8F2 + */ + public Builder setShareMin(UMQQMini content) { + mShareAction.withMedia(content); + refreshShareOptions(); + return this; + } + + /** + * 设置回调监听器 + */ public Builder setListener(UmengShare.OnShareListener listener) { mListener = listener; return this; @@ -102,16 +166,38 @@ public Builder setListener(UmengShare.OnShareListener listener) { */ @Override public void onItemClick(RecyclerView recyclerView, View itemView, int position) { - Platform platform = mAdapter.getItem(position).getSharePlatform(); + Platform platform = mAdapter.getItem(position).sharePlatform; if (platform != null) { - UmengClient.share(getActivity(), platform, mData, mListener); + UmengClient.share(getActivity(), platform, mShareAction, mListener); } else { - // 复制到剪贴板 - getSystemService(ClipboardManager.class).setPrimaryClip(ClipData.newPlainText("url", mData.getShareUrl())); - ToastUtils.show(R.string.share_platform_copy_hint); + if (mShareAction.getShareContent().getShareType() == ShareContent.WEB_STYLE) { + // 复制到剪贴板 + getSystemService(ClipboardManager.class).setPrimaryClip(ClipData.newPlainText("url", mShareAction.getShareContent().mMedia.toUrl())); + ToastUtils.show(R.string.share_platform_copy_hint); + } } dismiss(); } + + /** + * 刷新分享选项 + */ + private void refreshShareOptions() { + switch (mShareAction.getShareContent().getShareType()) { + case ShareContent.WEB_STYLE: + if (!mAdapter.containsItem(mCopyLink)) { + mAdapter.addItem(mCopyLink); + mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), mAdapter.getCount())); + } + break; + default: + if (mAdapter.containsItem(mCopyLink)) { + mAdapter.removeItem(mCopyLink); + mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), mAdapter.getCount())); + } + break; + } + } } private static class ShareAdapter extends AppAdapter { @@ -133,45 +219,32 @@ private final class ViewHolder extends AppAdapter.ViewHolder { private ViewHolder() { super(R.layout.share_item); - mImageView = (ImageView) findViewById(R.id.iv_share_image); - mTextView = (TextView) findViewById(R.id.tv_share_text); + mImageView = findViewById(R.id.iv_share_image); + mTextView = findViewById(R.id.tv_share_text); } @Override public void onBindView(int position) { ShareBean bean = getItem(position); - mImageView.setImageDrawable(bean.getShareIcon()); - mTextView.setText(bean.getShareName()); + mImageView.setImageDrawable(bean.shareIcon); + mTextView.setText(bean.shareName); } } } - private static class ShareBean { /** 分享图标 */ - private final Drawable mShareIcon; + final Drawable shareIcon; /** 分享名称 */ - private final String mShareName; + final String shareName; /** 分享平台 */ - private final Platform mSharePlatform; + final Platform sharePlatform; private ShareBean(Drawable icon, String name, Platform platform) { - mShareIcon = icon; - mShareName = name; - mSharePlatform = platform; - } - - private Drawable getShareIcon() { - return mShareIcon; - } - - private String getShareName() { - return mShareName; - } - - private Platform getSharePlatform() { - return mSharePlatform; + shareIcon = icon; + shareName = name; + sharePlatform = platform; } } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/TimeDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/TimeDialog.java index 463f9297..6e84d8c6 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/TimeDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/TimeDialog.java @@ -6,6 +6,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import com.hjq.base.BaseDialog; @@ -26,7 +27,7 @@ public final class TimeDialog { public static final class Builder - extends CommonDialog.Builder implements Runnable { + extends CommonDialog.Builder { private final RecyclerView mHourView; private final RecyclerView mMinuteView; @@ -40,6 +41,7 @@ public static final class Builder private final PickerAdapter mMinuteAdapter; private final PickerAdapter mSecondAdapter; + @Nullable private OnListener mListener; @SuppressWarnings("all") @@ -97,27 +99,6 @@ public Builder(Context context) { setHour(calendar.get(Calendar.HOUR_OF_DAY)); setMinute(calendar.get(Calendar.MINUTE)); setSecond(calendar.get(Calendar.SECOND)); - - postDelayed(this, 1000); - } - - @Override - public void run() { - if (mHourView.getScrollState() == RecyclerView.SCROLL_STATE_IDLE && - mMinuteView.getScrollState() == RecyclerView.SCROLL_STATE_IDLE && - mSecondView.getScrollState() == RecyclerView.SCROLL_STATE_IDLE) { - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, mHourManager.getPickedPosition()); - calendar.set(Calendar.MINUTE, mMinuteManager.getPickedPosition()); - calendar.set(Calendar.SECOND, mSecondManager.getPickedPosition()); - if (System.currentTimeMillis() - calendar.getTimeInMillis() < 3000) { - calendar = Calendar.getInstance(); - setHour(calendar.get(Calendar.HOUR_OF_DAY)); - setMinute(calendar.get(Calendar.MINUTE)); - setSecond(calendar.get(Calendar.SECOND)); - postDelayed(this, 1000); - } - } } public Builder setListener(OnListener listener) { @@ -156,8 +137,8 @@ public Builder setHour(int hour) { int index = hour; if (index < 0 || hour == 24) { index = 0; - } else if (index > mHourAdapter.getItemCount() - 1) { - index = mHourAdapter.getItemCount() - 1; + } else if (index > mHourAdapter.getCount() - 1) { + index = mHourAdapter.getCount() - 1; } mHourView.scrollToPosition(index); return this; @@ -171,8 +152,8 @@ public Builder setMinute(int minute) { int index = minute; if (index < 0) { index = 0; - } else if (index > mMinuteAdapter.getItemCount() - 1) { - index = mMinuteAdapter.getItemCount() - 1; + } else if (index > mMinuteAdapter.getCount() - 1) { + index = mMinuteAdapter.getCount() - 1; } mMinuteView.scrollToPosition(index); return this; @@ -186,8 +167,8 @@ public Builder setSecond(int second) { int index = second; if (index < 0) { index = 0; - } else if (index > mSecondAdapter.getItemCount() - 1) { - index = mSecondAdapter.getItemCount() - 1; + } else if (index > mSecondAdapter.getCount() - 1) { + index = mSecondAdapter.getCount() - 1; } mSecondView.scrollToPosition(index); return this; @@ -199,14 +180,16 @@ public void onClick(View view) { int viewId = view.getId(); if (viewId == R.id.tv_ui_confirm) { autoDismiss(); - if (mListener != null) { - mListener.onSelected(getDialog(), mHourManager.getPickedPosition(), mMinuteManager.getPickedPosition(), mSecondManager.getPickedPosition()); + if (mListener == null) { + return; } + mListener.onSelected(getDialog(), mHourManager.getPickedPosition(), mMinuteManager.getPickedPosition(), mSecondManager.getPickedPosition()); } else if (viewId == R.id.tv_ui_cancel) { autoDismiss(); - if (mListener != null) { - mListener.onCancel(getDialog()); + if (mListener == null) { + return; } + mListener.onCancel(getDialog()); } } } @@ -229,7 +212,7 @@ private final class ViewHolder extends AppAdapter.ViewHolder { ViewHolder() { super(R.layout.picker_item); - mPickerView = (TextView) findViewById(R.id.tv_picker_name); + mPickerView = findViewById(R.id.tv_picker_name); } @Override diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/HintDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/TipsDialog.java similarity index 80% rename from app/src/main/java/com/hjq/demo/ui/dialog/HintDialog.java rename to app/src/main/java/com/hjq/demo/ui/dialog/TipsDialog.java index 8f6cd869..951495f2 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/HintDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/TipsDialog.java @@ -15,13 +15,13 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/12/2 - * desc : Toast 效果对话框 + * desc : 提示对话框 */ -public final class HintDialog { +public final class TipsDialog { - public final static int ICON_FINISH = R.drawable.finish_ic; - public final static int ICON_ERROR = R.drawable.error_ic; - public final static int ICON_WARNING = R.drawable.warning_ic; + public final static int ICON_FINISH = R.drawable.tips_finish_ic; + public final static int ICON_ERROR = R.drawable.tips_error_ic; + public final static int ICON_WARNING = R.drawable.tips_warning_ic; public static final class Builder extends BaseDialog.Builder @@ -34,13 +34,13 @@ public static final class Builder public Builder(Context context) { super(context); - setContentView(R.layout.hint_dialog); + setContentView(R.layout.tips_dialog); setAnimStyle(BaseDialog.ANIM_TOAST); setBackgroundDimEnabled(false); setCancelable(false); - mMessageView = findViewById(R.id.tv_hint_message); - mIconView = findViewById(R.id.iv_status_icon); + mMessageView = findViewById(R.id.tv_tips_message); + mIconView = findViewById(R.id.iv_tips_icon); addOnShowListener(this); } @@ -85,9 +85,10 @@ public void onShow(BaseDialog dialog) { @Override public void run() { - if (isShowing()) { - dismiss(); + if (!isShowing()) { + return; } + dismiss(); } } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/dialog/UpdateDialog.java b/app/src/main/java/com/hjq/demo/ui/dialog/UpdateDialog.java index 1e95731b..d70c7ddb 100644 --- a/app/src/main/java/com/hjq/demo/ui/dialog/UpdateDialog.java +++ b/app/src/main/java/com/hjq/demo/ui/dialog/UpdateDialog.java @@ -9,6 +9,7 @@ import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.text.method.ScrollingMovementMethod; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; @@ -74,6 +75,9 @@ public Builder(Context context) { mUpdateView = findViewById(R.id.tv_update_update); mCloseView = findViewById(R.id.tv_update_close); setOnClickListener(mUpdateView, mCloseView); + + // 让 TextView 支持滚动 + mContentView.setMovementMethod(new ScrollingMovementMethod()); } /** @@ -145,7 +149,7 @@ public void onClick(View view) { * 下载 Apk */ @CheckNet - @Permissions({Permission.MANAGE_EXTERNAL_STORAGE}) + @Permissions({Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE, Permission.REQUEST_INSTALL_PACKAGES}) private void downloadApk() { // 设置对话框不能被取消 setCancelable(false); @@ -183,7 +187,7 @@ private void downloadApk() { .setPriority(NotificationCompat.PRIORITY_DEFAULT); // 创建要下载的文件对象 - mApkFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + mApkFile = new File(getContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), getString(R.string.app_name) + "_v" + mNameView.getText().toString() + ".apk"); EasyHttp.download(getDialog()) .method(HttpMethod.GET) diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/BrowserFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/BrowserFragment.java index df64539c..b9c6a823 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/BrowserFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/BrowserFragment.java @@ -10,10 +10,9 @@ import com.hjq.demo.R; import com.hjq.demo.action.StatusAction; import com.hjq.demo.aop.CheckNet; -import com.hjq.demo.aop.DebugLog; +import com.hjq.demo.aop.Log; import com.hjq.demo.app.AppActivity; import com.hjq.demo.app.AppFragment; -import com.hjq.demo.other.IntentKey; import com.hjq.demo.ui.activity.BrowserActivity; import com.hjq.demo.widget.BrowserView; import com.hjq.demo.widget.StatusLayout; @@ -30,11 +29,13 @@ public final class BrowserFragment extends AppFragment implements StatusAction, OnRefreshListener { - @DebugLog + private static final String INTENT_KEY_IN_URL = "url"; + + @Log public static BrowserFragment newInstance(String url) { BrowserFragment fragment = new BrowserFragment(); Bundle bundle = new Bundle(); - bundle.putString(IntentKey.URL, url); + bundle.putString(INTENT_KEY_IN_URL, url); fragment.setArguments(bundle); return fragment; } @@ -54,14 +55,17 @@ protected void initView() { mRefreshLayout = findViewById(R.id.sl_browser_refresh); mBrowserView = findViewById(R.id.wv_browser_view); + // 设置 WebView 生命周期回调 + mBrowserView.setLifecycleOwner(this); // 设置网页刷新监听 mRefreshLayout.setOnRefreshListener(this); } @Override protected void initData() { - mBrowserView.setBrowserViewClient(new MyBrowserViewClient()); - mBrowserView.loadUrl(getString(IntentKey.URL)); + mBrowserView.setBrowserViewClient(new AppBrowserViewClient()); + mBrowserView.setBrowserChromeClient(new BrowserView.BrowserChromeClient(mBrowserView)); + mBrowserView.loadUrl(getString(INTENT_KEY_IN_URL)); showLoading(); } @@ -87,13 +91,7 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { reload(); } - @Override - public void onDestroy() { - super.onDestroy(); - mBrowserView.onDestroy(); - } - - private class MyBrowserViewClient extends BrowserView.BrowserViewClient { + private class AppBrowserViewClient extends BrowserView.BrowserViewClient { /** * 网页加载错误时回调,这个方法会在 onPageFinished 之前调用 @@ -101,7 +99,7 @@ private class MyBrowserViewClient extends BrowserView.BrowserViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // 这里为什么要用延迟呢?因为加载出错之后会先调用 onReceivedError 再调用 onPageFinished - post(() -> showError(v -> reload())); + post(() -> showError(listener -> reload())); } /** diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/FindFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/FindFragment.java index 661cd2ef..38d986a1 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/FindFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/FindFragment.java @@ -1,6 +1,5 @@ package com.hjq.demo.ui.fragment; -import android.util.TypedValue; import android.view.View; import android.widget.ImageView; @@ -54,14 +53,14 @@ protected void initView() { protected void initData() { // 显示圆形的 ImageView GlideApp.with(this) - .load(R.drawable.example_bg) + .load(R.drawable.update_app_top_bg) .transform(new MultiTransformation<>(new CenterCrop(), new CircleCrop())) .into(mCircleView); // 显示圆角的 ImageView GlideApp.with(this) - .load(R.drawable.example_bg) - .transform(new MultiTransformation<>(new CenterCrop(), new RoundedCorners((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics())))) + .load(R.drawable.update_app_top_bg) + .transform(new MultiTransformation<>(new CenterCrop(), new RoundedCorners((int) getResources().getDimension(R.dimen.dp_10)))) .into(mCornerView); } diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/HomeFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/HomeFragment.java index a6d8d705..8416fb13 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/HomeFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/HomeFragment.java @@ -7,15 +7,16 @@ import androidx.appcompat.widget.AppCompatImageView; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; -import com.google.android.material.tabs.TabLayout; import com.gyf.immersionbar.ImmersionBar; import com.hjq.base.FragmentPagerAdapter; import com.hjq.demo.R; import com.hjq.demo.app.AppFragment; import com.hjq.demo.app.TitleBarFragment; import com.hjq.demo.ui.activity.HomeActivity; +import com.hjq.demo.ui.adapter.TabAdapter; import com.hjq.demo.widget.XCollapsingToolbarLayout; /** @@ -25,7 +26,8 @@ * desc : 首页 Fragment */ public final class HomeFragment extends TitleBarFragment - implements XCollapsingToolbarLayout.OnScrimsListener { + implements TabAdapter.OnTabListener, ViewPager.OnPageChangeListener, + XCollapsingToolbarLayout.OnScrimsListener { private XCollapsingToolbarLayout mCollapsingToolbarLayout; private Toolbar mToolbar; @@ -34,8 +36,10 @@ public final class HomeFragment extends TitleBarFragment private TextView mHintView; private AppCompatImageView mSearchView; - private TabLayout mTabLayout; + private RecyclerView mTabView; private ViewPager mViewPager; + + private TabAdapter mTabAdapter; private FragmentPagerAdapter> mPagerAdapter; public static HomeFragment newInstance() { @@ -56,14 +60,17 @@ protected void initView() { mHintView = findViewById(R.id.tv_home_hint); mSearchView = findViewById(R.id.iv_home_search); - mTabLayout = findViewById(R.id.tl_home_tab); + mTabView = findViewById(R.id.rv_home_tab); mViewPager = findViewById(R.id.vp_home_pager); mPagerAdapter = new FragmentPagerAdapter<>(this); mPagerAdapter.addFragment(StatusFragment.newInstance(), "列表演示"); mPagerAdapter.addFragment(BrowserFragment.newInstance("https://github.com/getActivity"), "网页演示"); mViewPager.setAdapter(mPagerAdapter); - mTabLayout.setupWithViewPager(mViewPager); + mViewPager.addOnPageChangeListener(this); + + mTabAdapter = new TabAdapter(getAttachActivity()); + mTabView.setAdapter(mTabAdapter); // 给这个 ToolBar 设置顶部内边距,才能和 TitleBar 进行对齐 ImmersionBar.setTitleBar(getAttachActivity(), mToolbar); @@ -74,7 +81,9 @@ protected void initView() { @Override protected void initData() { - + mTabAdapter.addItem("列表演示"); + mTabAdapter.addItem("网页演示"); + mTabAdapter.setOnTabListener(this); } @Override @@ -88,6 +97,34 @@ public boolean isStatusBarDarkFont() { return mCollapsingToolbarLayout.isScrimsShown(); } + /** + * {@link TabAdapter.OnTabListener} + */ + + @Override + public boolean onTabSelected(RecyclerView recyclerView, int position) { + mViewPager.setCurrentItem(position); + return true; + } + + /** + * {@link ViewPager.OnPageChangeListener} + */ + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} + + @Override + public void onPageSelected(int position) { + if (mTabAdapter == null) { + return; + } + mTabAdapter.setSelectedPosition(position); + } + + @Override + public void onPageScrollStateChanged(int state) {} + /** * CollapsingToolbarLayout 渐变回调 * @@ -96,18 +133,18 @@ public boolean isStatusBarDarkFont() { @SuppressLint("RestrictedApi") @Override public void onScrimsStateChange(XCollapsingToolbarLayout layout, boolean shown) { - if (shown) { - mAddressView.setTextColor(ContextCompat.getColor(getAttachActivity(), R.color.black)); - mHintView.setBackgroundResource(R.drawable.home_search_bar_gray_bg); - mHintView.setTextColor(ContextCompat.getColor(getAttachActivity(), R.color.black60)); - mSearchView.setSupportImageTintList(ColorStateList.valueOf(getColor(R.color.common_icon_color))); - getStatusBarConfig().statusBarDarkFont(true).init(); - } else { - mAddressView.setTextColor(ContextCompat.getColor(getAttachActivity(), R.color.white)); - mHintView.setBackgroundResource(R.drawable.home_search_bar_transparent_bg); - mHintView.setTextColor(ContextCompat.getColor(getAttachActivity(), R.color.white60)); - mSearchView.setSupportImageTintList(ColorStateList.valueOf(getColor(R.color.white))); - getStatusBarConfig().statusBarDarkFont(false).init(); - } + getStatusBarConfig().statusBarDarkFont(shown).init(); + mAddressView.setTextColor(ContextCompat.getColor(getAttachActivity(), shown ? R.color.black : R.color.white)); + mHintView.setBackgroundResource(shown ? R.drawable.home_search_bar_gray_bg : R.drawable.home_search_bar_transparent_bg); + mHintView.setTextColor(ContextCompat.getColor(getAttachActivity(), shown ? R.color.black60 : R.color.white60)); + mSearchView.setSupportImageTintList(ColorStateList.valueOf(getColor(shown ? R.color.common_icon_color : R.color.white))); + } + + @Override + public void onDestroy() { + super.onDestroy(); + mViewPager.setAdapter(null); + mViewPager.removeOnPageChangeListener(this); + mTabAdapter.setOnTabListener(null); } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/MessageFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/MessageFragment.java index de070a23..f69b5e3c 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/MessageFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/MessageFragment.java @@ -1,6 +1,5 @@ package com.hjq.demo.ui.fragment; -import android.util.TypedValue; import android.view.View; import android.widget.ImageView; @@ -76,8 +75,7 @@ public void onClick(View view) { mImageView.setVisibility(View.VISIBLE); GlideApp.with(this) .load("https://www.baidu.com/img/bd_logo.png") - .transform(new RoundedCorners((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - 20, getResources().getDisplayMetrics()))) + .transform(new RoundedCorners((int) getResources().getDimension(R.dimen.dp_20))) .into(mImageView); } else if (viewId == R.id.btn_message_toast) { @@ -90,15 +88,21 @@ public void onClick(View view) { } else if (viewId == R.id.btn_message_setting) { - XXPermissions.startApplicationDetails(this); + XXPermissions.startPermissionActivity(this); } else if (viewId == R.id.btn_message_black) { - getAttachActivity().getStatusBarConfig().statusBarDarkFont(true).init(); + getAttachActivity() + .getStatusBarConfig() + .statusBarDarkFont(true) + .init(); } else if (viewId == R.id.btn_message_white) { - getAttachActivity().getStatusBarConfig().statusBarDarkFont(false).init(); + getAttachActivity() + .getStatusBarConfig() + .statusBarDarkFont(false) + .init(); } else if (viewId == R.id.btn_message_tab) { diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/MeFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/MineFragment.java similarity index 75% rename from app/src/main/java/com/hjq/demo/ui/fragment/MeFragment.java rename to app/src/main/java/com/hjq/demo/ui/fragment/MineFragment.java index 50acbc44..10557b25 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/MeFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/MineFragment.java @@ -2,6 +2,7 @@ import android.content.ActivityNotFoundException; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.net.Uri; import android.view.View; @@ -38,23 +39,23 @@ * time : 2018/10/18 * desc : 我的 Fragment */ -public final class MeFragment extends TitleBarFragment { +public final class MineFragment extends TitleBarFragment { - public static MeFragment newInstance() { - return new MeFragment(); + public static MineFragment newInstance() { + return new MineFragment(); } @Override protected int getLayoutId() { - return R.layout.me_fragment; + return R.layout.mine_fragment; } @Override protected void initView() { - setOnClickListener(R.id.btn_me_dialog, R.id.btn_me_hint, R.id.btn_me_login, R.id.btn_me_register, R.id.btn_me_forget, - R.id.btn_me_reset, R.id.btn_me_change, R.id.btn_me_personal, R.id.btn_message_setting, R.id.btn_me_about, - R.id.btn_me_guide, R.id.btn_me_browser, R.id.btn_me_image_select, R.id.btn_me_image_preview, - R.id.btn_me_video_select, R.id.btn_me_video_play, R.id.btn_me_crash, R.id.btn_me_pay); + setOnClickListener(R.id.btn_mine_dialog, R.id.btn_mine_hint, R.id.btn_mine_login, R.id.btn_mine_register, R.id.btn_mine_forget, + R.id.btn_mine_reset, R.id.btn_mine_change, R.id.btn_mine_personal, R.id.btn_mine_setting, R.id.btn_mine_about, + R.id.btn_mine_guide, R.id.btn_mine_browser, R.id.btn_mine_image_select, R.id.btn_mine_image_preview, + R.id.btn_mine_video_select, R.id.btn_mine_video_play, R.id.btn_mine_crash, R.id.btn_mine_pay); } @Override @@ -66,51 +67,51 @@ protected void initData() { @Override public void onClick(View view) { int viewId = view.getId(); - if (viewId == R.id.btn_me_dialog) { + if (viewId == R.id.btn_mine_dialog) { startActivity(DialogActivity.class); - } else if (viewId == R.id.btn_me_hint) { + } else if (viewId == R.id.btn_mine_hint) { startActivity(StatusActivity.class); - } else if (viewId == R.id.btn_me_login) { + } else if (viewId == R.id.btn_mine_login) { startActivity(LoginActivity.class); - } else if (viewId == R.id.btn_me_register) { + } else if (viewId == R.id.btn_mine_register) { startActivity(RegisterActivity.class); - } else if (viewId == R.id.btn_me_forget) { + } else if (viewId == R.id.btn_mine_forget) { startActivity(PasswordForgetActivity.class); - } else if (viewId == R.id.btn_me_reset) { + } else if (viewId == R.id.btn_mine_reset) { startActivity(PasswordResetActivity.class); - } else if (viewId == R.id.btn_me_change) { + } else if (viewId == R.id.btn_mine_change) { startActivity(PhoneResetActivity.class); - } else if (viewId == R.id.btn_me_personal) { + } else if (viewId == R.id.btn_mine_personal) { startActivity(PersonalDataActivity.class); - } else if (viewId == R.id.btn_message_setting) { + } else if (viewId == R.id.btn_mine_setting) { startActivity(SettingActivity.class); - } else if (viewId == R.id.btn_me_about) { + } else if (viewId == R.id.btn_mine_about) { startActivity(AboutActivity.class); - } else if (viewId == R.id.btn_me_guide) { + } else if (viewId == R.id.btn_mine_guide) { startActivity(GuideActivity.class); - } else if (viewId == R.id.btn_me_browser) { + } else if (viewId == R.id.btn_mine_browser) { new InputDialog.Builder(getAttachActivity()) .setTitle("跳转到网页") @@ -121,7 +122,7 @@ public void onClick(View view) { .setListener((dialog, content) -> BrowserActivity.start(getAttachActivity(), content)) .show(); - } else if (viewId == R.id.btn_me_image_select) { + } else if (viewId == R.id.btn_mine_image_select) { ImageSelectActivity.start(getAttachActivity(), new ImageSelectActivity.OnPhotoSelectListener() { @@ -136,14 +137,14 @@ public void onCancel() { } }); - } else if (viewId == R.id.btn_me_image_preview) { + } else if (viewId == R.id.btn_mine_image_preview) { ArrayList images = new ArrayList<>(); images.add("https://www.baidu.com/img/bd_logo.png"); images.add("https://avatars1.githubusercontent.com/u/28616817"); ImagePreviewActivity.start(getAttachActivity(), images, images.size() - 1); - } else if (viewId == R.id.btn_me_video_select) { + } else if (viewId == R.id.btn_mine_video_select) { VideoSelectActivity.start(getAttachActivity(), new VideoSelectActivity.OnVideoSelectListener() { @@ -158,20 +159,23 @@ public void onCancel() { } }); - } else if (viewId == R.id.btn_me_video_play) { + } else if (viewId == R.id.btn_mine_video_play) { new VideoPlayActivity.Builder() .setVideoTitle("速度与激情特别行动") .setVideoSource("http://vfx.mtime.cn/Video/2019/06/29/mp4/190629004821240734.mp4") + .setActivityOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) .start(getAttachActivity()); - } else if (viewId == R.id.btn_me_crash) { + } else if (viewId == R.id.btn_mine_crash) { + // 上报错误到 Bugly 上 + CrashReport.postCatchedException(new IllegalStateException("are you ok?")); // 关闭 Bugly 异常捕捉 CrashReport.closeBugly(); throw new IllegalStateException("are you ok?"); - } else if (viewId == R.id.btn_me_pay) { + } else if (viewId == R.id.btn_mine_pay) { new MessageDialog.Builder(getAttachActivity()) .setTitle("捐赠") @@ -180,7 +184,7 @@ public void onCancel() { .setCancel(null) //.setAutoDismiss(false) .setListener(dialog -> { - BrowserActivity.start(getAttachActivity(), "https://gitee.com/getActivity/Donate"); + BrowserActivity.start(getAttachActivity(), "https://github.com/getActivity/Donate"); toast("AndroidProject 因为有你的支持而能够不断更新、完善,非常感谢支持!"); postDelayed(() -> { try { @@ -193,7 +197,6 @@ public void onCancel() { }, 2000); }) .show(); - } } diff --git a/app/src/main/java/com/hjq/demo/ui/fragment/StatusFragment.java b/app/src/main/java/com/hjq/demo/ui/fragment/StatusFragment.java index 3c375019..6789d39a 100644 --- a/app/src/main/java/com/hjq/demo/ui/fragment/StatusFragment.java +++ b/app/src/main/java/com/hjq/demo/ui/fragment/StatusFragment.java @@ -73,7 +73,7 @@ protected void initData() { */ private List analogData() { List data = new ArrayList<>(); - for (int i = mAdapter.getItemCount(); i < mAdapter.getItemCount() + 20; i++) { + for (int i = mAdapter.getCount(); i < mAdapter.getCount() + 20; i++) { data.add("我是第" + i + "条目"); } return data; @@ -110,7 +110,7 @@ public void onLoadMore(@NonNull RefreshLayout refreshLayout) { mAdapter.addData(analogData()); mRefreshLayout.finishLoadMore(); - mAdapter.setLastPage(mAdapter.getItemCount() >= 100); + mAdapter.setLastPage(mAdapter.getCount() >= 100); mRefreshLayout.setNoMoreData(mAdapter.isLastPage()); }, 1000); } diff --git a/app/src/main/java/com/hjq/demo/ui/popup/ListPopup.java b/app/src/main/java/com/hjq/demo/ui/popup/ListPopup.java index f535aaad..6cab8d25 100644 --- a/app/src/main/java/com/hjq/demo/ui/popup/ListPopup.java +++ b/app/src/main/java/com/hjq/demo/ui/popup/ListPopup.java @@ -8,6 +8,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import com.hjq.base.BaseAdapter; @@ -34,6 +35,7 @@ public static final class Builder implements BaseAdapter.OnItemClickListener { @SuppressWarnings("rawtypes") + @Nullable private OnListener mListener; private boolean mAutoDismiss = true; @@ -53,7 +55,7 @@ public Builder(Context context) { new ArrowDrawable.Builder(context) .setArrowOrientation(Gravity.TOP) .setArrowGravity(Gravity.CENTER) - .setShadowSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics())) + .setShadowSize((int) getResources().getDimension(R.dimen.dp_10)) .setBackgroundColor(0xFFFFFFFF) .apply(recyclerView); } @@ -112,9 +114,10 @@ public void onItemClick(RecyclerView recyclerView, View itemView, int position) dismiss(); } - if (mListener != null) { - mListener.onSelected(getPopupWindow(), position, mAdapter.getItem(position)); + if (mListener == null) { + return; } + mListener.onSelected(getPopupWindow(), position, mAdapter.getItem(position)); } } @@ -138,16 +141,17 @@ private final class ViewHolder extends AppAdapter.ViewHolder { super(new TextView(getContext())); mTextView = (TextView) getItemView(); mTextView.setTextColor(getColor(R.color.black50)); - mTextView.setTextSize(16); + mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.sp_16)); } @Override public void onBindView(int position) { mTextView.setText(getItem(position).toString()); - mTextView.setPaddingRelative((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, position == 0 ? 12 : 0, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics())); + + mTextView.setPaddingRelative((int) getResources().getDimension(R.dimen.dp_12), + (position == 0 ? (int) getResources().getDimension(R.dimen.dp_12) : 0), + (int) getResources().getDimension(R.dimen.dp_12), + (int) getResources().getDimension(R.dimen.dp_10)); } } } diff --git a/app/src/main/java/com/hjq/demo/widget/BrowserView.java b/app/src/main/java/com/hjq/demo/widget/BrowserView.java index feb02403..bcb00070 100644 --- a/app/src/main/java/com/hjq/demo/widget/BrowserView.java +++ b/app/src/main/java/com/hjq/demo/widget/BrowserView.java @@ -9,6 +9,7 @@ import android.net.Uri; import android.net.http.SslError; import android.os.Build; +import android.text.TextUtils; import android.util.AttributeSet; import android.webkit.GeolocationPermissions; import android.webkit.JsPromptResult; @@ -34,13 +35,16 @@ import com.hjq.demo.R; import com.hjq.demo.other.AppConfig; import com.hjq.demo.other.PermissionCallback; -import com.hjq.demo.ui.dialog.HintDialog; +import com.hjq.demo.ui.activity.ImageSelectActivity; +import com.hjq.demo.ui.activity.VideoSelectActivity; import com.hjq.demo.ui.dialog.InputDialog; import com.hjq.demo.ui.dialog.MessageDialog; +import com.hjq.demo.ui.dialog.TipsDialog; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; import com.hjq.widget.layout.NestedScrollWebView; +import java.io.File; import java.util.List; import timber.log.Timber; @@ -128,10 +132,10 @@ private static Context getFixedContext(Context context) { public String getUrl() { String originalUrl = super.getOriginalUrl(); // 避免开始时同时加载两个地址而导致的崩溃 - if (originalUrl != null) { - return originalUrl; + if (originalUrl == null) { + return super.getUrl(); } - return super.getUrl(); + return originalUrl; } /** @@ -152,7 +156,7 @@ public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Ev onResume(); resumeTimers(); break; - case ON_PAUSE: + case ON_STOP: onPause(); pauseTimers(); break; @@ -219,6 +223,7 @@ public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError e return; } + // 如何处理应用中的 WebView SSL 错误处理程序提醒:https://support.google.com/faqs/answer/7071387?hl=zh-Hans new MessageDialog.Builder(context) .setMessage(R.string.common_web_ssl_error_title) .setConfirm(R.string.common_web_ssl_error_allow) @@ -277,7 +282,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { Timber.i("WebView shouldOverrideUrlLoading:%s", url); String scheme = Uri.parse(url).getScheme(); if (scheme == null) { - return true; + return false; } switch (scheme) { // 如果这是跳链接操作 @@ -292,7 +297,6 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { default: break; } - // 已经处理该链接请求 return true; } @@ -341,8 +345,8 @@ public boolean onJsAlert(WebView view, String url, String message, JsResult resu return false; } - new HintDialog.Builder(activity) - .setIcon(HintDialog.ICON_WARNING) + new TipsDialog.Builder(activity) + .setIcon(TipsDialog.ICON_WARNING) .setMessage(message) .setCancelable(false) .addOnDismissListener(dialog -> result.confirm()) @@ -458,7 +462,6 @@ public void onCancel(BaseDialog dialog) { * @param callback 文件选择回调 * @param params 文件选择参数 */ - @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public boolean onShowFileChooser(WebView webView, ValueCallback callback, FileChooserParams params) { Activity activity = mWebView.getActivity(); @@ -468,12 +471,12 @@ public boolean onShowFileChooser(WebView webView, ValueCallback callback, } XXPermissions.with(activity) - .permission(Permission.MANAGE_EXTERNAL_STORAGE) + .permission(Permission.Group.STORAGE) .request(new PermissionCallback() { @Override public void onGranted(List permissions, boolean all) { if (all) { - openSystemFileChooser((BaseActivity) activity, callback, params); + openSystemFileChooser((BaseActivity) activity, params, callback); } } @@ -489,15 +492,59 @@ public void onDenied(List permissions, boolean never) { /** * 打开系统文件选择器 */ - private void openSystemFileChooser(BaseActivity activity, ValueCallback callback, FileChooserParams params) { + private static void openSystemFileChooser(BaseActivity activity, FileChooserParams params, ValueCallback callback) { Intent intent = params.createIntent(); String[] mimeTypes = params.getAcceptTypes(); - if (mimeTypes != null && mimeTypes.length > 0 && mimeTypes[0] != null && !"".equals(mimeTypes[0])) { + boolean multipleSelect = params.getMode() == FileChooserParams.MODE_OPEN_MULTIPLE; + if (mimeTypes != null && mimeTypes.length > 0 && !TextUtils.isEmpty(mimeTypes[0])) { // 要过滤的文件类型 intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); + if (mimeTypes.length == 1) { + switch (mimeTypes[0]) { + case "image/*": + ImageSelectActivity.start(activity, multipleSelect ? Integer.MAX_VALUE : 1, new ImageSelectActivity.OnPhotoSelectListener() { + + @Override + public void onSelected(List data) { + Uri[] uri = new Uri[data.size()]; + for (int i = 0; i < data.size(); i++) { + uri[i] = Uri.fromFile(new File(data.get(i))); + } + callback.onReceiveValue(uri); + } + + @Override + public void onCancel() { + callback.onReceiveValue(null); + } + }); + return; + case "video/*": + VideoSelectActivity.start(activity, multipleSelect ? Integer.MAX_VALUE : 1, new VideoSelectActivity.OnVideoSelectListener() { + + @Override + public void onSelected(List data) { + Uri[] uri = new Uri[data.size()]; + for (int i = 0; i < data.size(); i++) { + uri[i] = Uri.fromFile(new File(data.get(i).getVideoPath())); + } + callback.onReceiveValue(uri); + } + + @Override + public void onCancel() { + callback.onReceiveValue(null); + } + }); + return; + default: + break; + } + } } + // 是否是多选模式 - intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, params.getMode() == FileChooserParams.MODE_OPEN_MULTIPLE); + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multipleSelect); activity.startActivityForResult(Intent.createChooser(intent, params.getTitle()), (resultCode, data) -> { Uri[] uris = null; if (resultCode == Activity.RESULT_OK && data != null) { diff --git a/app/src/main/java/com/hjq/demo/widget/PasswordView.java b/app/src/main/java/com/hjq/demo/widget/PasswordView.java index de8ef418..584bdd85 100644 --- a/app/src/main/java/com/hjq/demo/widget/PasswordView.java +++ b/app/src/main/java/com/hjq/demo/widget/PasswordView.java @@ -5,11 +5,12 @@ import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; -import android.util.TypedValue; import android.view.View; import androidx.annotation.Nullable; +import com.hjq.demo.R; + /** * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject @@ -23,9 +24,9 @@ public final class PasswordView extends View { private final Paint mPointPaint; /** 单个密码框的宽度 */ - private int mItemWidth = 44; + private final int mItemWidth; /** 单个密码框的高度 */ - private int mItemHeight = 41; + private final int mItemHeight; /** 中心黑点的半径大小 */ private static final int POINT_RADIUS = 15; @@ -57,8 +58,8 @@ public PasswordView(Context context, @Nullable AttributeSet attrs, int defStyleA public PasswordView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mItemWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mItemWidth, getResources().getDisplayMetrics()); - mItemHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mItemHeight, getResources().getDisplayMetrics()); + mItemWidth = (int) getResources().getDimension(R.dimen.dp_44); + mItemHeight = (int) getResources().getDimension(R.dimen.dp_41); mPaint = new Paint(); // 设置抗锯齿 diff --git a/app/src/main/java/com/hjq/demo/widget/PlayerView.java b/app/src/main/java/com/hjq/demo/widget/PlayerView.java index c91b48a7..006b6572 100644 --- a/app/src/main/java/com/hjq/demo/widget/PlayerView.java +++ b/app/src/main/java/com/hjq/demo/widget/PlayerView.java @@ -1,8 +1,8 @@ package com.hjq.demo.widget; -import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; @@ -34,7 +34,9 @@ import com.airbnb.lottie.LottieAnimationView; import com.hjq.base.action.ActivityAction; import com.hjq.demo.R; +import com.hjq.demo.ui.dialog.MessageDialog; import com.hjq.widget.layout.SimpleLayout; +import com.hjq.widget.view.PlayButton; import java.io.File; import java.util.Formatter; @@ -52,7 +54,8 @@ public final class PlayerView extends SimpleLayout View.OnClickListener, ActivityAction, MediaPlayer.OnPreparedListener, MediaPlayer.OnInfoListener, - MediaPlayer.OnCompletionListener { + MediaPlayer.OnCompletionListener, + MediaPlayer.OnErrorListener { /** 刷新间隔 */ private static final int REFRESH_TIME = 1000; @@ -60,6 +63,8 @@ public final class PlayerView extends SimpleLayout private static final int CONTROLLER_TIME = 3000; /** 提示对话框隐藏间隔 */ private static final int DIALOG_TIME = 500; + /** 动画执行时间 */ + private static final int ANIM_TIME = 500; private final ViewGroup mTopLayout; private final TextView mTitleView; @@ -71,17 +76,22 @@ public final class PlayerView extends SimpleLayout private final SeekBar mProgressView; private final VideoView mVideoView; - private final ImageView mControlView; + private final PlayButton mControlView; private final ImageView mLockView; private ViewGroup mMessageLayout; private final LottieAnimationView mLottieView; private final TextView mMessageView; + /** 视频宽度 */ + private int mVideoWidth; + /** 视频高度 */ + private int mVideoHeight; + /** 锁定面板 */ private boolean mLockMode; /** 显示面板 */ - private boolean mControllerShow = true; + private boolean mControllerShow = false; /** 触摸按下的 X 坐标 */ private float mViewDownX; @@ -92,10 +102,11 @@ public final class PlayerView extends SimpleLayout /** 当前播放进度 */ private int mCurrentProgress; /** 返回监听器 */ - private onPlayListener mListener; + @Nullable + private OnPlayListener mListener; /** 音量管理器 */ - private AudioManager mAudioManager; + private final AudioManager mAudioManager; /** 最大音量值 */ private int mMaxVoice; /** 当前音量值 */ @@ -152,9 +163,9 @@ public PlayerView(Context context, AttributeSet attrs, int defStyleAttr, int def mVideoView.setOnPreparedListener(this); mVideoView.setOnCompletionListener(this); mVideoView.setOnInfoListener(this); + mVideoView.setOnErrorListener(this); mAudioManager = ContextCompat.getSystemService(getContext(), AudioManager.class); - postDelayed(mHideControllerRunnable, CONTROLLER_TIME); } /** @@ -217,7 +228,7 @@ public void setVideoSource(String url) { */ public void start() { mVideoView.start(); - mControlView.setImageResource(R.drawable.video_play_pause_ic); + mControlView.play(); // 延迟隐藏控制面板 removeCallbacks(mHideControllerRunnable); postDelayed(mHideControllerRunnable, CONTROLLER_TIME); @@ -228,7 +239,7 @@ public void start() { */ public void pause() { mVideoView.pause(); - mControlView.setImageResource(R.drawable.video_play_start_ic); + mControlView.pause(); // 延迟隐藏控制面板 removeCallbacks(mHideControllerRunnable); postDelayed(mHideControllerRunnable, CONTROLLER_TIME); @@ -309,7 +320,7 @@ public void setGestureEnabled(boolean enabled) { /** * 设置返回监听 */ - public void setOnPlayListener(onPlayListener listener) { + public void setOnPlayListener(@Nullable OnPlayListener listener) { mListener = listener; mLeftView.setVisibility(mListener != null ? VISIBLE : INVISIBLE); } @@ -323,16 +334,44 @@ public void showController() { } mControllerShow = true; - ObjectAnimator.ofFloat(mTopLayout, "translationY", - mTopLayout.getHeight(), 0).start(); - ObjectAnimator.ofFloat(mBottomLayout, "translationY", mBottomLayout.getHeight(), 0).start(); - ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); - animator.setDuration(500); - animator.addUpdateListener(animation -> { + ValueAnimator topAnimator = ValueAnimator.ofInt(-mTopLayout.getHeight(), 0); + topAnimator.setDuration(ANIM_TIME); + topAnimator.addUpdateListener(animation -> { + int translationY = (int) animation.getAnimatedValue(); + mTopLayout.setTranslationY(translationY); + if (translationY != -mTopLayout.getHeight()) { + return; + } + + if (mTopLayout.getVisibility() == INVISIBLE) { + mTopLayout.setVisibility(VISIBLE); + } + }); + topAnimator.start(); + + ValueAnimator bottomAnimator = ValueAnimator.ofInt(mBottomLayout.getHeight(), 0); + bottomAnimator.setDuration(ANIM_TIME); + bottomAnimator.addUpdateListener(animation -> { + int translationY = (int) animation.getAnimatedValue(); + mBottomLayout.setTranslationY(translationY); + if (translationY != mBottomLayout.getHeight()) { + return; + } + + if (mBottomLayout.getVisibility() == INVISIBLE) { + mBottomLayout.setVisibility(VISIBLE); + } + }); + bottomAnimator.start(); + + ValueAnimator alphaAnimator = ValueAnimator.ofFloat(0f, 1f); + alphaAnimator.setDuration(ANIM_TIME); + alphaAnimator.addUpdateListener(animation -> { float alpha = (float) animation.getAnimatedValue(); mLockView.setAlpha(alpha); mControlView.setAlpha(alpha); - if ((int) alpha != 1) { + if (alpha != 0) { return; } @@ -343,7 +382,7 @@ public void showController() { mControlView.setVisibility(VISIBLE); } }); - animator.start(); + alphaAnimator.start(); } /** @@ -355,16 +394,44 @@ public void hideController() { } mControllerShow = false; - ObjectAnimator.ofFloat(mTopLayout, "translationY", 0, - mTopLayout.getHeight()).start(); - ObjectAnimator.ofFloat(mBottomLayout, "translationY", 0, mBottomLayout.getHeight()).start(); - ValueAnimator animator = ValueAnimator.ofFloat(1f, 0f); - animator.setDuration(500); - animator.addUpdateListener(animation -> { + ValueAnimator topAnimator = ValueAnimator.ofInt(0, -mTopLayout.getHeight()); + topAnimator.setDuration(ANIM_TIME); + topAnimator.addUpdateListener(animation -> { + int translationY = (int) animation.getAnimatedValue(); + mTopLayout.setTranslationY(translationY); + if (translationY != -mTopLayout.getHeight()) { + return; + } + + if (mTopLayout.getVisibility() == VISIBLE) { + mTopLayout.setVisibility(INVISIBLE); + } + }); + topAnimator.start(); + + ValueAnimator bottomAnimator = ValueAnimator.ofInt(0, mBottomLayout.getHeight()); + bottomAnimator.setDuration(ANIM_TIME); + bottomAnimator.addUpdateListener(animation -> { + int translationY = (int) animation.getAnimatedValue(); + mBottomLayout.setTranslationY(translationY); + if (translationY != mBottomLayout.getHeight()) { + return; + } + + if (mBottomLayout.getVisibility() == VISIBLE) { + mBottomLayout.setVisibility(INVISIBLE); + } + }); + bottomAnimator.start(); + + ValueAnimator alphaAnimator = ValueAnimator.ofFloat(1f, 0f); + alphaAnimator.setDuration(ANIM_TIME); + alphaAnimator.addUpdateListener(animation -> { float alpha = (float) animation.getAnimatedValue(); mLockView.setAlpha(alpha); mControlView.setAlpha(alpha); - if (alpha != 0f) { + if (alpha != 0) { return; } @@ -375,7 +442,7 @@ public void hideController() { mControlView.setVisibility(INVISIBLE); } }); - animator.start(); + alphaAnimator.start(); } public void onResume() { @@ -397,54 +464,6 @@ public void onDestroy() { removeAllViews(); } - /** - * {@link MediaPlayer.OnPreparedListener} - */ - @Override - public void onPrepared(MediaPlayer player) { - mPlayTime.setText(conversionTime(0)); - mTotalTime.setText(conversionTime(player.getDuration())); - mProgressView.setMax(mVideoView.getDuration()); - - // 获取视频的宽高 - int videoWidth = player.getVideoWidth(); - int videoHeight = player.getVideoHeight(); - - // VideoView 的宽高 - int viewWidth = getWidth(); - int viewHeight = getHeight(); - - // 基于比例调整大小 - if (videoWidth * viewHeight < viewWidth * videoHeight) { - // 视频宽度过大,进行纠正 - viewWidth = viewHeight * videoWidth / videoHeight; - } else if (videoWidth * viewHeight > viewWidth * videoHeight) { - // 视频高度过大,进行纠正 - viewHeight = viewWidth * videoHeight / videoWidth; - } - - // 重新设置 VideoView 的宽高 - ViewGroup.LayoutParams params = mVideoView.getLayoutParams(); - params.width = viewWidth; - params.height = viewHeight; - mVideoView.setLayoutParams(params); - if (mListener != null) { - mListener.onPlayStart(this); - } - postDelayed(mRefreshRunnable, REFRESH_TIME / 2); - } - - /** - * {@link MediaPlayer.OnCompletionListener} - */ - @Override - public void onCompletion(MediaPlayer player) { - pause(); - if (mListener != null) { - mListener.onPlayEnd(this); - } - } - @Override protected void onWindowVisibilityChanged(int visibility) { // 这里解释一下 onWindowVisibilityChanged 方法调用的时机 @@ -452,10 +471,11 @@ protected void onWindowVisibilityChanged(int visibility) { // 从后台返回到前台:先调用 onWindowVisibilityChanged(View.INVISIBLE) 后调用 onWindowVisibilityChanged(View.VISIBLE) super.onWindowVisibilityChanged(visibility); // 这里修复了 Activity 从后台返回到前台时 VideoView 从头开始播放的问题 - if (visibility == VISIBLE) { - mVideoView.seekTo(mCurrentProgress); - mProgressView.setProgress(mCurrentProgress); + if (visibility != VISIBLE) { + return; } + mVideoView.seekTo(mCurrentProgress); + mProgressView.setProgress(mCurrentProgress); } /** @@ -494,6 +514,59 @@ public void onStopTrackingTouch(SeekBar seekBar) { setProgress(seekBar.getProgress()); } + /** + * {@link MediaPlayer.OnPreparedListener} + */ + @Override + public void onPrepared(MediaPlayer player) { + mPlayTime.setText(conversionTime(0)); + mTotalTime.setText(conversionTime(player.getDuration())); + mProgressView.setMax(mVideoView.getDuration()); + + // 获取视频的宽高 + mVideoWidth = player.getVideoWidth(); + mVideoHeight = player.getVideoHeight(); + + // VideoView 的宽高 + int viewWidth = getWidth(); + int viewHeight = getHeight(); + + // 基于比例调整大小 + if (mVideoWidth * viewHeight < viewWidth * mVideoHeight) { + // 视频宽度过大,进行纠正 + viewWidth = viewHeight * mVideoWidth / mVideoHeight; + } else if (mVideoWidth * viewHeight > viewWidth * mVideoHeight) { + // 视频高度过大,进行纠正 + viewHeight = viewWidth * mVideoHeight / mVideoWidth; + } + + // 重新设置 VideoView 的宽高 + ViewGroup.LayoutParams params = mVideoView.getLayoutParams(); + params.width = viewWidth; + params.height = viewHeight; + mVideoView.setLayoutParams(params); + + post(mShowControllerRunnable); + postDelayed(mRefreshRunnable, REFRESH_TIME / 2); + + if (mListener == null) { + return; + } + mListener.onPlayStart(this); + } + + /** + * {@link MediaPlayer.OnCompletionListener} + */ + @Override + public void onCompletion(MediaPlayer player) { + pause(); + if (mListener == null) { + return; + } + mListener.onPlayEnd(this); + } + /** * {@link MediaPlayer.OnInfoListener} */ @@ -519,6 +592,35 @@ public boolean onInfo(MediaPlayer player, int what, int extra) { return false; } + /** + * {@link MediaPlayer.OnErrorListener} + */ + + @Override + public boolean onError(MediaPlayer player, int what, int extra) { + Activity activity = getActivity(); + if (activity == null) { + return false; + } + + String message; + if (what == MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) { + message = activity.getString(R.string.common_video_error_not_support); + } else { + message = activity.getString(R.string.common_video_error_unknown); + } + message += "\n" + String.format(activity.getString(R.string.common_video_error_supplement), what, extra); + + new MessageDialog.Builder(getActivity()) + .setMessage(message) + .setConfirm(R.string.common_confirm) + .setCancel(null) + .setCancelable(false) + .setListener(dialog -> onCompletion(player)) + .show(); + return true; + } + /** * {@link View.OnClickListener} */ @@ -526,27 +628,34 @@ public boolean onInfo(MediaPlayer player, int what, int extra) { @Override public void onClick(View view) { if (view == this) { + // 先移除之前发送的 removeCallbacks(mShowControllerRunnable); removeCallbacks(mHideControllerRunnable); + if (mControllerShow) { // 隐藏控制面板 post(mHideControllerRunnable); - } else { - // 显示控制面板 - post(mShowControllerRunnable); - postDelayed(mHideControllerRunnable, CONTROLLER_TIME); + return; } - return; - } + // 显示控制面板 + post(mShowControllerRunnable); + postDelayed(mHideControllerRunnable, CONTROLLER_TIME); + + } else if (view == mLeftView) { - if (view == mLeftView && mListener != null) { + if (mListener == null) { + return; + } mListener.onClickBack(this); - return; - } - if (view == mControlView && mControlView.getVisibility() == VISIBLE) { + } else if (view == mControlView) { + + if (mControlView.getVisibility() != VISIBLE) { + return; + } + if (isPlaying()) { pause(); } else { @@ -560,24 +669,33 @@ public void onClick(View view) { post(mShowControllerRunnable); } postDelayed(mHideControllerRunnable, CONTROLLER_TIME); - if (mListener != null) { - mListener.onClickPlay(this); + if (mListener == null) { + return; } - return; - } + mListener.onClickPlay(this); + + } else if (view == mLockView) { - if (view == mLockView) { if (mLockMode) { unlock(); } else { lock(); } - if (mListener != null) { - mListener.onClickLock(this); + if (mListener == null) { + return; } + mListener.onClickLock(this); } } + public int getVideoWidth() { + return mVideoWidth; + } + + public int getVideoHeight() { + return mVideoHeight; + } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { @@ -596,7 +714,10 @@ public boolean onTouchEvent(MotionEvent event) { // 如果当前亮度是默认的,那么就获取系统当前的屏幕亮度 if (mCurrentBrightness == WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE) { try { - mCurrentBrightness = Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS) / 255f; + // 这里需要注意,Settings.System.SCREEN_BRIGHTNESS 获取到的值在小米手机上面会超过 255 + mCurrentBrightness = Math.min(Settings.System.getInt( + getContext().getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS), 255) / 255f; } catch (Settings.SettingNotFoundException ignored) { mCurrentBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF; } @@ -629,11 +750,12 @@ public boolean onTouchEvent(MotionEvent event) { int progress = getProgress() + second * 1000; if (progress >= 0 && progress <= getDuration()) { mAdjustSecond = second; - mLottieView.setImageResource(mAdjustSecond < 0 ? R.drawable.video_schedule_rewind_ic : R.drawable.video_schedule_forward_ic); + mLottieView.setImageResource(mAdjustSecond < 0 ? + R.drawable.video_schedule_rewind_ic : + R.drawable.video_schedule_forward_ic); mMessageView.setText(String.format("%s s", Math.abs(mAdjustSecond))); post(mShowMessageRunnable); } - break; } @@ -749,10 +871,12 @@ public void run() { mBottomLayout.setVisibility(GONE); } } - if (mListener != null) { - mListener.onPlayProgress(PlayerView.this); - } postDelayed(this, REFRESH_TIME); + + if (mListener == null) { + return; + } + mListener.onPlayProgress(PlayerView.this); } }; @@ -812,7 +936,7 @@ public static String conversionTime(int time) { /** * 点击返回监听器 */ - public interface onPlayListener { + public interface OnPlayListener { /** * 点击了返回按钮(可在此处处理返回事件) diff --git a/app/src/main/java/com/hjq/demo/widget/StatusLayout.java b/app/src/main/java/com/hjq/demo/widget/StatusLayout.java index f34869b2..6139be5a 100644 --- a/app/src/main/java/com/hjq/demo/widget/StatusLayout.java +++ b/app/src/main/java/com/hjq/demo/widget/StatusLayout.java @@ -5,6 +5,7 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; @@ -34,6 +35,10 @@ public final class StatusLayout extends FrameLayout { private LottieAnimationView mLottieView; /** 提示文本 */ private TextView mTextView; + /** 重试按钮 */ + private TextView mRetryView; + /** 重试监听 */ + private OnRetryListener mListener; public StatusLayout(@NonNull Context context) { this(context, null); @@ -44,15 +49,7 @@ public StatusLayout(@NonNull Context context, @Nullable AttributeSet attrs) { } public StatusLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public StatusLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - - setClickable(true); - setFocusable(true); - setFocusableInTouchMode(true); + super(context, attrs, defStyleAttr); } /** @@ -68,6 +65,7 @@ public void show() { if (isShow()) { return; } + mRetryView.setVisibility(mListener == null ? View.INVISIBLE : View.VISIBLE); // 显示布局 mMainLayout.setVisibility(VISIBLE); } @@ -147,23 +145,53 @@ private void initLayout() { mLottieView = mMainLayout.findViewById(R.id.iv_status_icon); mTextView = mMainLayout.findViewById(R.id.iv_status_text); + mRetryView = mMainLayout.findViewById(R.id.iv_status_retry); if (mMainLayout.getBackground() == null) { // 默认使用 windowBackground 作为背景 TypedArray typedArray = getContext().obtainStyledAttributes(new int[]{android.R.attr.windowBackground}); mMainLayout.setBackground(typedArray.getDrawable(0)); + mMainLayout.setClickable(true); typedArray.recycle(); } + mRetryView.setOnClickListener(mClickWrapper); + addView(mMainLayout); } - @Override - public void setOnClickListener(@Nullable OnClickListener l) { + /** + * 设置重试监听器 + */ + public void setOnRetryListener(OnRetryListener listener) { + mListener = listener; if (isShow()) { - mMainLayout.setOnClickListener(l); - } else { - super.setOnClickListener(l); + mRetryView.setVisibility(mListener == null ? View.INVISIBLE : View.VISIBLE); } } + + /** + * 点击事件包装类 + */ + private final OnClickListener mClickWrapper = new OnClickListener() { + + @Override + public void onClick(View v) { + if (mListener == null) { + return; + } + mListener.onRetry(StatusLayout.this); + } + }; + + /** + * 重试监听器 + */ + public interface OnRetryListener { + + /** + * 点击了重试 + */ + void onRetry(StatusLayout layout); + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjq/demo/widget/XCollapsingToolbarLayout.java b/app/src/main/java/com/hjq/demo/widget/XCollapsingToolbarLayout.java index 894a6721..662a5b97 100644 --- a/app/src/main/java/com/hjq/demo/widget/XCollapsingToolbarLayout.java +++ b/app/src/main/java/com/hjq/demo/widget/XCollapsingToolbarLayout.java @@ -3,6 +3,8 @@ import android.content.Context; import android.util.AttributeSet; +import androidx.annotation.Nullable; + import com.google.android.material.appbar.CollapsingToolbarLayout; /** @@ -14,6 +16,7 @@ public final class XCollapsingToolbarLayout extends CollapsingToolbarLayout { /** 渐变监听 */ + @Nullable private OnScrimsListener mListener; /** 当前渐变状态 */ private boolean mScrimsShown; @@ -34,13 +37,15 @@ public XCollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyl public void setScrimsShown(boolean shown, boolean animate) { super.setScrimsShown(shown, true); // 判断渐变状态是否改变了 - if (mScrimsShown != shown) { - // 如果是就记录并且回调监听器 - mScrimsShown = shown; - if (mListener != null) { - mListener.onScrimsStateChange(this, mScrimsShown); - } + if (mScrimsShown == shown) { + return; + } + // 如果是就记录并且回调监听器 + mScrimsShown = shown; + if (mListener == null) { + return; } + mListener.onScrimsStateChange(this, mScrimsShown); } /** @@ -53,7 +58,7 @@ public boolean isScrimsShown() { /** * 设置CollapsingToolbarLayout渐变监听 */ - public void setOnScrimsListener(OnScrimsListener listener) { + public void setOnScrimsListener(@Nullable OnScrimsListener listener) { mListener = listener; } diff --git a/umeng/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java b/app/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java similarity index 97% rename from umeng/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java rename to app/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java index b3088ef7..4b4195bb 100644 --- a/umeng/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java +++ b/app/src/main/java/com/hjq/demo/wxapi/WXEntryActivity.java @@ -1,11 +1,11 @@ -package com.hjq.demo.wxapi; - -import com.umeng.socialize.weixin.view.WXCallbackActivity; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/05/06 - * desc : 微信登录回调(请注意这个 Activity 放置的包名要和当前项目的包名保持一致,否则将不能正常回调) - */ +package com.hjq.demo.wxapi; + +import com.umeng.socialize.weixin.view.WXCallbackActivity; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2019/05/06 + * desc : 微信登录回调(请注意这个 Activity 放置的包名要和当前项目的包名保持一致,否则将不能正常回调) + */ public final class WXEntryActivity extends WXCallbackActivity {} \ No newline at end of file diff --git a/app/src/main/res/drawable/add_ic.xml b/app/src/main/res/drawable/add_ic.xml index ff46416a..43eaf96a 100644 --- a/app/src/main/res/drawable/add_ic.xml +++ b/app/src/main/res/drawable/add_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/arrows_bottom_ic.xml b/app/src/main/res/drawable/arrows_bottom_ic.xml index f29ad9d8..e6d04ad3 100644 --- a/app/src/main/res/drawable/arrows_bottom_ic.xml +++ b/app/src/main/res/drawable/arrows_bottom_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/arrows_left_ic.xml b/app/src/main/res/drawable/arrows_left_ic.xml index 1d82fa94..c3361c84 100644 --- a/app/src/main/res/drawable/arrows_left_ic.xml +++ b/app/src/main/res/drawable/arrows_left_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/arrows_right_ic.xml b/app/src/main/res/drawable/arrows_right_ic.xml index d6f8fb47..71feb85c 100644 --- a/app/src/main/res/drawable/arrows_right_ic.xml +++ b/app/src/main/res/drawable/arrows_right_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/arrows_top_ic.xml b/app/src/main/res/drawable/arrows_top_ic.xml index b44d617a..821ae8b0 100644 --- a/app/src/main/res/drawable/arrows_top_ic.xml +++ b/app/src/main/res/drawable/arrows_top_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/avatar_placeholder_ic.xml b/app/src/main/res/drawable/avatar_placeholder_ic.xml index 1fa74bd2..a92bf8de 100644 --- a/app/src/main/res/drawable/avatar_placeholder_ic.xml +++ b/app/src/main/res/drawable/avatar_placeholder_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/button_round_selector.xml b/app/src/main/res/drawable/button_circle_selector.xml similarity index 75% rename from app/src/main/res/drawable/button_round_selector.xml rename to app/src/main/res/drawable/button_circle_selector.xml index d573cc90..97ff0a77 100644 --- a/app/src/main/res/drawable/button_round_selector.xml +++ b/app/src/main/res/drawable/button_circle_selector.xml @@ -1,11 +1,11 @@ - + - + @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/app/src/main/res/drawable/button_rect_selector.xml b/app/src/main/res/drawable/button_rect_selector.xml index 806ff677..26819327 100644 --- a/app/src/main/res/drawable/button_rect_selector.xml +++ b/app/src/main/res/drawable/button_rect_selector.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/camera_ic.xml b/app/src/main/res/drawable/camera_ic.xml index e9615eed..ca10f5e6 100644 --- a/app/src/main/res/drawable/camera_ic.xml +++ b/app/src/main/res/drawable/camera_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/checkbox_checked_ic.xml b/app/src/main/res/drawable/checkbox_checked_ic.xml index cce6ac1b..30c611cc 100644 --- a/app/src/main/res/drawable/checkbox_checked_ic.xml +++ b/app/src/main/res/drawable/checkbox_checked_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/checkbox_disable_ic.xml b/app/src/main/res/drawable/checkbox_disable_ic.xml index 513093b8..3873ef97 100644 --- a/app/src/main/res/drawable/checkbox_disable_ic.xml +++ b/app/src/main/res/drawable/checkbox_disable_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/close_icon.xml b/app/src/main/res/drawable/close_icon.xml index 3b7bd4eb..f2b1d4bd 100644 --- a/app/src/main/res/drawable/close_icon.xml +++ b/app/src/main/res/drawable/close_icon.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/compound_normal_ic.xml b/app/src/main/res/drawable/compound_normal_ic.xml index 30b3ed14..4a9fd0e9 100644 --- a/app/src/main/res/drawable/compound_normal_ic.xml +++ b/app/src/main/res/drawable/compound_normal_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/countdown_selector.xml b/app/src/main/res/drawable/countdown_selector.xml index 61f4a1d1..ba8a69cc 100644 --- a/app/src/main/res/drawable/countdown_selector.xml +++ b/app/src/main/res/drawable/countdown_selector.xml @@ -5,7 +5,7 @@ - + @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/app/src/main/res/drawable/delete_ic.xml b/app/src/main/res/drawable/delete_ic.xml index 5d5cee6a..18baed89 100644 --- a/app/src/main/res/drawable/delete_ic.xml +++ b/app/src/main/res/drawable/delete_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/dialog_rounded_corner_bg.xml b/app/src/main/res/drawable/dialog_rounded_corner_bg.xml deleted file mode 100644 index ecac81aa..00000000 --- a/app/src/main/res/drawable/dialog_rounded_corner_bg.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/example_bg.xml b/app/src/main/res/drawable/example_bg.xml index 90e2be87..e66f37df 100644 --- a/app/src/main/res/drawable/example_bg.xml +++ b/app/src/main/res/drawable/example_bg.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_found_off_ic.xml b/app/src/main/res/drawable/home_found_off_ic.xml index 26557c2e..d44acdc5 100644 --- a/app/src/main/res/drawable/home_found_off_ic.xml +++ b/app/src/main/res/drawable/home_found_off_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_found_on_ic.xml b/app/src/main/res/drawable/home_found_on_ic.xml index 8bd0fa2a..7306055e 100644 --- a/app/src/main/res/drawable/home_found_on_ic.xml +++ b/app/src/main/res/drawable/home_found_on_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_found_selector.xml b/app/src/main/res/drawable/home_found_selector.xml index ed38d279..affb20fc 100644 --- a/app/src/main/res/drawable/home_found_selector.xml +++ b/app/src/main/res/drawable/home_found_selector.xml @@ -1,8 +1,8 @@ - - + + diff --git a/app/src/main/res/drawable/home_home_off_ic.xml b/app/src/main/res/drawable/home_home_off_ic.xml index fac197bf..e97da5e4 100644 --- a/app/src/main/res/drawable/home_home_off_ic.xml +++ b/app/src/main/res/drawable/home_home_off_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_home_on_ic.xml b/app/src/main/res/drawable/home_home_on_ic.xml index ce01600a..a5e0757c 100644 --- a/app/src/main/res/drawable/home_home_on_ic.xml +++ b/app/src/main/res/drawable/home_home_on_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_home_selector.xml b/app/src/main/res/drawable/home_home_selector.xml index 6674dd5a..aa81d8c4 100644 --- a/app/src/main/res/drawable/home_home_selector.xml +++ b/app/src/main/res/drawable/home_home_selector.xml @@ -1,8 +1,8 @@ - - + + diff --git a/app/src/main/res/drawable/home_me_off_ic.xml b/app/src/main/res/drawable/home_me_off_ic.xml index 1d841a93..62b441f7 100644 --- a/app/src/main/res/drawable/home_me_off_ic.xml +++ b/app/src/main/res/drawable/home_me_off_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_me_on_ic.xml b/app/src/main/res/drawable/home_me_on_ic.xml index c3d11554..24036117 100644 --- a/app/src/main/res/drawable/home_me_on_ic.xml +++ b/app/src/main/res/drawable/home_me_on_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_me_selector.xml b/app/src/main/res/drawable/home_me_selector.xml index 84f81d86..f96aaccc 100644 --- a/app/src/main/res/drawable/home_me_selector.xml +++ b/app/src/main/res/drawable/home_me_selector.xml @@ -1,8 +1,8 @@ - - + + diff --git a/app/src/main/res/drawable/home_message_off_ic.xml b/app/src/main/res/drawable/home_message_off_ic.xml index b1d0b38b..57fce1ba 100644 --- a/app/src/main/res/drawable/home_message_off_ic.xml +++ b/app/src/main/res/drawable/home_message_off_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_message_on_ic.xml b/app/src/main/res/drawable/home_message_on_ic.xml index cc46c7f3..04640407 100644 --- a/app/src/main/res/drawable/home_message_on_ic.xml +++ b/app/src/main/res/drawable/home_message_on_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/home_message_selector.xml b/app/src/main/res/drawable/home_message_selector.xml index cbe8bd95..46cb0285 100644 --- a/app/src/main/res/drawable/home_message_selector.xml +++ b/app/src/main/res/drawable/home_message_selector.xml @@ -1,8 +1,8 @@ - - + + diff --git a/app/src/main/res/drawable/home_navigation_color_selector.xml b/app/src/main/res/drawable/home_navigation_color_selector.xml deleted file mode 100644 index aa66a679..00000000 --- a/app/src/main/res/drawable/home_navigation_color_selector.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/home_search_bar_gray_bg.xml b/app/src/main/res/drawable/home_search_bar_gray_bg.xml index 98582cf6..067418ef 100644 --- a/app/src/main/res/drawable/home_search_bar_gray_bg.xml +++ b/app/src/main/res/drawable/home_search_bar_gray_bg.xml @@ -1,5 +1,8 @@ + + + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_search_bar_transparent_bg.xml b/app/src/main/res/drawable/home_search_bar_transparent_bg.xml index 90608bb0..29b243bc 100644 --- a/app/src/main/res/drawable/home_search_bar_transparent_bg.xml +++ b/app/src/main/res/drawable/home_search_bar_transparent_bg.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/image_loading_bg.xml b/app/src/main/res/drawable/image_loading_ic.xml similarity index 96% rename from app/src/main/res/drawable/image_loading_bg.xml rename to app/src/main/res/drawable/image_loading_ic.xml index 9d47e5be..a1987e86 100644 --- a/app/src/main/res/drawable/image_loading_bg.xml +++ b/app/src/main/res/drawable/image_loading_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/info_ic.xml b/app/src/main/res/drawable/info_ic.xml index 06c0c62f..2c330fa9 100644 --- a/app/src/main/res/drawable/info_ic.xml +++ b/app/src/main/res/drawable/info_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/login_qq_ic.xml b/app/src/main/res/drawable/login_qq_ic.xml index cc6a151e..c0509ee3 100644 --- a/app/src/main/res/drawable/login_qq_ic.xml +++ b/app/src/main/res/drawable/login_qq_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/login_wechat_ic.xml b/app/src/main/res/drawable/login_wechat_ic.xml index 71955ab4..63a5e3c6 100644 --- a/app/src/main/res/drawable/login_wechat_ic.xml +++ b/app/src/main/res/drawable/login_wechat_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/phone_ic.xml b/app/src/main/res/drawable/phone_ic.xml index e4a24b36..bcd8c672 100644 --- a/app/src/main/res/drawable/phone_ic.xml +++ b/app/src/main/res/drawable/phone_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/radiobutton_checked_ic.xml b/app/src/main/res/drawable/radiobutton_checked_ic.xml index 509b7ba2..8ed357ff 100644 --- a/app/src/main/res/drawable/radiobutton_checked_ic.xml +++ b/app/src/main/res/drawable/radiobutton_checked_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/radiobutton_disable_ic.xml b/app/src/main/res/drawable/radiobutton_disable_ic.xml index 1ba0b9e1..2686fb6c 100644 --- a/app/src/main/res/drawable/radiobutton_disable_ic.xml +++ b/app/src/main/res/drawable/radiobutton_disable_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/reboot_ic.xml b/app/src/main/res/drawable/reboot_ic.xml index 24432a87..5c440556 100644 --- a/app/src/main/res/drawable/reboot_ic.xml +++ b/app/src/main/res/drawable/reboot_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/roll_accent_bg.xml b/app/src/main/res/drawable/roll_accent_bg.xml new file mode 100644 index 00000000..ee43ce27 --- /dev/null +++ b/app/src/main/res/drawable/roll_accent_bg.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/safe_ic.xml b/app/src/main/res/drawable/safe_ic.xml index 9a1a988b..c243d7e6 100644 --- a/app/src/main/res/drawable/safe_ic.xml +++ b/app/src/main/res/drawable/safe_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/search_ic.xml b/app/src/main/res/drawable/search_ic.xml index 9b05b752..99a573e6 100644 --- a/app/src/main/res/drawable/search_ic.xml +++ b/app/src/main/res/drawable/search_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/setting_update_bg.xml b/app/src/main/res/drawable/setting_update_bg.xml deleted file mode 100644 index 6a807718..00000000 --- a/app/src/main/res/drawable/setting_update_bg.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/share_ic.xml b/app/src/main/res/drawable/share_ic.xml index 1199081f..5cb14c7c 100644 --- a/app/src/main/res/drawable/share_ic.xml +++ b/app/src/main/res/drawable/share_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/share_link_ic.xml b/app/src/main/res/drawable/share_link_ic.xml index 748f6daa..56bbc996 100644 --- a/app/src/main/res/drawable/share_link_ic.xml +++ b/app/src/main/res/drawable/share_link_ic.xml @@ -1,11 +1,10 @@ + android:width="@dimen/dp_200" + android:height="@dimen/dp_200" + android:viewportWidth="50" + android:viewportHeight="50"> \ No newline at end of file diff --git a/app/src/main/res/drawable/share_moment_ic.xml b/app/src/main/res/drawable/share_moment_ic.xml index 5d67980e..cba78f6f 100644 --- a/app/src/main/res/drawable/share_moment_ic.xml +++ b/app/src/main/res/drawable/share_moment_ic.xml @@ -1,39 +1,31 @@ + android:width="@dimen/dp_200" + android:height="@dimen/dp_200" + android:viewportWidth="50" + android:viewportHeight="50"> \ No newline at end of file diff --git a/app/src/main/res/drawable/share_qq_ic.xml b/app/src/main/res/drawable/share_qq_ic.xml index ed5119c4..4f82c71a 100644 --- a/app/src/main/res/drawable/share_qq_ic.xml +++ b/app/src/main/res/drawable/share_qq_ic.xml @@ -1,9 +1,9 @@ + android:width="@dimen/dp_200" + android:height="@dimen/dp_200" + android:viewportWidth="50" + android:viewportHeight="50"> diff --git a/app/src/main/res/drawable/share_qzone_ic.xml b/app/src/main/res/drawable/share_qzone_ic.xml index 90eff611..dacfbc89 100644 --- a/app/src/main/res/drawable/share_qzone_ic.xml +++ b/app/src/main/res/drawable/share_qzone_ic.xml @@ -1,9 +1,9 @@ + android:width="@dimen/dp_200" + android:height="@dimen/dp_200" + android:viewportWidth="50" + android:viewportHeight="50"> diff --git a/app/src/main/res/drawable/share_wechat_ic.xml b/app/src/main/res/drawable/share_wechat_ic.xml index a4c2ccc6..28afc05d 100644 --- a/app/src/main/res/drawable/share_wechat_ic.xml +++ b/app/src/main/res/drawable/share_wechat_ic.xml @@ -1,9 +1,9 @@ + android:width="@dimen/dp_200" + android:height="@dimen/dp_200" + android:viewportWidth="50" + android:viewportHeight="50"> diff --git a/app/src/main/res/drawable/status_empty_ic.xml b/app/src/main/res/drawable/status_empty_ic.xml index 18ae2382..bd74466a 100644 --- a/app/src/main/res/drawable/status_empty_ic.xml +++ b/app/src/main/res/drawable/status_empty_ic.xml @@ -1,35 +1,709 @@ + android:width="@dimen/dp_256" + android:height="@dimen/dp_256" + android:viewportWidth="600" + android:viewportHeight="600"> - + android:fillColor="#797979" + android:fillAlpha="1.00" + android:strokeAlpha="1.00" + android:pathData="M364.46,60.14 C366.1,52.77,376.07,51,381.9,54.42 +C385.59,56.19,386.23,60.54,387.27,64.06 C386.38,67.29,386.1,71.11,383.34,73.4 +C379.74,76.12,374.7,77.43,370.6,74.98 L371.58,75.16 +C376.23,75.83,381.8,74.88,384.35,70.47 C387.88,65.3,385.91,57.42,380.3,54.62 +C375.13,52.12,367.81,54.02,365.5,59.55 C363.61,63.27,364.7,67.49,366.19,71.13 +C366.27,71.6,366.42,72.54,366.49,73.01 C364.22,69.19,362.79,64.47,364.46,60.14 Z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/status_error_ic.xml b/app/src/main/res/drawable/status_error_ic.xml index 4c44126d..952e92f4 100644 --- a/app/src/main/res/drawable/status_error_ic.xml +++ b/app/src/main/res/drawable/status_error_ic.xml @@ -1,63 +1,799 @@ + android:width="@dimen/dp_256" + android:height="@dimen/dp_256" + android:viewportWidth="600" + android:viewportHeight="600"> - - - - - - + android:fillColor="#f0f0f0" + android:fillAlpha="1.00" + android:strokeAlpha="1.00" + android:pathData="M435.93,61.04 C439.27,67.03,442.43,73.13,445.94,79.01 +C451.83,82.73,458.36,85.39,464.16,89.27 C458.04,92.39,452.09,95.83,445.99,98.97 +C442.56,104.98,439.33,111.1,435.94,117.13 +C432.56,111.13,429.21,105.12,425.99,99.03 +C420.05,95.94,414.22,92.64,408.28,89.55 L408.12,88.88 +C413.97,85.39,420.15,82.44,426.06,79.04 C429.19,72.95,432.69,67.06,435.93,61.04 +Z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/status_nerwork_ic.xml b/app/src/main/res/drawable/status_nerwork_ic.xml index 472af063..17a339bc 100644 --- a/app/src/main/res/drawable/status_nerwork_ic.xml +++ b/app/src/main/res/drawable/status_nerwork_ic.xml @@ -1,147 +1,723 @@ + android:width="@dimen/dp_256" + android:height="@dimen/dp_256" + android:viewportWidth="600" + android:viewportHeight="600"> - - - - + android:fillColor="#c9c9c9" + android:fillAlpha="1.00" + android:strokeAlpha="1.00" + android:pathData="M286.53,4.53 C287.52,2.14,290.02,2.21,292.19,2.42 +C294.81,6.25,293.29,11.09,293.67,15.4 C297.4,15.5,301.21,14.94,304.89,15.72 +C305.87,16.74,306.69,17.89,307.55,19.01 C306.57,20.18,305.77,21.56,304.49,22.42 +C300.9,22.87,297.27,22.53,293.67,22.59 C293.56,26.22,293.98,29.9,293.43,33.51 +C292.03,36.53,288.18,36.15,286.39,33.74 C286.27,30.03,286.32,26.32,286.32,22.61 +C282.83,22.61,279.34,22.63,275.85,22.63 C275.25,22.21,274.04,21.37,273.44,20.95 +C273.4,19.54,273.4,18.14,273.44,16.74 C277.27,14.24,282.05,15.75,286.33,15.38 +C286.42,11.76,286.03,8.11,286.53,4.53 Z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/status_order_ic.xml b/app/src/main/res/drawable/status_order_ic.xml index 3a1f729c..def8674d 100644 --- a/app/src/main/res/drawable/status_order_ic.xml +++ b/app/src/main/res/drawable/status_order_ic.xml @@ -1,50 +1,904 @@ + android:width="@dimen/dp_256" + android:height="@dimen/dp_256" + android:viewportWidth="600" + android:viewportHeight="600"> - + android:strokeAlpha="1.00" + android:pathData="M336.34,52.79 C336.54,58.2,341.07,62.46,346.24,63.33 +C341.17,63.96,336.61,68.08,336.42,73.37 C335.29,68.26,331.31,63.83,325.91,63.3 +C331.34,62.64,335.55,58.12,336.34,52.79 Z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + android:fillColor="#989898" + android:fillAlpha="0.96" + android:strokeAlpha="0.96" + android:pathData="M228.76,341.89 C232,340.25,236.24,342.04,237.71,345.27 +C239.27,348.25,239.06,351.73,239.16,355 C239.07,369.3,239.32,383.6,239.22,397.9 +C263.82,398.4,288.42,397.76,313.02,397.86 +C327.7,398.04,342.41,398.52,357.08,397.84 +C357.14,381.56,357,365.27,357.19,348.99 +C357.03,345.22,360.36,341.72,364.03,341.31 +C368.55,341.19,372.16,345.59,371.85,349.97 +C371.89,366.35,371.97,382.73,371.85,399.12 +C371.19,404.94,366.47,409.96,360.88,411.53 +C356.95,412.18,352.94,411.8,348.99,411.85 +C312.32,411.79,275.65,411.81,238.99,411.88 +C232.78,412.28,226.8,407.82,224.86,402.01 +C223.77,399.15,224.25,396.02,224.12,393.04 +C223.6,378.68,224.36,364.31,224.14,349.95 +C223.93,346.68,225.57,343.11,228.76,341.89 M225.32,350.05 +C225.17,359.56,224.97,369.1,225.37,378.61 +C227.12,381.64,231.21,380.23,233.99,381.55 +C231.02,381.39,228.05,381.07,225.1,380.73 +C225.46,386.48,225.02,392.24,225.25,398 +C225.29,403.92,230.05,408.96,235.51,410.64 +C238.31,411.23,241.19,410.91,244.02,410.94 +C282.03,411.06,320.04,411.03,358.05,410.96 +C363.96,411.09,368.6,406.18,370.53,400.99 C370.3,400.59,369.83,399.8,369.6,399.4 +C369.86,399.17,370.37,398.71,370.62,398.48 +C370.5,381.78,371.02,365.07,370.55,348.38 C370.19,345.34,367.3,342,363.99,342.55 +C360.77,342.82,358.31,345.87,358.4,349.04 +C358.1,365.18,358.39,381.33,357.9,397.47 C359.58,397.72,361.27,398,362.95,398.29 +C361.2,398.14,359.37,397.77,357.69,398.47 +C354.24,399.59,350.58,398.9,347.04,399.05 +C315.38,399.15,283.72,399.07,252.05,399.08 +C247.32,399.11,242.59,399.16,237.88,398.71 +C237.92,382.45,237.73,366.18,237.67,349.92 +C237.92,345.96,234.19,341.68,230.03,342.71 +C227.11,343.86,225.25,346.93,225.32,350.05 Z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/succeed_ic.xml b/app/src/main/res/drawable/succeed_ic.xml index 5ef70460..9c0ed114 100644 --- a/app/src/main/res/drawable/succeed_ic.xml +++ b/app/src/main/res/drawable/succeed_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/error_ic.xml b/app/src/main/res/drawable/tips_error_ic.xml similarity index 96% rename from app/src/main/res/drawable/error_ic.xml rename to app/src/main/res/drawable/tips_error_ic.xml index 835e1d4c..85ea1c78 100644 --- a/app/src/main/res/drawable/error_ic.xml +++ b/app/src/main/res/drawable/tips_error_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/finish_ic.xml b/app/src/main/res/drawable/tips_finish_ic.xml similarity index 95% rename from app/src/main/res/drawable/finish_ic.xml rename to app/src/main/res/drawable/tips_finish_ic.xml index bc05665a..39c7c6de 100644 --- a/app/src/main/res/drawable/finish_ic.xml +++ b/app/src/main/res/drawable/tips_finish_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/warning_ic.xml b/app/src/main/res/drawable/tips_warning_ic.xml similarity index 95% rename from app/src/main/res/drawable/warning_ic.xml rename to app/src/main/res/drawable/tips_warning_ic.xml index 9d6c7d56..be868ec3 100644 --- a/app/src/main/res/drawable/warning_ic.xml +++ b/app/src/main/res/drawable/tips_warning_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_brightness_high_ic.xml b/app/src/main/res/drawable/video_brightness_high_ic.xml index 910a772c..7a695f1e 100644 --- a/app/src/main/res/drawable/video_brightness_high_ic.xml +++ b/app/src/main/res/drawable/video_brightness_high_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_brightness_low_ic.xml b/app/src/main/res/drawable/video_brightness_low_ic.xml index 7138d876..aed35112 100644 --- a/app/src/main/res/drawable/video_brightness_low_ic.xml +++ b/app/src/main/res/drawable/video_brightness_low_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_brightness_medium_ic.xml b/app/src/main/res/drawable/video_brightness_medium_ic.xml index 2ce0626e..d751f86f 100644 --- a/app/src/main/res/drawable/video_brightness_medium_ic.xml +++ b/app/src/main/res/drawable/video_brightness_medium_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_lock_close_ic.xml b/app/src/main/res/drawable/video_lock_close_ic.xml index faf78889..c225f08c 100644 --- a/app/src/main/res/drawable/video_lock_close_ic.xml +++ b/app/src/main/res/drawable/video_lock_close_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_lock_open_ic.xml b/app/src/main/res/drawable/video_lock_open_ic.xml index d0591259..b5a5f289 100644 --- a/app/src/main/res/drawable/video_lock_open_ic.xml +++ b/app/src/main/res/drawable/video_lock_open_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_play_pause_ic.xml b/app/src/main/res/drawable/video_play_pause_ic.xml deleted file mode 100644 index 7f5d2e63..00000000 --- a/app/src/main/res/drawable/video_play_pause_ic.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/video_play_start_ic.xml b/app/src/main/res/drawable/video_play_start_ic.xml deleted file mode 100644 index e5bb1efe..00000000 --- a/app/src/main/res/drawable/video_play_start_ic.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/video_progress_ball_bg.xml b/app/src/main/res/drawable/video_progress_ball_bg.xml index 21daca10..7dc9c362 100644 --- a/app/src/main/res/drawable/video_progress_ball_bg.xml +++ b/app/src/main/res/drawable/video_progress_ball_bg.xml @@ -2,8 +2,8 @@ + android:width="@dimen/dp_15" + android:height="@dimen/dp_15" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/video_progress_bg.xml b/app/src/main/res/drawable/video_progress_bg.xml index c14b5827..326bfaa6 100644 --- a/app/src/main/res/drawable/video_progress_bg.xml +++ b/app/src/main/res/drawable/video_progress_bg.xml @@ -4,7 +4,7 @@ - + @@ -13,7 +13,7 @@ - + @@ -23,7 +23,7 @@ - + diff --git a/app/src/main/res/drawable/video_schedule_forward_ic.xml b/app/src/main/res/drawable/video_schedule_forward_ic.xml index 909c76df..4477558a 100644 --- a/app/src/main/res/drawable/video_schedule_forward_ic.xml +++ b/app/src/main/res/drawable/video_schedule_forward_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_schedule_rewind_ic.xml b/app/src/main/res/drawable/video_schedule_rewind_ic.xml index cef3265b..828f064e 100644 --- a/app/src/main/res/drawable/video_schedule_rewind_ic.xml +++ b/app/src/main/res/drawable/video_schedule_rewind_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_volume_high_ic.xml b/app/src/main/res/drawable/video_volume_high_ic.xml index 79e98fba..29bcc6f4 100644 --- a/app/src/main/res/drawable/video_volume_high_ic.xml +++ b/app/src/main/res/drawable/video_volume_high_ic.xml @@ -1,9 +1,9 @@ + android:width="@dimen/dp_24" + android:height="@dimen/dp_24" + android:viewportWidth="24" + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/video_volume_medium_ic.xml b/app/src/main/res/drawable/video_volume_medium_ic.xml index 22fc84b2..b913cd4e 100644 --- a/app/src/main/res/drawable/video_volume_medium_ic.xml +++ b/app/src/main/res/drawable/video_volume_medium_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/video_volume_mute_ic.xml b/app/src/main/res/drawable/video_volume_mute_ic.xml index d2f0968b..d50b6054 100644 --- a/app/src/main/res/drawable/video_volume_mute_ic.xml +++ b/app/src/main/res/drawable/video_volume_mute_ic.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/videocam_ic.xml b/app/src/main/res/drawable/videocam_ic.xml index 8937e0ba..faf39929 100644 --- a/app/src/main/res/drawable/videocam_ic.xml +++ b/app/src/main/res/drawable/videocam_ic.xml @@ -1,7 +1,7 @@ + android:layout_width="@dimen/dp_100" + android:layout_height="@dimen/dp_100" + android:layout_marginTop="@dimen/dp_50" + android:layout_marginBottom="@dimen/dp_40" + app:scaleRatio="1.5" + app:srcCompat="@drawable/logo_big_ic" /> + android:textSize="@dimen/sp_18" /> + android:textSize="@dimen/sp_14" /> + android:textSize="@dimen/sp_14" /> \ No newline at end of file diff --git a/app/src/main/res/layout/address_dialog.xml b/app/src/main/res/layout/address_dialog.xml index 5312f9f5..18ee76c2 100644 --- a/app/src/main/res/layout/address_dialog.xml +++ b/app/src/main/res/layout/address_dialog.xml @@ -1,36 +1,39 @@ - + android:padding="@dimen/dp_10"> + android:textSize="@dimen/sp_15" /> @@ -39,23 +42,16 @@ android:layout_height="@dimen/line_size" android:background="#ececec" /> - + android:orientation="vertical" + android:paddingHorizontal="@dimen/dp_10" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/album_dialog.xml b/app/src/main/res/layout/album_dialog.xml index ccf3e1b9..d86a6d19 100644 --- a/app/src/main/res/layout/album_dialog.xml +++ b/app/src/main/res/layout/album_dialog.xml @@ -1,13 +1,16 @@ - @@ -34,16 +34,16 @@ android:ellipsize="end" android:singleLine="true" android:textColor="@color/black70" - android:textSize="15sp" + android:textSize="@dimen/sp_15" tools:text="图片专辑" /> @@ -52,7 +52,7 @@ android:id="@+id/rb_album_check" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginHorizontal="10dp" + android:layout_marginHorizontal="@dimen/dp_10" android:background="@null" android:clickable="false" android:focusable="false" diff --git a/app/src/main/res/layout/browser_activity.xml b/app/src/main/res/layout/browser_activity.xml index 286cb1f7..4b6c3a80 100644 --- a/app/src/main/res/layout/browser_activity.xml +++ b/app/src/main/res/layout/browser_activity.xml @@ -10,14 +10,14 @@ diff --git a/app/src/main/res/layout/copy_fragment.xml b/app/src/main/res/layout/copy_fragment.xml index f586800d..e5ab66bd 100644 --- a/app/src/main/res/layout/copy_fragment.xml +++ b/app/src/main/res/layout/copy_fragment.xml @@ -10,7 +10,7 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/crash_activity.xml b/app/src/main/res/layout/crash_activity.xml index 9457a224..a3f93eb7 100644 --- a/app/src/main/res/layout/crash_activity.xml +++ b/app/src/main/res/layout/crash_activity.xml @@ -4,16 +4,16 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/dl_crash_drawer" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + tools:context=".ui.activity.CrashActivity"> + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_10"> + android:lineSpacingExtra="@dimen/dp_5" + android:textSize="@dimen/sp_18" + android:textStyle="bold" + tools:text="应用程序发生崩溃" /> @@ -61,17 +61,17 @@ + android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_15"> @@ -79,14 +79,14 @@ @@ -95,20 +95,20 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginTop="10dp" + android:layout_marginTop="@dimen/dp_10" android:text="详细信息" android:textColor="@color/black80" - android:textSize="16sp" + android:textSize="@dimen/sp_16" android:textStyle="bold" /> + android:textSize="@dimen/sp_14" /> diff --git a/app/src/main/res/layout/custom_dialog.xml b/app/src/main/res/layout/custom_dialog.xml index 0ee9725f..d7b2b046 100644 --- a/app/src/main/res/layout/custom_dialog.xml +++ b/app/src/main/res/layout/custom_dialog.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" app:cardBackgroundColor="@color/white" - app:cardCornerRadius="15dp" + app:cardCornerRadius="@dimen/dp_15" app:cardElevation="0px"> + android:paddingHorizontal="@dimen/dp_25" + android:paddingVertical="@dimen/dp_15"> + android:layout_width="@dimen/dp_90" + android:layout_height="@dimen/dp_90" + app:srcCompat="@drawable/logo_big_ic" /> diff --git a/app/src/main/res/layout/date_dialog.xml b/app/src/main/res/layout/date_dialog.xml index bfc1c855..994c881b 100644 --- a/app/src/main/res/layout/date_dialog.xml +++ b/app/src/main/res/layout/date_dialog.xml @@ -4,9 +4,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingHorizontal="10dp" - android:paddingTop="15dp" - android:paddingBottom="5dp" + android:paddingHorizontal="@dimen/dp_10" + android:paddingTop="@dimen/dp_15" + android:paddingBottom="@dimen/dp_5" tools:context=".ui.dialog.DateDialog"> diff --git a/app/src/main/res/layout/find_fragment.xml b/app/src/main/res/layout/find_fragment.xml index c3e454d4..0ed7e67c 100644 --- a/app/src/main/res/layout/find_fragment.xml +++ b/app/src/main/res/layout/find_fragment.xml @@ -10,7 +10,7 @@ + android:padding="@dimen/dp_20"> - - @@ -82,7 +72,7 @@ style="@style/ButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="10dp" + android:layout_marginStart="@dimen/dp_10" android:enabled="false" android:text="禁用了的按钮" /> @@ -90,7 +80,7 @@ style="@style/RectButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="10dp" + android:layout_marginStart="@dimen/dp_10" android:text="不带圆角的" /> @@ -98,7 +88,7 @@ @@ -112,7 +102,7 @@ @@ -128,7 +118,7 @@ @@ -142,7 +132,7 @@ @@ -158,7 +148,7 @@ @@ -166,19 +156,19 @@ android:id="@+id/sb_find_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="10dp" + android:layout_marginStart="@dimen/dp_10" android:checked="true" /> @@ -186,8 +176,8 @@ @@ -201,20 +191,85 @@ + + + + + + + + + + @@ -223,8 +278,8 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" - android:layout_marginTop="20dp" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginTop="@dimen/dp_20" android:hint="这里只能输入手机号(只能以 1 开头)" app:regexType="mobile" /> @@ -232,7 +287,7 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" + android:layout_marginHorizontal="@dimen/dp_40" android:hint="这里只能输入中文(普通的中文字符)" app:regexType="chinese" /> @@ -240,7 +295,7 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" + android:layout_marginHorizontal="@dimen/dp_40" android:hint="这里只能输入英文(大写和小写的英文)" app:regexType="english" /> @@ -248,7 +303,15 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" + android:layout_marginHorizontal="@dimen/dp_40" + android:hint="这里只能输入数字(只允许输入纯数字)" + app:regexType="number" /> + + @@ -256,7 +319,7 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" + android:layout_marginHorizontal="@dimen/dp_40" android:hint="这里只能输入用户名(中文、英文、数字)" app:regexType="name" /> @@ -264,7 +327,7 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" + android:layout_marginHorizontal="@dimen/dp_40" android:hint="这里只能输入非空格的字符" app:regexType="nonnull" /> @@ -272,9 +335,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginTop="20dp" - android:layout_marginEnd="10dp" - android:layout_marginBottom="10dp" + android:layout_marginTop="@dimen/dp_20" + android:layout_marginEnd="@dimen/dp_10" + android:layout_marginBottom="@dimen/dp_10" android:text="这是一条华丽的分割线" /> @@ -282,6 +345,7 @@ diff --git a/app/src/main/res/layout/guide_activity.xml b/app/src/main/res/layout/guide_activity.xml index bb6a0916..1d00a531 100644 --- a/app/src/main/res/layout/guide_activity.xml +++ b/app/src/main/res/layout/guide_activity.xml @@ -11,20 +11,23 @@ android:id="@+id/vp_guide_pager" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="30dp" /> + android:paddingBottom="@dimen/dp_30" /> + android:layout_marginBottom="@dimen/dp_30"> + app:ci_drawable_unselected="@drawable/guide_indicator_unselected" + app:ci_height="@dimen/dp_5" + app:ci_margin="@dimen/dp_5" + app:ci_width="@dimen/dp_5" /> diff --git a/app/src/main/res/layout/guide_item.xml b/app/src/main/res/layout/guide_item.xml index 1849e926..d8729f4d 100644 --- a/app/src/main/res/layout/guide_item.xml +++ b/app/src/main/res/layout/guide_item.xml @@ -4,6 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="50dp" + android:paddingBottom="@dimen/dp_50" tools:context=".ui.adapter.GuideAdapter" tools:src="@drawable/guide_1_bg" /> \ No newline at end of file diff --git a/app/src/main/res/layout/home_activity.xml b/app/src/main/res/layout/home_activity.xml index 5a6c2de8..3086f2b9 100644 --- a/app/src/main/res/layout/home_activity.xml +++ b/app/src/main/res/layout/home_activity.xml @@ -13,17 +13,16 @@ android:layout_height="0px" android:layout_weight="1" /> - - + android:elevation="@dimen/dp_10" + android:orientation="vertical" + app:spanCount="4" + tools:itemCount="4" + tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + tools:listitem="@layout/home_navigation_item" /> \ No newline at end of file diff --git a/app/src/main/res/layout/home_fragment.xml b/app/src/main/res/layout/home_fragment.xml index b29dfe2b..98772947 100644 --- a/app/src/main/res/layout/home_fragment.xml +++ b/app/src/main/res/layout/home_fragment.xml @@ -16,10 +16,10 @@ + app:scrimVisibleHeightTrigger="@dimen/dp_100"> + android:orientation="horizontal"> + android:textSize="@dimen/sp_15" /> + android:textSize="@dimen/sp_13" /> @@ -76,16 +76,15 @@ - + android:orientation="vertical" + tools:itemCount="2" + tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + tools:listitem="@layout/tab_item_design" + tools:spanCount="2" /> diff --git a/app/src/main/res/layout/home_navigation_item.xml b/app/src/main/res/layout/home_navigation_item.xml new file mode 100644 index 00000000..5e3d4b64 --- /dev/null +++ b/app/src/main/res/layout/home_navigation_item.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/image_preview_activity.xml b/app/src/main/res/layout/image_preview_activity.xml index 28ec9c0d..60810836 100644 --- a/app/src/main/res/layout/image_preview_activity.xml +++ b/app/src/main/res/layout/image_preview_activity.xml @@ -16,14 +16,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" - android:layout_marginBottom="20dp" > + android:layout_marginBottom="@dimen/dp_20" > diff --git a/app/src/main/res/layout/image_select_activity.xml b/app/src/main/res/layout/image_select_activity.xml index e09157a0..3504f54d 100644 --- a/app/src/main/res/layout/image_select_activity.xml +++ b/app/src/main/res/layout/image_select_activity.xml @@ -32,16 +32,15 @@ - diff --git a/app/src/main/res/layout/image_select_item.xml b/app/src/main/res/layout/image_select_item.xml index 62c0263b..cc4d9afc 100644 --- a/app/src/main/res/layout/image_select_item.xml +++ b/app/src/main/res/layout/image_select_item.xml @@ -20,10 +20,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:paddingStart="20dp" - android:paddingTop="3dp" - android:paddingEnd="3dp" - android:paddingBottom="20dp"> + android:paddingStart="@dimen/dp_20" + android:paddingTop="@dimen/dp_3" + android:paddingEnd="@dimen/dp_3" + android:paddingBottom="@dimen/dp_20"> - \ No newline at end of file diff --git a/app/src/main/res/layout/login_activity.xml b/app/src/main/res/layout/login_activity.xml index 6f61019f..05f1afed 100644 --- a/app/src/main/res/layout/login_activity.xml +++ b/app/src/main/res/layout/login_activity.xml @@ -6,26 +6,28 @@ android:layout_height="match_parent" android:background="@color/white" android:gravity="center_horizontal" - android:layoutAnimation="@anim/from_bottom_layout" + android:layoutAnimation="@anim/layout_from_bottom" android:orientation="vertical" tools:context=".ui.activity.LoginActivity" tools:layoutAnimation="@null"> + android:layout_width="@dimen/dp_120" + android:layout_height="@dimen/dp_120" + android:layout_marginVertical="@dimen/dp_10" + app:srcCompat="@drawable/logo_big_ic" /> + android:layout_marginHorizontal="@dimen/dp_40" /> + android:layout_marginHorizontal="@dimen/dp_40" /> @@ -81,8 +83,8 @@ style="@style/ButtonStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="40dp" - android:layout_marginTop="30dp" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginTop="@dimen/dp_30" android:text="@string/login_text" /> @@ -90,7 +92,7 @@ + android:layout_weight="1" /> @@ -125,20 +127,20 @@ diff --git a/app/src/main/res/layout/menu_dialog.xml b/app/src/main/res/layout/menu_dialog.xml index 794f7229..5007bfc3 100644 --- a/app/src/main/res/layout/menu_dialog.xml +++ b/app/src/main/res/layout/menu_dialog.xml @@ -2,7 +2,7 @@ @@ -39,12 +39,12 @@ android:background="@drawable/transparent_selector" android:focusable="true" android:gravity="center" - android:paddingHorizontal="15dp" - android:paddingVertical="13dp" + android:paddingHorizontal="@dimen/dp_15" + android:paddingVertical="@dimen/dp_13" android:singleLine="true" android:text="@string/common_cancel" android:textColor="@color/common_cancel_text_color" - android:textSize="14sp" /> + android:textSize="@dimen/sp_14" /> diff --git a/app/src/main/res/layout/menu_item.xml b/app/src/main/res/layout/menu_item.xml index 25f6cdcb..e71d4945 100644 --- a/app/src/main/res/layout/menu_item.xml +++ b/app/src/main/res/layout/menu_item.xml @@ -12,11 +12,11 @@ android:layout_height="match_parent" android:background="@drawable/transparent_selector" android:gravity="center" - android:paddingHorizontal="15dp" - android:paddingVertical="13dp" + android:paddingHorizontal="@dimen/dp_15" + android:paddingVertical="@dimen/dp_13" android:singleLine="true" android:textColor="@color/common_confirm_text_color" - android:textSize="14sp" + android:textSize="@dimen/sp_14" tools:text="条目" /> \ No newline at end of file diff --git a/app/src/main/res/layout/message_fragment.xml b/app/src/main/res/layout/message_fragment.xml index 725d918c..70b5a835 100644 --- a/app/src/main/res/layout/message_fragment.xml +++ b/app/src/main/res/layout/message_fragment.xml @@ -10,7 +10,7 @@ diff --git a/app/src/main/res/layout/me_fragment.xml b/app/src/main/res/layout/mine_fragment.xml similarity index 73% rename from app/src/main/res/layout/me_fragment.xml rename to app/src/main/res/layout/mine_fragment.xml index cf38e521..94d06254 100644 --- a/app/src/main/res/layout/me_fragment.xml +++ b/app/src/main/res/layout/mine_fragment.xml @@ -5,12 +5,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ui.fragment.MeFragment"> + tools:context=".ui.fragment.MineFragment"> diff --git a/app/src/main/res/layout/password_forget_activity.xml b/app/src/main/res/layout/password_forget_activity.xml index 30e5d1cd..a03ab4e8 100644 --- a/app/src/main/res/layout/password_forget_activity.xml +++ b/app/src/main/res/layout/password_forget_activity.xml @@ -17,20 +17,20 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" + android:layout_marginTop="@dimen/dp_15" android:background="@color/white" android:drawableStart="@drawable/phone_ic" - android:drawablePadding="15dp" + android:drawablePadding="@dimen/dp_15" android:hint="@string/common_phone_input_hint" android:inputType="number" - android:paddingHorizontal="20dp" - android:paddingVertical="18dp" + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_18" android:singleLine="true" app:regexType="mobile" /> + android:layout_marginHorizontal="@dimen/dp_20" /> \ No newline at end of file diff --git a/app/src/main/res/layout/password_reset_activity.xml b/app/src/main/res/layout/password_reset_activity.xml index db28c6ca..5bf844a5 100644 --- a/app/src/main/res/layout/password_reset_activity.xml +++ b/app/src/main/res/layout/password_reset_activity.xml @@ -17,20 +17,20 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" + android:layout_marginTop="@dimen/dp_15" android:background="@color/white" android:drawableStart="@drawable/safe_ic" - android:drawablePadding="15dp" + android:drawablePadding="@dimen/dp_15" android:hint="@string/password_reset_phone_hint1" android:inputType="textPassword" android:maxLength="20" - android:paddingHorizontal="20dp" - android:paddingVertical="18dp" + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_18" android:singleLine="true" /> + android:layout_marginHorizontal="@dimen/dp_20" /> \ No newline at end of file diff --git a/app/src/main/res/layout/pay_password_delete_item.xml b/app/src/main/res/layout/pay_password_delete_item.xml index 044a6b15..b3bf6745 100644 --- a/app/src/main/res/layout/pay_password_delete_item.xml +++ b/app/src/main/res/layout/pay_password_delete_item.xml @@ -3,15 +3,15 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/dp_50" android:layout_margin="@dimen/line_size" android:background="@drawable/transparent_selector" android:focusable="false" tools:context=".ui.dialog.PayPasswordDialog"> diff --git a/app/src/main/res/layout/pay_password_dialog.xml b/app/src/main/res/layout/pay_password_dialog.xml index 5b1a129a..ad75e878 100644 --- a/app/src/main/res/layout/pay_password_dialog.xml +++ b/app/src/main/res/layout/pay_password_dialog.xml @@ -1,36 +1,39 @@ - + android:padding="@dimen/dp_10"> + android:textSize="@dimen/sp_15" /> @@ -45,9 +48,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:layout_marginTop="20dp" + android:layout_marginTop="@dimen/dp_20" android:textColor="#333333" - android:textSize="16sp" + android:textSize="@dimen/sp_14" tools:text="商品名称" /> + android:layout_marginTop="@dimen/dp_20" + android:layout_marginBottom="@dimen/dp_25" /> @@ -80,4 +83,4 @@ tools:listitem="@layout/pay_password_normal_item" tools:spanCount="3" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/pay_password_empty_item.xml b/app/src/main/res/layout/pay_password_empty_item.xml index 2122a9a8..30990c41 100644 --- a/app/src/main/res/layout/pay_password_empty_item.xml +++ b/app/src/main/res/layout/pay_password_empty_item.xml @@ -2,7 +2,7 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/pay_password_normal_item.xml b/app/src/main/res/layout/pay_password_normal_item.xml index 3c7265dc..b4484978 100644 --- a/app/src/main/res/layout/pay_password_normal_item.xml +++ b/app/src/main/res/layout/pay_password_normal_item.xml @@ -3,13 +3,13 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/tv_pay_key" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/dp_50" android:layout_gravity="center" android:layout_margin="@dimen/line_size" android:background="@drawable/white_selector" android:focusable="true" android:gravity="center" android:textColor="@color/black" - android:textSize="23sp" + android:textSize="@dimen/sp_18" tools:context=".ui.dialog.PayPasswordDialog" tools:text="0" /> \ No newline at end of file diff --git a/app/src/main/res/layout/personal_data_activity.xml b/app/src/main/res/layout/personal_data_activity.xml index b1f8fd5f..1a4db1ec 100644 --- a/app/src/main/res/layout/personal_data_activity.xml +++ b/app/src/main/res/layout/personal_data_activity.xml @@ -21,10 +21,10 @@ @@ -34,7 +34,7 @@ android:id="@+id/sb_person_data_id" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="10dp" + android:layout_marginTop="@dimen/dp_10" android:background="@color/white" app:bar_leftText="@string/personal_data_id" tools:bar_rightText="880634" /> @@ -44,7 +44,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:bar_leftText="@string/personal_data_name" - app:bar_rightHint="@string/personal_data_name_hint" + app:bar_rightTextHint="@string/personal_data_name_hint" tools:bar_rightText="Android 轮子哥" /> + app:bar_rightDrawable="@drawable/arrows_right_ic" + app:bar_rightTextHint="@string/personal_data_address_hint" /> \ No newline at end of file diff --git a/app/src/main/res/layout/phone_reset_activity.xml b/app/src/main/res/layout/phone_reset_activity.xml index f68c8e18..d286f321 100644 --- a/app/src/main/res/layout/phone_reset_activity.xml +++ b/app/src/main/res/layout/phone_reset_activity.xml @@ -15,11 +15,11 @@ + android:textSize="@dimen/sp_14" /> + android:layout_marginHorizontal="@dimen/dp_20" /> \ No newline at end of file diff --git a/app/src/main/res/layout/picker_item.xml b/app/src/main/res/layout/picker_item.xml index f17581bf..599e5783 100644 --- a/app/src/main/res/layout/picker_item.xml +++ b/app/src/main/res/layout/picker_item.xml @@ -5,9 +5,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:paddingVertical="10dp" + android:paddingVertical="@dimen/dp_10" android:singleLine="true" android:textColor="@color/black" - android:textSize="18sp" + android:textSize="@dimen/sp_18" android:textStyle="bold" tools:text="2018年" /> \ No newline at end of file diff --git a/app/src/main/res/layout/register_activity.xml b/app/src/main/res/layout/register_activity.xml index 77261292..553b6e8a 100644 --- a/app/src/main/res/layout/register_activity.xml +++ b/app/src/main/res/layout/register_activity.xml @@ -12,32 +12,32 @@ android:layout_height="wrap_content" android:clipToPadding="false" android:gravity="center_horizontal" - android:layoutAnimation="@anim/fall_down_layout" + android:layoutAnimation="@anim/layout_fall_down" android:orientation="vertical" - android:paddingHorizontal="40dp" + android:paddingHorizontal="@dimen/dp_40" tools:layoutAnimation="@null"> + android:textSize="@dimen/sp_23" /> + android:textSize="@dimen/sp_14" /> @@ -66,16 +66,17 @@ style="@style/CountdownViewStyle" /> - + android:singleLine="true" + app:regexType="number" /> @@ -84,7 +85,7 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginTop="@dimen/dp_20" android:hint="@string/register_password_hint1" android:maxLength="20" android:singleLine="true" /> @@ -96,7 +97,7 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginTop="@dimen/dp_20" android:hint="@string/register_password_hint2" android:imeOptions="actionDone" android:maxLength="20" @@ -109,7 +110,7 @@ style="@style/ButtonStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginVertical="30dp" + android:layout_marginVertical="@dimen/dp_30" android:text="@string/register_title" /> diff --git a/app/src/main/res/layout/safe_dialog.xml b/app/src/main/res/layout/safe_dialog.xml index d8dc8421..3c3f56af 100644 --- a/app/src/main/res/layout/safe_dialog.xml +++ b/app/src/main/res/layout/safe_dialog.xml @@ -5,8 +5,8 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" - android:paddingHorizontal="10dp" - android:paddingVertical="8dp" + android:paddingHorizontal="@dimen/dp_10" + android:paddingVertical="@dimen/dp_8" tools:background="@color/white" tools:context=".ui.dialog.SafeDialog"> @@ -15,22 +15,22 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:drawablePadding="15dp" + android:drawablePadding="@dimen/dp_15" android:hint="@string/common_phone_input_hint" - android:paddingHorizontal="20dp" - android:paddingVertical="10dp" + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_10" android:singleLine="true" - android:textSize="14sp" + android:textSize="@dimen/sp_14" tools:text="12345678910" /> + android:layout_marginHorizontal="@dimen/dp_10" /> @@ -44,25 +44,27 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:drawablePadding="15dp" + android:drawablePadding="@dimen/dp_15" + android:ellipsize="end" android:hint="@string/common_code_input_hint" android:inputType="number" android:maxLength="@integer/sms_code_length" - android:paddingHorizontal="20dp" - android:paddingVertical="10dp" + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_10" android:singleLine="true" - android:textSize="13sp" /> + android:textSize="@dimen/sp_13" /> + android:layout_marginHorizontal="@dimen/dp_10" /> + style="@style/CountdownViewStyle" + android:layout_marginHorizontal="@dimen/dp_5" /> diff --git a/app/src/main/res/layout/select_dialog.xml b/app/src/main/res/layout/select_dialog.xml index 33865c04..35ec4ec2 100644 --- a/app/src/main/res/layout/select_dialog.xml +++ b/app/src/main/res/layout/select_dialog.xml @@ -4,7 +4,7 @@ android:id="@+id/rv_select_list" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" + android:layout_marginTop="@dimen/dp_15" tools:context=".ui.dialog.SelectDialog" tools:itemCount="5" tools:listitem="@layout/select_item" /> \ No newline at end of file diff --git a/app/src/main/res/layout/select_item.xml b/app/src/main/res/layout/select_item.xml index 1c42417c..96beb19c 100644 --- a/app/src/main/res/layout/select_item.xml +++ b/app/src/main/res/layout/select_item.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingHorizontal="20dp" + android:paddingHorizontal="@dimen/dp_20" tools:context=".ui.dialog.SelectDialog"> - + android:textSize="@dimen/sp_15" + app:shape="rectangle" + app:shape_radius="@dimen/dp_720" + app:shape_solidColor="#F85E5E" /> @@ -54,9 +56,9 @@ android:id="@+id/sb_setting_phone" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="15dp" + android:layout_marginTop="@dimen/dp_15" app:bar_leftText="@string/setting_phone" - app:bar_rightIcon="@drawable/arrows_right_ic" + app:bar_rightDrawable="@drawable/arrows_right_ic" tools:bar_rightText="181****1413" /> + app:bar_rightDrawable="@drawable/arrows_right_ic" /> + app:bar_rightDrawable="@drawable/arrows_right_ic" /> + android:layout_marginHorizontal="@dimen/dp_15" /> @@ -103,15 +105,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:bar_leftText="@string/setting_cache" - app:bar_rightIcon="@drawable/arrows_right_ic" /> + app:bar_rightDrawable="@drawable/arrows_right_ic" /> + android:layout_marginVertical="@dimen/dp_15" + app:bar_leftText="@string/setting_exit" + app:bar_leftTextColor="@color/red" /> diff --git a/app/src/main/res/layout/share_dialog.xml b/app/src/main/res/layout/share_dialog.xml index 52407496..8dd66944 100644 --- a/app/src/main/res/layout/share_dialog.xml +++ b/app/src/main/res/layout/share_dialog.xml @@ -1,32 +1,37 @@ - + android:textSize="@dimen/sp_16" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/share_item.xml b/app/src/main/res/layout/share_item.xml index b24b0338..8cd14861 100644 --- a/app/src/main/res/layout/share_item.xml +++ b/app/src/main/res/layout/share_item.xml @@ -6,14 +6,14 @@ android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" - android:paddingTop="5dp" - android:paddingBottom="15dp" + android:paddingTop="@dimen/dp_5" + android:paddingBottom="@dimen/dp_15" tools:context=".ui.dialog.ShareDialog"> @@ -22,7 +22,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#666666" - android:textSize="12sp" + android:textSize="@dimen/sp_12" tools:text="分享平台" /> \ No newline at end of file diff --git a/app/src/main/res/layout/splash_activity.xml b/app/src/main/res/layout/splash_activity.xml index 29e5b8ba..d4924f73 100644 --- a/app/src/main/res/layout/splash_activity.xml +++ b/app/src/main/res/layout/splash_activity.xml @@ -13,7 +13,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginBottom="40dp" + android:layout_marginBottom="@dimen/dp_40" app:lottie_autoPlay="true" app:lottie_loop="false" app:lottie_rawRes="@raw/welcome" /> @@ -24,10 +24,10 @@ android:layout_height="wrap_content" android:layout_gravity="end" android:colorBackground="#b65656" - android:paddingHorizontal="15dp" - android:paddingVertical="10dp" + android:paddingHorizontal="@dimen/dp_15" + android:paddingVertical="@dimen/dp_10" android:textColor="@color/white" - android:textSize="12sp" + android:textSize="@dimen/sp_12" android:textStyle="bold" tools:text="DEBUG" /> @@ -36,11 +36,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" - android:layout_marginTop="50dp" - android:layout_marginBottom="30dp" + android:layout_marginTop="@dimen/dp_50" + android:layout_marginBottom="@dimen/dp_30" android:text="@string/app_name" android:textColor="@color/black60" - android:textSize="18sp" + android:textSize="@dimen/sp_18" android:textStyle="bold" /> \ No newline at end of file diff --git a/app/src/main/res/layout/status_activity.xml b/app/src/main/res/layout/status_activity.xml index 090f1b47..84c98420 100644 --- a/app/src/main/res/layout/status_activity.xml +++ b/app/src/main/res/layout/status_activity.xml @@ -21,7 +21,8 @@ android:name="com.hjq.demo.ui.fragment.StatusFragment" android:layout_width="match_parent" android:layout_height="match_parent" - tools:ignore="MissingId" /> + tools:ignore="MissingId" + tools:layout="@layout/status_fragment" /> diff --git a/app/src/main/res/layout/status_fragment.xml b/app/src/main/res/layout/status_fragment.xml index 045e9cf2..46a61e0c 100644 --- a/app/src/main/res/layout/status_fragment.xml +++ b/app/src/main/res/layout/status_fragment.xml @@ -3,14 +3,14 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="match_parent" + tools:context=".ui.fragment.StatusFragment" > + app:srlEnablePreviewInEditMode="false"> \ No newline at end of file diff --git a/app/src/main/res/layout/tab_item_design.xml b/app/src/main/res/layout/tab_item_design.xml new file mode 100644 index 00000000..687f1644 --- /dev/null +++ b/app/src/main/res/layout/tab_item_design.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_item_sliding.xml b/app/src/main/res/layout/tab_item_sliding.xml new file mode 100644 index 00000000..8baad415 --- /dev/null +++ b/app/src/main/res/layout/tab_item_sliding.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/time_dialog.xml b/app/src/main/res/layout/time_dialog.xml index d530b224..d5af7464 100644 --- a/app/src/main/res/layout/time_dialog.xml +++ b/app/src/main/res/layout/time_dialog.xml @@ -4,9 +4,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingHorizontal="10dp" - android:paddingTop="15dp" - android:paddingBottom="5dp" + android:paddingHorizontal="@dimen/dp_10" + android:paddingTop="@dimen/dp_15" + android:paddingBottom="@dimen/dp_5" tools:context=".ui.dialog.TimeDialog"> + tools:context=".ui.dialog.TipsDialog"> + android:id="@+id/iv_tips_icon" + android:layout_width="@dimen/dp_60" + android:layout_height="@dimen/dp_60" + android:layout_marginTop="@dimen/dp_10" + app:srcCompat="@drawable/tips_warning_ic" /> diff --git a/app/src/main/res/layout/ui_dialog.xml b/app/src/main/res/layout/ui_dialog.xml index adce417e..53ef48fd 100644 --- a/app/src/main/res/layout/ui_dialog.xml +++ b/app/src/main/res/layout/ui_dialog.xml @@ -2,7 +2,7 @@ + android:paddingTop="@dimen/dp_20"> + android:textSize="@dimen/sp_14" /> + android:textSize="@dimen/sp_14" /> diff --git a/app/src/main/res/layout/update_dialog.xml b/app/src/main/res/layout/update_dialog.xml index 09491f78..8bc78bf0 100644 --- a/app/src/main/res/layout/update_dialog.xml +++ b/app/src/main/res/layout/update_dialog.xml @@ -2,11 +2,11 @@ @@ -22,14 +22,15 @@ + android:layout_marginHorizontal="@dimen/dp_m_1" + app:srcCompat="@drawable/update_app_top_bg" /> + android:textSize="@dimen/sp_22" /> @@ -61,23 +62,25 @@ + android:textSize="@dimen/sp_15" + tools:text="6\n66\n666\n6666\n66666" /> + android:textSize="@dimen/sp_14" /> + android:textSize="@dimen/sp_15" /> diff --git a/app/src/main/res/layout/video_select_activity.xml b/app/src/main/res/layout/video_select_activity.xml index 093083d9..46d6671e 100644 --- a/app/src/main/res/layout/video_select_activity.xml +++ b/app/src/main/res/layout/video_select_activity.xml @@ -32,17 +32,16 @@ - + android:layout_marginEnd="@dimen/dp_15" + android:layout_marginBottom="@dimen/dp_20" + android:background="@drawable/roll_accent_bg" + android:padding="@dimen/dp_20" + app:srcCompat="@drawable/camera_ic" /> \ No newline at end of file diff --git a/app/src/main/res/layout/video_select_item.xml b/app/src/main/res/layout/video_select_item.xml index a0214022..674b0ab6 100644 --- a/app/src/main/res/layout/video_select_item.xml +++ b/app/src/main/res/layout/video_select_item.xml @@ -21,10 +21,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:paddingStart="20dp" - android:paddingTop="10dp" - android:paddingEnd="10dp" - android:paddingBottom="20dp"> + android:paddingStart="@dimen/dp_20" + android:paddingTop="@dimen/dp_10" + android:paddingEnd="@dimen/dp_10" + android:paddingBottom="@dimen/dp_20"> + android:paddingHorizontal="@dimen/dp_15" + android:paddingVertical="@dimen/dp_10"> diff --git a/app/src/main/res/layout/wait_dialog.xml b/app/src/main/res/layout/wait_dialog.xml index f35587af..cbae7aa4 100644 --- a/app/src/main/res/layout/wait_dialog.xml +++ b/app/src/main/res/layout/wait_dialog.xml @@ -8,7 +8,7 @@ android:gravity="center" android:orientation="vertical" app:cardBackgroundColor="@color/black85" - app:cardCornerRadius="15dp" + app:cardCornerRadius="@dimen/dp_15" app:cardElevation="0px" tools:context=".ui.dialog.WaitDialog"> @@ -16,14 +16,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:minWidth="110dp" - android:minHeight="110dp" + android:minWidth="@dimen/dp_110" + android:minHeight="@dimen/dp_110" android:orientation="vertical" - android:padding="10dp"> + android:padding="@dimen/dp_10"> @@ -32,12 +32,12 @@ android:id="@+id/tv_wait_message" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginHorizontal="15dp" - android:layout_marginTop="5dp" + android:layout_marginHorizontal="@dimen/dp_15" + android:layout_marginTop="@dimen/dp_5" android:maxLines="3" android:text="@string/common_loading" android:textColor="@color/white" - android:textSize="14sp" /> + android:textSize="@dimen/sp_14" /> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_player_view.xml b/app/src/main/res/layout/widget_player_view.xml index e7ca72f6..0d6618e8 100644 --- a/app/src/main/res/layout/widget_player_view.xml +++ b/app/src/main/res/layout/widget_player_view.xml @@ -20,19 +20,26 @@ android:fitsSystemWindows="true" android:orientation="vertical"> - + android:orientation="horizontal" + android:visibility="invisible" + app:shape="rectangle" + app:shape_angle="270" + app:shape_centerColor="@color/black20" + app:shape_endColor="@color/transparent" + app:shape_startColor="#AA000000" + tools:visibility="visible"> - + - + android:visibility="invisible" + tools:visibility="visible" /> - - - + + + android:paddingHorizontal="@dimen/dp_15" + android:visibility="invisible" + app:shape="rectangle" + app:shape_angle="90" + app:shape_centerColor="@color/black20" + app:shape_endColor="@color/transparent" + app:shape_startColor="#AA000000" + tools:visibility="visible"> - + @@ -122,7 +142,7 @@ android:orientation="vertical" android:visibility="gone" app:cardBackgroundColor="@color/black85" - app:cardCornerRadius="15dp" + app:cardCornerRadius="@dimen/dp_15" app:cardElevation="0px" tools:visibility="visible"> @@ -130,15 +150,15 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:minWidth="110dp" - android:minHeight="110dp" + android:minWidth="@dimen/dp_110" + android:minHeight="@dimen/dp_110" android:orientation="vertical" - android:padding="10dp"> + android:padding="@dimen/dp_10"> @@ -147,11 +167,11 @@ android:id="@+id/tv_player_view_message" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginHorizontal="15dp" - android:layout_marginTop="5dp" + android:layout_marginHorizontal="@dimen/dp_15" + android:layout_marginTop="@dimen/dp_5" android:maxLines="3" android:textColor="@color/white" - android:textSize="14sp" + android:textSize="@dimen/sp_14" tools:text="@string/common_loading" /> diff --git a/app/src/main/res/layout/widget_status_layout.xml b/app/src/main/res/layout/widget_status_layout.xml index 41873369..2b959eab 100644 --- a/app/src/main/res/layout/widget_status_layout.xml +++ b/app/src/main/res/layout/widget_status_layout.xml @@ -1,5 +1,5 @@ - + tools:src="@drawable/status_nerwork_ic" /> + android:textSize="@dimen/sp_14" + tools:text="@string/status_layout_error_network" /> + + + android:layout_weight="1.5" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_home_bottom_nav.xml b/app/src/main/res/menu/menu_home_bottom_nav.xml deleted file mode 100644 index ecdad4ad..00000000 --- a/app/src/main/res/menu/menu_home_bottom_nav.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/raw/province.json b/app/src/main/res/raw/province.json index 2d828012..7c0a55b9 100644 --- a/app/src/main/res/raw/province.json +++ b/app/src/main/res/raw/province.json @@ -663,11 +663,10 @@ "福山区", "牟平区", "莱山区", - "长岛县", "龙口市", "莱阳市", "莱州市", - "蓬莱市", + "蓬莱区", "招远市", "栖霞市", "海阳市", @@ -742,6 +741,13 @@ "莒县" ] }, + { + "name": "莱芜市", + "area": [ + "莱城区", + "钢城区" + ] + }, { "name": "临沂市", "area": [ @@ -779,8 +785,8 @@ "name": "聊城市", "area": [ "东昌府区", + "茌平区", "临清市", - "茌平县", "东阿县", "冠县", "高唐县", @@ -859,13 +865,14 @@ "龙湾区", "瓯海区", "洞头区", - "瑞安市", - "乐清市", "永嘉县", "平阳县", "苍南县", "文成县", - "泰顺县" + "泰顺县", + "瑞安市", + "乐清市", + "龙港市" ] }, { @@ -909,6 +916,7 @@ "兰溪市", "义乌市", "东阳市", + "永康市", "浦江县", "武义县", "磐安县" @@ -1069,9 +1077,9 @@ "原阳县", "延津县", "封丘县", - "长垣县", "卫辉市", - "辉县市" + "辉县市", + "长垣市" ] }, { @@ -1184,11 +1192,11 @@ "area": [ "川汇区", "扶沟县", + "淮阳区", "西华县", "商水县", "沈丘县", "郸城县", - "淮阳县", "太康县", "鹿邑县", "项城市" @@ -1249,10 +1257,10 @@ "温江区", "双流区", "郫都区", + "新津区", "金堂县", "大邑县", "蒲江县", - "新津县", "都江堰市", "彭州市", "邛崃市", @@ -1337,8 +1345,8 @@ "船山区", "安居区", "蓬溪县", - "射洪县", - "大英县" + "大英县", + "射洪市" ] }, { @@ -1397,7 +1405,7 @@ "area": [ "翠屏区", "南溪区", - "宜宾县", + "叙州区", "江安县", "长宁县", "高县", @@ -1693,6 +1701,91 @@ "鹤峰县" ] }, + { + "name": "仙桃市", + "area": [ + "干河街道", + "龙华山街道", + "沙嘴街道", + "郑场镇", + "毛嘴镇", + "剅河镇", + "三伏潭镇", + "胡场镇", + "长埫口镇", + "西流河镇", + "彭场镇", + "沙湖镇", + "杨林尾镇", + "张沟镇", + "郭河镇", + "沔城回族镇", + "通海口镇", + "陈场镇", + "仙桃经济开发区", + "仙桃工业园", + "沙湖原种场", + "九合垸原种场", + "排湖风景区" + ] + }, + { + "name": "潜江市", + "area": [ + "园林办事处", + "广华办事处", + "杨市办事处", + "周矶办事处", + "泰丰办事处", + "高场办事处", + "熊口镇", + "高石碑镇", + "老新镇", + "王场镇", + "渔洋镇", + "龙湾镇", + "浩口镇", + "积玉口镇", + "张金镇", + "白鹭湖管理区", + "总口管理区", + "熊口农场管理区", + "运粮湖管理区", + "后湖管理区", + "周矶管理区", + "竹根滩镇" + ] + }, + { + "name": "天门市", + "area": [ + "竟陵街道", + "候口街道", + "杨林街道", + "多宝镇", + "拖市镇", + "张港镇", + "蒋场镇", + "汪场镇", + "渔薪镇", + "黄潭镇", + "岳口镇", + "横林镇", + "彭市镇", + "麻洋镇", + "多祥镇", + "干驿镇", + "马湾镇", + "卢市镇", + "小板镇", + "九真镇", + "皂市镇", + "胡市镇", + "石家河镇", + "佛子山镇", + "净潭乡" + ] + }, { "name": "神农架林区", "area": [ @@ -1773,7 +1866,6 @@ "双清区", "大祥区", "北塔区", - "邵东县", "新邵县", "邵阳县", "隆回县", @@ -1781,7 +1873,8 @@ "绥宁县", "新宁县", "城步苗族自治县", - "武冈市" + "武冈市", + "邵东市" ] }, { @@ -1993,15 +2086,14 @@ { "name": "邢台市", "area": [ - "桥东区", - "桥西区", - "邢台县", + "襄都区", + "信都区", + "任泽区", + "南和区", "临城县", "内丘县", "柏乡县", "隆尧县", - "任县", - "南和县", "宁晋县", "巨鹿县", "新河县", @@ -2297,7 +2389,7 @@ "芜湖县", "繁昌县", "南陵县", - "无为县" + "无为市" ] }, { @@ -2364,8 +2456,8 @@ "宿松县", "望江县", "岳西县", - "潜山市", - "桐城市" + "桐城市", + "潜山市" ] }, { @@ -2451,11 +2543,11 @@ "area": [ "宣州区", "郎溪县", - "广德县", "泾县", "绩溪县", "旌德县", - "宁国市" + "宁国市", + "广德市" ] } ] @@ -2725,7 +2817,6 @@ "安塞区", "延长县", "延川县", - "子长县", "志丹县", "吴起县", "甘泉县", @@ -2733,7 +2824,8 @@ "洛川县", "宜川县", "黄龙县", - "黄陵县" + "黄陵县", + "子长市" ] }, { @@ -2807,9 +2899,9 @@ "东湖区", "西湖区", "青云谱区", - "湾里区", "青山湖区", "新建区", + "红谷滩区", "南昌县", "安义县", "进贤县" @@ -2878,7 +2970,6 @@ "上犹县", "崇义县", "安远县", - "龙南县", "定南县", "全南县", "宁都县", @@ -2887,7 +2978,8 @@ "会昌县", "寻乌县", "石城县", - "瑞金市" + "瑞金市", + "龙南市" ] }, { @@ -2944,7 +3036,7 @@ "area": [ "信州区", "广丰区", - "上饶县", + "广信区", "玉山县", "铅山县", "横峰县", @@ -2999,13 +3091,13 @@ "area": [ "红塔区", "江川区", - "澄江县", "通海县", "华宁县", "易门县", "峨山彝族自治县", "新平彝族傣族自治县", - "元江哈尼族彝族傣族自治县" + "元江哈尼族彝族傣族自治县", + "澄江市" ] }, { @@ -3218,19 +3310,18 @@ { "name": "长治市", "area": [ - "城区", - "郊区", - "长治县", + "潞州区", + "上党区", + "屯留区", + "潞城区", "襄垣县", - "屯留县", "平顺县", "黎城县", "壶关县", "长子县", "武乡县", "沁县", - "沁源县", - "潞城市" + "沁源县" ] }, { @@ -3259,12 +3350,12 @@ "name": "晋中市", "area": [ "榆次区", + "太谷区", "榆社县", "左权县", "和顺县", "昔阳县", "寿阳县", - "太谷县", "祁县", "平遥县", "灵石县", @@ -3366,6 +3457,7 @@ "农安县", "榆树市", "德惠市", + "公主岭市", "长德区", "北湖区", "空港区", @@ -3398,7 +3490,6 @@ "铁东区", "梨树县", "伊通满族自治县", - "公主岭市", "双辽市" ] }, @@ -3558,7 +3649,7 @@ "name": "黔西南布依族苗族自治州", "area": [ "兴义市", - "兴仁县", + "兴仁市", "普安县", "晴隆县", "贞丰县", @@ -3835,6 +3926,261 @@ "国营西联农场", "国营西培农场" ] + }, + { + "name": "五指山市", + "area": [ + "通什镇", + "南圣镇", + "毛阳镇", + "番阳镇", + "畅好乡", + "毛道乡", + "水满乡" + ] + }, + { + "name": "琼海市", + "area": [ + "嘉积镇", + "博鳌镇", + "万泉镇", + "潭门镇", + "长坡镇", + "塔洋镇", + "大路镇", + "中原镇", + "阳江镇", + "龙江镇", + "石壁镇", + "会山镇" + ] + }, + { + "name": "文昌市", + "area": [ + "文城镇", + "重兴镇", + "蓬莱镇", + "会文镇", + "东路镇", + "潭牛镇", + "东阁镇", + "文教镇", + "东郊镇", + "龙楼镇", + "昌洒镇", + "翁田镇", + "抱罗镇", + "冯坡镇", + "锦山镇", + "铺前镇", + "公坡镇" + ] + }, + { + "name": "万宁市", + "area": [ + "万城镇", + "龙滚镇", + "和乐镇", + "后安镇", + "大茂镇", + "东澳镇", + "礼纪镇", + "长丰镇", + "山根镇", + "北大镇", + "南桥镇", + "三更罗镇", + "兴隆华侨农场", + "地方国营六连林场" + ] + }, + { + "name": "东方市", + "area": [ + "八所镇", + "东河镇", + "大田镇", + "感城镇", + "板桥镇", + "三家镇", + "四更镇", + "新龙镇", + "天安乡", + "江边乡" + ] + }, + { + "name": "定安县", + "area": [ + "定城镇", + "新竹镇", + "龙湖镇", + "黄竹镇", + "雷鸣镇", + "龙门镇", + "龙河镇", + "岭口镇", + "翰林镇", + "富文镇" + ] + }, + { + "name": "屯昌县", + "area": [ + "屯城镇", + "新兴镇", + "枫木镇", + "乌坡镇", + "南吕镇", + "南坤镇", + "坡心镇", + "西昌镇" + ] + }, + { + "name": "澄迈县", + "area": [ + "金江镇", + "瑞溪镇", + "永发镇", + "老城镇", + "加乐镇", + "文儒镇", + "福山镇", + "桥头镇", + "中兴镇", + "仁兴镇", + "大丰镇", + "金安农场", + "红光农场", + "西达农场", + "澄迈林场", + "海南老城经济开发区", + "海口综合保税区", + "马村中心港区" + ] + }, + { + "name": "临高县", + "area": [ + "临城镇", + "东英镇", + "波莲镇", + "调楼镇", + "新盈镇", + "南宝镇", + "和舍镇", + "多文镇", + "博厚镇", + "皇桐镇", + "加来农场", + "金牌港经济开发区", + "临高角旅游度假开发区" + ] + }, + { + "name": "白沙黎族自治县", + "area": [ + "牙叉镇", + "七坊镇", + "邦溪镇", + "打安镇", + "细水乡", + "元门乡", + "南开乡", + "阜龙乡", + "青松乡", + "金波乡", + "荣邦乡" + ] + }, + { + "name": "昌江黎族自治县", + "area": [ + "石碌镇", + "叉河镇", + "十月田镇", + "乌烈镇", + "昌化镇", + "海尾镇", + "七叉镇", + "王下乡" + ] + }, + { + "name": "乐东黎族自治县", + "area": [ + "抱由镇", + "万冲镇", + "大安镇", + "志仲镇", + "千家镇", + "九所镇", + "利国镇", + "黄流镇", + "佛罗镇", + "尖峰镇", + "莺歌海镇" + ] + }, + { + "name": "陵水黎族自治县", + "area": [ + "椰林镇", + "新村镇", + "英州镇", + "本号镇", + "光坡镇", + "三才镇", + "黎安镇", + "隆广镇", + "文罗镇", + "提蒙乡", + "群英乡" + ] + }, + { + "name": "保亭黎族苗族自治县", + "area": [ + "保城镇", + "什玲镇", + "加茂镇", + "响水镇", + "新政镇", + "三道镇", + "六弓乡", + "南林乡", + "毛感乡" + ] + }, + { + "name": "琼中黎族苗族自治县", + "area": [ + "营根镇", + "湾岭镇", + "黎母山镇", + "红毛镇", + "长征镇", + "中平镇", + "和平镇", + "什运乡", + "上安乡", + "吊罗山乡", + "阳江农场", + "大丰农场", + "新进农场", + "乌石农场", + "岭头农场", + "南方农场", + "新伟农场", + "加钗农场", + "长征农场", + "乘坡农场", + "太平农场" + ] } ] }, @@ -3848,8 +4194,8 @@ "城中区", "城西区", "城北区", + "湟中区", "大通回族土族自治县", - "湟中县", "湟源县" ] }, @@ -3876,7 +4222,7 @@ { "name": "黄南藏族自治州", "area": [ - "同仁县", + "同仁市", "尖扎县", "泽库县", "河南蒙古族自治县" @@ -4031,22 +4377,15 @@ { "name": "伊春市", "area": [ - "伊春区", - "南岔区", + "伊美区", + "乌翠区", "友好区", - "西林区", - "翠峦区", - "新青区", - "美溪区", - "金山屯区", - "五营区", - "乌马河区", - "汤旺河区", - "带岭区", - "乌伊岭区", - "红星区", - "上甘岭区", "嘉荫县", + "汤旺县", + "丰林县", + "大箐山县", + "南岔县", + "金林区", "铁力市" ] }, @@ -4093,11 +4432,11 @@ "name": "黑河市", "area": [ "爱辉区", - "嫩江县", "逊克县", "孙吴县", "北安市", - "五大连池市" + "五大连池市", + "嫩江市" ] }, { @@ -4530,9 +4869,8 @@ "name": "百色市", "area": [ "右江区", - "田阳县", + "田阳区", "田东县", - "平果县", "德保县", "那坡县", "凌云县", @@ -4540,7 +4878,8 @@ "田林县", "西林县", "隆林各族自治县", - "靖西市" + "靖西市", + "平果市" ] }, { @@ -4726,8 +5065,8 @@ "name": "阿克苏地区", "area": [ "阿克苏市", + "库车市", "温宿县", - "库车县", "沙雅县", "新和县", "拜城县", @@ -4814,6 +5153,147 @@ "青河县", "吉木乃县" ] + }, + { + "name": "石河子市", + "area": [ + "新城街道", + "向阳街道", + "红山街道", + "老街街道", + "东城街道", + "北泉镇", + "石河子镇" + ] + }, + { + "name": "阿拉尔市", + "area": [ + "幸福路街道", + "金银川路街道", + "青松路街道", + "南口街道", + "托喀依乡", + "一团金银川镇", + "二团新井子镇", + "三团甘泉镇", + "四团永宁镇", + "五团沙河镇", + "六团双城镇", + "七团玛滩镇", + "八团塔门镇", + "九团梨花镇", + "十团昌安镇", + "十一团花桥镇", + "十二团塔南镇", + "十三团幸福镇", + "十四团金杨镇", + "十五团", + "十六团新开岭镇" + ] + }, + { + "name": "图木舒克市", + "area": [ + "锦绣街道", + "前海街道", + "永安坝街道", + "四十一团草湖镇", + "四十二团龙口镇", + "四十四团永安镇", + "四十五团前海镇", + "四十六团永兴镇", + "四十八团河东镇", + "四十九团海安镇", + "五十团夏河镇", + "五十一团唐驿镇", + "五十三团金胡杨镇", + "五十四团兴安镇", + "伽师总场嘉和镇" + ] + }, + { + "name": "五家渠市", + "area": [ + "军垦路街道", + "青湖路街道", + "人民路街道", + "一零二团梧桐镇", + "一零三团蔡家湖镇" + ] + }, + { + "name": "北屯市", + "area": [ + "天骄街道", + "龙疆街道", + "军垦街道", + "北屯镇", + "一八三团双渠镇", + "一八七团丰庆镇", + "一八八团海川镇" + ] + }, + { + "name": "铁门关市", + "area": [ + "迎宾街道", + "二十二团河畔镇", + "二十四团高桥镇", + "二十七团天湖镇", + "二十八团博古其镇", + "三十团双丰镇", + "三十六团米兰镇", + "三十七团金山镇", + "三十八团南屯镇", + "二二三团开泽镇" + ] + }, + { + "name": "双河市", + "area": [ + "八十一团双桥镇", + "八十四团石峪镇", + "八十五团", + "八十六团博河镇", + "八十九团", + "九十团双乐镇" + ] + }, + { + "name": "可克达拉市", + "area": [ + "六十三团榆树庄镇", + "六十四团苇湖镇", + "六十六团", + "六十七团", + "六十八团长丰镇" + ] + }, + { + "name": "昆玉市", + "area": [ + "四十七团老兵镇", + "皮山农场昆泉镇", + "一牧场昆牧镇", + "二二四团", + "二二五团玉泉镇" + ] + }, + { + "name": "胡杨河市", + "area": [ + "一二三团", + "一二四团", + "一二五团", + "一二六团", + "一二七团", + "一二八团", + "一二九团", + "一三零团", + "一三一团", + "一三七团" + ] } ] }, diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index de86d885..78554f9e 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -1,6 +1,5 @@ - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e47c3239..ecaa9700 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,13 +1,13 @@ - - - - - 1px - - - 999dp - - - 15dp - + + + + + 1px + + + 999dp + + + 15dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a951b4e..079a27c5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,8 +1,11 @@ 安卓技术中台 + 加载中… + 未知错误 + 确定 取消 @@ -14,11 +17,14 @@ - 应用出了点小意外,正在重新启动 当前网络不可用,请检查网络设置 + 该视频不适合在此设备上播放 + 无法播放此视频 + 错误类型:%d,错误代码:%d + 请输入手机号码 手机号输入不正确 @@ -78,7 +84,7 @@ 加载中… 请求出错,未知错误 - 账号异常,请重新登录 + 登录失效,请重新登录 数据解析异常,请稍后 服务器请求超时,请稍后再试 请求失败,请检查网络设置 @@ -88,8 +94,9 @@ 空空如也 - 请求出错,点击重试 - 网络错误,点击重试 + 请求出错,请重试 + 网络错误,请重试 + 重试 请选择地区 @@ -185,7 +192,7 @@ 关于我们 Android 轮子哥 - Copyright © 2018 – 2020 + Copyright © 2018 – 2021 忘记密码 @@ -231,6 +238,9 @@ 无法选中,该图片已经被删除 + + 裁剪失败,当前手机不支持裁剪图片 + 视频选择 所有视频 @@ -241,7 +251,7 @@ 无法选中,该视频已经被删除 - + 无法启动相机 目标地址错误 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index de92c6bb..41e05873 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,3 +1,4 @@ + @@ -13,7 +14,7 @@ @color/common_text_color - 14sp + @dimen/sp_14 @color/common_text_hint_color @@ -29,6 +30,8 @@ never + + false @@ -43,36 +46,38 @@ true - + - + @@ -94,22 +99,17 @@ wrap_content wrap_content @drawable/countdown_selector - 15dp - 15dp - 5dp - 5dp - 10dp - 10dp - 90dp + @dimen/dp_15 + @dimen/dp_15 + @dimen/dp_10 + @dimen/dp_10 + @dimen/dp_10 + @dimen/dp_10 + @dimen/dp_90 center @string/common_code_send @drawable/countdown_color_selector - 12sp - - - - \ No newline at end of file diff --git a/base/build.gradle b/base/build.gradle deleted file mode 100644 index fdc72234..00000000 --- a/base/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -apply plugin : 'com.android.library' -apply from : '../config.gradle' - -android { - - defaultConfig { - // 模块混淆配置 - consumerProguardFiles 'proguard-base.pro' - } -} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 84573d13..f7f954aa 100644 --- a/build.gradle +++ b/build.gradle @@ -1,50 +1,50 @@ -// AndroidProject 版本:v12.1 -// 发布日期:2021 年 02 月 27 日 -buildscript { - - repositories { - maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } - maven { url 'https://jitpack.io' } - jcenter() - google() - } - - // Studio 插件推荐:https://github.com/getActivity/StudioPlugins - dependencies { - // noinspection GradleDependency - classpath 'com.android.tools.build:gradle:3.6.3' - // AOP 配置插件:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx - classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10' - } -} - -allprojects { - repositories { - // 阿里云云效仓库,提升编译速度:https://maven.aliyun.com/mvn/guide - maven { url 'https://maven.aliyun.com/repository/jcenter' } - maven { url 'https://maven.aliyun.com/repository/public' } - maven { url 'https://maven.aliyun.com/repository/google' } - maven { url 'https://jitpack.io' } - // 友盟仓库:https://bintray.com/umsdk/release - maven { url 'https://dl.bintray.com/umsdk/release' } - jcenter() - google() - } - - tasks.withType(JavaCompile) { - // 设置全局编码 - options.encoding = 'UTF-8' - } - tasks.withType(Javadoc) { - // 设置文档编码 - options { - encoding 'UTF-8' - charSet 'UTF-8' - links 'http://docs.oracle.com/javase/7/docs/api' - } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir +// AndroidProject 版本:v13.0 +// 导入配置文件 +apply from : 'configs.gradle' + +buildscript { + // 导入通用的 Maven 库配置 + apply from : 'maven.gradle' + repositories { + // 阿里云云效仓库(Gradle 插件):https://maven.aliyun.com/mvn/guide + maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } + addCommonMaven(repositories) + } + + // Studio 插件推荐:https://github.com/getActivity/StudioPlugins + dependencies { + // Gradle 插件版本说明:https://developer.android.google.cn/studio/releases/gradle-plugin.html#updating-plugin + // noinspection GradleDependency + classpath 'com.android.tools.build:gradle:4.1.2' + // AOP 配置插件:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx + classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10' + } +} + +allprojects { + repositories { + // 友盟远程仓库:https://info.umeng.com/detail?id=443&cateId=1 + maven { url 'https://repo1.maven.org/maven2' } + addCommonMaven(repositories) + } + + tasks.withType(JavaCompile) { + // 设置全局编码 + options.encoding = 'UTF-8' + } + tasks.withType(Javadoc) { + // 设置文档编码 + options { + encoding 'UTF-8' + charSet 'UTF-8' + links 'http://docs.oracle.com/javase/7/docs/api' + } + } + + // 将构建文件统一输出到项目根目录下的 build 文件夹 + setBuildDir(new File(rootDir, "build/${path.replaceAll(':', '/')}")) +} + +task clean(type: Delete) { + delete rootProject.buildDir } \ No newline at end of file diff --git a/common.gradle b/common.gradle new file mode 100644 index 00000000..49f3f585 --- /dev/null +++ b/common.gradle @@ -0,0 +1,65 @@ +// 通用配置 +android { + + // 编译源码版本 + compileSdkVersion 30 + defaultConfig { + // 最低安装版本 + minSdkVersion 21 + // 目标适配版本 + targetSdkVersion 30 + versionName '1.0' + versionCode 10 + } + + // 支持 Java JDK 8 + compileOptions { + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 + } + + // 设置存放 so 文件的目录 + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } + + // 可在 Studio 最左侧中的 Build Variants 选项中切换默认的构建类型 + buildTypes { + // 调试版本 + debug {} + // 预览版本 + preview {} + // 正式版本 + release {} + } + + // 代码警告配置 + lintOptions { + // 禁用文本硬编码警告 + disable 'HardcodedText' + // 禁用图片描述警告 + disable 'ContentDescription' + } +} + +afterEvaluate { + // 前提条件是这个 Module 工程必须是 Library 类型,并且排除名为 umeng 的 Module 工程 + if (android.defaultConfig.applicationId == null && "umeng" != getName()) { + // 排除 BuildConfig.class + generateReleaseBuildConfig.enabled = false + generatePreviewBuildConfig.enabled = false + generateDebugBuildConfig.enabled = false + } +} + +dependencies { + // 依赖 libs 目录下所有的 jar 和 aar 包 + implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') + + // AndroidX 库:https://github.com/androidx/androidx + implementation 'androidx.appcompat:appcompat:1.3.1' + // Material 库:https://github.com/material-components/material-components-android + implementation 'com.google.android.material:material:1.4.0' +} \ No newline at end of file diff --git a/config.gradle b/config.gradle deleted file mode 100644 index d1a10f26..00000000 --- a/config.gradle +++ /dev/null @@ -1,53 +0,0 @@ -// 通用配置 -android { - - // 编译源码版本 - compileSdkVersion 30 - defaultConfig { - // 最低安装版本 - minSdkVersion 21 - // 目标适配版本 - targetSdkVersion 30 - versionName '1.0' - versionCode 10 - //versionCode new Date().format("yyyyMMdd") as int - } - - // 支持 Java JDK 8 - compileOptions { - targetCompatibility JavaVersion.VERSION_1_8 - sourceCompatibility JavaVersion.VERSION_1_8 - } - - // 设置存放 so 文件的目录 - sourceSets { - main { - jniLibs.srcDirs = ['libs'] - } - } - - // 代码警告配置 - lintOptions { - // 禁用文本硬编码警告 - disable 'HardcodedText' - } - - // 可在 Studio 左侧 Build Variants 选项中切换默认的构建模式 - buildTypes { - // 调试版本 - debug {} - // 预览版本 - preview {} - // 正式版本 - release {} - } -} - -dependencies { - // 依赖 libs 目录下所有的 jar 和 aar 包 - implementation fileTree(include: ["*.jar", '*.aar'], dir: "libs") - - // 谷歌兼容库:https://developer.android.google.cn/jetpack/androidx/releases/appcompat?hl=zh-cn - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.2.1' -} \ No newline at end of file diff --git a/configs.gradle b/configs.gradle new file mode 100644 index 00000000..4dc0f193 --- /dev/null +++ b/configs.gradle @@ -0,0 +1,60 @@ +ext { + // 测试服 + def SERVER_TYPE_TEST = "test" + // 预发布服 + def SERVER_TYPE_PREVIEW = "pre" + // 正式服 + def SERVER_TYPE_PRODUCT = "product" + + def taskName = project.gradle.startParameter.taskNames[0] + if (taskName == null) { + taskName = "" + } + // 打印当前执行的任务名称 + println "GradleLog TaskNameOutput " + taskName + + def serverType = SERVER_TYPE_PRODUCT + + if (taskName.endsWith("Debug")) { + serverType = SERVER_TYPE_TEST + } else if (taskName.endsWith("Preview")) { + serverType = SERVER_TYPE_PREVIEW + } + + // 从 Gradle 命令中读取参数配置,例如:./gradlew assembleRelease -P ServerType="test" + if (project.hasProperty("ServerType")) { + serverType = project.properties["ServerType"] + } + + // 打印当前服务器配置 + println "GradleLog ServerTypeOutput " + serverType + + // 友盟 AppKey + UMENG_APP_KEY = "5cb16d93570df399fd0014e2" + // QQ AppId + QQ_APP_ID = "101828096" + // QQ Secret + QQ_APP_SECRET = "9dfd3300c3aa3c4596a07796c64914b2" + // 微信 AppId + WX_APP_ID = "wxd35706cc9f46114c" + // 微信 Secret + WX_APP_SECRET = "0c8c7cf831dd135a32b3e395ea459b5a" + + switch(serverType) { + case SERVER_TYPE_TEST: + case SERVER_TYPE_PREVIEW: + LOG_ENABLE = true + BUGLY_ID = "请自行替换 Bugly 上面的 AppID" + if (serverType == SERVER_TYPE_PREVIEW) { + HOST_URL = "https://www.pre.baidu.com/" + } else { + HOST_URL = "https://www.test.baidu.com/" + } + break + case SERVER_TYPE_PRODUCT: + LOG_ENABLE = false + BUGLY_ID = "请自行替换 Bugly 上面的 AppID" + HOST_URL = "https://www.baidu.com/" + break + } +} \ No newline at end of file diff --git a/copy/proguard-rules.pro b/copy/proguard-rules.pro deleted file mode 100644 index 6be4355e..00000000 --- a/copy/proguard-rules.pro +++ /dev/null @@ -1,25 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in D:\SDK\Studio\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e8dd92ea..e9329ac9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ zipStoreBase = GRADLE_USER_HOME zipStorePath = wrapper/dists distributionBase = GRADLE_USER_HOME distributionPath = wrapper/dists -distributionUrl = https\://services.gradle.org/distributions/gradle-6.0-all.zip \ No newline at end of file +distributionUrl = https\://services.gradle.org/distributions/gradle-6.5-all.zip \ No newline at end of file diff --git a/library/base/build.gradle b/library/base/build.gradle new file mode 100644 index 00000000..fcd36fae --- /dev/null +++ b/library/base/build.gradle @@ -0,0 +1,20 @@ +apply plugin : 'com.android.library' +apply from : '../../common.gradle' + +android { + + defaultConfig { + // 模块混淆配置 + consumerProguardFiles 'proguard-base.pro' + } + + sourceSets { + main { + // res 资源目录配置 + res.srcDirs( + 'src/main/res', + 'src/main/res-sw', + ) + } + } +} \ No newline at end of file diff --git a/base/proguard-base.pro b/library/base/proguard-base.pro similarity index 97% rename from base/proguard-base.pro rename to library/base/proguard-base.pro index c50ee858..d076383f 100644 --- a/base/proguard-base.pro +++ b/library/base/proguard-base.pro @@ -7,6 +7,9 @@ -dontskipnonpubliclibraryclasses -verbose +# 不要删除无用代码 +-dontshrink + # 不混淆泛型 -keepattributes Signature diff --git a/base/src/main/AndroidManifest.xml b/library/base/src/main/AndroidManifest.xml similarity index 100% rename from base/src/main/AndroidManifest.xml rename to library/base/src/main/AndroidManifest.xml diff --git a/base/src/main/java/com/hjq/base/BaseActivity.java b/library/base/src/main/java/com/hjq/base/BaseActivity.java similarity index 97% rename from base/src/main/java/com/hjq/base/BaseActivity.java rename to library/base/src/main/java/com/hjq/base/BaseActivity.java index 277a2fcf..0596e65c 100644 --- a/base/src/main/java/com/hjq/base/BaseActivity.java +++ b/library/base/src/main/java/com/hjq/base/BaseActivity.java @@ -27,12 +27,15 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : Activity 基类 + * desc : Activity 技术基类 */ public abstract class BaseActivity extends AppCompatActivity implements ActivityAction, ClickAction, HandlerAction, BundleAction, KeyboardAction { + /** 错误结果码 */ + public static final int RESULT_ERROR = -2; + /** Activity 回调集合 */ private SparseArray mActivityCallbacks; @@ -92,9 +95,9 @@ protected void onDestroy() { @Override public void finish() { + super.finish(); // 隐藏软键,避免内存泄漏 hideKeyboard(getCurrentFocus()); - super.finish(); } /** @@ -142,6 +145,7 @@ public boolean dispatchKeyEvent(KeyEvent event) { return super.dispatchKeyEvent(event); } + @SuppressWarnings("deprecation") @Override public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { // 隐藏软键,避免内存泄漏 diff --git a/base/src/main/java/com/hjq/base/BaseAdapter.java b/library/base/src/main/java/com/hjq/base/BaseAdapter.java similarity index 93% rename from base/src/main/java/com/hjq/base/BaseAdapter.java rename to library/base/src/main/java/com/hjq/base/BaseAdapter.java index 57a6ffe3..ea5a244e 100644 --- a/base/src/main/java/com/hjq/base/BaseAdapter.java +++ b/library/base/src/main/java/com/hjq/base/BaseAdapter.java @@ -8,6 +8,7 @@ import androidx.annotation.IdRes; import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -17,7 +18,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : RecyclerView 适配器基类 + * desc : RecyclerView 适配器技术基类 */ public abstract class BaseAdapter.ViewHolder> extends RecyclerView.Adapter implements ResourcesAction { @@ -29,13 +30,17 @@ public abstract class BaseAdapter.ViewHolder> private RecyclerView mRecyclerView; /** 条目点击监听器 */ + @Nullable private OnItemClickListener mItemClickListener; /** 条目长按监听器 */ + @Nullable private OnItemLongClickListener mItemLongClickListener; /** 条目子 View 点击监听器 */ + @Nullable private SparseArray mChildClickListeners; /** 条目子 View 长按监听器 */ + @Nullable private SparseArray mChildLongClickListeners; /** ViewHolder 位置偏移值 */ @@ -58,8 +63,9 @@ public final void onBindViewHolder(@NonNull VH holder, int position) { } /** - * 获取RecyclerView 对象,需要在setAdapter之后绑定 + * 获取 RecyclerView 对象 */ + @Nullable public RecyclerView getRecyclerView() { return mRecyclerView; } @@ -215,7 +221,7 @@ protected RecyclerView.LayoutManager generateDefaultLayoutManager(Context contex /** * 设置 RecyclerView 条目点击监听 */ - public void setOnItemClickListener(OnItemClickListener listener) { + public void setOnItemClickListener(@Nullable OnItemClickListener listener) { checkRecyclerViewState(); mItemClickListener = listener; } @@ -223,7 +229,7 @@ public void setOnItemClickListener(OnItemClickListener listener) { /** * 设置 RecyclerView 条目子 View 点击监听 */ - public void setOnChildClickListener(@IdRes int id, OnChildClickListener listener) { + public void setOnChildClickListener(@IdRes int id, @Nullable OnChildClickListener listener) { checkRecyclerViewState(); if (mChildClickListeners == null) { mChildClickListeners = new SparseArray<>(); @@ -232,9 +238,9 @@ public void setOnChildClickListener(@IdRes int id, OnChildClickListener listener } /** - * 设置RecyclerView条目长按监听 + * 设置 RecyclerView 条目长按监听 */ - public void setOnItemLongClickListener(OnItemLongClickListener listener) { + public void setOnItemLongClickListener(@Nullable OnItemLongClickListener listener) { checkRecyclerViewState(); mItemLongClickListener = listener; } @@ -242,7 +248,7 @@ public void setOnItemLongClickListener(OnItemLongClickListener listener) { /** * 设置 RecyclerView 条目子 View 长按监听 */ - public void setOnChildLongClickListener(@IdRes int id, OnChildLongClickListener listener) { + public void setOnChildLongClickListener(@IdRes int id, @Nullable OnChildLongClickListener listener) { checkRecyclerViewState(); if (mChildLongClickListeners == null) { mChildLongClickListeners = new SparseArray<>(); @@ -250,6 +256,9 @@ public void setOnChildLongClickListener(@IdRes int id, OnChildLongClickListener mChildLongClickListeners.put(id, listener); } + /** + * 检查 RecyclerView 状态 + */ private void checkRecyclerViewState() { if (mRecyclerView != null) { // 必须在 RecyclerView.setAdapter() 之前设置监听 diff --git a/base/src/main/java/com/hjq/base/BaseDialog.java b/library/base/src/main/java/com/hjq/base/BaseDialog.java similarity index 85% rename from base/src/main/java/com/hjq/base/BaseDialog.java rename to library/base/src/main/java/com/hjq/base/BaseDialog.java index ab2b7bf4..2b3dc41b 100644 --- a/base/src/main/java/com/hjq/base/BaseDialog.java +++ b/library/base/src/main/java/com/hjq/base/BaseDialog.java @@ -52,7 +52,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/11/24 - * desc : Dialog 基类 + * desc : Dialog 技术基类 */ public class BaseDialog extends AppCompatDialog implements LifecycleOwner, ActivityAction, ResourcesAction, HandlerAction, ClickAction, AnimAction, KeyboardAction, @@ -61,8 +61,11 @@ public class BaseDialog extends AppCompatDialog implements LifecycleOwner, private final ListenersWrapper mListeners = new ListenersWrapper<>(this); private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this); + @Nullable private List mShowListeners; + @Nullable private List mCancelListeners; + @Nullable private List mDismissListeners; public BaseDialog(Context context) { @@ -86,27 +89,29 @@ public View getContentView() { } /** - * 设置宽度 + * 设置 Dialog 宽度 */ public void setWidth(int width) { Window window = getWindow(); - if (window != null) { - WindowManager.LayoutParams params = window.getAttributes(); - params.width = width; - window.setAttributes(params); + if (window == null) { + return; } + WindowManager.LayoutParams params = window.getAttributes(); + params.width = width; + window.setAttributes(params); } /** - * 设置高度 + * 设置 Dialog 高度 */ public void setHeight(int height) { Window window = getWindow(); - if (window != null) { - WindowManager.LayoutParams params = window.getAttributes(); - params.height = height; - window.setAttributes(params); + if (window == null) { + return; } + WindowManager.LayoutParams params = window.getAttributes(); + params.height = height; + window.setAttributes(params); } /** @@ -114,11 +119,12 @@ public void setHeight(int height) { */ public void setXOffset(int offset) { Window window = getWindow(); - if (window != null) { - WindowManager.LayoutParams params = window.getAttributes(); - params.x = offset; - window.setAttributes(params); + if (window == null) { + return; } + WindowManager.LayoutParams params = window.getAttributes(); + params.x = offset; + window.setAttributes(params); } /** @@ -126,23 +132,24 @@ public void setXOffset(int offset) { */ public void setYOffset(int offset) { Window window = getWindow(); - if (window != null) { - WindowManager.LayoutParams params = window.getAttributes(); - params.y = offset; - window.setAttributes(params); + if (window == null) { + return; } + WindowManager.LayoutParams params = window.getAttributes(); + params.y = offset; + window.setAttributes(params); } /** - * 获取当前设置重心 + * 获取 Dialog 重心 */ public int getGravity() { Window window = getWindow(); - if (window != null) { - WindowManager.LayoutParams params = window.getAttributes(); - return params.gravity; + if (window == null) { + return Gravity.NO_GRAVITY; } - return Gravity.NO_GRAVITY; + WindowManager.LayoutParams params = window.getAttributes(); + return params.gravity; } /** @@ -150,9 +157,10 @@ public int getGravity() { */ public void setGravity(int gravity) { Window window = getWindow(); - if (window != null) { - window.setGravity(gravity); + if (window == null) { + return; } + window.setGravity(gravity); } /** @@ -160,9 +168,10 @@ public void setGravity(int gravity) { */ public void setWindowAnimations(@StyleRes int id) { Window window = getWindow(); - if (window != null) { - window.setWindowAnimations(id); + if (window == null) { + return; } + window.setWindowAnimations(id); } /** @@ -170,10 +179,10 @@ public void setWindowAnimations(@StyleRes int id) { */ public int getWindowAnimations() { Window window = getWindow(); - if (window != null) { - return window.getAttributes().windowAnimations; + if (window == null) { + return BaseDialog.ANIM_DEFAULT; } - return BaseDialog.ANIM_DEFAULT; + return window.getAttributes().windowAnimations; } /** @@ -181,12 +190,13 @@ public int getWindowAnimations() { */ public void setBackgroundDimEnabled(boolean enabled) { Window window = getWindow(); - if (window != null) { - if (enabled) { - window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - } else { - window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - } + if (window == null) { + return; + } + if (enabled) { + window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } } @@ -195,9 +205,10 @@ public void setBackgroundDimEnabled(boolean enabled) { */ public void setBackgroundDimAmount(@FloatRange(from = 0.0, to = 1.0) float dimAmount) { Window window = getWindow(); - if (window != null) { - window.setDimAmount(dimAmount); + if (window == null) { + return; } + window.setDimAmount(dimAmount); } @Override @@ -322,9 +333,10 @@ public void addOnDismissListener(@Nullable BaseDialog.OnDismissListener listener * @param listener 监听器对象 */ public void removeOnShowListener(@Nullable BaseDialog.OnShowListener listener) { - if (mShowListeners != null) { - mShowListeners.remove(listener); + if (mShowListeners == null) { + return; } + mShowListeners.remove(listener); } /** @@ -333,9 +345,10 @@ public void removeOnShowListener(@Nullable BaseDialog.OnShowListener listener) { * @param listener 监听器对象 */ public void removeOnCancelListener(@Nullable BaseDialog.OnCancelListener listener) { - if (mCancelListeners != null) { - mCancelListeners.remove(listener); + if (mCancelListeners == null) { + return; } + mCancelListeners.remove(listener); } /** @@ -344,9 +357,10 @@ public void removeOnCancelListener(@Nullable BaseDialog.OnCancelListener listene * @param listener 监听器对象 */ public void removeOnDismissListener(@Nullable BaseDialog.OnDismissListener listener) { - if (mDismissListeners != null) { - mDismissListeners.remove(listener); + if (mDismissListeners == null) { + return; } + mDismissListeners.remove(listener); } /** @@ -438,7 +452,7 @@ protected void onStop() { } @SuppressWarnings("unchecked") - public static class Builder implements + public static class Builder> implements ActivityAction, ResourcesAction, ClickAction, KeyboardAction { /** Activity 对象 */ @@ -454,41 +468,41 @@ public static class Builder implements private int mThemeId = R.style.BaseDialogTheme; /** 动画样式 */ private int mAnimStyle = BaseDialog.ANIM_DEFAULT; + + /** 宽度和高度 */ + private int mWidth = WindowManager.LayoutParams.WRAP_CONTENT; + private int mHeight = WindowManager.LayoutParams.WRAP_CONTENT; + /** 重心位置 */ private int mGravity = Gravity.NO_GRAVITY; - /** 水平偏移 */ private int mXOffset; /** 垂直偏移 */ private int mYOffset; - /** 宽度和高度 */ - private int mWidth = WindowManager.LayoutParams.WRAP_CONTENT; - private int mHeight = WindowManager.LayoutParams.WRAP_CONTENT; + /** 是否能够被取消 */ + private boolean mCancelable = true; + /** 点击空白是否能够取消 前提是这个对话框可以被取消 */ + private boolean mCanceledOnTouchOutside = true; /** 背景遮盖层开关 */ private boolean mBackgroundDimEnabled = true; /** 背景遮盖层透明度 */ private float mBackgroundDimAmount = 0.5f; - /** 是否能够被取消 */ - private boolean mCancelable = true; - /** 点击空白是否能够取消 前提是这个对话框可以被取消 */ - private boolean mCanceledOnTouchOutside = true; - /** Dialog 创建监听 */ private BaseDialog.OnCreateListener mCreateListener; /** Dialog 显示监听 */ - private List mShowListeners = new ArrayList<>(); + private final List mShowListeners = new ArrayList<>(); /** Dialog 取消监听 */ - private List mCancelListeners = new ArrayList<>(); + private final List mCancelListeners = new ArrayList<>(); /** Dialog 销毁监听 */ - private List mDismissListeners = new ArrayList<>(); + private final List mDismissListeners = new ArrayList<>(); /** Dialog 按键监听 */ private BaseDialog.OnKeyListener mKeyListener; /** 点击事件集合 */ - private SparseArray mClickArray; + private SparseArray> mClickArray; public Builder(Activity activity) { this((Context) activity); @@ -499,18 +513,6 @@ public Builder(Context context) { mActivity = getActivity(); } - /** - * 设置主题 id - */ - public B setThemeStyle(@StyleRes int id) { - mThemeId = id; - if (isCreated()) { - // Dialog 创建之后不能再设置主题 id - throw new IllegalStateException("are you ok?"); - } - return (B) this; - } - /** * 设置布局 */ @@ -542,10 +544,18 @@ public B setContentView(View view) { // 如果当前没有设置重心,就自动获取布局重心 if (mGravity == Gravity.NO_GRAVITY) { if (layoutParams instanceof FrameLayout.LayoutParams) { - setGravity(((FrameLayout.LayoutParams) layoutParams).gravity); + int gravity = ((FrameLayout.LayoutParams) layoutParams).gravity; + if (gravity != FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY) { + setGravity(gravity); + } } else if (layoutParams instanceof LinearLayout.LayoutParams) { - setGravity(((LinearLayout.LayoutParams) layoutParams).gravity); - } else { + int gravity = ((LinearLayout.LayoutParams) layoutParams).gravity; + if (gravity != FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY) { + setGravity(gravity); + } + } + + if (mGravity == Gravity.NO_GRAVITY) { // 默认重心是居中 setGravity(Gravity.CENTER); } @@ -554,35 +564,24 @@ public B setContentView(View view) { } /** - * 设置重心位置 - */ - public B setGravity(int gravity) { - // 适配布局反方向 - mGravity = Gravity.getAbsoluteGravity(gravity, getResources().getConfiguration().getLayoutDirection()); - if (isCreated()) { - mDialog.setGravity(gravity); - } - return (B) this; - } - - /** - * 设置水平偏移 + * 设置主题 id */ - public B setXOffset(int offset) { - mXOffset = offset; + public B setThemeStyle(@StyleRes int id) { + mThemeId = id; if (isCreated()) { - mDialog.setXOffset(offset); + // Dialog 创建之后不能再设置主题 id + throw new IllegalStateException("are you ok?"); } return (B) this; } /** - * 设置垂直偏移 + * 设置动画,已经封装好几种样式,具体可见{@link AnimAction}类 */ - public B setYOffset(int offset) { - mYOffset = offset; + public B setAnimStyle(@StyleRes int id) { + mAnimStyle = id; if (isCreated()) { - mDialog.setYOffset(offset); + mDialog.setWindowAnimations(id); } return (B) this; } @@ -631,6 +630,40 @@ public B setHeight(int height) { return (B) this; } + /** + * 设置重心位置 + */ + public B setGravity(int gravity) { + // 适配布局反方向 + mGravity = Gravity.getAbsoluteGravity(gravity, getResources().getConfiguration().getLayoutDirection()); + if (isCreated()) { + mDialog.setGravity(gravity); + } + return (B) this; + } + + /** + * 设置水平偏移 + */ + public B setXOffset(int offset) { + mXOffset = offset; + if (isCreated()) { + mDialog.setXOffset(offset); + } + return (B) this; + } + + /** + * 设置垂直偏移 + */ + public B setYOffset(int offset) { + mYOffset = offset; + if (isCreated()) { + mDialog.setYOffset(offset); + } + return (B) this; + } + /** * 是否可以取消 */ @@ -653,17 +686,6 @@ public B setCanceledOnTouchOutside(boolean cancel) { return (B) this; } - /** - * 设置动画,已经封装好几种样式,具体可见{@link AnimAction}类 - */ - public B setAnimStyle(@StyleRes int id) { - mAnimStyle = id; - if (isCreated()) { - mDialog.setWindowAnimations(id); - } - return (B) this; - } - /** * 设置背景遮盖层开关 */ @@ -792,7 +814,7 @@ public B setImageDrawable(@IdRes int id, Drawable drawable) { /** * 设置点击事件 */ - public B setOnClickListener(@IdRes int id, @NonNull BaseDialog.OnClickListener listener) { + public B setOnClickListener(@IdRes int id, @NonNull BaseDialog.OnClickListener listener) { if (mClickArray == null) { mClickArray = new SparseArray<>(); } @@ -901,11 +923,7 @@ public BaseDialog create() { * 显示 */ public void show() { - if (mActivity == null) { - return; - } - - if (mActivity.isFinishing() || mActivity.isDestroyed()) { + if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) { return; } @@ -924,11 +942,7 @@ public void show() { * 销毁当前 Dialog */ public void dismiss() { - if (mActivity == null) { - return; - } - - if (mActivity.isFinishing() || mActivity.isDestroyed()) { + if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) { return; } @@ -955,7 +969,7 @@ public boolean isCreated() { * 当前 Dialog 是否显示了 */ public boolean isShowing() { - return mDialog != null && mDialog.isShowing(); + return isCreated() && mDialog.isShowing(); } /** @@ -969,33 +983,33 @@ protected BaseDialog createDialog(Context context, @StyleRes int themeId) { /** * 延迟执行 */ - public final void post(Runnable r) { + public final void post(Runnable runnable) { if (isShowing()) { - mDialog.post(r); + mDialog.post(runnable); } else { - addOnShowListener(new ShowPostWrapper(r)); + addOnShowListener(new ShowPostWrapper(runnable)); } } /** * 延迟一段时间执行 */ - public final void postDelayed(Runnable r, long delayMillis) { + public final void postDelayed(Runnable runnable, long delayMillis) { if (isShowing()) { - mDialog.postDelayed(r, delayMillis); + mDialog.postDelayed(runnable, delayMillis); } else { - addOnShowListener(new ShowPostDelayedWrapper(r, delayMillis)); + addOnShowListener(new ShowPostDelayedWrapper(runnable, delayMillis)); } } /** * 在指定的时间执行 */ - public final void postAtTime(Runnable r, long uptimeMillis) { + public final void postAtTime(Runnable runnable, long uptimeMillis) { if (isShowing()) { - mDialog.postAtTime(r, uptimeMillis); + mDialog.postAtTime(runnable, uptimeMillis); } else { - addOnShowListener(new ShowPostAtTimeWrapper(r, uptimeMillis)); + addOnShowListener(new ShowPostAtTimeWrapper(runnable, uptimeMillis)); } } @@ -1027,7 +1041,7 @@ public BaseDialog getDialog() { } /** - * Dialog 生命周期管理 + * Dialog 生命周期绑定 */ private static final class DialogLifecycle implements Application.ActivityLifecycleCallbacks, @@ -1062,14 +1076,17 @@ public void onActivityResumed(@NonNull Activity activity) { return; } - if (mDialog != null && mDialog.isShowing()) { - // 还原 Dialog 动画样式(这里必须要使用延迟设置,否则还是有一定几率会出现) - mDialog.postDelayed(() -> { - if (mDialog != null && mDialog.isShowing()) { - mDialog.setWindowAnimations(mDialogAnim); - } - }, 100); + if (mDialog == null || !mDialog.isShowing()) { + return; } + + // 还原 Dialog 动画样式(这里必须要使用延迟设置,否则还是有一定几率会出现) + mDialog.postDelayed(() -> { + if (mDialog == null || !mDialog.isShowing()) { + return; + } + mDialog.setWindowAnimations(mDialogAnim); + }, 100); } @Override @@ -1078,12 +1095,14 @@ public void onActivityPaused(@NonNull Activity activity) { return; } - if (mDialog != null && mDialog.isShowing()) { - // 获取 Dialog 动画样式 - mDialogAnim = mDialog.getWindowAnimations(); - // 设置 Dialog 无动画效果 - mDialog.setWindowAnimations(BaseDialog.ANIM_EMPTY); + if (mDialog == null || !mDialog.isShowing()) { + return; } + + // 获取 Dialog 动画样式 + mDialogAnim = mDialog.getWindowAnimations(); + // 设置 Dialog 无动画效果 + mDialog.setWindowAnimations(BaseDialog.ANIM_EMPTY); } @Override @@ -1098,17 +1117,18 @@ public void onActivityDestroyed(@NonNull Activity activity) { return; } - if (mDialog != null) { - mDialog.removeOnShowListener(this); - mDialog.removeOnDismissListener(this); - if (mDialog.isShowing()) { - mDialog.dismiss(); - } - mDialog = null; - } unregisterActivityLifecycleCallbacks(); - // 释放 Activity 对象 mActivity = null; + + if (mDialog == null) { + return; + } + mDialog.removeOnShowListener(this); + mDialog.removeOnDismissListener(this); + if (mDialog.isShowing()) { + mDialog.dismiss(); + } + mDialog = null; } @Override @@ -1166,36 +1186,41 @@ private ListenersWrapper(T referent) { @Override public void onShow(DialogInterface dialog) { - if (get() != null) { - get().onShow(dialog); + if (get() == null) { + return; } + get().onShow(dialog); } @Override public void onCancel(DialogInterface dialog) { - if (get() != null) { - get().onCancel(dialog); + if (get() == null) { + return; } + get().onCancel(dialog); } @Override public void onDismiss(DialogInterface dialog) { - if (get() != null) { - get().onDismiss(dialog); + if (get() == null) { + return; } + get().onDismiss(dialog); } } /** * 点击事件包装类 */ + @SuppressWarnings("rawtypes") private static final class ViewClickWrapper implements View.OnClickListener { private final BaseDialog mDialog; + @Nullable private final BaseDialog.OnClickListener mListener; - private ViewClickWrapper(BaseDialog dialog, BaseDialog.OnClickListener listener) { + private ViewClickWrapper(BaseDialog dialog, @Nullable BaseDialog.OnClickListener listener) { mDialog = dialog; mListener = listener; } @@ -1203,6 +1228,9 @@ private ViewClickWrapper(BaseDialog dialog, BaseDialog.OnClickListener listener) @SuppressWarnings("unchecked") @Override public final void onClick(View view) { + if (mListener == null) { + return; + } mListener.onClick(mDialog, view); } } @@ -1221,9 +1249,10 @@ private ShowListenerWrapper(DialogInterface.OnShowListener referent) { @Override public void onShow(BaseDialog dialog) { // 在横竖屏切换后监听对象会为空 - if (get() != null) { - get().onShow(dialog); + if (get() == null) { + return; } + get().onShow(dialog); } } @@ -1241,9 +1270,10 @@ private CancelListenerWrapper(DialogInterface.OnCancelListener referent) { @Override public void onCancel(BaseDialog dialog) { // 在横竖屏切换后监听对象会为空 - if (get() != null) { - get().onCancel(dialog); + if (get() == null) { + return; } + get().onCancel(dialog); } } @@ -1261,9 +1291,10 @@ private DismissListenerWrapper(DialogInterface.OnDismissListener referent) { @Override public void onDismiss(BaseDialog dialog) { // 在横竖屏切换后监听对象会为空 - if (get() != null) { - get().onDismiss(dialog); + if (get() == null) { + return; } + get().onDismiss(dialog); } } @@ -1282,10 +1313,10 @@ private KeyListenerWrapper(BaseDialog.OnKeyListener listener) { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { // 在横竖屏切换后监听对象会为空 - if (mListener != null && dialog instanceof BaseDialog) { - return mListener.onKey((BaseDialog) dialog, event); + if (mListener == null || !(dialog instanceof BaseDialog)) { + return false; } - return false; + return mListener.onKey((BaseDialog) dialog, event); } } @@ -1296,16 +1327,17 @@ private static final class ShowPostWrapper implements OnShowListener { private final Runnable mRunnable; - private ShowPostWrapper(Runnable r) { - mRunnable = r; + private ShowPostWrapper(Runnable runnable) { + mRunnable = runnable; } @Override public void onShow(BaseDialog dialog) { - if (mRunnable != null) { - dialog.removeOnShowListener(this); - dialog.post(mRunnable); + if (mRunnable == null) { + return; } + dialog.removeOnShowListener(this); + dialog.post(mRunnable); } } @@ -1324,10 +1356,11 @@ private ShowPostDelayedWrapper(Runnable r, long delayMillis) { @Override public void onShow(BaseDialog dialog) { - if (mRunnable != null) { - dialog.removeOnShowListener(this); - dialog.postDelayed(mRunnable, mDelayMillis); + if (mRunnable == null) { + return; } + dialog.removeOnShowListener(this); + dialog.postDelayed(mRunnable, mDelayMillis); } } @@ -1346,10 +1379,11 @@ private ShowPostAtTimeWrapper(Runnable r, long uptimeMillis) { @Override public void onShow(BaseDialog dialog) { - if (mRunnable != null) { - dialog.removeOnShowListener(this); - dialog.postAtTime(mRunnable, mUptimeMillis); + if (mRunnable == null) { + return; } + dialog.removeOnShowListener(this); + dialog.postAtTime(mRunnable, mUptimeMillis); } } @@ -1357,6 +1391,10 @@ public void onShow(BaseDialog dialog) { * 点击监听器 */ public interface OnClickListener { + + /** + * 点击事件触发了 + */ void onClick(BaseDialog dialog, V view); } diff --git a/base/src/main/java/com/hjq/base/BaseFragment.java b/library/base/src/main/java/com/hjq/base/BaseFragment.java similarity index 96% rename from base/src/main/java/com/hjq/base/BaseFragment.java rename to library/base/src/main/java/com/hjq/base/BaseFragment.java index 9553baf5..ba11be70 100644 --- a/base/src/main/java/com/hjq/base/BaseFragment.java +++ b/library/base/src/main/java/com/hjq/base/BaseFragment.java @@ -1,6 +1,7 @@ package com.hjq.base; import android.app.Activity; +import android.app.Application; import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -27,7 +28,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : Fragment 基类 + * desc : Fragment 技术基类 */ public abstract class BaseFragment extends Fragment implements ActivityAction, ResourcesAction, HandlerAction, ClickAction, BundleAction, KeyboardAction { @@ -127,6 +128,13 @@ public A getAttachActivity() { return mActivity; } + /** + * 获取 Application 对象 + */ + public Application getApplication() { + return mActivity != null ? mActivity.getApplication() : null; + } + /** * 获取布局 ID */ diff --git a/base/src/main/java/com/hjq/base/BasePopupWindow.java b/library/base/src/main/java/com/hjq/base/BasePopupWindow.java similarity index 78% rename from base/src/main/java/com/hjq/base/BasePopupWindow.java rename to library/base/src/main/java/com/hjq/base/BasePopupWindow.java index 9e791953..34ab449a 100644 --- a/base/src/main/java/com/hjq/base/BasePopupWindow.java +++ b/library/base/src/main/java/com/hjq/base/BasePopupWindow.java @@ -3,11 +3,13 @@ import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.app.Activity; +import android.app.Application; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Bundle; import android.util.SparseArray; import android.view.Gravity; import android.view.LayoutInflater; @@ -47,7 +49,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2019/09/16 - * desc : PopupWindow 基类 + * desc : PopupWindow 技术基类 */ public class BasePopupWindow extends PopupWindow implements ActivityAction, HandlerAction, ClickAction, @@ -77,7 +79,7 @@ public Context getContext() { */ @Deprecated @Override - public void setOnDismissListener(PopupWindow.OnDismissListener listener) { + public void setOnDismissListener(@Nullable PopupWindow.OnDismissListener listener) { if (listener == null) { return; } @@ -115,9 +117,10 @@ public void addOnDismissListener(@Nullable BasePopupWindow.OnDismissListener lis * @param listener 监听器对象 */ public void removeOnShowListener(@Nullable BasePopupWindow.OnShowListener listener) { - if (mShowListeners != null) { - mShowListeners.remove(listener); + if (mShowListeners == null) { + return; } + mShowListeners.remove(listener); } /** @@ -126,9 +129,10 @@ public void removeOnShowListener(@Nullable BasePopupWindow.OnShowListener listen * @param listener 监听器对象 */ public void removeOnDismissListener(@Nullable BasePopupWindow.OnDismissListener listener) { - if (mDismissListeners != null) { - mDismissListeners.remove(listener); + if (mDismissListeners == null) { + return; } + mDismissListeners.remove(listener); } /** @@ -151,10 +155,12 @@ private void setOnDismissListeners(@Nullable List> implements private final Activity mActivity; /** Context 对象 */ private final Context mContext; - /** PopupWindow 布局 */ - private View mContentView; /** PopupWindow 对象 */ private BasePopupWindow mPopupWindow; - - /** PopupWindow 创建监听 */ - private BasePopupWindow.OnCreateListener mCreateListener; - /** PopupWindow 显示监听 */ - private final List mShowListeners = new ArrayList<>(); - /** PopupWindow 销毁监听 */ - private final List mDismissListeners = new ArrayList<>(); + /** PopupWindow 布局 */ + private View mContentView; /** 动画样式 */ private int mAnimations = BasePopupWindow.ANIM_DEFAULT; - /** 重心位置 */ - private int mGravity = DEFAULT_ANCHORED_GRAVITY; /** 宽度和高度 */ private int mWidth = WindowManager.LayoutParams.WRAP_CONTENT; private int mHeight = WindowManager.LayoutParams.WRAP_CONTENT; + /** 重心位置 */ + private int mGravity = DEFAULT_ANCHORED_GRAVITY; + /** 水平偏移 */ + private int mXOffset; + /** 垂直偏移 */ + private int mYOffset; + /** 是否可触摸 */ private boolean mTouchable = true; /** 是否有焦点 */ @@ -306,10 +310,12 @@ public static class Builder> implements /** 背景遮盖层透明度 */ private float mBackgroundDimAmount; - /** 水平偏移 */ - private int mXOffset; - /** 垂直偏移 */ - private int mYOffset; + /** PopupWindow 创建监听 */ + private BasePopupWindow.OnCreateListener mCreateListener; + /** PopupWindow 显示监听 */ + private final List mShowListeners = new ArrayList<>(); + /** PopupWindow 销毁监听 */ + private final List mDismissListeners = new ArrayList<>(); /** 点击事件集合 */ private SparseArray> mClickArray; @@ -343,22 +349,30 @@ public B setContentView(View view) { return (B) this; } - ViewGroup.LayoutParams params = mContentView.getLayoutParams(); - if (params != null && + ViewGroup.LayoutParams layoutParams = mContentView.getLayoutParams(); + if (layoutParams != null && mWidth == ViewGroup.LayoutParams.WRAP_CONTENT && mHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { // 如果当前 PopupWindow 的宽高设置了自适应,就以布局中设置的宽高为主 - setWidth(params.width); - setHeight(params.height); + setWidth(layoutParams.width); + setHeight(layoutParams.height); } // 如果当前没有设置重心,就自动获取布局重心 if (mGravity == DEFAULT_ANCHORED_GRAVITY) { - if (params instanceof FrameLayout.LayoutParams) { - setGravity(((FrameLayout.LayoutParams) params).gravity); - } else if (params instanceof LinearLayout.LayoutParams) { - setGravity(((LinearLayout.LayoutParams) params).gravity); - } else { + if (layoutParams instanceof FrameLayout.LayoutParams) { + int gravity = ((FrameLayout.LayoutParams) layoutParams).gravity; + if (gravity != FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY) { + setGravity(gravity); + } + } else if (layoutParams instanceof LinearLayout.LayoutParams) { + int gravity = ((LinearLayout.LayoutParams) layoutParams).gravity; + if (gravity != FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY) { + setGravity(gravity); + } + } + + if (mGravity == Gravity.NO_GRAVITY) { // 默认重心是居中 setGravity(Gravity.CENTER); } @@ -367,11 +381,13 @@ public B setContentView(View view) { } /** - * 设置重心位置 + * 设置动画,已经封装好几种样式,具体可见{@link AnimAction}类 */ - public B setGravity(int gravity) { - // 适配布局反方向 - mGravity = Gravity.getAbsoluteGravity(gravity, getResources().getConfiguration().getLayoutDirection()); + public B setAnimStyle(@StyleRes int id) { + mAnimations = id; + if (isCreated()) { + mPopupWindow.setAnimationStyle(id); + } return (B) this; } @@ -415,6 +431,31 @@ public B setHeight(int height) { return (B) this; } + /** + * 设置重心位置 + */ + public B setGravity(int gravity) { + // 适配布局反方向 + mGravity = Gravity.getAbsoluteGravity(gravity, getResources().getConfiguration().getLayoutDirection()); + return (B) this; + } + + /** + * 设置水平偏移量 + */ + public B setXOffset(int offset) { + mXOffset = offset; + return (B) this; + } + + /** + * 设置垂直偏移量 + */ + public B setYOffset(int offset) { + mYOffset = offset; + return (B) this; + } + /** * 是否可触摸 */ @@ -448,33 +489,6 @@ public B setOutsideTouchable(boolean outsideTouchable) { return (B) this; } - /** - * 设置水平偏移量 - */ - public B setXOffset(int offset) { - mXOffset = offset; - return (B) this; - } - - /** - * 设置垂直偏移量 - */ - public B setYOffset(int offset) { - mYOffset = offset; - return (B) this; - } - - /** - * 设置动画,已经封装好几种样式,具体可见{@link AnimAction}类 - */ - public B setAnimStyle(@StyleRes int id) { - mAnimations = id; - if (isCreated()) { - mPopupWindow.setAnimationStyle(id); - } - return (B) this; - } - /** * 设置背景遮盖层的透明度 */ @@ -573,7 +587,7 @@ public B setImageDrawable(@IdRes int id, Drawable drawable) { /** * 设置点击事件 */ - public B setOnClickListener(@IdRes int id, @NonNull BasePopupWindow.OnClickListener listener) { + public B setOnClickListener(@IdRes int id, @NonNull BasePopupWindow.OnClickListener listener) { if (mClickArray == null) { mClickArray = new SparseArray<>(); } @@ -651,6 +665,11 @@ public BasePopupWindow create() { } } + // 将 PopupWindow 的生命周期和 Activity 绑定在一起 + if (mActivity != null) { + PopupWindowLifecycle.with(mActivity, mPopupWindow); + } + if (mCreateListener != null) { mCreateListener.onCreate(mPopupWindow); } @@ -662,11 +681,7 @@ public BasePopupWindow create() { * 显示为下拉 */ public void showAsDropDown(View anchor) { - if (mActivity == null) { - return; - } - - if (mActivity.isFinishing() || mActivity.isDestroyed()) { + if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) { return; } @@ -680,11 +695,7 @@ public void showAsDropDown(View anchor) { * 显示在指定位置 */ public void showAtLocation(View parent) { - if (mActivity == null) { - return; - } - - if (mActivity.isFinishing() || mActivity.isDestroyed()) { + if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) { return; } @@ -710,18 +721,14 @@ public boolean isCreated() { * 当前 PopupWindow 是否显示了 */ public boolean isShowing() { - return mPopupWindow != null && mPopupWindow.isShowing(); + return isCreated() && mPopupWindow.isShowing(); } /** * 销毁当前 PopupWindow */ public void dismiss() { - if (mActivity == null) { - return; - } - - if (mActivity.isFinishing() || mActivity.isDestroyed()) { + if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) { return; } @@ -769,33 +776,135 @@ public BasePopupWindow getPopupWindow() { /** * 延迟执行 */ - public final void post(Runnable r) { + public final void post(Runnable runnable) { if (isShowing()) { - mPopupWindow.post(r); + mPopupWindow.post(runnable); } else { - addOnShowListener(new ShowPostWrapper(r)); + addOnShowListener(new ShowPostWrapper(runnable)); } } /** * 延迟一段时间执行 */ - public final void postDelayed(Runnable r, long delayMillis) { + public final void postDelayed(Runnable runnable, long delayMillis) { if (isShowing()) { - mPopupWindow.postDelayed(r, delayMillis); + mPopupWindow.postDelayed(runnable, delayMillis); } else { - addOnShowListener(new ShowPostDelayedWrapper(r, delayMillis)); + addOnShowListener(new ShowPostDelayedWrapper(runnable, delayMillis)); } } /** * 在指定的时间执行 */ - public final void postAtTime(Runnable r, long uptimeMillis) { + public final void postAtTime(Runnable runnable, long uptimeMillis) { if (isShowing()) { - mPopupWindow.postAtTime(r, uptimeMillis); + mPopupWindow.postAtTime(runnable, uptimeMillis); } else { - addOnShowListener(new ShowPostAtTimeWrapper(r, uptimeMillis)); + addOnShowListener(new ShowPostAtTimeWrapper(runnable, uptimeMillis)); + } + } + } + + /** + * PopupWindow 生命周期绑定 + */ + private static final class PopupWindowLifecycle implements + Application.ActivityLifecycleCallbacks, + BasePopupWindow.OnShowListener, + BasePopupWindow.OnDismissListener { + + private static void with(Activity activity, BasePopupWindow popupWindow) { + new PopupWindowLifecycle(activity, popupWindow); + } + + private BasePopupWindow mPopupWindow; + private Activity mActivity; + + private PopupWindowLifecycle(Activity activity, BasePopupWindow popupWindow) { + mActivity = activity; + popupWindow.addOnShowListener(this); + popupWindow.addOnDismissListener(this); + } + + @Override + public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {} + + @Override + public void onActivityStarted(@NonNull Activity activity) {} + + @Override + public void onActivityResumed(@NonNull Activity activity) {} + + @Override + public void onActivityPaused(@NonNull Activity activity) {} + + @Override + public void onActivityStopped(@NonNull Activity activity) {} + + @Override + public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {} + + @Override + public void onActivityDestroyed(@NonNull Activity activity) { + if (mActivity != activity) { + return; + } + + unregisterActivityLifecycleCallbacks(); + mActivity = null; + + if (mPopupWindow == null) { + return; + } + mPopupWindow.removeOnShowListener(this); + mPopupWindow.removeOnDismissListener(this); + if (mPopupWindow.isShowing()) { + mPopupWindow.dismiss(); + } + mPopupWindow = null; + } + + @Override + public void onShow(BasePopupWindow popupWindow) { + mPopupWindow = popupWindow; + registerActivityLifecycleCallbacks(); + } + + @Override + public void onDismiss(BasePopupWindow popupWindow) { + mPopupWindow = null; + unregisterActivityLifecycleCallbacks(); + } + + /** + * 注册 Activity 生命周期监听 + */ + private void registerActivityLifecycleCallbacks() { + if (mActivity == null) { + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + mActivity.registerActivityLifecycleCallbacks(this); + } else { + mActivity.getApplication().registerActivityLifecycleCallbacks(this); + } + } + + /** + * 反注册 Activity 生命周期监听 + */ + private void unregisterActivityLifecycleCallbacks() { + if (mActivity == null) { + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + mActivity.unregisterActivityLifecycleCallbacks(this); + } else { + mActivity.getApplication().unregisterActivityLifecycleCallbacks(this); } } } @@ -838,9 +947,10 @@ private DismissListenerWrapper(PopupWindow.OnDismissListener referent) { @Override public void onDismiss(BasePopupWindow popupWindow) { // 在横竖屏切换后监听对象会为空 - if (get() != null) { - get().onDismiss(); + if (get() == null) { + return; } + get().onDismiss(); } } @@ -852,9 +962,10 @@ private static final class ViewClickWrapper implements View.OnClickListener { private final BasePopupWindow mBasePopupWindow; + @Nullable private final BasePopupWindow.OnClickListener mListener; - private ViewClickWrapper(BasePopupWindow popupWindow, BasePopupWindow.OnClickListener listener) { + private ViewClickWrapper(BasePopupWindow popupWindow, @Nullable BasePopupWindow.OnClickListener listener) { mBasePopupWindow = popupWindow; mListener = listener; } @@ -862,6 +973,9 @@ private ViewClickWrapper(BasePopupWindow popupWindow, BasePopupWindow.OnClickLis @SuppressWarnings("unchecked") @Override public final void onClick(View view) { + if (mListener == null) { + return; + } mListener.onClick(mBasePopupWindow, view); } } @@ -873,16 +987,17 @@ private static final class ShowPostWrapper implements OnShowListener { private final Runnable mRunnable; - private ShowPostWrapper(Runnable r) { - mRunnable = r; + private ShowPostWrapper(Runnable runnable) { + mRunnable = runnable; } @Override - public void onShow(BasePopupWindow dialog) { - if (mRunnable != null) { - dialog.removeOnShowListener(this); - dialog.post(mRunnable); + public void onShow(BasePopupWindow popupWindow) { + if (mRunnable == null) { + return; } + popupWindow.removeOnShowListener(this); + popupWindow.post(mRunnable); } } @@ -894,17 +1009,18 @@ private static final class ShowPostDelayedWrapper implements OnShowListener { private final Runnable mRunnable; private final long mDelayMillis; - private ShowPostDelayedWrapper(Runnable r, long delayMillis) { - mRunnable = r; + private ShowPostDelayedWrapper(Runnable runnable, long delayMillis) { + mRunnable = runnable; mDelayMillis = delayMillis; } @Override - public void onShow(BasePopupWindow dialog) { - if (mRunnable != null) { - dialog.removeOnShowListener(this); - dialog.postDelayed(mRunnable, mDelayMillis); + public void onShow(BasePopupWindow popupWindow) { + if (mRunnable == null) { + return; } + popupWindow.removeOnShowListener(this); + popupWindow.postDelayed(mRunnable, mDelayMillis); } } @@ -916,17 +1032,18 @@ private static final class ShowPostAtTimeWrapper implements OnShowListener { private final Runnable mRunnable; private final long mUptimeMillis; - private ShowPostAtTimeWrapper(Runnable r, long uptimeMillis) { - mRunnable = r; + private ShowPostAtTimeWrapper(Runnable runnable, long uptimeMillis) { + mRunnable = runnable; mUptimeMillis = uptimeMillis; } @Override - public void onShow(BasePopupWindow dialog) { - if (mRunnable != null) { - dialog.removeOnShowListener(this); - dialog.postAtTime(mRunnable, mUptimeMillis); + public void onShow(BasePopupWindow popupWindow) { + if (mRunnable == null) { + return; } + popupWindow.removeOnShowListener(this); + popupWindow.postAtTime(mRunnable, mUptimeMillis); } } @@ -934,6 +1051,10 @@ public void onShow(BasePopupWindow dialog) { * 点击监听器 */ public interface OnClickListener { + + /** + * 点击事件触发了 + */ void onClick(BasePopupWindow popupWindow, V view); } diff --git a/base/src/main/java/com/hjq/base/BottomSheetDialog.java b/library/base/src/main/java/com/hjq/base/BottomSheetDialog.java similarity index 84% rename from base/src/main/java/com/hjq/base/BottomSheetDialog.java rename to library/base/src/main/java/com/hjq/base/BottomSheetDialog.java index 758c8712..06370a54 100644 --- a/base/src/main/java/com/hjq/base/BottomSheetDialog.java +++ b/library/base/src/main/java/com/hjq/base/BottomSheetDialog.java @@ -3,8 +3,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; -import android.os.Build; -import android.os.Build.VERSION; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; @@ -54,12 +52,22 @@ public BottomSheetDialog(@NonNull Context context, int themeResId) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); - if (window != null) { - if (VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - } - window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + if (window == null) { + return; } + + // 沉浸式状态栏 + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + // 隐藏底部导航栏 + View decorView = getWindow().getDecorView(); + int uiOptions = decorView.getSystemUiVisibility() | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + decorView.setSystemUiVisibility(uiOptions); + + window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); } @Override @@ -81,29 +89,34 @@ public void setContentView(View view, LayoutParams params) { @Override public void setCancelable(boolean cancelable) { super.setCancelable(cancelable); - if (mCancelable != cancelable) { - mCancelable = cancelable; - if (mBottomSheetBehavior != null) { - mBottomSheetBehavior.setHideable(cancelable); - } + if (mCancelable == cancelable) { + return; + } + mCancelable = cancelable; + + if (mBottomSheetBehavior == null) { + return; } + mBottomSheetBehavior.setHideable(cancelable); } @Override protected void onStart() { super.onStart(); - if (mBottomSheetBehavior != null && mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { - mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + + if (mBottomSheetBehavior == null || mBottomSheetBehavior.getState() != BottomSheetBehavior.STATE_HIDDEN) { + return; } + mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } @Override public void cancel() { - if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { + if (mBottomSheetBehavior == null || mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { super.cancel(); - } else { - mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + return; } + mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } @Override diff --git a/base/src/main/java/com/hjq/base/FragmentPagerAdapter.java b/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.java similarity index 88% rename from base/src/main/java/com/hjq/base/FragmentPagerAdapter.java rename to library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.java index de4cb190..9a7246aa 100644 --- a/base/src/main/java/com/hjq/base/FragmentPagerAdapter.java +++ b/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.java @@ -88,13 +88,16 @@ public void addFragment(F fragment) { public void addFragment(F fragment, CharSequence title) { mFragmentSet.add(fragment); mFragmentTitle.add(title); - if (mViewPager != null) { - notifyDataSetChanged(); - if (mLazyMode) { - mViewPager.setOffscreenPageLimit(getCount()); - } else { - mViewPager.setOffscreenPageLimit(1); - } + + if (mViewPager == null) { + return; + } + + notifyDataSetChanged(); + if (mLazyMode) { + mViewPager.setOffscreenPageLimit(getCount()); + } else { + mViewPager.setOffscreenPageLimit(1); } } @@ -109,11 +112,12 @@ public F getShowFragment() { * 获取某个 Fragment 的索引(没有就返回 -1) */ public int getFragmentIndex(Class clazz) { - if (clazz != null) { - for (int i = 0; i < mFragmentSet.size(); i++) { - if (clazz.getName().equals(mFragmentSet.get(i).getClass().getName())) { - return i; - } + if (clazz == null) { + return -1; + } + for (int i = 0; i < mFragmentSet.size(); i++) { + if (clazz.getName().equals(mFragmentSet.get(i).getClass().getName())) { + return i; } } return -1; diff --git a/base/src/main/java/com/hjq/base/RecyclerPagerAdapter.java b/library/base/src/main/java/com/hjq/base/RecyclerPagerAdapter.java similarity index 88% rename from base/src/main/java/com/hjq/base/RecyclerPagerAdapter.java rename to library/base/src/main/java/com/hjq/base/RecyclerPagerAdapter.java index 30f38f9d..eb8af08a 100644 --- a/base/src/main/java/com/hjq/base/RecyclerPagerAdapter.java +++ b/library/base/src/main/java/com/hjq/base/RecyclerPagerAdapter.java @@ -28,32 +28,32 @@ public RecyclerPagerAdapter(RecyclerView.Adapter adapter) { @Override public void onChanged() { - mAdapter.notifyDataSetChanged(); + notifyDataSetChanged(); } @Override public void onItemRangeChanged(int positionStart, int itemCount) { - mAdapter.notifyDataSetChanged(); + notifyDataSetChanged(); } @Override public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) { - mAdapter.notifyDataSetChanged(); + notifyDataSetChanged(); } @Override public void onItemRangeInserted(int positionStart, int itemCount) { - mAdapter.notifyDataSetChanged(); + notifyDataSetChanged(); } @Override public void onItemRangeRemoved(int positionStart, int itemCount) { - mAdapter.notifyDataSetChanged(); + notifyDataSetChanged(); } @Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - mAdapter.notifyDataSetChanged(); + notifyDataSetChanged(); } }); } diff --git a/base/src/main/java/com/hjq/base/action/ActivityAction.java b/library/base/src/main/java/com/hjq/base/action/ActivityAction.java similarity index 100% rename from base/src/main/java/com/hjq/base/action/ActivityAction.java rename to library/base/src/main/java/com/hjq/base/action/ActivityAction.java diff --git a/base/src/main/java/com/hjq/base/action/AnimAction.java b/library/base/src/main/java/com/hjq/base/action/AnimAction.java similarity index 100% rename from base/src/main/java/com/hjq/base/action/AnimAction.java rename to library/base/src/main/java/com/hjq/base/action/AnimAction.java diff --git a/base/src/main/java/com/hjq/base/action/BundleAction.java b/library/base/src/main/java/com/hjq/base/action/BundleAction.java similarity index 100% rename from base/src/main/java/com/hjq/base/action/BundleAction.java rename to library/base/src/main/java/com/hjq/base/action/BundleAction.java diff --git a/base/src/main/java/com/hjq/base/action/ClickAction.java b/library/base/src/main/java/com/hjq/base/action/ClickAction.java similarity index 79% rename from base/src/main/java/com/hjq/base/action/ClickAction.java rename to library/base/src/main/java/com/hjq/base/action/ClickAction.java index b0d1fcbb..dfd20186 100644 --- a/base/src/main/java/com/hjq/base/action/ClickAction.java +++ b/library/base/src/main/java/com/hjq/base/action/ClickAction.java @@ -3,6 +3,7 @@ import android.view.View; import androidx.annotation.IdRes; +import androidx.annotation.Nullable; /** * author : Android 轮子哥 @@ -18,7 +19,7 @@ default void setOnClickListener(@IdRes int... ids) { setOnClickListener(this, ids); } - default void setOnClickListener(View.OnClickListener listener, @IdRes int... ids) { + default void setOnClickListener(@Nullable View.OnClickListener listener, @IdRes int... ids) { for (int id : ids) { findViewById(id).setOnClickListener(listener); } @@ -28,7 +29,7 @@ default void setOnClickListener(View... views) { setOnClickListener(this, views); } - default void setOnClickListener(View.OnClickListener listener, View... views) { + default void setOnClickListener(@Nullable View.OnClickListener listener, View... views) { for (View view : views) { view.setOnClickListener(listener); } diff --git a/base/src/main/java/com/hjq/base/action/HandlerAction.java b/library/base/src/main/java/com/hjq/base/action/HandlerAction.java similarity index 68% rename from base/src/main/java/com/hjq/base/action/HandlerAction.java rename to library/base/src/main/java/com/hjq/base/action/HandlerAction.java index 12ec8d86..5044ae3d 100644 --- a/base/src/main/java/com/hjq/base/action/HandlerAction.java +++ b/library/base/src/main/java/com/hjq/base/action/HandlerAction.java @@ -24,33 +24,33 @@ default Handler getHandler() { /** * 延迟执行 */ - default boolean post(Runnable r) { - return postDelayed(r, 0); + default boolean post(Runnable runnable) { + return postDelayed(runnable, 0); } /** * 延迟一段时间执行 */ - default boolean postDelayed(Runnable r, long delayMillis) { + default boolean postDelayed(Runnable runnable, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } - return postAtTime(r, SystemClock.uptimeMillis() + delayMillis); + return postAtTime(runnable, SystemClock.uptimeMillis() + delayMillis); } /** * 在指定的时间执行 */ - default boolean postAtTime(Runnable r, long uptimeMillis) { + default boolean postAtTime(Runnable runnable, long uptimeMillis) { // 发送和当前对象相关的消息回调 - return HANDLER.postAtTime(r, this, uptimeMillis); + return HANDLER.postAtTime(runnable, this, uptimeMillis); } /** * 移除单个消息回调 */ - default void removeCallbacks(Runnable r) { - HANDLER.removeCallbacks(r); + default void removeCallbacks(Runnable runnable) { + HANDLER.removeCallbacks(runnable); } /** diff --git a/base/src/main/java/com/hjq/base/action/KeyboardAction.java b/library/base/src/main/java/com/hjq/base/action/KeyboardAction.java similarity index 71% rename from base/src/main/java/com/hjq/base/action/KeyboardAction.java rename to library/base/src/main/java/com/hjq/base/action/KeyboardAction.java index 0128fae0..33ec8326 100644 --- a/base/src/main/java/com/hjq/base/action/KeyboardAction.java +++ b/library/base/src/main/java/com/hjq/base/action/KeyboardAction.java @@ -13,7 +13,7 @@ public interface KeyboardAction { /** - * 显示软键盘 + * 显示软键盘,需要先 requestFocus 获取焦点,如果是在 Activity Create,那么需要延迟一段时间 */ default void showKeyboard(View view) { if (view == null) { @@ -21,9 +21,10 @@ default void showKeyboard(View view) { } InputMethodManager manager = (InputMethodManager) view.getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); - if (manager != null) { - manager.showSoftInput(view, 0); + if (manager == null) { + return; } + manager.showSoftInput(view, InputMethodManager.SHOW_FORCED); } /** @@ -35,9 +36,10 @@ default void hideKeyboard(View view) { } InputMethodManager manager = (InputMethodManager) view.getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); - if (manager != null) { - manager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + if (manager == null) { + return; } + manager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } /** @@ -49,8 +51,9 @@ default void toggleSoftInput(View view) { } InputMethodManager manager = (InputMethodManager) view.getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); - if (manager != null) { - manager.toggleSoftInput(0, 0); + if (manager == null) { + return; } + manager.toggleSoftInput(0, 0); } } \ No newline at end of file diff --git a/base/src/main/java/com/hjq/base/action/ResourcesAction.java b/library/base/src/main/java/com/hjq/base/action/ResourcesAction.java similarity index 100% rename from base/src/main/java/com/hjq/base/action/ResourcesAction.java rename to library/base/src/main/java/com/hjq/base/action/ResourcesAction.java diff --git a/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml new file mode 100644 index 00000000..75fba692 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -170.6667dp + -85.3333dp + -56.8889dp + -34.1333dp + -28.4444dp + -22.7556dp + -14.2222dp + -5.6889dp + -2.8444dp + + 0.2844dp + 1.4222dp + 2.8444dp + 4.2667dp + 5.6889dp + 7.1111dp + 8.5333dp + 9.9556dp + 11.3778dp + 12.8000dp + 14.2222dp + 17.0667dp + 19.9111dp + 22.7556dp + 25.6000dp + 28.4444dp + 31.2889dp + 34.1333dp + 36.9778dp + 39.8222dp + 42.6667dp + 45.5111dp + 48.3556dp + 51.2000dp + 54.0444dp + 56.8889dp + 59.7333dp + 62.5778dp + 65.4222dp + 68.2667dp + 71.1111dp + 73.9556dp + 76.8000dp + 79.6444dp + 82.4889dp + 85.3333dp + 88.1778dp + 91.0222dp + 93.8667dp + 96.7111dp + 99.5556dp + 102.4000dp + 105.2444dp + 108.0889dp + 110.9333dp + 113.7778dp + 116.6222dp + 119.4667dp + 122.3111dp + 125.1556dp + 128.0000dp + 130.8444dp + 133.6889dp + 136.5333dp + 139.3778dp + 142.2222dp + 145.0667dp + 147.9111dp + 150.7556dp + 153.6000dp + 156.4444dp + 159.2889dp + 162.1333dp + 164.9778dp + 167.8222dp + 170.6667dp + 173.5111dp + 176.3556dp + 179.2000dp + 182.0444dp + 184.8889dp + 187.7333dp + 190.5778dp + 193.4222dp + 196.2667dp + 199.1111dp + 201.9556dp + 204.8000dp + 207.6444dp + 210.4889dp + 213.3333dp + 216.1778dp + 219.0222dp + 221.8667dp + 224.7111dp + 227.5556dp + 230.4000dp + 233.2444dp + 236.0889dp + 238.9333dp + 241.7778dp + 244.6222dp + 247.4667dp + 250.3111dp + 253.1556dp + 256.0000dp + 258.8444dp + 261.6889dp + 264.5333dp + 267.3778dp + 270.2222dp + 273.0667dp + 275.9111dp + 278.7556dp + 281.6000dp + 284.4444dp + 287.2889dp + 290.1333dp + 292.9778dp + 295.8222dp + 298.6667dp + 301.5111dp + 304.3556dp + 307.2000dp + 310.0444dp + 312.8889dp + 315.7333dp + 318.5778dp + 321.4222dp + 324.2667dp + 327.1111dp + 329.9556dp + 332.8000dp + 335.6444dp + 338.4889dp + 341.3333dp + 344.1778dp + 347.0222dp + 349.8667dp + 352.7111dp + 355.5556dp + 358.4000dp + 361.2444dp + 364.0889dp + 366.9333dp + 369.7778dp + 372.6222dp + 375.4667dp + 378.3111dp + 381.1556dp + 384.0000dp + 386.8444dp + 389.6889dp + 392.5333dp + 395.3778dp + 398.2222dp + 401.0667dp + 403.9111dp + 406.7556dp + 409.6000dp + 412.4444dp + 415.2889dp + 418.1333dp + 420.9778dp + 423.8222dp + 426.6667dp + 429.5111dp + 432.3556dp + 435.2000dp + 438.0444dp + 440.8889dp + 443.7333dp + 446.5778dp + 449.4222dp + 452.2667dp + 455.1111dp + 457.9556dp + 460.8000dp + 463.6444dp + 466.4889dp + 469.3333dp + 472.1778dp + 475.0222dp + 477.8667dp + 480.7111dp + 483.5556dp + 486.4000dp + 489.2444dp + 492.0889dp + 494.9333dp + 497.7778dp + 500.6222dp + 503.4667dp + 506.3111dp + 509.1556dp + 512.0000dp + 514.8444dp + 517.6889dp + 520.5333dp + 523.3778dp + 526.2222dp + 529.0667dp + 531.9111dp + 534.7556dp + 537.6000dp + 540.4444dp + 543.2889dp + 546.1333dp + 548.9778dp + 551.8222dp + 554.6667dp + 557.5111dp + 560.3556dp + 563.2000dp + 566.0444dp + 568.8889dp + 571.7333dp + 574.5778dp + 577.4222dp + 580.2667dp + 583.1111dp + 585.9556dp + 588.8000dp + 591.6444dp + 594.4889dp + 597.3333dp + 600.1778dp + 603.0222dp + 605.8667dp + 608.7111dp + 611.5556dp + 614.4000dp + 617.2444dp + 620.0889dp + 622.9333dp + 625.7778dp + 628.6222dp + 631.4667dp + 634.3111dp + 637.1556dp + 640.0000dp + 642.8444dp + 645.6889dp + 648.5333dp + 651.3778dp + 654.2222dp + 657.0667dp + 659.9111dp + 662.7556dp + 665.6000dp + 668.4444dp + 671.2889dp + 674.1333dp + 676.9778dp + 679.8222dp + 682.6667dp + 685.5111dp + 688.3556dp + 691.2000dp + 694.0444dp + 696.8889dp + 699.7333dp + 702.5778dp + 705.4222dp + 708.2667dp + 711.1111dp + 713.9556dp + 716.8000dp + 719.6444dp + 722.4889dp + 725.3333dp + 728.1778dp + 731.0222dp + 733.8667dp + 736.7111dp + 739.5556dp + 742.4000dp + 745.2444dp + 748.0889dp + 750.9333dp + 753.7778dp + 756.6222dp + 759.4667dp + 762.3111dp + 765.1556dp + 768.0000dp + 770.8444dp + 773.6889dp + 776.5333dp + 779.3778dp + 782.2222dp + 785.0667dp + 787.9111dp + 790.7556dp + 793.6000dp + 796.4444dp + 799.2889dp + 802.1333dp + 804.9778dp + 807.8222dp + 810.6667dp + 813.5111dp + 816.3556dp + 819.2000dp + 822.0444dp + 824.8889dp + 827.7333dp + 830.5778dp + 833.4222dp + 836.2667dp + 839.1111dp + 841.9556dp + 844.8000dp + 847.6444dp + 850.4889dp + 853.3333dp + 856.1778dp + 859.0222dp + 861.8667dp + 864.7111dp + 867.5556dp + 870.4000dp + 873.2444dp + 876.0889dp + 878.9333dp + 881.7778dp + 884.6222dp + 887.4667dp + 890.3111dp + 893.1556dp + 896.0000dp + 898.8444dp + 901.6889dp + 904.5333dp + 907.3778dp + 910.2222dp + 913.0667dp + 915.9111dp + 918.7556dp + 921.6000dp + 924.4444dp + 927.2889dp + 930.1333dp + 932.9778dp + 935.8222dp + 938.6667dp + 941.5111dp + 944.3556dp + 947.2000dp + 950.0444dp + 952.8889dp + 955.7333dp + 958.5778dp + 961.4222dp + 964.2667dp + 967.1111dp + 969.9556dp + 972.8000dp + 975.6444dp + 978.4889dp + 981.3333dp + 984.1778dp + 987.0222dp + 989.8667dp + 992.7111dp + 995.5556dp + 998.4000dp + 1001.2444dp + 1004.0889dp + 1006.9333dp + 1009.7778dp + 1012.6222dp + 1015.4667dp + 1018.3111dp + 1021.1556dp + 1024.0000dp + 1038.2222dp + 1052.4444dp + 1137.7778dp + 1166.2222dp + 1200.3556dp + 1342.5778dp + 1422.2222dp + 1706.6667dp + 1820.4444dp + 2048.0000dp + diff --git a/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml new file mode 100644 index 00000000..e36cb3c4 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 17.0667sp + 19.9111sp + 22.7556sp + 25.6000sp + 28.4444sp + 31.2889sp + 34.1333sp + 36.9778sp + 39.8222sp + 42.6667sp + 45.5111sp + 48.3556sp + 51.2000sp + 54.0444sp + 56.8889sp + 59.7333sp + 62.5778sp + 65.4222sp + 68.2667sp + 71.1111sp + 79.6444sp + 85.3333sp + 91.0222sp + 96.7111sp + 102.4000sp + 108.0889sp + 113.7778sp + 119.4667sp + 136.5333sp + diff --git a/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml new file mode 100644 index 00000000..df38b72c --- /dev/null +++ b/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -213.3333dp + -106.6667dp + -71.1111dp + -42.6667dp + -35.5556dp + -28.4444dp + -17.7778dp + -7.1111dp + -3.5556dp + + 0.3556dp + 1.7778dp + 3.5556dp + 5.3333dp + 7.1111dp + 8.8889dp + 10.6667dp + 12.4444dp + 14.2222dp + 16.0000dp + 17.7778dp + 21.3333dp + 24.8889dp + 28.4444dp + 32.0000dp + 35.5556dp + 39.1111dp + 42.6667dp + 46.2222dp + 49.7778dp + 53.3333dp + 56.8889dp + 60.4444dp + 64.0000dp + 67.5556dp + 71.1111dp + 74.6667dp + 78.2222dp + 81.7778dp + 85.3333dp + 88.8889dp + 92.4444dp + 96.0000dp + 99.5556dp + 103.1111dp + 106.6667dp + 110.2222dp + 113.7778dp + 117.3333dp + 120.8889dp + 124.4444dp + 128.0000dp + 131.5556dp + 135.1111dp + 138.6667dp + 142.2222dp + 145.7778dp + 149.3333dp + 152.8889dp + 156.4444dp + 160.0000dp + 163.5556dp + 167.1111dp + 170.6667dp + 174.2222dp + 177.7778dp + 181.3333dp + 184.8889dp + 188.4444dp + 192.0000dp + 195.5556dp + 199.1111dp + 202.6667dp + 206.2222dp + 209.7778dp + 213.3333dp + 216.8889dp + 220.4444dp + 224.0000dp + 227.5556dp + 231.1111dp + 234.6667dp + 238.2222dp + 241.7778dp + 245.3333dp + 248.8889dp + 252.4444dp + 256.0000dp + 259.5556dp + 263.1111dp + 266.6667dp + 270.2222dp + 273.7778dp + 277.3333dp + 280.8889dp + 284.4444dp + 288.0000dp + 291.5556dp + 295.1111dp + 298.6667dp + 302.2222dp + 305.7778dp + 309.3333dp + 312.8889dp + 316.4444dp + 320.0000dp + 323.5556dp + 327.1111dp + 330.6667dp + 334.2222dp + 337.7778dp + 341.3333dp + 344.8889dp + 348.4444dp + 352.0000dp + 355.5556dp + 359.1111dp + 362.6667dp + 366.2222dp + 369.7778dp + 373.3333dp + 376.8889dp + 380.4444dp + 384.0000dp + 387.5556dp + 391.1111dp + 394.6667dp + 398.2222dp + 401.7778dp + 405.3333dp + 408.8889dp + 412.4444dp + 416.0000dp + 419.5556dp + 423.1111dp + 426.6667dp + 430.2222dp + 433.7778dp + 437.3333dp + 440.8889dp + 444.4444dp + 448.0000dp + 451.5556dp + 455.1111dp + 458.6667dp + 462.2222dp + 465.7778dp + 469.3333dp + 472.8889dp + 476.4444dp + 480.0000dp + 483.5556dp + 487.1111dp + 490.6667dp + 494.2222dp + 497.7778dp + 501.3333dp + 504.8889dp + 508.4444dp + 512.0000dp + 515.5556dp + 519.1111dp + 522.6667dp + 526.2222dp + 529.7778dp + 533.3333dp + 536.8889dp + 540.4444dp + 544.0000dp + 547.5556dp + 551.1111dp + 554.6667dp + 558.2222dp + 561.7778dp + 565.3333dp + 568.8889dp + 572.4444dp + 576.0000dp + 579.5556dp + 583.1111dp + 586.6667dp + 590.2222dp + 593.7778dp + 597.3333dp + 600.8889dp + 604.4444dp + 608.0000dp + 611.5556dp + 615.1111dp + 618.6667dp + 622.2222dp + 625.7778dp + 629.3333dp + 632.8889dp + 636.4444dp + 640.0000dp + 643.5556dp + 647.1111dp + 650.6667dp + 654.2222dp + 657.7778dp + 661.3333dp + 664.8889dp + 668.4444dp + 672.0000dp + 675.5556dp + 679.1111dp + 682.6667dp + 686.2222dp + 689.7778dp + 693.3333dp + 696.8889dp + 700.4444dp + 704.0000dp + 707.5556dp + 711.1111dp + 714.6667dp + 718.2222dp + 721.7778dp + 725.3333dp + 728.8889dp + 732.4444dp + 736.0000dp + 739.5556dp + 743.1111dp + 746.6667dp + 750.2222dp + 753.7778dp + 757.3333dp + 760.8889dp + 764.4444dp + 768.0000dp + 771.5556dp + 775.1111dp + 778.6667dp + 782.2222dp + 785.7778dp + 789.3333dp + 792.8889dp + 796.4444dp + 800.0000dp + 803.5556dp + 807.1111dp + 810.6667dp + 814.2222dp + 817.7778dp + 821.3333dp + 824.8889dp + 828.4444dp + 832.0000dp + 835.5556dp + 839.1111dp + 842.6667dp + 846.2222dp + 849.7778dp + 853.3333dp + 856.8889dp + 860.4444dp + 864.0000dp + 867.5556dp + 871.1111dp + 874.6667dp + 878.2222dp + 881.7778dp + 885.3333dp + 888.8889dp + 892.4444dp + 896.0000dp + 899.5556dp + 903.1111dp + 906.6667dp + 910.2222dp + 913.7778dp + 917.3333dp + 920.8889dp + 924.4444dp + 928.0000dp + 931.5556dp + 935.1111dp + 938.6667dp + 942.2222dp + 945.7778dp + 949.3333dp + 952.8889dp + 956.4444dp + 960.0000dp + 963.5556dp + 967.1111dp + 970.6667dp + 974.2222dp + 977.7778dp + 981.3333dp + 984.8889dp + 988.4444dp + 992.0000dp + 995.5556dp + 999.1111dp + 1002.6667dp + 1006.2222dp + 1009.7778dp + 1013.3333dp + 1016.8889dp + 1020.4444dp + 1024.0000dp + 1027.5556dp + 1031.1111dp + 1034.6667dp + 1038.2222dp + 1041.7778dp + 1045.3333dp + 1048.8889dp + 1052.4444dp + 1056.0000dp + 1059.5556dp + 1063.1111dp + 1066.6667dp + 1070.2222dp + 1073.7778dp + 1077.3333dp + 1080.8889dp + 1084.4444dp + 1088.0000dp + 1091.5556dp + 1095.1111dp + 1098.6667dp + 1102.2222dp + 1105.7778dp + 1109.3333dp + 1112.8889dp + 1116.4444dp + 1120.0000dp + 1123.5556dp + 1127.1111dp + 1130.6667dp + 1134.2222dp + 1137.7778dp + 1141.3333dp + 1144.8889dp + 1148.4444dp + 1152.0000dp + 1155.5556dp + 1159.1111dp + 1162.6667dp + 1166.2222dp + 1169.7778dp + 1173.3333dp + 1176.8889dp + 1180.4444dp + 1184.0000dp + 1187.5556dp + 1191.1111dp + 1194.6667dp + 1198.2222dp + 1201.7778dp + 1205.3333dp + 1208.8889dp + 1212.4444dp + 1216.0000dp + 1219.5556dp + 1223.1111dp + 1226.6667dp + 1230.2222dp + 1233.7778dp + 1237.3333dp + 1240.8889dp + 1244.4444dp + 1248.0000dp + 1251.5556dp + 1255.1111dp + 1258.6667dp + 1262.2222dp + 1265.7778dp + 1269.3333dp + 1272.8889dp + 1276.4444dp + 1280.0000dp + 1297.7778dp + 1315.5556dp + 1422.2222dp + 1457.7778dp + 1500.4444dp + 1678.2222dp + 1777.7778dp + 2133.3333dp + 2275.5556dp + 2560.0000dp + diff --git a/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml new file mode 100644 index 00000000..e9d7c4e0 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 21.3333sp + 24.8889sp + 28.4444sp + 32.0000sp + 35.5556sp + 39.1111sp + 42.6667sp + 46.2222sp + 49.7778sp + 53.3333sp + 56.8889sp + 60.4444sp + 64.0000sp + 67.5556sp + 71.1111sp + 74.6667sp + 78.2222sp + 81.7778sp + 85.3333sp + 88.8889sp + 99.5556sp + 106.6667sp + 113.7778sp + 120.8889sp + 128.0000sp + 135.1111sp + 142.2222sp + 149.3333sp + 170.6667sp + diff --git a/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml new file mode 100644 index 00000000..0bc15eff --- /dev/null +++ b/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -227.5000dp + -113.7500dp + -75.8333dp + -45.5000dp + -37.9167dp + -30.3333dp + -18.9583dp + -7.5833dp + -3.7917dp + + 0.3792dp + 1.8958dp + 3.7917dp + 5.6875dp + 7.5833dp + 9.4792dp + 11.3750dp + 13.2708dp + 15.1667dp + 17.0625dp + 18.9583dp + 22.7500dp + 26.5417dp + 30.3333dp + 34.1250dp + 37.9167dp + 41.7083dp + 45.5000dp + 49.2917dp + 53.0833dp + 56.8750dp + 60.6667dp + 64.4583dp + 68.2500dp + 72.0417dp + 75.8333dp + 79.6250dp + 83.4167dp + 87.2083dp + 91.0000dp + 94.7917dp + 98.5833dp + 102.3750dp + 106.1667dp + 109.9583dp + 113.7500dp + 117.5417dp + 121.3333dp + 125.1250dp + 128.9167dp + 132.7083dp + 136.5000dp + 140.2917dp + 144.0833dp + 147.8750dp + 151.6667dp + 155.4583dp + 159.2500dp + 163.0417dp + 166.8333dp + 170.6250dp + 174.4167dp + 178.2083dp + 182.0000dp + 185.7917dp + 189.5833dp + 193.3750dp + 197.1667dp + 200.9583dp + 204.7500dp + 208.5417dp + 212.3333dp + 216.1250dp + 219.9167dp + 223.7083dp + 227.5000dp + 231.2917dp + 235.0833dp + 238.8750dp + 242.6667dp + 246.4583dp + 250.2500dp + 254.0417dp + 257.8333dp + 261.6250dp + 265.4167dp + 269.2083dp + 273.0000dp + 276.7917dp + 280.5833dp + 284.3750dp + 288.1667dp + 291.9583dp + 295.7500dp + 299.5417dp + 303.3333dp + 307.1250dp + 310.9167dp + 314.7083dp + 318.5000dp + 322.2917dp + 326.0833dp + 329.8750dp + 333.6667dp + 337.4583dp + 341.2500dp + 345.0417dp + 348.8333dp + 352.6250dp + 356.4167dp + 360.2083dp + 364.0000dp + 367.7917dp + 371.5833dp + 375.3750dp + 379.1667dp + 382.9583dp + 386.7500dp + 390.5417dp + 394.3333dp + 398.1250dp + 401.9167dp + 405.7083dp + 409.5000dp + 413.2917dp + 417.0833dp + 420.8750dp + 424.6667dp + 428.4583dp + 432.2500dp + 436.0417dp + 439.8333dp + 443.6250dp + 447.4167dp + 451.2083dp + 455.0000dp + 458.7917dp + 462.5833dp + 466.3750dp + 470.1667dp + 473.9583dp + 477.7500dp + 481.5417dp + 485.3333dp + 489.1250dp + 492.9167dp + 496.7083dp + 500.5000dp + 504.2917dp + 508.0833dp + 511.8750dp + 515.6667dp + 519.4583dp + 523.2500dp + 527.0417dp + 530.8333dp + 534.6250dp + 538.4167dp + 542.2083dp + 546.0000dp + 549.7917dp + 553.5833dp + 557.3750dp + 561.1667dp + 564.9583dp + 568.7500dp + 572.5417dp + 576.3333dp + 580.1250dp + 583.9167dp + 587.7083dp + 591.5000dp + 595.2917dp + 599.0833dp + 602.8750dp + 606.6667dp + 610.4583dp + 614.2500dp + 618.0417dp + 621.8333dp + 625.6250dp + 629.4167dp + 633.2083dp + 637.0000dp + 640.7917dp + 644.5833dp + 648.3750dp + 652.1667dp + 655.9583dp + 659.7500dp + 663.5417dp + 667.3333dp + 671.1250dp + 674.9167dp + 678.7083dp + 682.5000dp + 686.2917dp + 690.0833dp + 693.8750dp + 697.6667dp + 701.4583dp + 705.2500dp + 709.0417dp + 712.8333dp + 716.6250dp + 720.4167dp + 724.2083dp + 728.0000dp + 731.7917dp + 735.5833dp + 739.3750dp + 743.1667dp + 746.9583dp + 750.7500dp + 754.5417dp + 758.3333dp + 762.1250dp + 765.9167dp + 769.7083dp + 773.5000dp + 777.2917dp + 781.0833dp + 784.8750dp + 788.6667dp + 792.4583dp + 796.2500dp + 800.0417dp + 803.8333dp + 807.6250dp + 811.4167dp + 815.2083dp + 819.0000dp + 822.7917dp + 826.5833dp + 830.3750dp + 834.1667dp + 837.9583dp + 841.7500dp + 845.5417dp + 849.3333dp + 853.1250dp + 856.9167dp + 860.7083dp + 864.5000dp + 868.2917dp + 872.0833dp + 875.8750dp + 879.6667dp + 883.4583dp + 887.2500dp + 891.0417dp + 894.8333dp + 898.6250dp + 902.4167dp + 906.2083dp + 910.0000dp + 913.7917dp + 917.5833dp + 921.3750dp + 925.1667dp + 928.9583dp + 932.7500dp + 936.5417dp + 940.3333dp + 944.1250dp + 947.9167dp + 951.7083dp + 955.5000dp + 959.2917dp + 963.0833dp + 966.8750dp + 970.6667dp + 974.4583dp + 978.2500dp + 982.0417dp + 985.8333dp + 989.6250dp + 993.4167dp + 997.2083dp + 1001.0000dp + 1004.7917dp + 1008.5833dp + 1012.3750dp + 1016.1667dp + 1019.9583dp + 1023.7500dp + 1027.5417dp + 1031.3333dp + 1035.1250dp + 1038.9167dp + 1042.7083dp + 1046.5000dp + 1050.2917dp + 1054.0833dp + 1057.8750dp + 1061.6667dp + 1065.4583dp + 1069.2500dp + 1073.0417dp + 1076.8333dp + 1080.6250dp + 1084.4167dp + 1088.2083dp + 1092.0000dp + 1095.7917dp + 1099.5833dp + 1103.3750dp + 1107.1667dp + 1110.9583dp + 1114.7500dp + 1118.5417dp + 1122.3333dp + 1126.1250dp + 1129.9167dp + 1133.7083dp + 1137.5000dp + 1141.2917dp + 1145.0833dp + 1148.8750dp + 1152.6667dp + 1156.4583dp + 1160.2500dp + 1164.0417dp + 1167.8333dp + 1171.6250dp + 1175.4167dp + 1179.2083dp + 1183.0000dp + 1186.7917dp + 1190.5833dp + 1194.3750dp + 1198.1667dp + 1201.9583dp + 1205.7500dp + 1209.5417dp + 1213.3333dp + 1217.1250dp + 1220.9167dp + 1224.7083dp + 1228.5000dp + 1232.2917dp + 1236.0833dp + 1239.8750dp + 1243.6667dp + 1247.4583dp + 1251.2500dp + 1255.0417dp + 1258.8333dp + 1262.6250dp + 1266.4167dp + 1270.2083dp + 1274.0000dp + 1277.7917dp + 1281.5833dp + 1285.3750dp + 1289.1667dp + 1292.9583dp + 1296.7500dp + 1300.5417dp + 1304.3333dp + 1308.1250dp + 1311.9167dp + 1315.7083dp + 1319.5000dp + 1323.2917dp + 1327.0833dp + 1330.8750dp + 1334.6667dp + 1338.4583dp + 1342.2500dp + 1346.0417dp + 1349.8333dp + 1353.6250dp + 1357.4167dp + 1361.2083dp + 1365.0000dp + 1383.9583dp + 1402.9167dp + 1516.6667dp + 1554.5833dp + 1600.0833dp + 1789.6667dp + 1895.8333dp + 2275.0000dp + 2426.6667dp + 2730.0000dp + diff --git a/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml new file mode 100644 index 00000000..860fdb46 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 22.7500sp + 26.5417sp + 30.3333sp + 34.1250sp + 37.9167sp + 41.7083sp + 45.5000sp + 49.2917sp + 53.0833sp + 56.8750sp + 60.6667sp + 64.4583sp + 68.2500sp + 72.0417sp + 75.8333sp + 79.6250sp + 83.4167sp + 87.2083sp + 91.0000sp + 94.7917sp + 106.1667sp + 113.7500sp + 121.3333sp + 128.9167sp + 136.5000sp + 144.0833sp + 151.6667sp + 159.2500sp + 182.0000sp + diff --git a/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml new file mode 100644 index 00000000..21e36339 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -40.0000dp + -20.0000dp + -13.3333dp + -8.0000dp + -6.6667dp + -5.3333dp + -3.3333dp + -1.3333dp + -0.6667dp + + 0.0667dp + 0.3333dp + 0.6667dp + 1.0000dp + 1.3333dp + 1.6667dp + 2.0000dp + 2.3333dp + 2.6667dp + 3.0000dp + 3.3333dp + 4.0000dp + 4.6667dp + 5.3333dp + 6.0000dp + 6.6667dp + 7.3333dp + 8.0000dp + 8.6667dp + 9.3333dp + 10.0000dp + 10.6667dp + 11.3333dp + 12.0000dp + 12.6667dp + 13.3333dp + 14.0000dp + 14.6667dp + 15.3333dp + 16.0000dp + 16.6667dp + 17.3333dp + 18.0000dp + 18.6667dp + 19.3333dp + 20.0000dp + 20.6667dp + 21.3333dp + 22.0000dp + 22.6667dp + 23.3333dp + 24.0000dp + 24.6667dp + 25.3333dp + 26.0000dp + 26.6667dp + 27.3333dp + 28.0000dp + 28.6667dp + 29.3333dp + 30.0000dp + 30.6667dp + 31.3333dp + 32.0000dp + 32.6667dp + 33.3333dp + 34.0000dp + 34.6667dp + 35.3333dp + 36.0000dp + 36.6667dp + 37.3333dp + 38.0000dp + 38.6667dp + 39.3333dp + 40.0000dp + 40.6667dp + 41.3333dp + 42.0000dp + 42.6667dp + 43.3333dp + 44.0000dp + 44.6667dp + 45.3333dp + 46.0000dp + 46.6667dp + 47.3333dp + 48.0000dp + 48.6667dp + 49.3333dp + 50.0000dp + 50.6667dp + 51.3333dp + 52.0000dp + 52.6667dp + 53.3333dp + 54.0000dp + 54.6667dp + 55.3333dp + 56.0000dp + 56.6667dp + 57.3333dp + 58.0000dp + 58.6667dp + 59.3333dp + 60.0000dp + 60.6667dp + 61.3333dp + 62.0000dp + 62.6667dp + 63.3333dp + 64.0000dp + 64.6667dp + 65.3333dp + 66.0000dp + 66.6667dp + 67.3333dp + 68.0000dp + 68.6667dp + 69.3333dp + 70.0000dp + 70.6667dp + 71.3333dp + 72.0000dp + 72.6667dp + 73.3333dp + 74.0000dp + 74.6667dp + 75.3333dp + 76.0000dp + 76.6667dp + 77.3333dp + 78.0000dp + 78.6667dp + 79.3333dp + 80.0000dp + 80.6667dp + 81.3333dp + 82.0000dp + 82.6667dp + 83.3333dp + 84.0000dp + 84.6667dp + 85.3333dp + 86.0000dp + 86.6667dp + 87.3333dp + 88.0000dp + 88.6667dp + 89.3333dp + 90.0000dp + 90.6667dp + 91.3333dp + 92.0000dp + 92.6667dp + 93.3333dp + 94.0000dp + 94.6667dp + 95.3333dp + 96.0000dp + 96.6667dp + 97.3333dp + 98.0000dp + 98.6667dp + 99.3333dp + 100.0000dp + 100.6667dp + 101.3333dp + 102.0000dp + 102.6667dp + 103.3333dp + 104.0000dp + 104.6667dp + 105.3333dp + 106.0000dp + 106.6667dp + 107.3333dp + 108.0000dp + 108.6667dp + 109.3333dp + 110.0000dp + 110.6667dp + 111.3333dp + 112.0000dp + 112.6667dp + 113.3333dp + 114.0000dp + 114.6667dp + 115.3333dp + 116.0000dp + 116.6667dp + 117.3333dp + 118.0000dp + 118.6667dp + 119.3333dp + 120.0000dp + 120.6667dp + 121.3333dp + 122.0000dp + 122.6667dp + 123.3333dp + 124.0000dp + 124.6667dp + 125.3333dp + 126.0000dp + 126.6667dp + 127.3333dp + 128.0000dp + 128.6667dp + 129.3333dp + 130.0000dp + 130.6667dp + 131.3333dp + 132.0000dp + 132.6667dp + 133.3333dp + 134.0000dp + 134.6667dp + 135.3333dp + 136.0000dp + 136.6667dp + 137.3333dp + 138.0000dp + 138.6667dp + 139.3333dp + 140.0000dp + 140.6667dp + 141.3333dp + 142.0000dp + 142.6667dp + 143.3333dp + 144.0000dp + 144.6667dp + 145.3333dp + 146.0000dp + 146.6667dp + 147.3333dp + 148.0000dp + 148.6667dp + 149.3333dp + 150.0000dp + 150.6667dp + 151.3333dp + 152.0000dp + 152.6667dp + 153.3333dp + 154.0000dp + 154.6667dp + 155.3333dp + 156.0000dp + 156.6667dp + 157.3333dp + 158.0000dp + 158.6667dp + 159.3333dp + 160.0000dp + 160.6667dp + 161.3333dp + 162.0000dp + 162.6667dp + 163.3333dp + 164.0000dp + 164.6667dp + 165.3333dp + 166.0000dp + 166.6667dp + 167.3333dp + 168.0000dp + 168.6667dp + 169.3333dp + 170.0000dp + 170.6667dp + 171.3333dp + 172.0000dp + 172.6667dp + 173.3333dp + 174.0000dp + 174.6667dp + 175.3333dp + 176.0000dp + 176.6667dp + 177.3333dp + 178.0000dp + 178.6667dp + 179.3333dp + 180.0000dp + 180.6667dp + 181.3333dp + 182.0000dp + 182.6667dp + 183.3333dp + 184.0000dp + 184.6667dp + 185.3333dp + 186.0000dp + 186.6667dp + 187.3333dp + 188.0000dp + 188.6667dp + 189.3333dp + 190.0000dp + 190.6667dp + 191.3333dp + 192.0000dp + 192.6667dp + 193.3333dp + 194.0000dp + 194.6667dp + 195.3333dp + 196.0000dp + 196.6667dp + 197.3333dp + 198.0000dp + 198.6667dp + 199.3333dp + 200.0000dp + 200.6667dp + 201.3333dp + 202.0000dp + 202.6667dp + 203.3333dp + 204.0000dp + 204.6667dp + 205.3333dp + 206.0000dp + 206.6667dp + 207.3333dp + 208.0000dp + 208.6667dp + 209.3333dp + 210.0000dp + 210.6667dp + 211.3333dp + 212.0000dp + 212.6667dp + 213.3333dp + 214.0000dp + 214.6667dp + 215.3333dp + 216.0000dp + 216.6667dp + 217.3333dp + 218.0000dp + 218.6667dp + 219.3333dp + 220.0000dp + 220.6667dp + 221.3333dp + 222.0000dp + 222.6667dp + 223.3333dp + 224.0000dp + 224.6667dp + 225.3333dp + 226.0000dp + 226.6667dp + 227.3333dp + 228.0000dp + 228.6667dp + 229.3333dp + 230.0000dp + 230.6667dp + 231.3333dp + 232.0000dp + 232.6667dp + 233.3333dp + 234.0000dp + 234.6667dp + 235.3333dp + 236.0000dp + 236.6667dp + 237.3333dp + 238.0000dp + 238.6667dp + 239.3333dp + 240.0000dp + 243.3333dp + 246.6667dp + 266.6667dp + 273.3333dp + 281.3333dp + 314.6667dp + 333.3333dp + 400.0000dp + 426.6667dp + 480.0000dp + diff --git a/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml new file mode 100644 index 00000000..d9e8ec6e --- /dev/null +++ b/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 4.0000sp + 4.6667sp + 5.3333sp + 6.0000sp + 6.6667sp + 7.3333sp + 8.0000sp + 8.6667sp + 9.3333sp + 10.0000sp + 10.6667sp + 11.3333sp + 12.0000sp + 12.6667sp + 13.3333sp + 14.0000sp + 14.6667sp + 15.3333sp + 16.0000sp + 16.6667sp + 18.6667sp + 20.0000sp + 21.3333sp + 22.6667sp + 24.0000sp + 25.3333sp + 26.6667sp + 28.0000sp + 32.0000sp + diff --git a/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml new file mode 100644 index 00000000..aee242fa --- /dev/null +++ b/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -53.3333dp + -26.6667dp + -17.7778dp + -10.6667dp + -8.8889dp + -7.1111dp + -4.4444dp + -1.7778dp + -0.8889dp + + 0.0889dp + 0.4444dp + 0.8889dp + 1.3333dp + 1.7778dp + 2.2222dp + 2.6667dp + 3.1111dp + 3.5556dp + 4.0000dp + 4.4444dp + 5.3333dp + 6.2222dp + 7.1111dp + 8.0000dp + 8.8889dp + 9.7778dp + 10.6667dp + 11.5556dp + 12.4444dp + 13.3333dp + 14.2222dp + 15.1111dp + 16.0000dp + 16.8889dp + 17.7778dp + 18.6667dp + 19.5556dp + 20.4444dp + 21.3333dp + 22.2222dp + 23.1111dp + 24.0000dp + 24.8889dp + 25.7778dp + 26.6667dp + 27.5556dp + 28.4444dp + 29.3333dp + 30.2222dp + 31.1111dp + 32.0000dp + 32.8889dp + 33.7778dp + 34.6667dp + 35.5556dp + 36.4444dp + 37.3333dp + 38.2222dp + 39.1111dp + 40.0000dp + 40.8889dp + 41.7778dp + 42.6667dp + 43.5556dp + 44.4444dp + 45.3333dp + 46.2222dp + 47.1111dp + 48.0000dp + 48.8889dp + 49.7778dp + 50.6667dp + 51.5556dp + 52.4444dp + 53.3333dp + 54.2222dp + 55.1111dp + 56.0000dp + 56.8889dp + 57.7778dp + 58.6667dp + 59.5556dp + 60.4444dp + 61.3333dp + 62.2222dp + 63.1111dp + 64.0000dp + 64.8889dp + 65.7778dp + 66.6667dp + 67.5556dp + 68.4444dp + 69.3333dp + 70.2222dp + 71.1111dp + 72.0000dp + 72.8889dp + 73.7778dp + 74.6667dp + 75.5556dp + 76.4444dp + 77.3333dp + 78.2222dp + 79.1111dp + 80.0000dp + 80.8889dp + 81.7778dp + 82.6667dp + 83.5556dp + 84.4444dp + 85.3333dp + 86.2222dp + 87.1111dp + 88.0000dp + 88.8889dp + 89.7778dp + 90.6667dp + 91.5556dp + 92.4444dp + 93.3333dp + 94.2222dp + 95.1111dp + 96.0000dp + 96.8889dp + 97.7778dp + 98.6667dp + 99.5556dp + 100.4444dp + 101.3333dp + 102.2222dp + 103.1111dp + 104.0000dp + 104.8889dp + 105.7778dp + 106.6667dp + 107.5556dp + 108.4444dp + 109.3333dp + 110.2222dp + 111.1111dp + 112.0000dp + 112.8889dp + 113.7778dp + 114.6667dp + 115.5556dp + 116.4444dp + 117.3333dp + 118.2222dp + 119.1111dp + 120.0000dp + 120.8889dp + 121.7778dp + 122.6667dp + 123.5556dp + 124.4444dp + 125.3333dp + 126.2222dp + 127.1111dp + 128.0000dp + 128.8889dp + 129.7778dp + 130.6667dp + 131.5556dp + 132.4444dp + 133.3333dp + 134.2222dp + 135.1111dp + 136.0000dp + 136.8889dp + 137.7778dp + 138.6667dp + 139.5556dp + 140.4444dp + 141.3333dp + 142.2222dp + 143.1111dp + 144.0000dp + 144.8889dp + 145.7778dp + 146.6667dp + 147.5556dp + 148.4444dp + 149.3333dp + 150.2222dp + 151.1111dp + 152.0000dp + 152.8889dp + 153.7778dp + 154.6667dp + 155.5556dp + 156.4444dp + 157.3333dp + 158.2222dp + 159.1111dp + 160.0000dp + 160.8889dp + 161.7778dp + 162.6667dp + 163.5556dp + 164.4444dp + 165.3333dp + 166.2222dp + 167.1111dp + 168.0000dp + 168.8889dp + 169.7778dp + 170.6667dp + 171.5556dp + 172.4444dp + 173.3333dp + 174.2222dp + 175.1111dp + 176.0000dp + 176.8889dp + 177.7778dp + 178.6667dp + 179.5556dp + 180.4444dp + 181.3333dp + 182.2222dp + 183.1111dp + 184.0000dp + 184.8889dp + 185.7778dp + 186.6667dp + 187.5556dp + 188.4444dp + 189.3333dp + 190.2222dp + 191.1111dp + 192.0000dp + 192.8889dp + 193.7778dp + 194.6667dp + 195.5556dp + 196.4444dp + 197.3333dp + 198.2222dp + 199.1111dp + 200.0000dp + 200.8889dp + 201.7778dp + 202.6667dp + 203.5556dp + 204.4444dp + 205.3333dp + 206.2222dp + 207.1111dp + 208.0000dp + 208.8889dp + 209.7778dp + 210.6667dp + 211.5556dp + 212.4444dp + 213.3333dp + 214.2222dp + 215.1111dp + 216.0000dp + 216.8889dp + 217.7778dp + 218.6667dp + 219.5556dp + 220.4444dp + 221.3333dp + 222.2222dp + 223.1111dp + 224.0000dp + 224.8889dp + 225.7778dp + 226.6667dp + 227.5556dp + 228.4444dp + 229.3333dp + 230.2222dp + 231.1111dp + 232.0000dp + 232.8889dp + 233.7778dp + 234.6667dp + 235.5556dp + 236.4444dp + 237.3333dp + 238.2222dp + 239.1111dp + 240.0000dp + 240.8889dp + 241.7778dp + 242.6667dp + 243.5556dp + 244.4444dp + 245.3333dp + 246.2222dp + 247.1111dp + 248.0000dp + 248.8889dp + 249.7778dp + 250.6667dp + 251.5556dp + 252.4444dp + 253.3333dp + 254.2222dp + 255.1111dp + 256.0000dp + 256.8889dp + 257.7778dp + 258.6667dp + 259.5556dp + 260.4444dp + 261.3333dp + 262.2222dp + 263.1111dp + 264.0000dp + 264.8889dp + 265.7778dp + 266.6667dp + 267.5556dp + 268.4444dp + 269.3333dp + 270.2222dp + 271.1111dp + 272.0000dp + 272.8889dp + 273.7778dp + 274.6667dp + 275.5556dp + 276.4444dp + 277.3333dp + 278.2222dp + 279.1111dp + 280.0000dp + 280.8889dp + 281.7778dp + 282.6667dp + 283.5556dp + 284.4444dp + 285.3333dp + 286.2222dp + 287.1111dp + 288.0000dp + 288.8889dp + 289.7778dp + 290.6667dp + 291.5556dp + 292.4444dp + 293.3333dp + 294.2222dp + 295.1111dp + 296.0000dp + 296.8889dp + 297.7778dp + 298.6667dp + 299.5556dp + 300.4444dp + 301.3333dp + 302.2222dp + 303.1111dp + 304.0000dp + 304.8889dp + 305.7778dp + 306.6667dp + 307.5556dp + 308.4444dp + 309.3333dp + 310.2222dp + 311.1111dp + 312.0000dp + 312.8889dp + 313.7778dp + 314.6667dp + 315.5556dp + 316.4444dp + 317.3333dp + 318.2222dp + 319.1111dp + 320.0000dp + 324.4444dp + 328.8889dp + 355.5556dp + 364.4444dp + 375.1111dp + 419.5556dp + 444.4444dp + 533.3333dp + 568.8889dp + 640.0000dp + diff --git a/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml new file mode 100644 index 00000000..899c3ce1 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 5.3333sp + 6.2222sp + 7.1111sp + 8.0000sp + 8.8889sp + 9.7778sp + 10.6667sp + 11.5556sp + 12.4444sp + 13.3333sp + 14.2222sp + 15.1111sp + 16.0000sp + 16.8889sp + 17.7778sp + 18.6667sp + 19.5556sp + 20.4444sp + 21.3333sp + 22.2222sp + 24.8889sp + 26.6667sp + 28.4444sp + 30.2222sp + 32.0000sp + 33.7778sp + 35.5556sp + 37.3333sp + 42.6667sp + diff --git a/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml new file mode 100644 index 00000000..6aee2b11 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -60.0000dp + -30.0000dp + -20.0000dp + -12.0000dp + -10.0000dp + -8.0000dp + -5.0000dp + -2.0000dp + -1.0000dp + + 0.1000dp + 0.5000dp + 1.0000dp + 1.5000dp + 2.0000dp + 2.5000dp + 3.0000dp + 3.5000dp + 4.0000dp + 4.5000dp + 5.0000dp + 6.0000dp + 7.0000dp + 8.0000dp + 9.0000dp + 10.0000dp + 11.0000dp + 12.0000dp + 13.0000dp + 14.0000dp + 15.0000dp + 16.0000dp + 17.0000dp + 18.0000dp + 19.0000dp + 20.0000dp + 21.0000dp + 22.0000dp + 23.0000dp + 24.0000dp + 25.0000dp + 26.0000dp + 27.0000dp + 28.0000dp + 29.0000dp + 30.0000dp + 31.0000dp + 32.0000dp + 33.0000dp + 34.0000dp + 35.0000dp + 36.0000dp + 37.0000dp + 38.0000dp + 39.0000dp + 40.0000dp + 41.0000dp + 42.0000dp + 43.0000dp + 44.0000dp + 45.0000dp + 46.0000dp + 47.0000dp + 48.0000dp + 49.0000dp + 50.0000dp + 51.0000dp + 52.0000dp + 53.0000dp + 54.0000dp + 55.0000dp + 56.0000dp + 57.0000dp + 58.0000dp + 59.0000dp + 60.0000dp + 61.0000dp + 62.0000dp + 63.0000dp + 64.0000dp + 65.0000dp + 66.0000dp + 67.0000dp + 68.0000dp + 69.0000dp + 70.0000dp + 71.0000dp + 72.0000dp + 73.0000dp + 74.0000dp + 75.0000dp + 76.0000dp + 77.0000dp + 78.0000dp + 79.0000dp + 80.0000dp + 81.0000dp + 82.0000dp + 83.0000dp + 84.0000dp + 85.0000dp + 86.0000dp + 87.0000dp + 88.0000dp + 89.0000dp + 90.0000dp + 91.0000dp + 92.0000dp + 93.0000dp + 94.0000dp + 95.0000dp + 96.0000dp + 97.0000dp + 98.0000dp + 99.0000dp + 100.0000dp + 101.0000dp + 102.0000dp + 103.0000dp + 104.0000dp + 105.0000dp + 106.0000dp + 107.0000dp + 108.0000dp + 109.0000dp + 110.0000dp + 111.0000dp + 112.0000dp + 113.0000dp + 114.0000dp + 115.0000dp + 116.0000dp + 117.0000dp + 118.0000dp + 119.0000dp + 120.0000dp + 121.0000dp + 122.0000dp + 123.0000dp + 124.0000dp + 125.0000dp + 126.0000dp + 127.0000dp + 128.0000dp + 129.0000dp + 130.0000dp + 131.0000dp + 132.0000dp + 133.0000dp + 134.0000dp + 135.0000dp + 136.0000dp + 137.0000dp + 138.0000dp + 139.0000dp + 140.0000dp + 141.0000dp + 142.0000dp + 143.0000dp + 144.0000dp + 145.0000dp + 146.0000dp + 147.0000dp + 148.0000dp + 149.0000dp + 150.0000dp + 151.0000dp + 152.0000dp + 153.0000dp + 154.0000dp + 155.0000dp + 156.0000dp + 157.0000dp + 158.0000dp + 159.0000dp + 160.0000dp + 161.0000dp + 162.0000dp + 163.0000dp + 164.0000dp + 165.0000dp + 166.0000dp + 167.0000dp + 168.0000dp + 169.0000dp + 170.0000dp + 171.0000dp + 172.0000dp + 173.0000dp + 174.0000dp + 175.0000dp + 176.0000dp + 177.0000dp + 178.0000dp + 179.0000dp + 180.0000dp + 181.0000dp + 182.0000dp + 183.0000dp + 184.0000dp + 185.0000dp + 186.0000dp + 187.0000dp + 188.0000dp + 189.0000dp + 190.0000dp + 191.0000dp + 192.0000dp + 193.0000dp + 194.0000dp + 195.0000dp + 196.0000dp + 197.0000dp + 198.0000dp + 199.0000dp + 200.0000dp + 201.0000dp + 202.0000dp + 203.0000dp + 204.0000dp + 205.0000dp + 206.0000dp + 207.0000dp + 208.0000dp + 209.0000dp + 210.0000dp + 211.0000dp + 212.0000dp + 213.0000dp + 214.0000dp + 215.0000dp + 216.0000dp + 217.0000dp + 218.0000dp + 219.0000dp + 220.0000dp + 221.0000dp + 222.0000dp + 223.0000dp + 224.0000dp + 225.0000dp + 226.0000dp + 227.0000dp + 228.0000dp + 229.0000dp + 230.0000dp + 231.0000dp + 232.0000dp + 233.0000dp + 234.0000dp + 235.0000dp + 236.0000dp + 237.0000dp + 238.0000dp + 239.0000dp + 240.0000dp + 241.0000dp + 242.0000dp + 243.0000dp + 244.0000dp + 245.0000dp + 246.0000dp + 247.0000dp + 248.0000dp + 249.0000dp + 250.0000dp + 251.0000dp + 252.0000dp + 253.0000dp + 254.0000dp + 255.0000dp + 256.0000dp + 257.0000dp + 258.0000dp + 259.0000dp + 260.0000dp + 261.0000dp + 262.0000dp + 263.0000dp + 264.0000dp + 265.0000dp + 266.0000dp + 267.0000dp + 268.0000dp + 269.0000dp + 270.0000dp + 271.0000dp + 272.0000dp + 273.0000dp + 274.0000dp + 275.0000dp + 276.0000dp + 277.0000dp + 278.0000dp + 279.0000dp + 280.0000dp + 281.0000dp + 282.0000dp + 283.0000dp + 284.0000dp + 285.0000dp + 286.0000dp + 287.0000dp + 288.0000dp + 289.0000dp + 290.0000dp + 291.0000dp + 292.0000dp + 293.0000dp + 294.0000dp + 295.0000dp + 296.0000dp + 297.0000dp + 298.0000dp + 299.0000dp + 300.0000dp + 301.0000dp + 302.0000dp + 303.0000dp + 304.0000dp + 305.0000dp + 306.0000dp + 307.0000dp + 308.0000dp + 309.0000dp + 310.0000dp + 311.0000dp + 312.0000dp + 313.0000dp + 314.0000dp + 315.0000dp + 316.0000dp + 317.0000dp + 318.0000dp + 319.0000dp + 320.0000dp + 321.0000dp + 322.0000dp + 323.0000dp + 324.0000dp + 325.0000dp + 326.0000dp + 327.0000dp + 328.0000dp + 329.0000dp + 330.0000dp + 331.0000dp + 332.0000dp + 333.0000dp + 334.0000dp + 335.0000dp + 336.0000dp + 337.0000dp + 338.0000dp + 339.0000dp + 340.0000dp + 341.0000dp + 342.0000dp + 343.0000dp + 344.0000dp + 345.0000dp + 346.0000dp + 347.0000dp + 348.0000dp + 349.0000dp + 350.0000dp + 351.0000dp + 352.0000dp + 353.0000dp + 354.0000dp + 355.0000dp + 356.0000dp + 357.0000dp + 358.0000dp + 359.0000dp + 360.0000dp + 365.0000dp + 370.0000dp + 400.0000dp + 410.0000dp + 422.0000dp + 472.0000dp + 500.0000dp + 600.0000dp + 640.0000dp + 720.0000dp + diff --git a/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml new file mode 100644 index 00000000..9af91712 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.0000sp + 7.0000sp + 8.0000sp + 9.0000sp + 10.0000sp + 11.0000sp + 12.0000sp + 13.0000sp + 14.0000sp + 15.0000sp + 16.0000sp + 17.0000sp + 18.0000sp + 19.0000sp + 20.0000sp + 21.0000sp + 22.0000sp + 23.0000sp + 24.0000sp + 25.0000sp + 28.0000sp + 30.0000sp + 32.0000sp + 34.0000sp + 36.0000sp + 38.0000sp + 40.0000sp + 42.0000sp + 48.0000sp + diff --git a/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml new file mode 100644 index 00000000..801948a2 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -60.3773dp + -30.1887dp + -20.1258dp + -12.0755dp + -10.0629dp + -8.0503dp + -5.0314dp + -2.0126dp + -1.0063dp + + 0.1006dp + 0.5031dp + 1.0063dp + 1.5094dp + 2.0126dp + 2.5157dp + 3.0189dp + 3.5220dp + 4.0252dp + 4.5283dp + 5.0314dp + 6.0377dp + 7.0440dp + 8.0503dp + 9.0566dp + 10.0629dp + 11.0692dp + 12.0755dp + 13.0818dp + 14.0880dp + 15.0943dp + 16.1006dp + 17.1069dp + 18.1132dp + 19.1195dp + 20.1258dp + 21.1321dp + 22.1384dp + 23.1447dp + 24.1509dp + 25.1572dp + 26.1635dp + 27.1698dp + 28.1761dp + 29.1824dp + 30.1887dp + 31.1950dp + 32.2013dp + 33.2075dp + 34.2138dp + 35.2201dp + 36.2264dp + 37.2327dp + 38.2390dp + 39.2453dp + 40.2516dp + 41.2579dp + 42.2641dp + 43.2704dp + 44.2767dp + 45.2830dp + 46.2893dp + 47.2956dp + 48.3019dp + 49.3082dp + 50.3145dp + 51.3207dp + 52.3270dp + 53.3333dp + 54.3396dp + 55.3459dp + 56.3522dp + 57.3585dp + 58.3648dp + 59.3711dp + 60.3773dp + 61.3836dp + 62.3899dp + 63.3962dp + 64.4025dp + 65.4088dp + 66.4151dp + 67.4214dp + 68.4277dp + 69.4340dp + 70.4402dp + 71.4465dp + 72.4528dp + 73.4591dp + 74.4654dp + 75.4717dp + 76.4780dp + 77.4843dp + 78.4906dp + 79.4968dp + 80.5031dp + 81.5094dp + 82.5157dp + 83.5220dp + 84.5283dp + 85.5346dp + 86.5409dp + 87.5472dp + 88.5534dp + 89.5597dp + 90.5660dp + 91.5723dp + 92.5786dp + 93.5849dp + 94.5912dp + 95.5975dp + 96.6038dp + 97.6100dp + 98.6163dp + 99.6226dp + 100.6289dp + 101.6352dp + 102.6415dp + 103.6478dp + 104.6541dp + 105.6604dp + 106.6667dp + 107.6729dp + 108.6792dp + 109.6855dp + 110.6918dp + 111.6981dp + 112.7044dp + 113.7107dp + 114.7170dp + 115.7233dp + 116.7295dp + 117.7358dp + 118.7421dp + 119.7484dp + 120.7547dp + 121.7610dp + 122.7673dp + 123.7736dp + 124.7799dp + 125.7861dp + 126.7924dp + 127.7987dp + 128.8050dp + 129.8113dp + 130.8176dp + 131.8239dp + 132.8302dp + 133.8365dp + 134.8427dp + 135.8490dp + 136.8553dp + 137.8616dp + 138.8679dp + 139.8742dp + 140.8805dp + 141.8868dp + 142.8931dp + 143.8994dp + 144.9056dp + 145.9119dp + 146.9182dp + 147.9245dp + 148.9308dp + 149.9371dp + 150.9434dp + 151.9497dp + 152.9560dp + 153.9622dp + 154.9685dp + 155.9748dp + 156.9811dp + 157.9874dp + 158.9937dp + 160.0000dp + 161.0063dp + 162.0126dp + 163.0188dp + 164.0251dp + 165.0314dp + 166.0377dp + 167.0440dp + 168.0503dp + 169.0566dp + 170.0629dp + 171.0692dp + 172.0754dp + 173.0817dp + 174.0880dp + 175.0943dp + 176.1006dp + 177.1069dp + 178.1132dp + 179.1195dp + 180.1258dp + 181.1320dp + 182.1383dp + 183.1446dp + 184.1509dp + 185.1572dp + 186.1635dp + 187.1698dp + 188.1761dp + 189.1824dp + 190.1887dp + 191.1949dp + 192.2012dp + 193.2075dp + 194.2138dp + 195.2201dp + 196.2264dp + 197.2327dp + 198.2390dp + 199.2453dp + 200.2515dp + 201.2578dp + 202.2641dp + 203.2704dp + 204.2767dp + 205.2830dp + 206.2893dp + 207.2956dp + 208.3019dp + 209.3081dp + 210.3144dp + 211.3207dp + 212.3270dp + 213.3333dp + 214.3396dp + 215.3459dp + 216.3522dp + 217.3585dp + 218.3647dp + 219.3710dp + 220.3773dp + 221.3836dp + 222.3899dp + 223.3962dp + 224.4025dp + 225.4088dp + 226.4151dp + 227.4214dp + 228.4276dp + 229.4339dp + 230.4402dp + 231.4465dp + 232.4528dp + 233.4591dp + 234.4654dp + 235.4717dp + 236.4780dp + 237.4842dp + 238.4905dp + 239.4968dp + 240.5031dp + 241.5094dp + 242.5157dp + 243.5220dp + 244.5283dp + 245.5346dp + 246.5408dp + 247.5471dp + 248.5534dp + 249.5597dp + 250.5660dp + 251.5723dp + 252.5786dp + 253.5849dp + 254.5912dp + 255.5974dp + 256.6037dp + 257.6100dp + 258.6163dp + 259.6226dp + 260.6289dp + 261.6352dp + 262.6415dp + 263.6478dp + 264.6541dp + 265.6603dp + 266.6666dp + 267.6729dp + 268.6792dp + 269.6855dp + 270.6918dp + 271.6981dp + 272.7044dp + 273.7107dp + 274.7169dp + 275.7232dp + 276.7295dp + 277.7358dp + 278.7421dp + 279.7484dp + 280.7547dp + 281.7610dp + 282.7673dp + 283.7735dp + 284.7798dp + 285.7861dp + 286.7924dp + 287.7987dp + 288.8050dp + 289.8113dp + 290.8176dp + 291.8239dp + 292.8301dp + 293.8364dp + 294.8427dp + 295.8490dp + 296.8553dp + 297.8616dp + 298.8679dp + 299.8742dp + 300.8805dp + 301.8868dp + 302.8930dp + 303.8993dp + 304.9056dp + 305.9119dp + 306.9182dp + 307.9245dp + 308.9308dp + 309.9371dp + 310.9434dp + 311.9496dp + 312.9559dp + 313.9622dp + 314.9685dp + 315.9748dp + 316.9811dp + 317.9874dp + 318.9937dp + 320.0000dp + 321.0062dp + 322.0125dp + 323.0188dp + 324.0251dp + 325.0314dp + 326.0377dp + 327.0440dp + 328.0503dp + 329.0566dp + 330.0628dp + 331.0691dp + 332.0754dp + 333.0817dp + 334.0880dp + 335.0943dp + 336.1006dp + 337.1069dp + 338.1132dp + 339.1194dp + 340.1257dp + 341.1320dp + 342.1383dp + 343.1446dp + 344.1509dp + 345.1572dp + 346.1635dp + 347.1698dp + 348.1761dp + 349.1823dp + 350.1886dp + 351.1949dp + 352.2012dp + 353.2075dp + 354.2138dp + 355.2201dp + 356.2264dp + 357.2327dp + 358.2389dp + 359.2452dp + 360.2515dp + 361.2578dp + 362.2641dp + 367.2955dp + 372.3270dp + 402.5157dp + 412.5786dp + 424.6540dp + 474.9685dp + 503.1446dp + 603.7735dp + 644.0251dp + 724.5282dp + diff --git a/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml new file mode 100644 index 00000000..61137a0f --- /dev/null +++ b/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.0377sp + 7.0440sp + 8.0503sp + 9.0566sp + 10.0629sp + 11.0692sp + 12.0755sp + 13.0818sp + 14.0880sp + 15.0943sp + 16.1006sp + 17.1069sp + 18.1132sp + 19.1195sp + 20.1258sp + 21.1321sp + 22.1384sp + 23.1447sp + 24.1509sp + 25.1572sp + 28.1761sp + 30.1887sp + 32.2013sp + 34.2138sp + 36.2264sp + 38.2390sp + 40.2516sp + 42.2641sp + 48.3019sp + diff --git a/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml new file mode 100644 index 00000000..6d8b3a60 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -64.0000dp + -32.0000dp + -21.3333dp + -12.8000dp + -10.6667dp + -8.5333dp + -5.3333dp + -2.1333dp + -1.0667dp + + 0.1067dp + 0.5333dp + 1.0667dp + 1.6000dp + 2.1333dp + 2.6667dp + 3.2000dp + 3.7333dp + 4.2667dp + 4.8000dp + 5.3333dp + 6.4000dp + 7.4667dp + 8.5333dp + 9.6000dp + 10.6667dp + 11.7333dp + 12.8000dp + 13.8667dp + 14.9333dp + 16.0000dp + 17.0667dp + 18.1333dp + 19.2000dp + 20.2667dp + 21.3333dp + 22.4000dp + 23.4667dp + 24.5333dp + 25.6000dp + 26.6667dp + 27.7333dp + 28.8000dp + 29.8667dp + 30.9333dp + 32.0000dp + 33.0667dp + 34.1333dp + 35.2000dp + 36.2667dp + 37.3333dp + 38.4000dp + 39.4667dp + 40.5333dp + 41.6000dp + 42.6667dp + 43.7333dp + 44.8000dp + 45.8667dp + 46.9333dp + 48.0000dp + 49.0667dp + 50.1333dp + 51.2000dp + 52.2667dp + 53.3333dp + 54.4000dp + 55.4667dp + 56.5333dp + 57.6000dp + 58.6667dp + 59.7333dp + 60.8000dp + 61.8667dp + 62.9333dp + 64.0000dp + 65.0667dp + 66.1333dp + 67.2000dp + 68.2667dp + 69.3333dp + 70.4000dp + 71.4667dp + 72.5333dp + 73.6000dp + 74.6667dp + 75.7333dp + 76.8000dp + 77.8667dp + 78.9333dp + 80.0000dp + 81.0667dp + 82.1333dp + 83.2000dp + 84.2667dp + 85.3333dp + 86.4000dp + 87.4667dp + 88.5333dp + 89.6000dp + 90.6667dp + 91.7333dp + 92.8000dp + 93.8667dp + 94.9333dp + 96.0000dp + 97.0667dp + 98.1333dp + 99.2000dp + 100.2667dp + 101.3333dp + 102.4000dp + 103.4667dp + 104.5333dp + 105.6000dp + 106.6667dp + 107.7333dp + 108.8000dp + 109.8667dp + 110.9333dp + 112.0000dp + 113.0667dp + 114.1333dp + 115.2000dp + 116.2667dp + 117.3333dp + 118.4000dp + 119.4667dp + 120.5333dp + 121.6000dp + 122.6667dp + 123.7333dp + 124.8000dp + 125.8667dp + 126.9333dp + 128.0000dp + 129.0667dp + 130.1333dp + 131.2000dp + 132.2667dp + 133.3333dp + 134.4000dp + 135.4667dp + 136.5333dp + 137.6000dp + 138.6667dp + 139.7333dp + 140.8000dp + 141.8667dp + 142.9333dp + 144.0000dp + 145.0667dp + 146.1333dp + 147.2000dp + 148.2667dp + 149.3333dp + 150.4000dp + 151.4667dp + 152.5333dp + 153.6000dp + 154.6667dp + 155.7333dp + 156.8000dp + 157.8667dp + 158.9333dp + 160.0000dp + 161.0667dp + 162.1333dp + 163.2000dp + 164.2667dp + 165.3333dp + 166.4000dp + 167.4667dp + 168.5333dp + 169.6000dp + 170.6667dp + 171.7333dp + 172.8000dp + 173.8667dp + 174.9333dp + 176.0000dp + 177.0667dp + 178.1333dp + 179.2000dp + 180.2667dp + 181.3333dp + 182.4000dp + 183.4667dp + 184.5333dp + 185.6000dp + 186.6667dp + 187.7333dp + 188.8000dp + 189.8667dp + 190.9333dp + 192.0000dp + 193.0667dp + 194.1333dp + 195.2000dp + 196.2667dp + 197.3333dp + 198.4000dp + 199.4667dp + 200.5333dp + 201.6000dp + 202.6667dp + 203.7333dp + 204.8000dp + 205.8667dp + 206.9333dp + 208.0000dp + 209.0667dp + 210.1333dp + 211.2000dp + 212.2667dp + 213.3333dp + 214.4000dp + 215.4667dp + 216.5333dp + 217.6000dp + 218.6667dp + 219.7333dp + 220.8000dp + 221.8667dp + 222.9333dp + 224.0000dp + 225.0667dp + 226.1333dp + 227.2000dp + 228.2667dp + 229.3333dp + 230.4000dp + 231.4667dp + 232.5333dp + 233.6000dp + 234.6667dp + 235.7333dp + 236.8000dp + 237.8667dp + 238.9333dp + 240.0000dp + 241.0667dp + 242.1333dp + 243.2000dp + 244.2667dp + 245.3333dp + 246.4000dp + 247.4667dp + 248.5333dp + 249.6000dp + 250.6667dp + 251.7333dp + 252.8000dp + 253.8667dp + 254.9333dp + 256.0000dp + 257.0667dp + 258.1333dp + 259.2000dp + 260.2667dp + 261.3333dp + 262.4000dp + 263.4667dp + 264.5333dp + 265.6000dp + 266.6667dp + 267.7333dp + 268.8000dp + 269.8667dp + 270.9333dp + 272.0000dp + 273.0667dp + 274.1333dp + 275.2000dp + 276.2667dp + 277.3333dp + 278.4000dp + 279.4667dp + 280.5333dp + 281.6000dp + 282.6667dp + 283.7333dp + 284.8000dp + 285.8667dp + 286.9333dp + 288.0000dp + 289.0667dp + 290.1333dp + 291.2000dp + 292.2667dp + 293.3333dp + 294.4000dp + 295.4667dp + 296.5333dp + 297.6000dp + 298.6667dp + 299.7333dp + 300.8000dp + 301.8667dp + 302.9333dp + 304.0000dp + 305.0667dp + 306.1333dp + 307.2000dp + 308.2667dp + 309.3333dp + 310.4000dp + 311.4667dp + 312.5333dp + 313.6000dp + 314.6667dp + 315.7333dp + 316.8000dp + 317.8667dp + 318.9333dp + 320.0000dp + 321.0667dp + 322.1333dp + 323.2000dp + 324.2667dp + 325.3333dp + 326.4000dp + 327.4667dp + 328.5333dp + 329.6000dp + 330.6667dp + 331.7333dp + 332.8000dp + 333.8667dp + 334.9333dp + 336.0000dp + 337.0667dp + 338.1333dp + 339.2000dp + 340.2667dp + 341.3333dp + 342.4000dp + 343.4667dp + 344.5333dp + 345.6000dp + 346.6667dp + 347.7333dp + 348.8000dp + 349.8667dp + 350.9333dp + 352.0000dp + 353.0667dp + 354.1333dp + 355.2000dp + 356.2667dp + 357.3333dp + 358.4000dp + 359.4667dp + 360.5333dp + 361.6000dp + 362.6667dp + 363.7333dp + 364.8000dp + 365.8667dp + 366.9333dp + 368.0000dp + 369.0667dp + 370.1333dp + 371.2000dp + 372.2667dp + 373.3333dp + 374.4000dp + 375.4667dp + 376.5333dp + 377.6000dp + 378.6667dp + 379.7333dp + 380.8000dp + 381.8667dp + 382.9333dp + 384.0000dp + 389.3333dp + 394.6667dp + 426.6667dp + 437.3333dp + 450.1333dp + 503.4667dp + 533.3333dp + 640.0000dp + 682.6667dp + 768.0000dp + diff --git a/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml new file mode 100644 index 00000000..47c5af68 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.4000sp + 7.4667sp + 8.5333sp + 9.6000sp + 10.6667sp + 11.7333sp + 12.8000sp + 13.8667sp + 14.9333sp + 16.0000sp + 17.0667sp + 18.1333sp + 19.2000sp + 20.2667sp + 21.3333sp + 22.4000sp + 23.4667sp + 24.5333sp + 25.6000sp + 26.6667sp + 29.8667sp + 32.0000sp + 34.1333sp + 36.2667sp + 38.4000sp + 40.5333sp + 42.6667sp + 44.8000sp + 51.2000sp + diff --git a/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml new file mode 100644 index 00000000..45357c0d --- /dev/null +++ b/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -65.4545dp + -32.7273dp + -21.8182dp + -13.0909dp + -10.9091dp + -8.7273dp + -5.4545dp + -2.1818dp + -1.0909dp + + 0.1091dp + 0.5455dp + 1.0909dp + 1.6364dp + 2.1818dp + 2.7273dp + 3.2727dp + 3.8182dp + 4.3636dp + 4.9091dp + 5.4545dp + 6.5455dp + 7.6364dp + 8.7273dp + 9.8182dp + 10.9091dp + 12.0000dp + 13.0909dp + 14.1818dp + 15.2727dp + 16.3636dp + 17.4545dp + 18.5455dp + 19.6364dp + 20.7273dp + 21.8182dp + 22.9091dp + 24.0000dp + 25.0909dp + 26.1818dp + 27.2727dp + 28.3636dp + 29.4545dp + 30.5454dp + 31.6364dp + 32.7273dp + 33.8182dp + 34.9091dp + 36.0000dp + 37.0909dp + 38.1818dp + 39.2727dp + 40.3636dp + 41.4545dp + 42.5454dp + 43.6364dp + 44.7273dp + 45.8182dp + 46.9091dp + 48.0000dp + 49.0909dp + 50.1818dp + 51.2727dp + 52.3636dp + 53.4545dp + 54.5454dp + 55.6364dp + 56.7273dp + 57.8182dp + 58.9091dp + 60.0000dp + 61.0909dp + 62.1818dp + 63.2727dp + 64.3636dp + 65.4545dp + 66.5454dp + 67.6364dp + 68.7273dp + 69.8182dp + 70.9091dp + 72.0000dp + 73.0909dp + 74.1818dp + 75.2727dp + 76.3636dp + 77.4545dp + 78.5454dp + 79.6363dp + 80.7273dp + 81.8182dp + 82.9091dp + 84.0000dp + 85.0909dp + 86.1818dp + 87.2727dp + 88.3636dp + 89.4545dp + 90.5454dp + 91.6363dp + 92.7273dp + 93.8182dp + 94.9091dp + 96.0000dp + 97.0909dp + 98.1818dp + 99.2727dp + 100.3636dp + 101.4545dp + 102.5454dp + 103.6363dp + 104.7273dp + 105.8182dp + 106.9091dp + 108.0000dp + 109.0909dp + 110.1818dp + 111.2727dp + 112.3636dp + 113.4545dp + 114.5454dp + 115.6363dp + 116.7273dp + 117.8182dp + 118.9091dp + 120.0000dp + 121.0909dp + 122.1818dp + 123.2727dp + 124.3636dp + 125.4545dp + 126.5454dp + 127.6363dp + 128.7272dp + 129.8182dp + 130.9091dp + 132.0000dp + 133.0909dp + 134.1818dp + 135.2727dp + 136.3636dp + 137.4545dp + 138.5454dp + 139.6363dp + 140.7272dp + 141.8182dp + 142.9091dp + 144.0000dp + 145.0909dp + 146.1818dp + 147.2727dp + 148.3636dp + 149.4545dp + 150.5454dp + 151.6363dp + 152.7272dp + 153.8182dp + 154.9091dp + 156.0000dp + 157.0909dp + 158.1818dp + 159.2727dp + 160.3636dp + 161.4545dp + 162.5454dp + 163.6363dp + 164.7272dp + 165.8182dp + 166.9091dp + 168.0000dp + 169.0909dp + 170.1818dp + 171.2727dp + 172.3636dp + 173.4545dp + 174.5454dp + 175.6363dp + 176.7272dp + 177.8181dp + 178.9091dp + 180.0000dp + 181.0909dp + 182.1818dp + 183.2727dp + 184.3636dp + 185.4545dp + 186.5454dp + 187.6363dp + 188.7272dp + 189.8181dp + 190.9091dp + 192.0000dp + 193.0909dp + 194.1818dp + 195.2727dp + 196.3636dp + 197.4545dp + 198.5454dp + 199.6363dp + 200.7272dp + 201.8181dp + 202.9091dp + 204.0000dp + 205.0909dp + 206.1818dp + 207.2727dp + 208.3636dp + 209.4545dp + 210.5454dp + 211.6363dp + 212.7272dp + 213.8181dp + 214.9091dp + 216.0000dp + 217.0909dp + 218.1818dp + 219.2727dp + 220.3636dp + 221.4545dp + 222.5454dp + 223.6363dp + 224.7272dp + 225.8181dp + 226.9090dp + 228.0000dp + 229.0909dp + 230.1818dp + 231.2727dp + 232.3636dp + 233.4545dp + 234.5454dp + 235.6363dp + 236.7272dp + 237.8181dp + 238.9090dp + 240.0000dp + 241.0909dp + 242.1818dp + 243.2727dp + 244.3636dp + 245.4545dp + 246.5454dp + 247.6363dp + 248.7272dp + 249.8181dp + 250.9090dp + 252.0000dp + 253.0909dp + 254.1818dp + 255.2727dp + 256.3636dp + 257.4545dp + 258.5454dp + 259.6363dp + 260.7272dp + 261.8181dp + 262.9090dp + 264.0000dp + 265.0909dp + 266.1818dp + 267.2727dp + 268.3636dp + 269.4545dp + 270.5454dp + 271.6363dp + 272.7272dp + 273.8181dp + 274.9090dp + 275.9999dp + 277.0909dp + 278.1818dp + 279.2727dp + 280.3636dp + 281.4545dp + 282.5454dp + 283.6363dp + 284.7272dp + 285.8181dp + 286.9090dp + 287.9999dp + 289.0909dp + 290.1818dp + 291.2727dp + 292.3636dp + 293.4545dp + 294.5454dp + 295.6363dp + 296.7272dp + 297.8181dp + 298.9090dp + 299.9999dp + 301.0909dp + 302.1818dp + 303.2727dp + 304.3636dp + 305.4545dp + 306.5454dp + 307.6363dp + 308.7272dp + 309.8181dp + 310.9090dp + 311.9999dp + 313.0909dp + 314.1818dp + 315.2727dp + 316.3636dp + 317.4545dp + 318.5454dp + 319.6363dp + 320.7272dp + 321.8181dp + 322.9090dp + 323.9999dp + 325.0908dp + 326.1818dp + 327.2727dp + 328.3636dp + 329.4545dp + 330.5454dp + 331.6363dp + 332.7272dp + 333.8181dp + 334.9090dp + 335.9999dp + 337.0908dp + 338.1818dp + 339.2727dp + 340.3636dp + 341.4545dp + 342.5454dp + 343.6363dp + 344.7272dp + 345.8181dp + 346.9090dp + 347.9999dp + 349.0908dp + 350.1818dp + 351.2727dp + 352.3636dp + 353.4545dp + 354.5454dp + 355.6363dp + 356.7272dp + 357.8181dp + 358.9090dp + 359.9999dp + 361.0908dp + 362.1818dp + 363.2727dp + 364.3636dp + 365.4545dp + 366.5454dp + 367.6363dp + 368.7272dp + 369.8181dp + 370.9090dp + 371.9999dp + 373.0908dp + 374.1817dp + 375.2727dp + 376.3636dp + 377.4545dp + 378.5454dp + 379.6363dp + 380.7272dp + 381.8181dp + 382.9090dp + 383.9999dp + 385.0908dp + 386.1817dp + 387.2727dp + 388.3636dp + 389.4545dp + 390.5454dp + 391.6363dp + 392.7272dp + 398.1817dp + 403.6363dp + 436.3636dp + 447.2726dp + 460.3636dp + 514.9090dp + 545.4544dp + 654.5453dp + 698.1817dp + 785.4544dp + diff --git a/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml new file mode 100644 index 00000000..f9156eb2 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.5455sp + 7.6364sp + 8.7273sp + 9.8182sp + 10.9091sp + 12.0000sp + 13.0909sp + 14.1818sp + 15.2727sp + 16.3636sp + 17.4545sp + 18.5455sp + 19.6364sp + 20.7273sp + 21.8182sp + 22.9091sp + 24.0000sp + 25.0909sp + 26.1818sp + 27.2727sp + 30.5454sp + 32.7273sp + 34.9091sp + 37.0909sp + 39.2727sp + 41.4545sp + 43.6364sp + 45.8182sp + 52.3636sp + diff --git a/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml new file mode 100644 index 00000000..8428cbcb --- /dev/null +++ b/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -66.6667dp + -33.3333dp + -22.2222dp + -13.3333dp + -11.1111dp + -8.8889dp + -5.5556dp + -2.2222dp + -1.1111dp + + 0.1111dp + 0.5556dp + 1.1111dp + 1.6667dp + 2.2222dp + 2.7778dp + 3.3333dp + 3.8889dp + 4.4444dp + 5.0000dp + 5.5556dp + 6.6667dp + 7.7778dp + 8.8889dp + 10.0000dp + 11.1111dp + 12.2222dp + 13.3333dp + 14.4444dp + 15.5556dp + 16.6667dp + 17.7778dp + 18.8889dp + 20.0000dp + 21.1111dp + 22.2222dp + 23.3333dp + 24.4444dp + 25.5556dp + 26.6667dp + 27.7778dp + 28.8889dp + 30.0000dp + 31.1111dp + 32.2222dp + 33.3333dp + 34.4444dp + 35.5556dp + 36.6667dp + 37.7778dp + 38.8889dp + 40.0000dp + 41.1111dp + 42.2222dp + 43.3333dp + 44.4444dp + 45.5556dp + 46.6667dp + 47.7778dp + 48.8889dp + 50.0000dp + 51.1111dp + 52.2222dp + 53.3333dp + 54.4444dp + 55.5556dp + 56.6667dp + 57.7778dp + 58.8889dp + 60.0000dp + 61.1111dp + 62.2222dp + 63.3333dp + 64.4444dp + 65.5556dp + 66.6667dp + 67.7778dp + 68.8889dp + 70.0000dp + 71.1111dp + 72.2222dp + 73.3333dp + 74.4444dp + 75.5556dp + 76.6667dp + 77.7778dp + 78.8889dp + 80.0000dp + 81.1111dp + 82.2222dp + 83.3333dp + 84.4444dp + 85.5556dp + 86.6667dp + 87.7778dp + 88.8889dp + 90.0000dp + 91.1111dp + 92.2222dp + 93.3333dp + 94.4444dp + 95.5556dp + 96.6667dp + 97.7778dp + 98.8889dp + 100.0000dp + 101.1111dp + 102.2222dp + 103.3333dp + 104.4444dp + 105.5556dp + 106.6667dp + 107.7778dp + 108.8889dp + 110.0000dp + 111.1111dp + 112.2222dp + 113.3333dp + 114.4444dp + 115.5556dp + 116.6667dp + 117.7778dp + 118.8889dp + 120.0000dp + 121.1111dp + 122.2222dp + 123.3333dp + 124.4444dp + 125.5556dp + 126.6667dp + 127.7778dp + 128.8889dp + 130.0000dp + 131.1111dp + 132.2222dp + 133.3333dp + 134.4444dp + 135.5556dp + 136.6667dp + 137.7778dp + 138.8889dp + 140.0000dp + 141.1111dp + 142.2222dp + 143.3333dp + 144.4444dp + 145.5556dp + 146.6667dp + 147.7778dp + 148.8889dp + 150.0000dp + 151.1111dp + 152.2222dp + 153.3333dp + 154.4444dp + 155.5556dp + 156.6667dp + 157.7778dp + 158.8889dp + 160.0000dp + 161.1111dp + 162.2222dp + 163.3333dp + 164.4444dp + 165.5556dp + 166.6667dp + 167.7778dp + 168.8889dp + 170.0000dp + 171.1111dp + 172.2222dp + 173.3333dp + 174.4444dp + 175.5556dp + 176.6667dp + 177.7778dp + 178.8889dp + 180.0000dp + 181.1111dp + 182.2222dp + 183.3333dp + 184.4444dp + 185.5556dp + 186.6667dp + 187.7778dp + 188.8889dp + 190.0000dp + 191.1111dp + 192.2222dp + 193.3333dp + 194.4444dp + 195.5556dp + 196.6667dp + 197.7778dp + 198.8889dp + 200.0000dp + 201.1111dp + 202.2222dp + 203.3333dp + 204.4444dp + 205.5556dp + 206.6667dp + 207.7778dp + 208.8889dp + 210.0000dp + 211.1111dp + 212.2222dp + 213.3333dp + 214.4444dp + 215.5556dp + 216.6667dp + 217.7778dp + 218.8889dp + 220.0000dp + 221.1111dp + 222.2222dp + 223.3333dp + 224.4444dp + 225.5556dp + 226.6667dp + 227.7778dp + 228.8889dp + 230.0000dp + 231.1111dp + 232.2222dp + 233.3333dp + 234.4444dp + 235.5556dp + 236.6667dp + 237.7778dp + 238.8889dp + 240.0000dp + 241.1111dp + 242.2222dp + 243.3333dp + 244.4444dp + 245.5556dp + 246.6667dp + 247.7778dp + 248.8889dp + 250.0000dp + 251.1111dp + 252.2222dp + 253.3333dp + 254.4444dp + 255.5556dp + 256.6667dp + 257.7778dp + 258.8889dp + 260.0000dp + 261.1111dp + 262.2222dp + 263.3333dp + 264.4444dp + 265.5556dp + 266.6667dp + 267.7778dp + 268.8889dp + 270.0000dp + 271.1111dp + 272.2222dp + 273.3333dp + 274.4444dp + 275.5556dp + 276.6667dp + 277.7778dp + 278.8889dp + 280.0000dp + 281.1111dp + 282.2222dp + 283.3333dp + 284.4444dp + 285.5556dp + 286.6667dp + 287.7778dp + 288.8889dp + 290.0000dp + 291.1111dp + 292.2222dp + 293.3333dp + 294.4444dp + 295.5556dp + 296.6667dp + 297.7778dp + 298.8889dp + 300.0000dp + 301.1111dp + 302.2222dp + 303.3333dp + 304.4444dp + 305.5556dp + 306.6667dp + 307.7778dp + 308.8889dp + 310.0000dp + 311.1111dp + 312.2222dp + 313.3333dp + 314.4444dp + 315.5556dp + 316.6667dp + 317.7778dp + 318.8889dp + 320.0000dp + 321.1111dp + 322.2222dp + 323.3333dp + 324.4444dp + 325.5556dp + 326.6667dp + 327.7778dp + 328.8889dp + 330.0000dp + 331.1111dp + 332.2222dp + 333.3333dp + 334.4444dp + 335.5556dp + 336.6667dp + 337.7778dp + 338.8889dp + 340.0000dp + 341.1111dp + 342.2222dp + 343.3333dp + 344.4444dp + 345.5556dp + 346.6667dp + 347.7778dp + 348.8889dp + 350.0000dp + 351.1111dp + 352.2222dp + 353.3333dp + 354.4444dp + 355.5556dp + 356.6667dp + 357.7778dp + 358.8889dp + 360.0000dp + 361.1111dp + 362.2222dp + 363.3333dp + 364.4444dp + 365.5556dp + 366.6667dp + 367.7778dp + 368.8889dp + 370.0000dp + 371.1111dp + 372.2222dp + 373.3333dp + 374.4444dp + 375.5556dp + 376.6667dp + 377.7778dp + 378.8889dp + 380.0000dp + 381.1111dp + 382.2222dp + 383.3333dp + 384.4444dp + 385.5556dp + 386.6667dp + 387.7778dp + 388.8889dp + 390.0000dp + 391.1111dp + 392.2222dp + 393.3333dp + 394.4444dp + 395.5556dp + 396.6667dp + 397.7778dp + 398.8889dp + 400.0000dp + 405.5556dp + 411.1111dp + 444.4444dp + 455.5556dp + 468.8889dp + 524.4444dp + 555.5556dp + 666.6667dp + 711.1111dp + 800.0000dp + diff --git a/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml new file mode 100644 index 00000000..f4f031bf --- /dev/null +++ b/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.6667sp + 7.7778sp + 8.8889sp + 10.0000sp + 11.1111sp + 12.2222sp + 13.3333sp + 14.4444sp + 15.5556sp + 16.6667sp + 17.7778sp + 18.8889sp + 20.0000sp + 21.1111sp + 22.2222sp + 23.3333sp + 24.4444sp + 25.5556sp + 26.6667sp + 27.7778sp + 31.1111sp + 33.3333sp + 35.5556sp + 37.7778sp + 40.0000sp + 42.2222sp + 44.4444sp + 46.6667sp + 53.3333sp + diff --git a/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml new file mode 100644 index 00000000..152eef92 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -68.3333dp + -34.1667dp + -22.7778dp + -13.6667dp + -11.3889dp + -9.1111dp + -5.6944dp + -2.2778dp + -1.1389dp + + 0.1139dp + 0.5694dp + 1.1389dp + 1.7083dp + 2.2778dp + 2.8472dp + 3.4167dp + 3.9861dp + 4.5556dp + 5.1250dp + 5.6944dp + 6.8333dp + 7.9722dp + 9.1111dp + 10.2500dp + 11.3889dp + 12.5278dp + 13.6667dp + 14.8056dp + 15.9444dp + 17.0833dp + 18.2222dp + 19.3611dp + 20.5000dp + 21.6389dp + 22.7778dp + 23.9167dp + 25.0556dp + 26.1944dp + 27.3333dp + 28.4722dp + 29.6111dp + 30.7500dp + 31.8889dp + 33.0278dp + 34.1667dp + 35.3056dp + 36.4444dp + 37.5833dp + 38.7222dp + 39.8611dp + 41.0000dp + 42.1389dp + 43.2778dp + 44.4167dp + 45.5556dp + 46.6944dp + 47.8333dp + 48.9722dp + 50.1111dp + 51.2500dp + 52.3889dp + 53.5278dp + 54.6667dp + 55.8056dp + 56.9444dp + 58.0833dp + 59.2222dp + 60.3611dp + 61.5000dp + 62.6389dp + 63.7778dp + 64.9167dp + 66.0556dp + 67.1944dp + 68.3333dp + 69.4722dp + 70.6111dp + 71.7500dp + 72.8889dp + 74.0278dp + 75.1667dp + 76.3056dp + 77.4444dp + 78.5833dp + 79.7222dp + 80.8611dp + 82.0000dp + 83.1389dp + 84.2778dp + 85.4167dp + 86.5556dp + 87.6944dp + 88.8333dp + 89.9722dp + 91.1111dp + 92.2500dp + 93.3889dp + 94.5278dp + 95.6667dp + 96.8056dp + 97.9444dp + 99.0833dp + 100.2222dp + 101.3611dp + 102.5000dp + 103.6389dp + 104.7778dp + 105.9167dp + 107.0556dp + 108.1944dp + 109.3333dp + 110.4722dp + 111.6111dp + 112.7500dp + 113.8889dp + 115.0278dp + 116.1667dp + 117.3056dp + 118.4444dp + 119.5833dp + 120.7222dp + 121.8611dp + 123.0000dp + 124.1389dp + 125.2778dp + 126.4167dp + 127.5556dp + 128.6944dp + 129.8333dp + 130.9722dp + 132.1111dp + 133.2500dp + 134.3889dp + 135.5278dp + 136.6667dp + 137.8056dp + 138.9444dp + 140.0833dp + 141.2222dp + 142.3611dp + 143.5000dp + 144.6389dp + 145.7778dp + 146.9167dp + 148.0556dp + 149.1944dp + 150.3333dp + 151.4722dp + 152.6111dp + 153.7500dp + 154.8889dp + 156.0278dp + 157.1667dp + 158.3056dp + 159.4444dp + 160.5833dp + 161.7222dp + 162.8611dp + 164.0000dp + 165.1389dp + 166.2778dp + 167.4167dp + 168.5556dp + 169.6944dp + 170.8333dp + 171.9722dp + 173.1111dp + 174.2500dp + 175.3889dp + 176.5278dp + 177.6667dp + 178.8056dp + 179.9444dp + 181.0833dp + 182.2222dp + 183.3611dp + 184.5000dp + 185.6389dp + 186.7778dp + 187.9167dp + 189.0556dp + 190.1944dp + 191.3333dp + 192.4722dp + 193.6111dp + 194.7500dp + 195.8889dp + 197.0278dp + 198.1667dp + 199.3056dp + 200.4444dp + 201.5833dp + 202.7222dp + 203.8611dp + 205.0000dp + 206.1389dp + 207.2778dp + 208.4167dp + 209.5556dp + 210.6944dp + 211.8333dp + 212.9722dp + 214.1111dp + 215.2500dp + 216.3889dp + 217.5278dp + 218.6667dp + 219.8056dp + 220.9444dp + 222.0833dp + 223.2222dp + 224.3611dp + 225.5000dp + 226.6389dp + 227.7778dp + 228.9167dp + 230.0556dp + 231.1944dp + 232.3333dp + 233.4722dp + 234.6111dp + 235.7500dp + 236.8889dp + 238.0278dp + 239.1667dp + 240.3056dp + 241.4444dp + 242.5833dp + 243.7222dp + 244.8611dp + 246.0000dp + 247.1389dp + 248.2778dp + 249.4167dp + 250.5556dp + 251.6944dp + 252.8333dp + 253.9722dp + 255.1111dp + 256.2500dp + 257.3889dp + 258.5278dp + 259.6667dp + 260.8056dp + 261.9444dp + 263.0833dp + 264.2222dp + 265.3611dp + 266.5000dp + 267.6389dp + 268.7778dp + 269.9167dp + 271.0556dp + 272.1944dp + 273.3333dp + 274.4722dp + 275.6111dp + 276.7500dp + 277.8889dp + 279.0278dp + 280.1667dp + 281.3056dp + 282.4444dp + 283.5833dp + 284.7222dp + 285.8611dp + 287.0000dp + 288.1389dp + 289.2778dp + 290.4167dp + 291.5556dp + 292.6944dp + 293.8333dp + 294.9722dp + 296.1111dp + 297.2500dp + 298.3889dp + 299.5278dp + 300.6667dp + 301.8056dp + 302.9444dp + 304.0833dp + 305.2222dp + 306.3611dp + 307.5000dp + 308.6389dp + 309.7778dp + 310.9167dp + 312.0556dp + 313.1944dp + 314.3333dp + 315.4722dp + 316.6111dp + 317.7500dp + 318.8889dp + 320.0278dp + 321.1667dp + 322.3056dp + 323.4444dp + 324.5833dp + 325.7222dp + 326.8611dp + 328.0000dp + 329.1389dp + 330.2778dp + 331.4167dp + 332.5556dp + 333.6944dp + 334.8333dp + 335.9722dp + 337.1111dp + 338.2500dp + 339.3889dp + 340.5278dp + 341.6667dp + 342.8056dp + 343.9444dp + 345.0833dp + 346.2222dp + 347.3611dp + 348.5000dp + 349.6389dp + 350.7778dp + 351.9167dp + 353.0556dp + 354.1944dp + 355.3333dp + 356.4722dp + 357.6111dp + 358.7500dp + 359.8889dp + 361.0278dp + 362.1667dp + 363.3056dp + 364.4444dp + 365.5833dp + 366.7222dp + 367.8611dp + 369.0000dp + 370.1389dp + 371.2778dp + 372.4167dp + 373.5556dp + 374.6944dp + 375.8333dp + 376.9722dp + 378.1111dp + 379.2500dp + 380.3889dp + 381.5278dp + 382.6667dp + 383.8056dp + 384.9444dp + 386.0833dp + 387.2222dp + 388.3611dp + 389.5000dp + 390.6389dp + 391.7778dp + 392.9167dp + 394.0556dp + 395.1944dp + 396.3333dp + 397.4722dp + 398.6111dp + 399.7500dp + 400.8889dp + 402.0278dp + 403.1667dp + 404.3056dp + 405.4444dp + 406.5833dp + 407.7222dp + 408.8611dp + 410.0000dp + 415.6944dp + 421.3889dp + 455.5556dp + 466.9444dp + 480.6111dp + 537.5556dp + 569.4444dp + 683.3333dp + 728.8889dp + 820.0000dp + diff --git a/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml new file mode 100644 index 00000000..1f93ba0e --- /dev/null +++ b/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.8333sp + 7.9722sp + 9.1111sp + 10.2500sp + 11.3889sp + 12.5278sp + 13.6667sp + 14.8056sp + 15.9444sp + 17.0833sp + 18.2222sp + 19.3611sp + 20.5000sp + 21.6389sp + 22.7778sp + 23.9167sp + 25.0556sp + 26.1944sp + 27.3333sp + 28.4722sp + 31.8889sp + 34.1667sp + 36.4444sp + 38.7222sp + 41.0000sp + 43.2778sp + 45.5556sp + 47.8333sp + 54.6667sp + diff --git a/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml new file mode 100644 index 00000000..e628dce2 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -68.5714dp + -34.2857dp + -22.8571dp + -13.7143dp + -11.4286dp + -9.1429dp + -5.7143dp + -2.2857dp + -1.1429dp + + 0.1143dp + 0.5714dp + 1.1429dp + 1.7143dp + 2.2857dp + 2.8571dp + 3.4286dp + 4.0000dp + 4.5714dp + 5.1429dp + 5.7143dp + 6.8571dp + 8.0000dp + 9.1429dp + 10.2857dp + 11.4286dp + 12.5714dp + 13.7143dp + 14.8571dp + 16.0000dp + 17.1429dp + 18.2857dp + 19.4286dp + 20.5714dp + 21.7143dp + 22.8571dp + 24.0000dp + 25.1429dp + 26.2857dp + 27.4286dp + 28.5714dp + 29.7143dp + 30.8571dp + 32.0000dp + 33.1429dp + 34.2857dp + 35.4286dp + 36.5714dp + 37.7143dp + 38.8571dp + 40.0000dp + 41.1428dp + 42.2857dp + 43.4286dp + 44.5714dp + 45.7143dp + 46.8571dp + 48.0000dp + 49.1428dp + 50.2857dp + 51.4286dp + 52.5714dp + 53.7143dp + 54.8571dp + 56.0000dp + 57.1428dp + 58.2857dp + 59.4286dp + 60.5714dp + 61.7143dp + 62.8571dp + 64.0000dp + 65.1428dp + 66.2857dp + 67.4286dp + 68.5714dp + 69.7143dp + 70.8571dp + 72.0000dp + 73.1428dp + 74.2857dp + 75.4286dp + 76.5714dp + 77.7143dp + 78.8571dp + 80.0000dp + 81.1428dp + 82.2857dp + 83.4286dp + 84.5714dp + 85.7143dp + 86.8571dp + 88.0000dp + 89.1428dp + 90.2857dp + 91.4286dp + 92.5714dp + 93.7143dp + 94.8571dp + 96.0000dp + 97.1428dp + 98.2857dp + 99.4286dp + 100.5714dp + 101.7143dp + 102.8571dp + 104.0000dp + 105.1428dp + 106.2857dp + 107.4286dp + 108.5714dp + 109.7143dp + 110.8571dp + 112.0000dp + 113.1428dp + 114.2857dp + 115.4286dp + 116.5714dp + 117.7143dp + 118.8571dp + 120.0000dp + 121.1428dp + 122.2857dp + 123.4285dp + 124.5714dp + 125.7143dp + 126.8571dp + 128.0000dp + 129.1428dp + 130.2857dp + 131.4285dp + 132.5714dp + 133.7143dp + 134.8571dp + 136.0000dp + 137.1428dp + 138.2857dp + 139.4285dp + 140.5714dp + 141.7143dp + 142.8571dp + 144.0000dp + 145.1428dp + 146.2857dp + 147.4285dp + 148.5714dp + 149.7143dp + 150.8571dp + 152.0000dp + 153.1428dp + 154.2857dp + 155.4285dp + 156.5714dp + 157.7143dp + 158.8571dp + 160.0000dp + 161.1428dp + 162.2857dp + 163.4285dp + 164.5714dp + 165.7143dp + 166.8571dp + 168.0000dp + 169.1428dp + 170.2857dp + 171.4285dp + 172.5714dp + 173.7143dp + 174.8571dp + 176.0000dp + 177.1428dp + 178.2857dp + 179.4285dp + 180.5714dp + 181.7143dp + 182.8571dp + 184.0000dp + 185.1428dp + 186.2857dp + 187.4285dp + 188.5714dp + 189.7143dp + 190.8571dp + 192.0000dp + 193.1428dp + 194.2857dp + 195.4285dp + 196.5714dp + 197.7143dp + 198.8571dp + 200.0000dp + 201.1428dp + 202.2857dp + 203.4285dp + 204.5714dp + 205.7142dp + 206.8571dp + 208.0000dp + 209.1428dp + 210.2857dp + 211.4285dp + 212.5714dp + 213.7142dp + 214.8571dp + 216.0000dp + 217.1428dp + 218.2857dp + 219.4285dp + 220.5714dp + 221.7142dp + 222.8571dp + 224.0000dp + 225.1428dp + 226.2857dp + 227.4285dp + 228.5714dp + 229.7142dp + 230.8571dp + 232.0000dp + 233.1428dp + 234.2857dp + 235.4285dp + 236.5714dp + 237.7142dp + 238.8571dp + 240.0000dp + 241.1428dp + 242.2857dp + 243.4285dp + 244.5714dp + 245.7142dp + 246.8571dp + 248.0000dp + 249.1428dp + 250.2857dp + 251.4285dp + 252.5714dp + 253.7142dp + 254.8571dp + 256.0000dp + 257.1428dp + 258.2857dp + 259.4285dp + 260.5714dp + 261.7142dp + 262.8571dp + 264.0000dp + 265.1428dp + 266.2857dp + 267.4285dp + 268.5714dp + 269.7142dp + 270.8571dp + 272.0000dp + 273.1428dp + 274.2857dp + 275.4285dp + 276.5714dp + 277.7142dp + 278.8571dp + 280.0000dp + 281.1428dp + 282.2857dp + 283.4285dp + 284.5714dp + 285.7142dp + 286.8571dp + 287.9999dp + 289.1428dp + 290.2857dp + 291.4285dp + 292.5714dp + 293.7142dp + 294.8571dp + 295.9999dp + 297.1428dp + 298.2857dp + 299.4285dp + 300.5714dp + 301.7142dp + 302.8571dp + 303.9999dp + 305.1428dp + 306.2857dp + 307.4285dp + 308.5714dp + 309.7142dp + 310.8571dp + 311.9999dp + 313.1428dp + 314.2857dp + 315.4285dp + 316.5714dp + 317.7142dp + 318.8571dp + 319.9999dp + 321.1428dp + 322.2857dp + 323.4285dp + 324.5714dp + 325.7142dp + 326.8571dp + 327.9999dp + 329.1428dp + 330.2857dp + 331.4285dp + 332.5714dp + 333.7142dp + 334.8571dp + 335.9999dp + 337.1428dp + 338.2857dp + 339.4285dp + 340.5714dp + 341.7142dp + 342.8571dp + 343.9999dp + 345.1428dp + 346.2857dp + 347.4285dp + 348.5714dp + 349.7142dp + 350.8571dp + 351.9999dp + 353.1428dp + 354.2857dp + 355.4285dp + 356.5714dp + 357.7142dp + 358.8571dp + 359.9999dp + 361.1428dp + 362.2857dp + 363.4285dp + 364.5714dp + 365.7142dp + 366.8571dp + 367.9999dp + 369.1428dp + 370.2856dp + 371.4285dp + 372.5714dp + 373.7142dp + 374.8571dp + 375.9999dp + 377.1428dp + 378.2856dp + 379.4285dp + 380.5714dp + 381.7142dp + 382.8571dp + 383.9999dp + 385.1428dp + 386.2856dp + 387.4285dp + 388.5714dp + 389.7142dp + 390.8571dp + 391.9999dp + 393.1428dp + 394.2856dp + 395.4285dp + 396.5714dp + 397.7142dp + 398.8571dp + 399.9999dp + 401.1428dp + 402.2856dp + 403.4285dp + 404.5714dp + 405.7142dp + 406.8571dp + 407.9999dp + 409.1428dp + 410.2856dp + 411.4285dp + 417.1428dp + 422.8571dp + 457.1428dp + 468.5713dp + 482.2856dp + 539.4285dp + 571.4285dp + 685.7142dp + 731.4284dp + 822.8570dp + diff --git a/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml new file mode 100644 index 00000000..27f5ee23 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.8571sp + 8.0000sp + 9.1429sp + 10.2857sp + 11.4286sp + 12.5714sp + 13.7143sp + 14.8571sp + 16.0000sp + 17.1429sp + 18.2857sp + 19.4286sp + 20.5714sp + 21.7143sp + 22.8571sp + 24.0000sp + 25.1429sp + 26.2857sp + 27.4286sp + 28.5714sp + 32.0000sp + 34.2857sp + 36.5714sp + 38.8571sp + 41.1428sp + 43.4286sp + 45.7143sp + 48.0000sp + 54.8571sp + diff --git a/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml new file mode 100644 index 00000000..bdc986ed --- /dev/null +++ b/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -72.0000dp + -36.0000dp + -24.0000dp + -14.4000dp + -12.0000dp + -9.6000dp + -6.0000dp + -2.4000dp + -1.2000dp + + 0.1200dp + 0.6000dp + 1.2000dp + 1.8000dp + 2.4000dp + 3.0000dp + 3.6000dp + 4.2000dp + 4.8000dp + 5.4000dp + 6.0000dp + 7.2000dp + 8.4000dp + 9.6000dp + 10.8000dp + 12.0000dp + 13.2000dp + 14.4000dp + 15.6000dp + 16.8000dp + 18.0000dp + 19.2000dp + 20.4000dp + 21.6000dp + 22.8000dp + 24.0000dp + 25.2000dp + 26.4000dp + 27.6000dp + 28.8000dp + 30.0000dp + 31.2000dp + 32.4000dp + 33.6000dp + 34.8000dp + 36.0000dp + 37.2000dp + 38.4000dp + 39.6000dp + 40.8000dp + 42.0000dp + 43.2000dp + 44.4000dp + 45.6000dp + 46.8000dp + 48.0000dp + 49.2000dp + 50.4000dp + 51.6000dp + 52.8000dp + 54.0000dp + 55.2000dp + 56.4000dp + 57.6000dp + 58.8000dp + 60.0000dp + 61.2000dp + 62.4000dp + 63.6000dp + 64.8000dp + 66.0000dp + 67.2000dp + 68.4000dp + 69.6000dp + 70.8000dp + 72.0000dp + 73.2000dp + 74.4000dp + 75.6000dp + 76.8000dp + 78.0000dp + 79.2000dp + 80.4000dp + 81.6000dp + 82.8000dp + 84.0000dp + 85.2000dp + 86.4000dp + 87.6000dp + 88.8000dp + 90.0000dp + 91.2000dp + 92.4000dp + 93.6000dp + 94.8000dp + 96.0000dp + 97.2000dp + 98.4000dp + 99.6000dp + 100.8000dp + 102.0000dp + 103.2000dp + 104.4000dp + 105.6000dp + 106.8000dp + 108.0000dp + 109.2000dp + 110.4000dp + 111.6000dp + 112.8000dp + 114.0000dp + 115.2000dp + 116.4000dp + 117.6000dp + 118.8000dp + 120.0000dp + 121.2000dp + 122.4000dp + 123.6000dp + 124.8000dp + 126.0000dp + 127.2000dp + 128.4000dp + 129.6000dp + 130.8000dp + 132.0000dp + 133.2000dp + 134.4000dp + 135.6000dp + 136.8000dp + 138.0000dp + 139.2000dp + 140.4000dp + 141.6000dp + 142.8000dp + 144.0000dp + 145.2000dp + 146.4000dp + 147.6000dp + 148.8000dp + 150.0000dp + 151.2000dp + 152.4000dp + 153.6000dp + 154.8000dp + 156.0000dp + 157.2000dp + 158.4000dp + 159.6000dp + 160.8000dp + 162.0000dp + 163.2000dp + 164.4000dp + 165.6000dp + 166.8000dp + 168.0000dp + 169.2000dp + 170.4000dp + 171.6000dp + 172.8000dp + 174.0000dp + 175.2000dp + 176.4000dp + 177.6000dp + 178.8000dp + 180.0000dp + 181.2000dp + 182.4000dp + 183.6000dp + 184.8000dp + 186.0000dp + 187.2000dp + 188.4000dp + 189.6000dp + 190.8000dp + 192.0000dp + 193.2000dp + 194.4000dp + 195.6000dp + 196.8000dp + 198.0000dp + 199.2000dp + 200.4000dp + 201.6000dp + 202.8000dp + 204.0000dp + 205.2000dp + 206.4000dp + 207.6000dp + 208.8000dp + 210.0000dp + 211.2000dp + 212.4000dp + 213.6000dp + 214.8000dp + 216.0000dp + 217.2000dp + 218.4000dp + 219.6000dp + 220.8000dp + 222.0000dp + 223.2000dp + 224.4000dp + 225.6000dp + 226.8000dp + 228.0000dp + 229.2000dp + 230.4000dp + 231.6000dp + 232.8000dp + 234.0000dp + 235.2000dp + 236.4000dp + 237.6000dp + 238.8000dp + 240.0000dp + 241.2000dp + 242.4000dp + 243.6000dp + 244.8000dp + 246.0000dp + 247.2000dp + 248.4000dp + 249.6000dp + 250.8000dp + 252.0000dp + 253.2000dp + 254.4000dp + 255.6000dp + 256.8000dp + 258.0000dp + 259.2000dp + 260.4000dp + 261.6000dp + 262.8000dp + 264.0000dp + 265.2000dp + 266.4000dp + 267.6000dp + 268.8000dp + 270.0000dp + 271.2000dp + 272.4000dp + 273.6000dp + 274.8000dp + 276.0000dp + 277.2000dp + 278.4000dp + 279.6000dp + 280.8000dp + 282.0000dp + 283.2000dp + 284.4000dp + 285.6000dp + 286.8000dp + 288.0000dp + 289.2000dp + 290.4000dp + 291.6000dp + 292.8000dp + 294.0000dp + 295.2000dp + 296.4000dp + 297.6000dp + 298.8000dp + 300.0000dp + 301.2000dp + 302.4000dp + 303.6000dp + 304.8000dp + 306.0000dp + 307.2000dp + 308.4000dp + 309.6000dp + 310.8000dp + 312.0000dp + 313.2000dp + 314.4000dp + 315.6000dp + 316.8000dp + 318.0000dp + 319.2000dp + 320.4000dp + 321.6000dp + 322.8000dp + 324.0000dp + 325.2000dp + 326.4000dp + 327.6000dp + 328.8000dp + 330.0000dp + 331.2000dp + 332.4000dp + 333.6000dp + 334.8000dp + 336.0000dp + 337.2000dp + 338.4000dp + 339.6000dp + 340.8000dp + 342.0000dp + 343.2000dp + 344.4000dp + 345.6000dp + 346.8000dp + 348.0000dp + 349.2000dp + 350.4000dp + 351.6000dp + 352.8000dp + 354.0000dp + 355.2000dp + 356.4000dp + 357.6000dp + 358.8000dp + 360.0000dp + 361.2000dp + 362.4000dp + 363.6000dp + 364.8000dp + 366.0000dp + 367.2000dp + 368.4000dp + 369.6000dp + 370.8000dp + 372.0000dp + 373.2000dp + 374.4000dp + 375.6000dp + 376.8000dp + 378.0000dp + 379.2000dp + 380.4000dp + 381.6000dp + 382.8000dp + 384.0000dp + 385.2000dp + 386.4000dp + 387.6000dp + 388.8000dp + 390.0000dp + 391.2000dp + 392.4000dp + 393.6000dp + 394.8000dp + 396.0000dp + 397.2000dp + 398.4000dp + 399.6000dp + 400.8000dp + 402.0000dp + 403.2000dp + 404.4000dp + 405.6000dp + 406.8000dp + 408.0000dp + 409.2000dp + 410.4000dp + 411.6000dp + 412.8000dp + 414.0000dp + 415.2000dp + 416.4000dp + 417.6000dp + 418.8000dp + 420.0000dp + 421.2000dp + 422.4000dp + 423.6000dp + 424.8000dp + 426.0000dp + 427.2000dp + 428.4000dp + 429.6000dp + 430.8000dp + 432.0000dp + 438.0000dp + 444.0000dp + 480.0000dp + 492.0000dp + 506.4000dp + 566.4000dp + 600.0000dp + 720.0000dp + 768.0000dp + 864.0000dp + diff --git a/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml new file mode 100644 index 00000000..eacacf1f --- /dev/null +++ b/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 7.2000sp + 8.4000sp + 9.6000sp + 10.8000sp + 12.0000sp + 13.2000sp + 14.4000sp + 15.6000sp + 16.8000sp + 18.0000sp + 19.2000sp + 20.4000sp + 21.6000sp + 22.8000sp + 24.0000sp + 25.2000sp + 26.4000sp + 27.6000sp + 28.8000sp + 30.0000sp + 33.6000sp + 36.0000sp + 38.4000sp + 40.8000sp + 43.2000sp + 45.6000sp + 48.0000sp + 50.4000sp + 57.6000sp + diff --git a/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml new file mode 100644 index 00000000..b5114c6f --- /dev/null +++ b/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -80.0000dp + -40.0000dp + -26.6667dp + -16.0000dp + -13.3333dp + -10.6667dp + -6.6667dp + -2.6667dp + -1.3333dp + + 0.1333dp + 0.6667dp + 1.3333dp + 2.0000dp + 2.6667dp + 3.3333dp + 4.0000dp + 4.6667dp + 5.3333dp + 6.0000dp + 6.6667dp + 8.0000dp + 9.3333dp + 10.6667dp + 12.0000dp + 13.3333dp + 14.6667dp + 16.0000dp + 17.3333dp + 18.6667dp + 20.0000dp + 21.3333dp + 22.6667dp + 24.0000dp + 25.3333dp + 26.6667dp + 28.0000dp + 29.3333dp + 30.6667dp + 32.0000dp + 33.3333dp + 34.6667dp + 36.0000dp + 37.3333dp + 38.6667dp + 40.0000dp + 41.3333dp + 42.6667dp + 44.0000dp + 45.3333dp + 46.6667dp + 48.0000dp + 49.3333dp + 50.6667dp + 52.0000dp + 53.3333dp + 54.6667dp + 56.0000dp + 57.3333dp + 58.6667dp + 60.0000dp + 61.3333dp + 62.6667dp + 64.0000dp + 65.3333dp + 66.6667dp + 68.0000dp + 69.3333dp + 70.6667dp + 72.0000dp + 73.3333dp + 74.6667dp + 76.0000dp + 77.3333dp + 78.6667dp + 80.0000dp + 81.3333dp + 82.6667dp + 84.0000dp + 85.3333dp + 86.6667dp + 88.0000dp + 89.3333dp + 90.6667dp + 92.0000dp + 93.3333dp + 94.6667dp + 96.0000dp + 97.3333dp + 98.6667dp + 100.0000dp + 101.3333dp + 102.6667dp + 104.0000dp + 105.3333dp + 106.6667dp + 108.0000dp + 109.3333dp + 110.6667dp + 112.0000dp + 113.3333dp + 114.6667dp + 116.0000dp + 117.3333dp + 118.6667dp + 120.0000dp + 121.3333dp + 122.6667dp + 124.0000dp + 125.3333dp + 126.6667dp + 128.0000dp + 129.3333dp + 130.6667dp + 132.0000dp + 133.3333dp + 134.6667dp + 136.0000dp + 137.3333dp + 138.6667dp + 140.0000dp + 141.3333dp + 142.6667dp + 144.0000dp + 145.3333dp + 146.6667dp + 148.0000dp + 149.3333dp + 150.6667dp + 152.0000dp + 153.3333dp + 154.6667dp + 156.0000dp + 157.3333dp + 158.6667dp + 160.0000dp + 161.3333dp + 162.6667dp + 164.0000dp + 165.3333dp + 166.6667dp + 168.0000dp + 169.3333dp + 170.6667dp + 172.0000dp + 173.3333dp + 174.6667dp + 176.0000dp + 177.3333dp + 178.6667dp + 180.0000dp + 181.3333dp + 182.6667dp + 184.0000dp + 185.3333dp + 186.6667dp + 188.0000dp + 189.3333dp + 190.6667dp + 192.0000dp + 193.3333dp + 194.6667dp + 196.0000dp + 197.3333dp + 198.6667dp + 200.0000dp + 201.3333dp + 202.6667dp + 204.0000dp + 205.3333dp + 206.6667dp + 208.0000dp + 209.3333dp + 210.6667dp + 212.0000dp + 213.3333dp + 214.6667dp + 216.0000dp + 217.3333dp + 218.6667dp + 220.0000dp + 221.3333dp + 222.6667dp + 224.0000dp + 225.3333dp + 226.6667dp + 228.0000dp + 229.3333dp + 230.6667dp + 232.0000dp + 233.3333dp + 234.6667dp + 236.0000dp + 237.3333dp + 238.6667dp + 240.0000dp + 241.3333dp + 242.6667dp + 244.0000dp + 245.3333dp + 246.6667dp + 248.0000dp + 249.3333dp + 250.6667dp + 252.0000dp + 253.3333dp + 254.6667dp + 256.0000dp + 257.3333dp + 258.6667dp + 260.0000dp + 261.3333dp + 262.6667dp + 264.0000dp + 265.3333dp + 266.6667dp + 268.0000dp + 269.3333dp + 270.6667dp + 272.0000dp + 273.3333dp + 274.6667dp + 276.0000dp + 277.3333dp + 278.6667dp + 280.0000dp + 281.3333dp + 282.6667dp + 284.0000dp + 285.3333dp + 286.6667dp + 288.0000dp + 289.3333dp + 290.6667dp + 292.0000dp + 293.3333dp + 294.6667dp + 296.0000dp + 297.3333dp + 298.6667dp + 300.0000dp + 301.3333dp + 302.6667dp + 304.0000dp + 305.3333dp + 306.6667dp + 308.0000dp + 309.3333dp + 310.6667dp + 312.0000dp + 313.3333dp + 314.6667dp + 316.0000dp + 317.3333dp + 318.6667dp + 320.0000dp + 321.3333dp + 322.6667dp + 324.0000dp + 325.3333dp + 326.6667dp + 328.0000dp + 329.3333dp + 330.6667dp + 332.0000dp + 333.3333dp + 334.6667dp + 336.0000dp + 337.3333dp + 338.6667dp + 340.0000dp + 341.3333dp + 342.6667dp + 344.0000dp + 345.3333dp + 346.6667dp + 348.0000dp + 349.3333dp + 350.6667dp + 352.0000dp + 353.3333dp + 354.6667dp + 356.0000dp + 357.3333dp + 358.6667dp + 360.0000dp + 361.3333dp + 362.6667dp + 364.0000dp + 365.3333dp + 366.6667dp + 368.0000dp + 369.3333dp + 370.6667dp + 372.0000dp + 373.3333dp + 374.6667dp + 376.0000dp + 377.3333dp + 378.6667dp + 380.0000dp + 381.3333dp + 382.6667dp + 384.0000dp + 385.3333dp + 386.6667dp + 388.0000dp + 389.3333dp + 390.6667dp + 392.0000dp + 393.3333dp + 394.6667dp + 396.0000dp + 397.3333dp + 398.6667dp + 400.0000dp + 401.3333dp + 402.6667dp + 404.0000dp + 405.3333dp + 406.6667dp + 408.0000dp + 409.3333dp + 410.6667dp + 412.0000dp + 413.3333dp + 414.6667dp + 416.0000dp + 417.3333dp + 418.6667dp + 420.0000dp + 421.3333dp + 422.6667dp + 424.0000dp + 425.3333dp + 426.6667dp + 428.0000dp + 429.3333dp + 430.6667dp + 432.0000dp + 433.3333dp + 434.6667dp + 436.0000dp + 437.3333dp + 438.6667dp + 440.0000dp + 441.3333dp + 442.6667dp + 444.0000dp + 445.3333dp + 446.6667dp + 448.0000dp + 449.3333dp + 450.6667dp + 452.0000dp + 453.3333dp + 454.6667dp + 456.0000dp + 457.3333dp + 458.6667dp + 460.0000dp + 461.3333dp + 462.6667dp + 464.0000dp + 465.3333dp + 466.6667dp + 468.0000dp + 469.3333dp + 470.6667dp + 472.0000dp + 473.3333dp + 474.6667dp + 476.0000dp + 477.3333dp + 478.6667dp + 480.0000dp + 486.6667dp + 493.3333dp + 533.3333dp + 546.6667dp + 562.6667dp + 629.3333dp + 666.6667dp + 800.0000dp + 853.3333dp + 960.0000dp + diff --git a/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml new file mode 100644 index 00000000..46c21162 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 8.0000sp + 9.3333sp + 10.6667sp + 12.0000sp + 13.3333sp + 14.6667sp + 16.0000sp + 17.3333sp + 18.6667sp + 20.0000sp + 21.3333sp + 22.6667sp + 24.0000sp + 25.3333sp + 26.6667sp + 28.0000sp + 29.3333sp + 30.6667sp + 32.0000sp + 33.3333sp + 37.3333sp + 40.0000sp + 42.6667sp + 45.3333sp + 48.0000sp + 50.6667sp + 53.3333sp + 56.0000sp + 64.0000sp + diff --git a/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml new file mode 100644 index 00000000..f40b47eb --- /dev/null +++ b/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -88.8333dp + -44.4167dp + -29.6111dp + -17.7667dp + -14.8056dp + -11.8444dp + -7.4028dp + -2.9611dp + -1.4806dp + + 0.1481dp + 0.7403dp + 1.4806dp + 2.2208dp + 2.9611dp + 3.7014dp + 4.4417dp + 5.1819dp + 5.9222dp + 6.6625dp + 7.4028dp + 8.8833dp + 10.3639dp + 11.8444dp + 13.3250dp + 14.8056dp + 16.2861dp + 17.7667dp + 19.2472dp + 20.7278dp + 22.2083dp + 23.6889dp + 25.1694dp + 26.6500dp + 28.1306dp + 29.6111dp + 31.0917dp + 32.5722dp + 34.0528dp + 35.5333dp + 37.0139dp + 38.4944dp + 39.9750dp + 41.4556dp + 42.9361dp + 44.4167dp + 45.8972dp + 47.3778dp + 48.8583dp + 50.3389dp + 51.8194dp + 53.3000dp + 54.7806dp + 56.2611dp + 57.7417dp + 59.2222dp + 60.7028dp + 62.1833dp + 63.6639dp + 65.1444dp + 66.6250dp + 68.1056dp + 69.5861dp + 71.0667dp + 72.5472dp + 74.0278dp + 75.5083dp + 76.9889dp + 78.4694dp + 79.9500dp + 81.4306dp + 82.9111dp + 84.3917dp + 85.8722dp + 87.3528dp + 88.8333dp + 90.3139dp + 91.7944dp + 93.2750dp + 94.7556dp + 96.2361dp + 97.7167dp + 99.1972dp + 100.6778dp + 102.1583dp + 103.6389dp + 105.1194dp + 106.6000dp + 108.0806dp + 109.5611dp + 111.0417dp + 112.5222dp + 114.0028dp + 115.4833dp + 116.9639dp + 118.4444dp + 119.9250dp + 121.4056dp + 122.8861dp + 124.3667dp + 125.8472dp + 127.3278dp + 128.8083dp + 130.2889dp + 131.7694dp + 133.2500dp + 134.7306dp + 136.2111dp + 137.6917dp + 139.1722dp + 140.6528dp + 142.1333dp + 143.6139dp + 145.0944dp + 146.5750dp + 148.0556dp + 149.5361dp + 151.0167dp + 152.4972dp + 153.9778dp + 155.4583dp + 156.9389dp + 158.4194dp + 159.9000dp + 161.3806dp + 162.8611dp + 164.3417dp + 165.8222dp + 167.3028dp + 168.7833dp + 170.2639dp + 171.7444dp + 173.2250dp + 174.7056dp + 176.1861dp + 177.6667dp + 179.1472dp + 180.6278dp + 182.1083dp + 183.5889dp + 185.0694dp + 186.5500dp + 188.0306dp + 189.5111dp + 190.9917dp + 192.4722dp + 193.9528dp + 195.4333dp + 196.9139dp + 198.3944dp + 199.8750dp + 201.3556dp + 202.8361dp + 204.3167dp + 205.7972dp + 207.2778dp + 208.7583dp + 210.2389dp + 211.7194dp + 213.2000dp + 214.6806dp + 216.1611dp + 217.6417dp + 219.1222dp + 220.6028dp + 222.0833dp + 223.5639dp + 225.0444dp + 226.5250dp + 228.0056dp + 229.4861dp + 230.9667dp + 232.4472dp + 233.9278dp + 235.4083dp + 236.8889dp + 238.3694dp + 239.8500dp + 241.3306dp + 242.8111dp + 244.2917dp + 245.7722dp + 247.2528dp + 248.7333dp + 250.2139dp + 251.6944dp + 253.1750dp + 254.6556dp + 256.1361dp + 257.6167dp + 259.0972dp + 260.5778dp + 262.0583dp + 263.5389dp + 265.0194dp + 266.5000dp + 267.9806dp + 269.4611dp + 270.9417dp + 272.4222dp + 273.9028dp + 275.3833dp + 276.8639dp + 278.3444dp + 279.8250dp + 281.3056dp + 282.7861dp + 284.2667dp + 285.7472dp + 287.2278dp + 288.7083dp + 290.1889dp + 291.6694dp + 293.1500dp + 294.6306dp + 296.1111dp + 297.5917dp + 299.0722dp + 300.5528dp + 302.0333dp + 303.5139dp + 304.9944dp + 306.4750dp + 307.9556dp + 309.4361dp + 310.9167dp + 312.3972dp + 313.8778dp + 315.3583dp + 316.8389dp + 318.3194dp + 319.8000dp + 321.2806dp + 322.7611dp + 324.2417dp + 325.7222dp + 327.2028dp + 328.6833dp + 330.1639dp + 331.6444dp + 333.1250dp + 334.6056dp + 336.0861dp + 337.5667dp + 339.0472dp + 340.5278dp + 342.0083dp + 343.4889dp + 344.9694dp + 346.4500dp + 347.9306dp + 349.4111dp + 350.8917dp + 352.3722dp + 353.8528dp + 355.3333dp + 356.8139dp + 358.2944dp + 359.7750dp + 361.2556dp + 362.7361dp + 364.2167dp + 365.6972dp + 367.1778dp + 368.6583dp + 370.1389dp + 371.6194dp + 373.1000dp + 374.5806dp + 376.0611dp + 377.5417dp + 379.0222dp + 380.5028dp + 381.9833dp + 383.4639dp + 384.9444dp + 386.4250dp + 387.9056dp + 389.3861dp + 390.8667dp + 392.3472dp + 393.8278dp + 395.3083dp + 396.7889dp + 398.2694dp + 399.7500dp + 401.2306dp + 402.7111dp + 404.1917dp + 405.6722dp + 407.1528dp + 408.6333dp + 410.1139dp + 411.5944dp + 413.0750dp + 414.5556dp + 416.0361dp + 417.5167dp + 418.9972dp + 420.4778dp + 421.9583dp + 423.4389dp + 424.9194dp + 426.4000dp + 427.8806dp + 429.3611dp + 430.8417dp + 432.3222dp + 433.8028dp + 435.2833dp + 436.7639dp + 438.2444dp + 439.7250dp + 441.2056dp + 442.6861dp + 444.1667dp + 445.6472dp + 447.1278dp + 448.6083dp + 450.0889dp + 451.5694dp + 453.0500dp + 454.5306dp + 456.0111dp + 457.4917dp + 458.9722dp + 460.4528dp + 461.9333dp + 463.4139dp + 464.8944dp + 466.3750dp + 467.8556dp + 469.3361dp + 470.8167dp + 472.2972dp + 473.7778dp + 475.2583dp + 476.7389dp + 478.2194dp + 479.7000dp + 481.1806dp + 482.6611dp + 484.1417dp + 485.6222dp + 487.1028dp + 488.5833dp + 490.0639dp + 491.5444dp + 493.0250dp + 494.5056dp + 495.9861dp + 497.4667dp + 498.9472dp + 500.4278dp + 501.9083dp + 503.3889dp + 504.8694dp + 506.3500dp + 507.8306dp + 509.3111dp + 510.7917dp + 512.2722dp + 513.7528dp + 515.2333dp + 516.7139dp + 518.1944dp + 519.6750dp + 521.1556dp + 522.6361dp + 524.1167dp + 525.5972dp + 527.0778dp + 528.5583dp + 530.0389dp + 531.5194dp + 533.0000dp + 540.4028dp + 547.8056dp + 592.2222dp + 607.0278dp + 624.7944dp + 698.8222dp + 740.2778dp + 888.3333dp + 947.5556dp + 1066.0000dp + diff --git a/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml new file mode 100644 index 00000000..e9176645 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 8.8833sp + 10.3639sp + 11.8444sp + 13.3250sp + 14.8056sp + 16.2861sp + 17.7667sp + 19.2472sp + 20.7278sp + 22.2083sp + 23.6889sp + 25.1694sp + 26.6500sp + 28.1306sp + 29.6111sp + 31.0917sp + 32.5722sp + 34.0528sp + 35.5333sp + 37.0139sp + 41.4556sp + 44.4167sp + 47.3778sp + 50.3389sp + 53.3000sp + 56.2611sp + 59.2222sp + 62.1833sp + 71.0667sp + diff --git a/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml new file mode 100644 index 00000000..959c6e6d --- /dev/null +++ b/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -90.0000dp + -45.0000dp + -30.0000dp + -18.0000dp + -15.0000dp + -12.0000dp + -7.5000dp + -3.0000dp + -1.5000dp + + 0.1500dp + 0.7500dp + 1.5000dp + 2.2500dp + 3.0000dp + 3.7500dp + 4.5000dp + 5.2500dp + 6.0000dp + 6.7500dp + 7.5000dp + 9.0000dp + 10.5000dp + 12.0000dp + 13.5000dp + 15.0000dp + 16.5000dp + 18.0000dp + 19.5000dp + 21.0000dp + 22.5000dp + 24.0000dp + 25.5000dp + 27.0000dp + 28.5000dp + 30.0000dp + 31.5000dp + 33.0000dp + 34.5000dp + 36.0000dp + 37.5000dp + 39.0000dp + 40.5000dp + 42.0000dp + 43.5000dp + 45.0000dp + 46.5000dp + 48.0000dp + 49.5000dp + 51.0000dp + 52.5000dp + 54.0000dp + 55.5000dp + 57.0000dp + 58.5000dp + 60.0000dp + 61.5000dp + 63.0000dp + 64.5000dp + 66.0000dp + 67.5000dp + 69.0000dp + 70.5000dp + 72.0000dp + 73.5000dp + 75.0000dp + 76.5000dp + 78.0000dp + 79.5000dp + 81.0000dp + 82.5000dp + 84.0000dp + 85.5000dp + 87.0000dp + 88.5000dp + 90.0000dp + 91.5000dp + 93.0000dp + 94.5000dp + 96.0000dp + 97.5000dp + 99.0000dp + 100.5000dp + 102.0000dp + 103.5000dp + 105.0000dp + 106.5000dp + 108.0000dp + 109.5000dp + 111.0000dp + 112.5000dp + 114.0000dp + 115.5000dp + 117.0000dp + 118.5000dp + 120.0000dp + 121.5000dp + 123.0000dp + 124.5000dp + 126.0000dp + 127.5000dp + 129.0000dp + 130.5000dp + 132.0000dp + 133.5000dp + 135.0000dp + 136.5000dp + 138.0000dp + 139.5000dp + 141.0000dp + 142.5000dp + 144.0000dp + 145.5000dp + 147.0000dp + 148.5000dp + 150.0000dp + 151.5000dp + 153.0000dp + 154.5000dp + 156.0000dp + 157.5000dp + 159.0000dp + 160.5000dp + 162.0000dp + 163.5000dp + 165.0000dp + 166.5000dp + 168.0000dp + 169.5000dp + 171.0000dp + 172.5000dp + 174.0000dp + 175.5000dp + 177.0000dp + 178.5000dp + 180.0000dp + 181.5000dp + 183.0000dp + 184.5000dp + 186.0000dp + 187.5000dp + 189.0000dp + 190.5000dp + 192.0000dp + 193.5000dp + 195.0000dp + 196.5000dp + 198.0000dp + 199.5000dp + 201.0000dp + 202.5000dp + 204.0000dp + 205.5000dp + 207.0000dp + 208.5000dp + 210.0000dp + 211.5000dp + 213.0000dp + 214.5000dp + 216.0000dp + 217.5000dp + 219.0000dp + 220.5000dp + 222.0000dp + 223.5000dp + 225.0000dp + 226.5000dp + 228.0000dp + 229.5000dp + 231.0000dp + 232.5000dp + 234.0000dp + 235.5000dp + 237.0000dp + 238.5000dp + 240.0000dp + 241.5000dp + 243.0000dp + 244.5000dp + 246.0000dp + 247.5000dp + 249.0000dp + 250.5000dp + 252.0000dp + 253.5000dp + 255.0000dp + 256.5000dp + 258.0000dp + 259.5000dp + 261.0000dp + 262.5000dp + 264.0000dp + 265.5000dp + 267.0000dp + 268.5000dp + 270.0000dp + 271.5000dp + 273.0000dp + 274.5000dp + 276.0000dp + 277.5000dp + 279.0000dp + 280.5000dp + 282.0000dp + 283.5000dp + 285.0000dp + 286.5000dp + 288.0000dp + 289.5000dp + 291.0000dp + 292.5000dp + 294.0000dp + 295.5000dp + 297.0000dp + 298.5000dp + 300.0000dp + 301.5000dp + 303.0000dp + 304.5000dp + 306.0000dp + 307.5000dp + 309.0000dp + 310.5000dp + 312.0000dp + 313.5000dp + 315.0000dp + 316.5000dp + 318.0000dp + 319.5000dp + 321.0000dp + 322.5000dp + 324.0000dp + 325.5000dp + 327.0000dp + 328.5000dp + 330.0000dp + 331.5000dp + 333.0000dp + 334.5000dp + 336.0000dp + 337.5000dp + 339.0000dp + 340.5000dp + 342.0000dp + 343.5000dp + 345.0000dp + 346.5000dp + 348.0000dp + 349.5000dp + 351.0000dp + 352.5000dp + 354.0000dp + 355.5000dp + 357.0000dp + 358.5000dp + 360.0000dp + 361.5000dp + 363.0000dp + 364.5000dp + 366.0000dp + 367.5000dp + 369.0000dp + 370.5000dp + 372.0000dp + 373.5000dp + 375.0000dp + 376.5000dp + 378.0000dp + 379.5000dp + 381.0000dp + 382.5000dp + 384.0000dp + 385.5000dp + 387.0000dp + 388.5000dp + 390.0000dp + 391.5000dp + 393.0000dp + 394.5000dp + 396.0000dp + 397.5000dp + 399.0000dp + 400.5000dp + 402.0000dp + 403.5000dp + 405.0000dp + 406.5000dp + 408.0000dp + 409.5000dp + 411.0000dp + 412.5000dp + 414.0000dp + 415.5000dp + 417.0000dp + 418.5000dp + 420.0000dp + 421.5000dp + 423.0000dp + 424.5000dp + 426.0000dp + 427.5000dp + 429.0000dp + 430.5000dp + 432.0000dp + 433.5000dp + 435.0000dp + 436.5000dp + 438.0000dp + 439.5000dp + 441.0000dp + 442.5000dp + 444.0000dp + 445.5000dp + 447.0000dp + 448.5000dp + 450.0000dp + 451.5000dp + 453.0000dp + 454.5000dp + 456.0000dp + 457.5000dp + 459.0000dp + 460.5000dp + 462.0000dp + 463.5000dp + 465.0000dp + 466.5000dp + 468.0000dp + 469.5000dp + 471.0000dp + 472.5000dp + 474.0000dp + 475.5000dp + 477.0000dp + 478.5000dp + 480.0000dp + 481.5000dp + 483.0000dp + 484.5000dp + 486.0000dp + 487.5000dp + 489.0000dp + 490.5000dp + 492.0000dp + 493.5000dp + 495.0000dp + 496.5000dp + 498.0000dp + 499.5000dp + 501.0000dp + 502.5000dp + 504.0000dp + 505.5000dp + 507.0000dp + 508.5000dp + 510.0000dp + 511.5000dp + 513.0000dp + 514.5000dp + 516.0000dp + 517.5000dp + 519.0000dp + 520.5000dp + 522.0000dp + 523.5000dp + 525.0000dp + 526.5000dp + 528.0000dp + 529.5000dp + 531.0000dp + 532.5000dp + 534.0000dp + 535.5000dp + 537.0000dp + 538.5000dp + 540.0000dp + 547.5000dp + 555.0000dp + 600.0000dp + 615.0000dp + 633.0000dp + 708.0000dp + 750.0000dp + 900.0000dp + 960.0000dp + 1080.0000dp + diff --git a/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml new file mode 100644 index 00000000..197d2a75 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 9.0000sp + 10.5000sp + 12.0000sp + 13.5000sp + 15.0000sp + 16.5000sp + 18.0000sp + 19.5000sp + 21.0000sp + 22.5000sp + 24.0000sp + 25.5000sp + 27.0000sp + 28.5000sp + 30.0000sp + 31.5000sp + 33.0000sp + 34.5000sp + 36.0000sp + 37.5000sp + 42.0000sp + 45.0000sp + 48.0000sp + 51.0000sp + 54.0000sp + 57.0000sp + 60.0000sp + 63.0000sp + 72.0000sp + diff --git a/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml new file mode 100644 index 00000000..81e2babe --- /dev/null +++ b/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -98.6667dp + -49.3333dp + -32.8889dp + -19.7333dp + -16.4444dp + -13.1556dp + -8.2222dp + -3.2889dp + -1.6444dp + + 0.1644dp + 0.8222dp + 1.6444dp + 2.4667dp + 3.2889dp + 4.1111dp + 4.9333dp + 5.7556dp + 6.5778dp + 7.4000dp + 8.2222dp + 9.8667dp + 11.5111dp + 13.1556dp + 14.8000dp + 16.4444dp + 18.0889dp + 19.7333dp + 21.3778dp + 23.0222dp + 24.6667dp + 26.3111dp + 27.9556dp + 29.6000dp + 31.2444dp + 32.8889dp + 34.5333dp + 36.1778dp + 37.8222dp + 39.4667dp + 41.1111dp + 42.7556dp + 44.4000dp + 46.0444dp + 47.6889dp + 49.3333dp + 50.9778dp + 52.6222dp + 54.2667dp + 55.9111dp + 57.5556dp + 59.2000dp + 60.8444dp + 62.4889dp + 64.1333dp + 65.7778dp + 67.4222dp + 69.0667dp + 70.7111dp + 72.3556dp + 74.0000dp + 75.6444dp + 77.2889dp + 78.9333dp + 80.5778dp + 82.2222dp + 83.8667dp + 85.5111dp + 87.1556dp + 88.8000dp + 90.4444dp + 92.0889dp + 93.7333dp + 95.3778dp + 97.0222dp + 98.6667dp + 100.3111dp + 101.9556dp + 103.6000dp + 105.2444dp + 106.8889dp + 108.5333dp + 110.1778dp + 111.8222dp + 113.4667dp + 115.1111dp + 116.7556dp + 118.4000dp + 120.0444dp + 121.6889dp + 123.3333dp + 124.9778dp + 126.6222dp + 128.2667dp + 129.9111dp + 131.5556dp + 133.2000dp + 134.8444dp + 136.4889dp + 138.1333dp + 139.7778dp + 141.4222dp + 143.0667dp + 144.7111dp + 146.3556dp + 148.0000dp + 149.6444dp + 151.2889dp + 152.9333dp + 154.5778dp + 156.2222dp + 157.8667dp + 159.5111dp + 161.1556dp + 162.8000dp + 164.4444dp + 166.0889dp + 167.7333dp + 169.3778dp + 171.0222dp + 172.6667dp + 174.3111dp + 175.9556dp + 177.6000dp + 179.2444dp + 180.8889dp + 182.5333dp + 184.1778dp + 185.8222dp + 187.4667dp + 189.1111dp + 190.7556dp + 192.4000dp + 194.0444dp + 195.6889dp + 197.3333dp + 198.9778dp + 200.6222dp + 202.2667dp + 203.9111dp + 205.5556dp + 207.2000dp + 208.8444dp + 210.4889dp + 212.1333dp + 213.7778dp + 215.4222dp + 217.0667dp + 218.7111dp + 220.3556dp + 222.0000dp + 223.6444dp + 225.2889dp + 226.9333dp + 228.5778dp + 230.2222dp + 231.8667dp + 233.5111dp + 235.1556dp + 236.8000dp + 238.4444dp + 240.0889dp + 241.7333dp + 243.3778dp + 245.0222dp + 246.6667dp + 248.3111dp + 249.9556dp + 251.6000dp + 253.2444dp + 254.8889dp + 256.5333dp + 258.1778dp + 259.8222dp + 261.4667dp + 263.1111dp + 264.7556dp + 266.4000dp + 268.0444dp + 269.6889dp + 271.3333dp + 272.9778dp + 274.6222dp + 276.2667dp + 277.9111dp + 279.5556dp + 281.2000dp + 282.8444dp + 284.4889dp + 286.1333dp + 287.7778dp + 289.4222dp + 291.0667dp + 292.7111dp + 294.3556dp + 296.0000dp + 297.6444dp + 299.2889dp + 300.9333dp + 302.5778dp + 304.2222dp + 305.8667dp + 307.5111dp + 309.1556dp + 310.8000dp + 312.4444dp + 314.0889dp + 315.7333dp + 317.3778dp + 319.0222dp + 320.6667dp + 322.3111dp + 323.9556dp + 325.6000dp + 327.2444dp + 328.8889dp + 330.5333dp + 332.1778dp + 333.8222dp + 335.4667dp + 337.1111dp + 338.7556dp + 340.4000dp + 342.0444dp + 343.6889dp + 345.3333dp + 346.9778dp + 348.6222dp + 350.2667dp + 351.9111dp + 353.5556dp + 355.2000dp + 356.8444dp + 358.4889dp + 360.1333dp + 361.7778dp + 363.4222dp + 365.0667dp + 366.7111dp + 368.3556dp + 370.0000dp + 371.6444dp + 373.2889dp + 374.9333dp + 376.5778dp + 378.2222dp + 379.8667dp + 381.5111dp + 383.1556dp + 384.8000dp + 386.4444dp + 388.0889dp + 389.7333dp + 391.3778dp + 393.0222dp + 394.6667dp + 396.3111dp + 397.9556dp + 399.6000dp + 401.2444dp + 402.8889dp + 404.5333dp + 406.1778dp + 407.8222dp + 409.4667dp + 411.1111dp + 412.7556dp + 414.4000dp + 416.0444dp + 417.6889dp + 419.3333dp + 420.9778dp + 422.6222dp + 424.2667dp + 425.9111dp + 427.5556dp + 429.2000dp + 430.8444dp + 432.4889dp + 434.1333dp + 435.7778dp + 437.4222dp + 439.0667dp + 440.7111dp + 442.3556dp + 444.0000dp + 445.6444dp + 447.2889dp + 448.9333dp + 450.5778dp + 452.2222dp + 453.8667dp + 455.5111dp + 457.1556dp + 458.8000dp + 460.4444dp + 462.0889dp + 463.7333dp + 465.3778dp + 467.0222dp + 468.6667dp + 470.3111dp + 471.9556dp + 473.6000dp + 475.2444dp + 476.8889dp + 478.5333dp + 480.1778dp + 481.8222dp + 483.4667dp + 485.1111dp + 486.7556dp + 488.4000dp + 490.0444dp + 491.6889dp + 493.3333dp + 494.9778dp + 496.6222dp + 498.2667dp + 499.9111dp + 501.5556dp + 503.2000dp + 504.8444dp + 506.4889dp + 508.1333dp + 509.7778dp + 511.4222dp + 513.0667dp + 514.7111dp + 516.3556dp + 518.0000dp + 519.6444dp + 521.2889dp + 522.9333dp + 524.5778dp + 526.2222dp + 527.8667dp + 529.5111dp + 531.1556dp + 532.8000dp + 534.4444dp + 536.0889dp + 537.7333dp + 539.3778dp + 541.0222dp + 542.6667dp + 544.3111dp + 545.9556dp + 547.6000dp + 549.2444dp + 550.8889dp + 552.5333dp + 554.1778dp + 555.8222dp + 557.4667dp + 559.1111dp + 560.7556dp + 562.4000dp + 564.0444dp + 565.6889dp + 567.3333dp + 568.9778dp + 570.6222dp + 572.2667dp + 573.9111dp + 575.5556dp + 577.2000dp + 578.8444dp + 580.4889dp + 582.1333dp + 583.7778dp + 585.4222dp + 587.0667dp + 588.7111dp + 590.3556dp + 592.0000dp + 600.2222dp + 608.4444dp + 657.7778dp + 674.2222dp + 693.9556dp + 776.1778dp + 822.2222dp + 986.6667dp + 1052.4444dp + 1184.0000dp + diff --git a/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml new file mode 100644 index 00000000..77463cc2 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 9.8667sp + 11.5111sp + 13.1556sp + 14.8000sp + 16.4444sp + 18.0889sp + 19.7333sp + 21.3778sp + 23.0222sp + 24.6667sp + 26.3111sp + 27.9556sp + 29.6000sp + 31.2444sp + 32.8889sp + 34.5333sp + 36.1778sp + 37.8222sp + 39.4667sp + 41.1111sp + 46.0444sp + 49.3333sp + 52.6222sp + 55.9111sp + 59.2000sp + 62.4889sp + 65.7778sp + 69.0667sp + 78.9333sp + diff --git a/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml new file mode 100644 index 00000000..761d4afd --- /dev/null +++ b/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -100.0000dp + -50.0000dp + -33.3333dp + -20.0000dp + -16.6667dp + -13.3333dp + -8.3333dp + -3.3333dp + -1.6667dp + + 0.1667dp + 0.8333dp + 1.6667dp + 2.5000dp + 3.3333dp + 4.1667dp + 5.0000dp + 5.8333dp + 6.6667dp + 7.5000dp + 8.3333dp + 10.0000dp + 11.6667dp + 13.3333dp + 15.0000dp + 16.6667dp + 18.3333dp + 20.0000dp + 21.6667dp + 23.3333dp + 25.0000dp + 26.6667dp + 28.3333dp + 30.0000dp + 31.6667dp + 33.3333dp + 35.0000dp + 36.6667dp + 38.3333dp + 40.0000dp + 41.6667dp + 43.3333dp + 45.0000dp + 46.6667dp + 48.3333dp + 50.0000dp + 51.6667dp + 53.3333dp + 55.0000dp + 56.6667dp + 58.3333dp + 60.0000dp + 61.6667dp + 63.3333dp + 65.0000dp + 66.6667dp + 68.3333dp + 70.0000dp + 71.6667dp + 73.3333dp + 75.0000dp + 76.6667dp + 78.3333dp + 80.0000dp + 81.6667dp + 83.3333dp + 85.0000dp + 86.6667dp + 88.3333dp + 90.0000dp + 91.6667dp + 93.3333dp + 95.0000dp + 96.6667dp + 98.3333dp + 100.0000dp + 101.6667dp + 103.3333dp + 105.0000dp + 106.6667dp + 108.3333dp + 110.0000dp + 111.6667dp + 113.3333dp + 115.0000dp + 116.6667dp + 118.3333dp + 120.0000dp + 121.6667dp + 123.3333dp + 125.0000dp + 126.6667dp + 128.3333dp + 130.0000dp + 131.6667dp + 133.3333dp + 135.0000dp + 136.6667dp + 138.3333dp + 140.0000dp + 141.6667dp + 143.3333dp + 145.0000dp + 146.6667dp + 148.3333dp + 150.0000dp + 151.6667dp + 153.3333dp + 155.0000dp + 156.6667dp + 158.3333dp + 160.0000dp + 161.6667dp + 163.3333dp + 165.0000dp + 166.6667dp + 168.3333dp + 170.0000dp + 171.6667dp + 173.3333dp + 175.0000dp + 176.6667dp + 178.3333dp + 180.0000dp + 181.6667dp + 183.3333dp + 185.0000dp + 186.6667dp + 188.3333dp + 190.0000dp + 191.6667dp + 193.3333dp + 195.0000dp + 196.6667dp + 198.3333dp + 200.0000dp + 201.6667dp + 203.3333dp + 205.0000dp + 206.6667dp + 208.3333dp + 210.0000dp + 211.6667dp + 213.3333dp + 215.0000dp + 216.6667dp + 218.3333dp + 220.0000dp + 221.6667dp + 223.3333dp + 225.0000dp + 226.6667dp + 228.3333dp + 230.0000dp + 231.6667dp + 233.3333dp + 235.0000dp + 236.6667dp + 238.3333dp + 240.0000dp + 241.6667dp + 243.3333dp + 245.0000dp + 246.6667dp + 248.3333dp + 250.0000dp + 251.6667dp + 253.3333dp + 255.0000dp + 256.6667dp + 258.3333dp + 260.0000dp + 261.6667dp + 263.3333dp + 265.0000dp + 266.6667dp + 268.3333dp + 270.0000dp + 271.6667dp + 273.3333dp + 275.0000dp + 276.6667dp + 278.3333dp + 280.0000dp + 281.6667dp + 283.3333dp + 285.0000dp + 286.6667dp + 288.3333dp + 290.0000dp + 291.6667dp + 293.3333dp + 295.0000dp + 296.6667dp + 298.3333dp + 300.0000dp + 301.6667dp + 303.3333dp + 305.0000dp + 306.6667dp + 308.3333dp + 310.0000dp + 311.6667dp + 313.3333dp + 315.0000dp + 316.6667dp + 318.3333dp + 320.0000dp + 321.6667dp + 323.3333dp + 325.0000dp + 326.6667dp + 328.3333dp + 330.0000dp + 331.6667dp + 333.3333dp + 335.0000dp + 336.6667dp + 338.3333dp + 340.0000dp + 341.6667dp + 343.3333dp + 345.0000dp + 346.6667dp + 348.3333dp + 350.0000dp + 351.6667dp + 353.3333dp + 355.0000dp + 356.6667dp + 358.3333dp + 360.0000dp + 361.6667dp + 363.3333dp + 365.0000dp + 366.6667dp + 368.3333dp + 370.0000dp + 371.6667dp + 373.3333dp + 375.0000dp + 376.6667dp + 378.3333dp + 380.0000dp + 381.6667dp + 383.3333dp + 385.0000dp + 386.6667dp + 388.3333dp + 390.0000dp + 391.6667dp + 393.3333dp + 395.0000dp + 396.6667dp + 398.3333dp + 400.0000dp + 401.6667dp + 403.3333dp + 405.0000dp + 406.6667dp + 408.3333dp + 410.0000dp + 411.6667dp + 413.3333dp + 415.0000dp + 416.6667dp + 418.3333dp + 420.0000dp + 421.6667dp + 423.3333dp + 425.0000dp + 426.6667dp + 428.3333dp + 430.0000dp + 431.6667dp + 433.3333dp + 435.0000dp + 436.6667dp + 438.3333dp + 440.0000dp + 441.6667dp + 443.3333dp + 445.0000dp + 446.6667dp + 448.3333dp + 450.0000dp + 451.6667dp + 453.3333dp + 455.0000dp + 456.6667dp + 458.3333dp + 460.0000dp + 461.6667dp + 463.3333dp + 465.0000dp + 466.6667dp + 468.3333dp + 470.0000dp + 471.6667dp + 473.3333dp + 475.0000dp + 476.6667dp + 478.3333dp + 480.0000dp + 481.6667dp + 483.3333dp + 485.0000dp + 486.6667dp + 488.3333dp + 490.0000dp + 491.6667dp + 493.3333dp + 495.0000dp + 496.6667dp + 498.3333dp + 500.0000dp + 501.6667dp + 503.3333dp + 505.0000dp + 506.6667dp + 508.3333dp + 510.0000dp + 511.6667dp + 513.3333dp + 515.0000dp + 516.6667dp + 518.3333dp + 520.0000dp + 521.6667dp + 523.3333dp + 525.0000dp + 526.6667dp + 528.3333dp + 530.0000dp + 531.6667dp + 533.3333dp + 535.0000dp + 536.6667dp + 538.3333dp + 540.0000dp + 541.6667dp + 543.3333dp + 545.0000dp + 546.6667dp + 548.3333dp + 550.0000dp + 551.6667dp + 553.3333dp + 555.0000dp + 556.6667dp + 558.3333dp + 560.0000dp + 561.6667dp + 563.3333dp + 565.0000dp + 566.6667dp + 568.3333dp + 570.0000dp + 571.6667dp + 573.3333dp + 575.0000dp + 576.6667dp + 578.3333dp + 580.0000dp + 581.6667dp + 583.3333dp + 585.0000dp + 586.6667dp + 588.3333dp + 590.0000dp + 591.6667dp + 593.3333dp + 595.0000dp + 596.6667dp + 598.3333dp + 600.0000dp + 608.3333dp + 616.6667dp + 666.6667dp + 683.3333dp + 703.3333dp + 786.6667dp + 833.3333dp + 1000.0000dp + 1066.6667dp + 1200.0000dp + diff --git a/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml new file mode 100644 index 00000000..998b966e --- /dev/null +++ b/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 10.0000sp + 11.6667sp + 13.3333sp + 15.0000sp + 16.6667sp + 18.3333sp + 20.0000sp + 21.6667sp + 23.3333sp + 25.0000sp + 26.6667sp + 28.3333sp + 30.0000sp + 31.6667sp + 33.3333sp + 35.0000sp + 36.6667sp + 38.3333sp + 40.0000sp + 41.6667sp + 46.6667sp + 50.0000sp + 53.3333sp + 56.6667sp + 60.0000sp + 63.3333sp + 66.6667sp + 70.0000sp + 80.0000sp + diff --git a/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml new file mode 100644 index 00000000..dd2324c9 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -106.6667dp + -53.3333dp + -35.5556dp + -21.3333dp + -17.7778dp + -14.2222dp + -8.8889dp + -3.5556dp + -1.7778dp + + 0.1778dp + 0.8889dp + 1.7778dp + 2.6667dp + 3.5556dp + 4.4444dp + 5.3333dp + 6.2222dp + 7.1111dp + 8.0000dp + 8.8889dp + 10.6667dp + 12.4444dp + 14.2222dp + 16.0000dp + 17.7778dp + 19.5556dp + 21.3333dp + 23.1111dp + 24.8889dp + 26.6667dp + 28.4444dp + 30.2222dp + 32.0000dp + 33.7778dp + 35.5556dp + 37.3333dp + 39.1111dp + 40.8889dp + 42.6667dp + 44.4444dp + 46.2222dp + 48.0000dp + 49.7778dp + 51.5556dp + 53.3333dp + 55.1111dp + 56.8889dp + 58.6667dp + 60.4444dp + 62.2222dp + 64.0000dp + 65.7778dp + 67.5556dp + 69.3333dp + 71.1111dp + 72.8889dp + 74.6667dp + 76.4444dp + 78.2222dp + 80.0000dp + 81.7778dp + 83.5556dp + 85.3333dp + 87.1111dp + 88.8889dp + 90.6667dp + 92.4444dp + 94.2222dp + 96.0000dp + 97.7778dp + 99.5556dp + 101.3333dp + 103.1111dp + 104.8889dp + 106.6667dp + 108.4444dp + 110.2222dp + 112.0000dp + 113.7778dp + 115.5556dp + 117.3333dp + 119.1111dp + 120.8889dp + 122.6667dp + 124.4444dp + 126.2222dp + 128.0000dp + 129.7778dp + 131.5556dp + 133.3333dp + 135.1111dp + 136.8889dp + 138.6667dp + 140.4444dp + 142.2222dp + 144.0000dp + 145.7778dp + 147.5556dp + 149.3333dp + 151.1111dp + 152.8889dp + 154.6667dp + 156.4444dp + 158.2222dp + 160.0000dp + 161.7778dp + 163.5556dp + 165.3333dp + 167.1111dp + 168.8889dp + 170.6667dp + 172.4444dp + 174.2222dp + 176.0000dp + 177.7778dp + 179.5556dp + 181.3333dp + 183.1111dp + 184.8889dp + 186.6667dp + 188.4444dp + 190.2222dp + 192.0000dp + 193.7778dp + 195.5556dp + 197.3333dp + 199.1111dp + 200.8889dp + 202.6667dp + 204.4444dp + 206.2222dp + 208.0000dp + 209.7778dp + 211.5556dp + 213.3333dp + 215.1111dp + 216.8889dp + 218.6667dp + 220.4444dp + 222.2222dp + 224.0000dp + 225.7778dp + 227.5556dp + 229.3333dp + 231.1111dp + 232.8889dp + 234.6667dp + 236.4444dp + 238.2222dp + 240.0000dp + 241.7778dp + 243.5556dp + 245.3333dp + 247.1111dp + 248.8889dp + 250.6667dp + 252.4444dp + 254.2222dp + 256.0000dp + 257.7778dp + 259.5556dp + 261.3333dp + 263.1111dp + 264.8889dp + 266.6667dp + 268.4444dp + 270.2222dp + 272.0000dp + 273.7778dp + 275.5556dp + 277.3333dp + 279.1111dp + 280.8889dp + 282.6667dp + 284.4444dp + 286.2222dp + 288.0000dp + 289.7778dp + 291.5556dp + 293.3333dp + 295.1111dp + 296.8889dp + 298.6667dp + 300.4444dp + 302.2222dp + 304.0000dp + 305.7778dp + 307.5556dp + 309.3333dp + 311.1111dp + 312.8889dp + 314.6667dp + 316.4444dp + 318.2222dp + 320.0000dp + 321.7778dp + 323.5556dp + 325.3333dp + 327.1111dp + 328.8889dp + 330.6667dp + 332.4444dp + 334.2222dp + 336.0000dp + 337.7778dp + 339.5556dp + 341.3333dp + 343.1111dp + 344.8889dp + 346.6667dp + 348.4444dp + 350.2222dp + 352.0000dp + 353.7778dp + 355.5556dp + 357.3333dp + 359.1111dp + 360.8889dp + 362.6667dp + 364.4444dp + 366.2222dp + 368.0000dp + 369.7778dp + 371.5556dp + 373.3333dp + 375.1111dp + 376.8889dp + 378.6667dp + 380.4444dp + 382.2222dp + 384.0000dp + 385.7778dp + 387.5556dp + 389.3333dp + 391.1111dp + 392.8889dp + 394.6667dp + 396.4444dp + 398.2222dp + 400.0000dp + 401.7778dp + 403.5556dp + 405.3333dp + 407.1111dp + 408.8889dp + 410.6667dp + 412.4444dp + 414.2222dp + 416.0000dp + 417.7778dp + 419.5556dp + 421.3333dp + 423.1111dp + 424.8889dp + 426.6667dp + 428.4444dp + 430.2222dp + 432.0000dp + 433.7778dp + 435.5556dp + 437.3333dp + 439.1111dp + 440.8889dp + 442.6667dp + 444.4444dp + 446.2222dp + 448.0000dp + 449.7778dp + 451.5556dp + 453.3333dp + 455.1111dp + 456.8889dp + 458.6667dp + 460.4444dp + 462.2222dp + 464.0000dp + 465.7778dp + 467.5556dp + 469.3333dp + 471.1111dp + 472.8889dp + 474.6667dp + 476.4444dp + 478.2222dp + 480.0000dp + 481.7778dp + 483.5556dp + 485.3333dp + 487.1111dp + 488.8889dp + 490.6667dp + 492.4444dp + 494.2222dp + 496.0000dp + 497.7778dp + 499.5556dp + 501.3333dp + 503.1111dp + 504.8889dp + 506.6667dp + 508.4444dp + 510.2222dp + 512.0000dp + 513.7778dp + 515.5556dp + 517.3333dp + 519.1111dp + 520.8889dp + 522.6667dp + 524.4444dp + 526.2222dp + 528.0000dp + 529.7778dp + 531.5556dp + 533.3333dp + 535.1111dp + 536.8889dp + 538.6667dp + 540.4444dp + 542.2222dp + 544.0000dp + 545.7778dp + 547.5556dp + 549.3333dp + 551.1111dp + 552.8889dp + 554.6667dp + 556.4444dp + 558.2222dp + 560.0000dp + 561.7778dp + 563.5556dp + 565.3333dp + 567.1111dp + 568.8889dp + 570.6667dp + 572.4444dp + 574.2222dp + 576.0000dp + 577.7778dp + 579.5556dp + 581.3333dp + 583.1111dp + 584.8889dp + 586.6667dp + 588.4444dp + 590.2222dp + 592.0000dp + 593.7778dp + 595.5556dp + 597.3333dp + 599.1111dp + 600.8889dp + 602.6667dp + 604.4444dp + 606.2222dp + 608.0000dp + 609.7778dp + 611.5556dp + 613.3333dp + 615.1111dp + 616.8889dp + 618.6667dp + 620.4444dp + 622.2222dp + 624.0000dp + 625.7778dp + 627.5556dp + 629.3333dp + 631.1111dp + 632.8889dp + 634.6667dp + 636.4444dp + 638.2222dp + 640.0000dp + 648.8889dp + 657.7778dp + 711.1111dp + 728.8889dp + 750.2222dp + 839.1111dp + 888.8889dp + 1066.6667dp + 1137.7778dp + 1280.0000dp + diff --git a/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml new file mode 100644 index 00000000..ac00db69 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 10.6667sp + 12.4444sp + 14.2222sp + 16.0000sp + 17.7778sp + 19.5556sp + 21.3333sp + 23.1111sp + 24.8889sp + 26.6667sp + 28.4444sp + 30.2222sp + 32.0000sp + 33.7778sp + 35.5556sp + 37.3333sp + 39.1111sp + 40.8889sp + 42.6667sp + 44.4444sp + 49.7778sp + 53.3333sp + 56.8889sp + 60.4444sp + 64.0000sp + 67.5556sp + 71.1111sp + 74.6667sp + 85.3333sp + diff --git a/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml new file mode 100644 index 00000000..66adb83a --- /dev/null +++ b/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -110.3333dp + -55.1667dp + -36.7778dp + -22.0667dp + -18.3889dp + -14.7111dp + -9.1944dp + -3.6778dp + -1.8389dp + + 0.1839dp + 0.9194dp + 1.8389dp + 2.7583dp + 3.6778dp + 4.5972dp + 5.5167dp + 6.4361dp + 7.3556dp + 8.2750dp + 9.1944dp + 11.0333dp + 12.8722dp + 14.7111dp + 16.5500dp + 18.3889dp + 20.2278dp + 22.0667dp + 23.9056dp + 25.7444dp + 27.5833dp + 29.4222dp + 31.2611dp + 33.1000dp + 34.9389dp + 36.7778dp + 38.6167dp + 40.4556dp + 42.2944dp + 44.1333dp + 45.9722dp + 47.8111dp + 49.6500dp + 51.4889dp + 53.3278dp + 55.1667dp + 57.0056dp + 58.8444dp + 60.6833dp + 62.5222dp + 64.3611dp + 66.2000dp + 68.0389dp + 69.8778dp + 71.7167dp + 73.5556dp + 75.3944dp + 77.2333dp + 79.0722dp + 80.9111dp + 82.7500dp + 84.5889dp + 86.4278dp + 88.2667dp + 90.1056dp + 91.9444dp + 93.7833dp + 95.6222dp + 97.4611dp + 99.3000dp + 101.1389dp + 102.9778dp + 104.8167dp + 106.6556dp + 108.4944dp + 110.3333dp + 112.1722dp + 114.0111dp + 115.8500dp + 117.6889dp + 119.5278dp + 121.3667dp + 123.2056dp + 125.0444dp + 126.8833dp + 128.7222dp + 130.5611dp + 132.4000dp + 134.2389dp + 136.0778dp + 137.9167dp + 139.7556dp + 141.5944dp + 143.4333dp + 145.2722dp + 147.1111dp + 148.9500dp + 150.7889dp + 152.6278dp + 154.4667dp + 156.3056dp + 158.1444dp + 159.9833dp + 161.8222dp + 163.6611dp + 165.5000dp + 167.3389dp + 169.1778dp + 171.0167dp + 172.8556dp + 174.6944dp + 176.5333dp + 178.3722dp + 180.2111dp + 182.0500dp + 183.8889dp + 185.7278dp + 187.5667dp + 189.4056dp + 191.2444dp + 193.0833dp + 194.9222dp + 196.7611dp + 198.6000dp + 200.4389dp + 202.2778dp + 204.1167dp + 205.9556dp + 207.7944dp + 209.6333dp + 211.4722dp + 213.3111dp + 215.1500dp + 216.9889dp + 218.8278dp + 220.6667dp + 222.5056dp + 224.3444dp + 226.1833dp + 228.0222dp + 229.8611dp + 231.7000dp + 233.5389dp + 235.3778dp + 237.2167dp + 239.0556dp + 240.8944dp + 242.7333dp + 244.5722dp + 246.4111dp + 248.2500dp + 250.0889dp + 251.9278dp + 253.7667dp + 255.6056dp + 257.4444dp + 259.2833dp + 261.1222dp + 262.9611dp + 264.8000dp + 266.6389dp + 268.4778dp + 270.3167dp + 272.1556dp + 273.9944dp + 275.8333dp + 277.6722dp + 279.5111dp + 281.3500dp + 283.1889dp + 285.0278dp + 286.8667dp + 288.7056dp + 290.5444dp + 292.3833dp + 294.2222dp + 296.0611dp + 297.9000dp + 299.7389dp + 301.5778dp + 303.4167dp + 305.2556dp + 307.0944dp + 308.9333dp + 310.7722dp + 312.6111dp + 314.4500dp + 316.2889dp + 318.1278dp + 319.9667dp + 321.8056dp + 323.6444dp + 325.4833dp + 327.3222dp + 329.1611dp + 331.0000dp + 332.8389dp + 334.6778dp + 336.5167dp + 338.3556dp + 340.1944dp + 342.0333dp + 343.8722dp + 345.7111dp + 347.5500dp + 349.3889dp + 351.2278dp + 353.0667dp + 354.9056dp + 356.7444dp + 358.5833dp + 360.4222dp + 362.2611dp + 364.1000dp + 365.9389dp + 367.7778dp + 369.6167dp + 371.4556dp + 373.2944dp + 375.1333dp + 376.9722dp + 378.8111dp + 380.6500dp + 382.4889dp + 384.3278dp + 386.1667dp + 388.0056dp + 389.8444dp + 391.6833dp + 393.5222dp + 395.3611dp + 397.2000dp + 399.0389dp + 400.8778dp + 402.7167dp + 404.5556dp + 406.3944dp + 408.2333dp + 410.0722dp + 411.9111dp + 413.7500dp + 415.5889dp + 417.4278dp + 419.2667dp + 421.1056dp + 422.9444dp + 424.7833dp + 426.6222dp + 428.4611dp + 430.3000dp + 432.1389dp + 433.9778dp + 435.8167dp + 437.6556dp + 439.4944dp + 441.3333dp + 443.1722dp + 445.0111dp + 446.8500dp + 448.6889dp + 450.5278dp + 452.3667dp + 454.2056dp + 456.0444dp + 457.8833dp + 459.7222dp + 461.5611dp + 463.4000dp + 465.2389dp + 467.0778dp + 468.9167dp + 470.7556dp + 472.5944dp + 474.4333dp + 476.2722dp + 478.1111dp + 479.9500dp + 481.7889dp + 483.6278dp + 485.4667dp + 487.3056dp + 489.1444dp + 490.9833dp + 492.8222dp + 494.6611dp + 496.5000dp + 498.3389dp + 500.1778dp + 502.0167dp + 503.8556dp + 505.6944dp + 507.5333dp + 509.3722dp + 511.2111dp + 513.0500dp + 514.8889dp + 516.7278dp + 518.5667dp + 520.4056dp + 522.2444dp + 524.0833dp + 525.9222dp + 527.7611dp + 529.6000dp + 531.4389dp + 533.2778dp + 535.1167dp + 536.9556dp + 538.7944dp + 540.6333dp + 542.4722dp + 544.3111dp + 546.1500dp + 547.9889dp + 549.8278dp + 551.6667dp + 553.5056dp + 555.3444dp + 557.1833dp + 559.0222dp + 560.8611dp + 562.7000dp + 564.5389dp + 566.3778dp + 568.2167dp + 570.0556dp + 571.8944dp + 573.7333dp + 575.5722dp + 577.4111dp + 579.2500dp + 581.0889dp + 582.9278dp + 584.7667dp + 586.6056dp + 588.4444dp + 590.2833dp + 592.1222dp + 593.9611dp + 595.8000dp + 597.6389dp + 599.4778dp + 601.3167dp + 603.1556dp + 604.9944dp + 606.8333dp + 608.6722dp + 610.5111dp + 612.3500dp + 614.1889dp + 616.0278dp + 617.8667dp + 619.7056dp + 621.5444dp + 623.3833dp + 625.2222dp + 627.0611dp + 628.9000dp + 630.7389dp + 632.5778dp + 634.4167dp + 636.2556dp + 638.0944dp + 639.9333dp + 641.7722dp + 643.6111dp + 645.4500dp + 647.2889dp + 649.1278dp + 650.9667dp + 652.8056dp + 654.6444dp + 656.4833dp + 658.3222dp + 660.1611dp + 662.0000dp + 671.1944dp + 680.3889dp + 735.5556dp + 753.9444dp + 776.0111dp + 867.9556dp + 919.4444dp + 1103.3333dp + 1176.8889dp + 1324.0000dp + diff --git a/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml new file mode 100644 index 00000000..d9e0e828 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 11.0333sp + 12.8722sp + 14.7111sp + 16.5500sp + 18.3889sp + 20.2278sp + 22.0667sp + 23.9056sp + 25.7444sp + 27.5833sp + 29.4222sp + 31.2611sp + 33.1000sp + 34.9389sp + 36.7778sp + 38.6167sp + 40.4556sp + 42.2944sp + 44.1333sp + 45.9722sp + 51.4889sp + 55.1667sp + 58.8444sp + 62.5222sp + 66.2000sp + 69.8778sp + 73.5556sp + 77.2333sp + 88.2667sp + diff --git a/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml new file mode 100644 index 00000000..032414a0 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -120.0000dp + -60.0000dp + -40.0000dp + -24.0000dp + -20.0000dp + -16.0000dp + -10.0000dp + -4.0000dp + -2.0000dp + + 0.2000dp + 1.0000dp + 2.0000dp + 3.0000dp + 4.0000dp + 5.0000dp + 6.0000dp + 7.0000dp + 8.0000dp + 9.0000dp + 10.0000dp + 12.0000dp + 14.0000dp + 16.0000dp + 18.0000dp + 20.0000dp + 22.0000dp + 24.0000dp + 26.0000dp + 28.0000dp + 30.0000dp + 32.0000dp + 34.0000dp + 36.0000dp + 38.0000dp + 40.0000dp + 42.0000dp + 44.0000dp + 46.0000dp + 48.0000dp + 50.0000dp + 52.0000dp + 54.0000dp + 56.0000dp + 58.0000dp + 60.0000dp + 62.0000dp + 64.0000dp + 66.0000dp + 68.0000dp + 70.0000dp + 72.0000dp + 74.0000dp + 76.0000dp + 78.0000dp + 80.0000dp + 82.0000dp + 84.0000dp + 86.0000dp + 88.0000dp + 90.0000dp + 92.0000dp + 94.0000dp + 96.0000dp + 98.0000dp + 100.0000dp + 102.0000dp + 104.0000dp + 106.0000dp + 108.0000dp + 110.0000dp + 112.0000dp + 114.0000dp + 116.0000dp + 118.0000dp + 120.0000dp + 122.0000dp + 124.0000dp + 126.0000dp + 128.0000dp + 130.0000dp + 132.0000dp + 134.0000dp + 136.0000dp + 138.0000dp + 140.0000dp + 142.0000dp + 144.0000dp + 146.0000dp + 148.0000dp + 150.0000dp + 152.0000dp + 154.0000dp + 156.0000dp + 158.0000dp + 160.0000dp + 162.0000dp + 164.0000dp + 166.0000dp + 168.0000dp + 170.0000dp + 172.0000dp + 174.0000dp + 176.0000dp + 178.0000dp + 180.0000dp + 182.0000dp + 184.0000dp + 186.0000dp + 188.0000dp + 190.0000dp + 192.0000dp + 194.0000dp + 196.0000dp + 198.0000dp + 200.0000dp + 202.0000dp + 204.0000dp + 206.0000dp + 208.0000dp + 210.0000dp + 212.0000dp + 214.0000dp + 216.0000dp + 218.0000dp + 220.0000dp + 222.0000dp + 224.0000dp + 226.0000dp + 228.0000dp + 230.0000dp + 232.0000dp + 234.0000dp + 236.0000dp + 238.0000dp + 240.0000dp + 242.0000dp + 244.0000dp + 246.0000dp + 248.0000dp + 250.0000dp + 252.0000dp + 254.0000dp + 256.0000dp + 258.0000dp + 260.0000dp + 262.0000dp + 264.0000dp + 266.0000dp + 268.0000dp + 270.0000dp + 272.0000dp + 274.0000dp + 276.0000dp + 278.0000dp + 280.0000dp + 282.0000dp + 284.0000dp + 286.0000dp + 288.0000dp + 290.0000dp + 292.0000dp + 294.0000dp + 296.0000dp + 298.0000dp + 300.0000dp + 302.0000dp + 304.0000dp + 306.0000dp + 308.0000dp + 310.0000dp + 312.0000dp + 314.0000dp + 316.0000dp + 318.0000dp + 320.0000dp + 322.0000dp + 324.0000dp + 326.0000dp + 328.0000dp + 330.0000dp + 332.0000dp + 334.0000dp + 336.0000dp + 338.0000dp + 340.0000dp + 342.0000dp + 344.0000dp + 346.0000dp + 348.0000dp + 350.0000dp + 352.0000dp + 354.0000dp + 356.0000dp + 358.0000dp + 360.0000dp + 362.0000dp + 364.0000dp + 366.0000dp + 368.0000dp + 370.0000dp + 372.0000dp + 374.0000dp + 376.0000dp + 378.0000dp + 380.0000dp + 382.0000dp + 384.0000dp + 386.0000dp + 388.0000dp + 390.0000dp + 392.0000dp + 394.0000dp + 396.0000dp + 398.0000dp + 400.0000dp + 402.0000dp + 404.0000dp + 406.0000dp + 408.0000dp + 410.0000dp + 412.0000dp + 414.0000dp + 416.0000dp + 418.0000dp + 420.0000dp + 422.0000dp + 424.0000dp + 426.0000dp + 428.0000dp + 430.0000dp + 432.0000dp + 434.0000dp + 436.0000dp + 438.0000dp + 440.0000dp + 442.0000dp + 444.0000dp + 446.0000dp + 448.0000dp + 450.0000dp + 452.0000dp + 454.0000dp + 456.0000dp + 458.0000dp + 460.0000dp + 462.0000dp + 464.0000dp + 466.0000dp + 468.0000dp + 470.0000dp + 472.0000dp + 474.0000dp + 476.0000dp + 478.0000dp + 480.0000dp + 482.0000dp + 484.0000dp + 486.0000dp + 488.0000dp + 490.0000dp + 492.0000dp + 494.0000dp + 496.0000dp + 498.0000dp + 500.0000dp + 502.0000dp + 504.0000dp + 506.0000dp + 508.0000dp + 510.0000dp + 512.0000dp + 514.0000dp + 516.0000dp + 518.0000dp + 520.0000dp + 522.0000dp + 524.0000dp + 526.0000dp + 528.0000dp + 530.0000dp + 532.0000dp + 534.0000dp + 536.0000dp + 538.0000dp + 540.0000dp + 542.0000dp + 544.0000dp + 546.0000dp + 548.0000dp + 550.0000dp + 552.0000dp + 554.0000dp + 556.0000dp + 558.0000dp + 560.0000dp + 562.0000dp + 564.0000dp + 566.0000dp + 568.0000dp + 570.0000dp + 572.0000dp + 574.0000dp + 576.0000dp + 578.0000dp + 580.0000dp + 582.0000dp + 584.0000dp + 586.0000dp + 588.0000dp + 590.0000dp + 592.0000dp + 594.0000dp + 596.0000dp + 598.0000dp + 600.0000dp + 602.0000dp + 604.0000dp + 606.0000dp + 608.0000dp + 610.0000dp + 612.0000dp + 614.0000dp + 616.0000dp + 618.0000dp + 620.0000dp + 622.0000dp + 624.0000dp + 626.0000dp + 628.0000dp + 630.0000dp + 632.0000dp + 634.0000dp + 636.0000dp + 638.0000dp + 640.0000dp + 642.0000dp + 644.0000dp + 646.0000dp + 648.0000dp + 650.0000dp + 652.0000dp + 654.0000dp + 656.0000dp + 658.0000dp + 660.0000dp + 662.0000dp + 664.0000dp + 666.0000dp + 668.0000dp + 670.0000dp + 672.0000dp + 674.0000dp + 676.0000dp + 678.0000dp + 680.0000dp + 682.0000dp + 684.0000dp + 686.0000dp + 688.0000dp + 690.0000dp + 692.0000dp + 694.0000dp + 696.0000dp + 698.0000dp + 700.0000dp + 702.0000dp + 704.0000dp + 706.0000dp + 708.0000dp + 710.0000dp + 712.0000dp + 714.0000dp + 716.0000dp + 718.0000dp + 720.0000dp + 730.0000dp + 740.0000dp + 800.0000dp + 820.0000dp + 844.0000dp + 944.0000dp + 1000.0000dp + 1200.0000dp + 1280.0000dp + 1440.0000dp + diff --git a/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml new file mode 100644 index 00000000..345bfa45 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 12.0000sp + 14.0000sp + 16.0000sp + 18.0000sp + 20.0000sp + 22.0000sp + 24.0000sp + 26.0000sp + 28.0000sp + 30.0000sp + 32.0000sp + 34.0000sp + 36.0000sp + 38.0000sp + 40.0000sp + 42.0000sp + 44.0000sp + 46.0000sp + 48.0000sp + 50.0000sp + 56.0000sp + 60.0000sp + 64.0000sp + 68.0000sp + 72.0000sp + 76.0000sp + 80.0000sp + 84.0000sp + 96.0000sp + diff --git a/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml new file mode 100644 index 00000000..ca4d7c73 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -128.0000dp + -64.0000dp + -42.6667dp + -25.6000dp + -21.3333dp + -17.0667dp + -10.6667dp + -4.2667dp + -2.1333dp + + 0.2133dp + 1.0667dp + 2.1333dp + 3.2000dp + 4.2667dp + 5.3333dp + 6.4000dp + 7.4667dp + 8.5333dp + 9.6000dp + 10.6667dp + 12.8000dp + 14.9333dp + 17.0667dp + 19.2000dp + 21.3333dp + 23.4667dp + 25.6000dp + 27.7333dp + 29.8667dp + 32.0000dp + 34.1333dp + 36.2667dp + 38.4000dp + 40.5333dp + 42.6667dp + 44.8000dp + 46.9333dp + 49.0667dp + 51.2000dp + 53.3333dp + 55.4667dp + 57.6000dp + 59.7333dp + 61.8667dp + 64.0000dp + 66.1333dp + 68.2667dp + 70.4000dp + 72.5333dp + 74.6667dp + 76.8000dp + 78.9333dp + 81.0667dp + 83.2000dp + 85.3333dp + 87.4667dp + 89.6000dp + 91.7333dp + 93.8667dp + 96.0000dp + 98.1333dp + 100.2667dp + 102.4000dp + 104.5333dp + 106.6667dp + 108.8000dp + 110.9333dp + 113.0667dp + 115.2000dp + 117.3333dp + 119.4667dp + 121.6000dp + 123.7333dp + 125.8667dp + 128.0000dp + 130.1333dp + 132.2667dp + 134.4000dp + 136.5333dp + 138.6667dp + 140.8000dp + 142.9333dp + 145.0667dp + 147.2000dp + 149.3333dp + 151.4667dp + 153.6000dp + 155.7333dp + 157.8667dp + 160.0000dp + 162.1333dp + 164.2667dp + 166.4000dp + 168.5333dp + 170.6667dp + 172.8000dp + 174.9333dp + 177.0667dp + 179.2000dp + 181.3333dp + 183.4667dp + 185.6000dp + 187.7333dp + 189.8667dp + 192.0000dp + 194.1333dp + 196.2667dp + 198.4000dp + 200.5333dp + 202.6667dp + 204.8000dp + 206.9333dp + 209.0667dp + 211.2000dp + 213.3333dp + 215.4667dp + 217.6000dp + 219.7333dp + 221.8667dp + 224.0000dp + 226.1333dp + 228.2667dp + 230.4000dp + 232.5333dp + 234.6667dp + 236.8000dp + 238.9333dp + 241.0667dp + 243.2000dp + 245.3333dp + 247.4667dp + 249.6000dp + 251.7333dp + 253.8667dp + 256.0000dp + 258.1333dp + 260.2667dp + 262.4000dp + 264.5333dp + 266.6667dp + 268.8000dp + 270.9333dp + 273.0667dp + 275.2000dp + 277.3333dp + 279.4667dp + 281.6000dp + 283.7333dp + 285.8667dp + 288.0000dp + 290.1333dp + 292.2667dp + 294.4000dp + 296.5333dp + 298.6667dp + 300.8000dp + 302.9333dp + 305.0667dp + 307.2000dp + 309.3333dp + 311.4667dp + 313.6000dp + 315.7333dp + 317.8667dp + 320.0000dp + 322.1333dp + 324.2667dp + 326.4000dp + 328.5333dp + 330.6667dp + 332.8000dp + 334.9333dp + 337.0667dp + 339.2000dp + 341.3333dp + 343.4667dp + 345.6000dp + 347.7333dp + 349.8667dp + 352.0000dp + 354.1333dp + 356.2667dp + 358.4000dp + 360.5333dp + 362.6667dp + 364.8000dp + 366.9333dp + 369.0667dp + 371.2000dp + 373.3333dp + 375.4667dp + 377.6000dp + 379.7333dp + 381.8667dp + 384.0000dp + 386.1333dp + 388.2667dp + 390.4000dp + 392.5333dp + 394.6667dp + 396.8000dp + 398.9333dp + 401.0667dp + 403.2000dp + 405.3333dp + 407.4667dp + 409.6000dp + 411.7333dp + 413.8667dp + 416.0000dp + 418.1333dp + 420.2667dp + 422.4000dp + 424.5333dp + 426.6667dp + 428.8000dp + 430.9333dp + 433.0667dp + 435.2000dp + 437.3333dp + 439.4667dp + 441.6000dp + 443.7333dp + 445.8667dp + 448.0000dp + 450.1333dp + 452.2667dp + 454.4000dp + 456.5333dp + 458.6667dp + 460.8000dp + 462.9333dp + 465.0667dp + 467.2000dp + 469.3333dp + 471.4667dp + 473.6000dp + 475.7333dp + 477.8667dp + 480.0000dp + 482.1333dp + 484.2667dp + 486.4000dp + 488.5333dp + 490.6667dp + 492.8000dp + 494.9333dp + 497.0667dp + 499.2000dp + 501.3333dp + 503.4667dp + 505.6000dp + 507.7333dp + 509.8667dp + 512.0000dp + 514.1333dp + 516.2667dp + 518.4000dp + 520.5333dp + 522.6667dp + 524.8000dp + 526.9333dp + 529.0667dp + 531.2000dp + 533.3333dp + 535.4667dp + 537.6000dp + 539.7333dp + 541.8667dp + 544.0000dp + 546.1333dp + 548.2667dp + 550.4000dp + 552.5333dp + 554.6667dp + 556.8000dp + 558.9333dp + 561.0667dp + 563.2000dp + 565.3333dp + 567.4667dp + 569.6000dp + 571.7333dp + 573.8667dp + 576.0000dp + 578.1333dp + 580.2667dp + 582.4000dp + 584.5333dp + 586.6667dp + 588.8000dp + 590.9333dp + 593.0667dp + 595.2000dp + 597.3333dp + 599.4667dp + 601.6000dp + 603.7333dp + 605.8667dp + 608.0000dp + 610.1333dp + 612.2667dp + 614.4000dp + 616.5333dp + 618.6667dp + 620.8000dp + 622.9333dp + 625.0667dp + 627.2000dp + 629.3333dp + 631.4667dp + 633.6000dp + 635.7333dp + 637.8667dp + 640.0000dp + 642.1333dp + 644.2667dp + 646.4000dp + 648.5333dp + 650.6667dp + 652.8000dp + 654.9333dp + 657.0667dp + 659.2000dp + 661.3333dp + 663.4667dp + 665.6000dp + 667.7333dp + 669.8667dp + 672.0000dp + 674.1333dp + 676.2667dp + 678.4000dp + 680.5333dp + 682.6667dp + 684.8000dp + 686.9333dp + 689.0667dp + 691.2000dp + 693.3333dp + 695.4667dp + 697.6000dp + 699.7333dp + 701.8667dp + 704.0000dp + 706.1333dp + 708.2667dp + 710.4000dp + 712.5333dp + 714.6667dp + 716.8000dp + 718.9333dp + 721.0667dp + 723.2000dp + 725.3333dp + 727.4667dp + 729.6000dp + 731.7333dp + 733.8667dp + 736.0000dp + 738.1333dp + 740.2667dp + 742.4000dp + 744.5333dp + 746.6667dp + 748.8000dp + 750.9333dp + 753.0667dp + 755.2000dp + 757.3333dp + 759.4667dp + 761.6000dp + 763.7333dp + 765.8667dp + 768.0000dp + 778.6667dp + 789.3333dp + 853.3333dp + 874.6667dp + 900.2667dp + 1006.9333dp + 1066.6667dp + 1280.0000dp + 1365.3333dp + 1536.0000dp + diff --git a/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml new file mode 100644 index 00000000..212928e6 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 12.8000sp + 14.9333sp + 17.0667sp + 19.2000sp + 21.3333sp + 23.4667sp + 25.6000sp + 27.7333sp + 29.8667sp + 32.0000sp + 34.1333sp + 36.2667sp + 38.4000sp + 40.5333sp + 42.6667sp + 44.8000sp + 46.9333sp + 49.0667sp + 51.2000sp + 53.3333sp + 59.7333sp + 64.0000sp + 68.2667sp + 72.5333sp + 76.8000sp + 81.0667sp + 85.3333sp + 89.6000sp + 102.4000sp + diff --git a/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml new file mode 100644 index 00000000..b486684a --- /dev/null +++ b/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -133.3333dp + -66.6667dp + -44.4444dp + -26.6667dp + -22.2222dp + -17.7778dp + -11.1111dp + -4.4444dp + -2.2222dp + + 0.2222dp + 1.1111dp + 2.2222dp + 3.3333dp + 4.4444dp + 5.5556dp + 6.6667dp + 7.7778dp + 8.8889dp + 10.0000dp + 11.1111dp + 13.3333dp + 15.5556dp + 17.7778dp + 20.0000dp + 22.2222dp + 24.4444dp + 26.6667dp + 28.8889dp + 31.1111dp + 33.3333dp + 35.5556dp + 37.7778dp + 40.0000dp + 42.2222dp + 44.4444dp + 46.6667dp + 48.8889dp + 51.1111dp + 53.3333dp + 55.5556dp + 57.7778dp + 60.0000dp + 62.2222dp + 64.4444dp + 66.6667dp + 68.8889dp + 71.1111dp + 73.3333dp + 75.5556dp + 77.7778dp + 80.0000dp + 82.2222dp + 84.4444dp + 86.6667dp + 88.8889dp + 91.1111dp + 93.3333dp + 95.5556dp + 97.7778dp + 100.0000dp + 102.2222dp + 104.4444dp + 106.6667dp + 108.8889dp + 111.1111dp + 113.3333dp + 115.5556dp + 117.7778dp + 120.0000dp + 122.2222dp + 124.4444dp + 126.6667dp + 128.8889dp + 131.1111dp + 133.3333dp + 135.5556dp + 137.7778dp + 140.0000dp + 142.2222dp + 144.4444dp + 146.6667dp + 148.8889dp + 151.1111dp + 153.3333dp + 155.5556dp + 157.7778dp + 160.0000dp + 162.2222dp + 164.4444dp + 166.6667dp + 168.8889dp + 171.1111dp + 173.3333dp + 175.5556dp + 177.7778dp + 180.0000dp + 182.2222dp + 184.4444dp + 186.6667dp + 188.8889dp + 191.1111dp + 193.3333dp + 195.5556dp + 197.7778dp + 200.0000dp + 202.2222dp + 204.4444dp + 206.6667dp + 208.8889dp + 211.1111dp + 213.3333dp + 215.5556dp + 217.7778dp + 220.0000dp + 222.2222dp + 224.4444dp + 226.6667dp + 228.8889dp + 231.1111dp + 233.3333dp + 235.5556dp + 237.7778dp + 240.0000dp + 242.2222dp + 244.4444dp + 246.6667dp + 248.8889dp + 251.1111dp + 253.3333dp + 255.5556dp + 257.7778dp + 260.0000dp + 262.2222dp + 264.4444dp + 266.6667dp + 268.8889dp + 271.1111dp + 273.3333dp + 275.5556dp + 277.7778dp + 280.0000dp + 282.2222dp + 284.4444dp + 286.6667dp + 288.8889dp + 291.1111dp + 293.3333dp + 295.5556dp + 297.7778dp + 300.0000dp + 302.2222dp + 304.4444dp + 306.6667dp + 308.8889dp + 311.1111dp + 313.3333dp + 315.5556dp + 317.7778dp + 320.0000dp + 322.2222dp + 324.4444dp + 326.6667dp + 328.8889dp + 331.1111dp + 333.3333dp + 335.5556dp + 337.7778dp + 340.0000dp + 342.2222dp + 344.4444dp + 346.6667dp + 348.8889dp + 351.1111dp + 353.3333dp + 355.5556dp + 357.7778dp + 360.0000dp + 362.2222dp + 364.4444dp + 366.6667dp + 368.8889dp + 371.1111dp + 373.3333dp + 375.5556dp + 377.7778dp + 380.0000dp + 382.2222dp + 384.4444dp + 386.6667dp + 388.8889dp + 391.1111dp + 393.3333dp + 395.5556dp + 397.7778dp + 400.0000dp + 402.2222dp + 404.4444dp + 406.6667dp + 408.8889dp + 411.1111dp + 413.3333dp + 415.5556dp + 417.7778dp + 420.0000dp + 422.2222dp + 424.4444dp + 426.6667dp + 428.8889dp + 431.1111dp + 433.3333dp + 435.5556dp + 437.7778dp + 440.0000dp + 442.2222dp + 444.4444dp + 446.6667dp + 448.8889dp + 451.1111dp + 453.3333dp + 455.5556dp + 457.7778dp + 460.0000dp + 462.2222dp + 464.4444dp + 466.6667dp + 468.8889dp + 471.1111dp + 473.3333dp + 475.5556dp + 477.7778dp + 480.0000dp + 482.2222dp + 484.4444dp + 486.6667dp + 488.8889dp + 491.1111dp + 493.3333dp + 495.5556dp + 497.7778dp + 500.0000dp + 502.2222dp + 504.4444dp + 506.6667dp + 508.8889dp + 511.1111dp + 513.3333dp + 515.5556dp + 517.7778dp + 520.0000dp + 522.2222dp + 524.4444dp + 526.6667dp + 528.8889dp + 531.1111dp + 533.3333dp + 535.5556dp + 537.7778dp + 540.0000dp + 542.2222dp + 544.4444dp + 546.6667dp + 548.8889dp + 551.1111dp + 553.3333dp + 555.5556dp + 557.7778dp + 560.0000dp + 562.2222dp + 564.4444dp + 566.6667dp + 568.8889dp + 571.1111dp + 573.3333dp + 575.5556dp + 577.7778dp + 580.0000dp + 582.2222dp + 584.4444dp + 586.6667dp + 588.8889dp + 591.1111dp + 593.3333dp + 595.5556dp + 597.7778dp + 600.0000dp + 602.2222dp + 604.4444dp + 606.6667dp + 608.8889dp + 611.1111dp + 613.3333dp + 615.5556dp + 617.7778dp + 620.0000dp + 622.2222dp + 624.4444dp + 626.6667dp + 628.8889dp + 631.1111dp + 633.3333dp + 635.5556dp + 637.7778dp + 640.0000dp + 642.2222dp + 644.4444dp + 646.6667dp + 648.8889dp + 651.1111dp + 653.3333dp + 655.5556dp + 657.7778dp + 660.0000dp + 662.2222dp + 664.4444dp + 666.6667dp + 668.8889dp + 671.1111dp + 673.3333dp + 675.5556dp + 677.7778dp + 680.0000dp + 682.2222dp + 684.4444dp + 686.6667dp + 688.8889dp + 691.1111dp + 693.3333dp + 695.5556dp + 697.7778dp + 700.0000dp + 702.2222dp + 704.4444dp + 706.6667dp + 708.8889dp + 711.1111dp + 713.3333dp + 715.5556dp + 717.7778dp + 720.0000dp + 722.2222dp + 724.4444dp + 726.6667dp + 728.8889dp + 731.1111dp + 733.3333dp + 735.5556dp + 737.7778dp + 740.0000dp + 742.2222dp + 744.4444dp + 746.6667dp + 748.8889dp + 751.1111dp + 753.3333dp + 755.5556dp + 757.7778dp + 760.0000dp + 762.2222dp + 764.4444dp + 766.6667dp + 768.8889dp + 771.1111dp + 773.3333dp + 775.5556dp + 777.7778dp + 780.0000dp + 782.2222dp + 784.4444dp + 786.6667dp + 788.8889dp + 791.1111dp + 793.3333dp + 795.5556dp + 797.7778dp + 800.0000dp + 811.1111dp + 822.2222dp + 888.8889dp + 911.1111dp + 937.7778dp + 1048.8889dp + 1111.1111dp + 1333.3333dp + 1422.2222dp + 1600.0000dp + diff --git a/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml new file mode 100644 index 00000000..5aff008f --- /dev/null +++ b/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 13.3333sp + 15.5556sp + 17.7778sp + 20.0000sp + 22.2222sp + 24.4444sp + 26.6667sp + 28.8889sp + 31.1111sp + 33.3333sp + 35.5556sp + 37.7778sp + 40.0000sp + 42.2222sp + 44.4444sp + 46.6667sp + 48.8889sp + 51.1111sp + 53.3333sp + 55.5556sp + 62.2222sp + 66.6667sp + 71.1111sp + 75.5556sp + 80.0000sp + 84.4444sp + 88.8889sp + 93.3333sp + 106.6667sp + diff --git a/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml new file mode 100644 index 00000000..cd7f4c83 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -135.1667dp + -67.5833dp + -45.0556dp + -27.0333dp + -22.5278dp + -18.0222dp + -11.2639dp + -4.5056dp + -2.2528dp + + 0.2253dp + 1.1264dp + 2.2528dp + 3.3792dp + 4.5056dp + 5.6319dp + 6.7583dp + 7.8847dp + 9.0111dp + 10.1375dp + 11.2639dp + 13.5167dp + 15.7694dp + 18.0222dp + 20.2750dp + 22.5278dp + 24.7806dp + 27.0333dp + 29.2861dp + 31.5389dp + 33.7917dp + 36.0444dp + 38.2972dp + 40.5500dp + 42.8028dp + 45.0556dp + 47.3083dp + 49.5611dp + 51.8139dp + 54.0667dp + 56.3194dp + 58.5722dp + 60.8250dp + 63.0778dp + 65.3306dp + 67.5833dp + 69.8361dp + 72.0889dp + 74.3417dp + 76.5944dp + 78.8472dp + 81.1000dp + 83.3528dp + 85.6056dp + 87.8583dp + 90.1111dp + 92.3639dp + 94.6167dp + 96.8694dp + 99.1222dp + 101.3750dp + 103.6278dp + 105.8806dp + 108.1333dp + 110.3861dp + 112.6389dp + 114.8917dp + 117.1444dp + 119.3972dp + 121.6500dp + 123.9028dp + 126.1556dp + 128.4083dp + 130.6611dp + 132.9139dp + 135.1667dp + 137.4194dp + 139.6722dp + 141.9250dp + 144.1778dp + 146.4306dp + 148.6833dp + 150.9361dp + 153.1889dp + 155.4417dp + 157.6944dp + 159.9472dp + 162.2000dp + 164.4528dp + 166.7056dp + 168.9583dp + 171.2111dp + 173.4639dp + 175.7167dp + 177.9694dp + 180.2222dp + 182.4750dp + 184.7278dp + 186.9806dp + 189.2333dp + 191.4861dp + 193.7389dp + 195.9917dp + 198.2444dp + 200.4972dp + 202.7500dp + 205.0028dp + 207.2556dp + 209.5083dp + 211.7611dp + 214.0139dp + 216.2667dp + 218.5194dp + 220.7722dp + 223.0250dp + 225.2778dp + 227.5306dp + 229.7833dp + 232.0361dp + 234.2889dp + 236.5417dp + 238.7944dp + 241.0472dp + 243.3000dp + 245.5528dp + 247.8056dp + 250.0583dp + 252.3111dp + 254.5639dp + 256.8167dp + 259.0694dp + 261.3222dp + 263.5750dp + 265.8278dp + 268.0806dp + 270.3333dp + 272.5861dp + 274.8389dp + 277.0917dp + 279.3444dp + 281.5972dp + 283.8500dp + 286.1028dp + 288.3556dp + 290.6083dp + 292.8611dp + 295.1139dp + 297.3667dp + 299.6194dp + 301.8722dp + 304.1250dp + 306.3778dp + 308.6306dp + 310.8833dp + 313.1361dp + 315.3889dp + 317.6417dp + 319.8944dp + 322.1472dp + 324.4000dp + 326.6528dp + 328.9056dp + 331.1583dp + 333.4111dp + 335.6639dp + 337.9167dp + 340.1694dp + 342.4222dp + 344.6750dp + 346.9278dp + 349.1806dp + 351.4333dp + 353.6861dp + 355.9389dp + 358.1917dp + 360.4444dp + 362.6972dp + 364.9500dp + 367.2028dp + 369.4556dp + 371.7083dp + 373.9611dp + 376.2139dp + 378.4667dp + 380.7194dp + 382.9722dp + 385.2250dp + 387.4778dp + 389.7306dp + 391.9833dp + 394.2361dp + 396.4889dp + 398.7417dp + 400.9944dp + 403.2472dp + 405.5000dp + 407.7528dp + 410.0056dp + 412.2583dp + 414.5111dp + 416.7639dp + 419.0167dp + 421.2694dp + 423.5222dp + 425.7750dp + 428.0278dp + 430.2806dp + 432.5333dp + 434.7861dp + 437.0389dp + 439.2917dp + 441.5444dp + 443.7972dp + 446.0500dp + 448.3028dp + 450.5556dp + 452.8083dp + 455.0611dp + 457.3139dp + 459.5667dp + 461.8194dp + 464.0722dp + 466.3250dp + 468.5778dp + 470.8306dp + 473.0833dp + 475.3361dp + 477.5889dp + 479.8417dp + 482.0944dp + 484.3472dp + 486.6000dp + 488.8528dp + 491.1056dp + 493.3583dp + 495.6111dp + 497.8639dp + 500.1167dp + 502.3694dp + 504.6222dp + 506.8750dp + 509.1278dp + 511.3806dp + 513.6333dp + 515.8861dp + 518.1389dp + 520.3917dp + 522.6444dp + 524.8972dp + 527.1500dp + 529.4028dp + 531.6556dp + 533.9083dp + 536.1611dp + 538.4139dp + 540.6667dp + 542.9194dp + 545.1722dp + 547.4250dp + 549.6778dp + 551.9306dp + 554.1833dp + 556.4361dp + 558.6889dp + 560.9417dp + 563.1944dp + 565.4472dp + 567.7000dp + 569.9528dp + 572.2056dp + 574.4583dp + 576.7111dp + 578.9639dp + 581.2167dp + 583.4694dp + 585.7222dp + 587.9750dp + 590.2278dp + 592.4806dp + 594.7333dp + 596.9861dp + 599.2389dp + 601.4917dp + 603.7444dp + 605.9972dp + 608.2500dp + 610.5028dp + 612.7556dp + 615.0083dp + 617.2611dp + 619.5139dp + 621.7667dp + 624.0194dp + 626.2722dp + 628.5250dp + 630.7778dp + 633.0306dp + 635.2833dp + 637.5361dp + 639.7889dp + 642.0417dp + 644.2944dp + 646.5472dp + 648.8000dp + 651.0528dp + 653.3056dp + 655.5583dp + 657.8111dp + 660.0639dp + 662.3167dp + 664.5694dp + 666.8222dp + 669.0750dp + 671.3278dp + 673.5806dp + 675.8333dp + 678.0861dp + 680.3389dp + 682.5917dp + 684.8444dp + 687.0972dp + 689.3500dp + 691.6028dp + 693.8556dp + 696.1083dp + 698.3611dp + 700.6139dp + 702.8667dp + 705.1194dp + 707.3722dp + 709.6250dp + 711.8778dp + 714.1306dp + 716.3833dp + 718.6361dp + 720.8889dp + 723.1417dp + 725.3944dp + 727.6472dp + 729.9000dp + 732.1528dp + 734.4056dp + 736.6583dp + 738.9111dp + 741.1639dp + 743.4167dp + 745.6694dp + 747.9222dp + 750.1750dp + 752.4278dp + 754.6806dp + 756.9333dp + 759.1861dp + 761.4389dp + 763.6917dp + 765.9444dp + 768.1972dp + 770.4500dp + 772.7028dp + 774.9556dp + 777.2083dp + 779.4611dp + 781.7139dp + 783.9667dp + 786.2194dp + 788.4722dp + 790.7250dp + 792.9778dp + 795.2306dp + 797.4833dp + 799.7361dp + 801.9889dp + 804.2417dp + 806.4944dp + 808.7472dp + 811.0000dp + 822.2639dp + 833.5278dp + 901.1111dp + 923.6389dp + 950.6722dp + 1063.3111dp + 1126.3889dp + 1351.6667dp + 1441.7778dp + 1622.0000dp + diff --git a/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml new file mode 100644 index 00000000..1ad5de99 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 13.5167sp + 15.7694sp + 18.0222sp + 20.2750sp + 22.5278sp + 24.7806sp + 27.0333sp + 29.2861sp + 31.5389sp + 33.7917sp + 36.0444sp + 38.2972sp + 40.5500sp + 42.8028sp + 45.0556sp + 47.3083sp + 49.5611sp + 51.8139sp + 54.0667sp + 56.3194sp + 63.0778sp + 67.5833sp + 72.0889sp + 76.5944sp + 81.1000sp + 85.6056sp + 90.1111sp + 94.6167sp + 108.1333sp + diff --git a/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml new file mode 100644 index 00000000..1925707b --- /dev/null +++ b/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -136.6667dp + -68.3333dp + -45.5556dp + -27.3333dp + -22.7778dp + -18.2222dp + -11.3889dp + -4.5556dp + -2.2778dp + + 0.2278dp + 1.1389dp + 2.2778dp + 3.4167dp + 4.5556dp + 5.6944dp + 6.8333dp + 7.9722dp + 9.1111dp + 10.2500dp + 11.3889dp + 13.6667dp + 15.9444dp + 18.2222dp + 20.5000dp + 22.7778dp + 25.0556dp + 27.3333dp + 29.6111dp + 31.8889dp + 34.1667dp + 36.4444dp + 38.7222dp + 41.0000dp + 43.2778dp + 45.5556dp + 47.8333dp + 50.1111dp + 52.3889dp + 54.6667dp + 56.9444dp + 59.2222dp + 61.5000dp + 63.7778dp + 66.0556dp + 68.3333dp + 70.6111dp + 72.8889dp + 75.1667dp + 77.4444dp + 79.7222dp + 82.0000dp + 84.2778dp + 86.5556dp + 88.8333dp + 91.1111dp + 93.3889dp + 95.6667dp + 97.9444dp + 100.2222dp + 102.5000dp + 104.7778dp + 107.0556dp + 109.3333dp + 111.6111dp + 113.8889dp + 116.1667dp + 118.4444dp + 120.7222dp + 123.0000dp + 125.2778dp + 127.5556dp + 129.8333dp + 132.1111dp + 134.3889dp + 136.6667dp + 138.9444dp + 141.2222dp + 143.5000dp + 145.7778dp + 148.0556dp + 150.3333dp + 152.6111dp + 154.8889dp + 157.1667dp + 159.4444dp + 161.7222dp + 164.0000dp + 166.2778dp + 168.5556dp + 170.8333dp + 173.1111dp + 175.3889dp + 177.6667dp + 179.9444dp + 182.2222dp + 184.5000dp + 186.7778dp + 189.0556dp + 191.3333dp + 193.6111dp + 195.8889dp + 198.1667dp + 200.4444dp + 202.7222dp + 205.0000dp + 207.2778dp + 209.5556dp + 211.8333dp + 214.1111dp + 216.3889dp + 218.6667dp + 220.9444dp + 223.2222dp + 225.5000dp + 227.7778dp + 230.0556dp + 232.3333dp + 234.6111dp + 236.8889dp + 239.1667dp + 241.4444dp + 243.7222dp + 246.0000dp + 248.2778dp + 250.5556dp + 252.8333dp + 255.1111dp + 257.3889dp + 259.6667dp + 261.9444dp + 264.2222dp + 266.5000dp + 268.7778dp + 271.0556dp + 273.3333dp + 275.6111dp + 277.8889dp + 280.1667dp + 282.4444dp + 284.7222dp + 287.0000dp + 289.2778dp + 291.5556dp + 293.8333dp + 296.1111dp + 298.3889dp + 300.6667dp + 302.9444dp + 305.2222dp + 307.5000dp + 309.7778dp + 312.0556dp + 314.3333dp + 316.6111dp + 318.8889dp + 321.1667dp + 323.4444dp + 325.7222dp + 328.0000dp + 330.2778dp + 332.5556dp + 334.8333dp + 337.1111dp + 339.3889dp + 341.6667dp + 343.9444dp + 346.2222dp + 348.5000dp + 350.7778dp + 353.0556dp + 355.3333dp + 357.6111dp + 359.8889dp + 362.1667dp + 364.4444dp + 366.7222dp + 369.0000dp + 371.2778dp + 373.5556dp + 375.8333dp + 378.1111dp + 380.3889dp + 382.6667dp + 384.9444dp + 387.2222dp + 389.5000dp + 391.7778dp + 394.0556dp + 396.3333dp + 398.6111dp + 400.8889dp + 403.1667dp + 405.4444dp + 407.7222dp + 410.0000dp + 412.2778dp + 414.5556dp + 416.8333dp + 419.1111dp + 421.3889dp + 423.6667dp + 425.9444dp + 428.2222dp + 430.5000dp + 432.7778dp + 435.0556dp + 437.3333dp + 439.6111dp + 441.8889dp + 444.1667dp + 446.4444dp + 448.7222dp + 451.0000dp + 453.2778dp + 455.5556dp + 457.8333dp + 460.1111dp + 462.3889dp + 464.6667dp + 466.9444dp + 469.2222dp + 471.5000dp + 473.7778dp + 476.0556dp + 478.3333dp + 480.6111dp + 482.8889dp + 485.1667dp + 487.4444dp + 489.7222dp + 492.0000dp + 494.2778dp + 496.5556dp + 498.8333dp + 501.1111dp + 503.3889dp + 505.6667dp + 507.9444dp + 510.2222dp + 512.5000dp + 514.7778dp + 517.0556dp + 519.3333dp + 521.6111dp + 523.8889dp + 526.1667dp + 528.4444dp + 530.7222dp + 533.0000dp + 535.2778dp + 537.5556dp + 539.8333dp + 542.1111dp + 544.3889dp + 546.6667dp + 548.9444dp + 551.2222dp + 553.5000dp + 555.7778dp + 558.0556dp + 560.3333dp + 562.6111dp + 564.8889dp + 567.1667dp + 569.4444dp + 571.7222dp + 574.0000dp + 576.2778dp + 578.5556dp + 580.8333dp + 583.1111dp + 585.3889dp + 587.6667dp + 589.9444dp + 592.2222dp + 594.5000dp + 596.7778dp + 599.0556dp + 601.3333dp + 603.6111dp + 605.8889dp + 608.1667dp + 610.4444dp + 612.7222dp + 615.0000dp + 617.2778dp + 619.5556dp + 621.8333dp + 624.1111dp + 626.3889dp + 628.6667dp + 630.9444dp + 633.2222dp + 635.5000dp + 637.7778dp + 640.0556dp + 642.3333dp + 644.6111dp + 646.8889dp + 649.1667dp + 651.4444dp + 653.7222dp + 656.0000dp + 658.2778dp + 660.5556dp + 662.8333dp + 665.1111dp + 667.3889dp + 669.6667dp + 671.9444dp + 674.2222dp + 676.5000dp + 678.7778dp + 681.0556dp + 683.3333dp + 685.6111dp + 687.8889dp + 690.1667dp + 692.4444dp + 694.7222dp + 697.0000dp + 699.2778dp + 701.5556dp + 703.8333dp + 706.1111dp + 708.3889dp + 710.6667dp + 712.9444dp + 715.2222dp + 717.5000dp + 719.7778dp + 722.0556dp + 724.3333dp + 726.6111dp + 728.8889dp + 731.1667dp + 733.4444dp + 735.7222dp + 738.0000dp + 740.2778dp + 742.5556dp + 744.8333dp + 747.1111dp + 749.3889dp + 751.6667dp + 753.9444dp + 756.2222dp + 758.5000dp + 760.7778dp + 763.0556dp + 765.3333dp + 767.6111dp + 769.8889dp + 772.1667dp + 774.4444dp + 776.7222dp + 779.0000dp + 781.2778dp + 783.5556dp + 785.8333dp + 788.1111dp + 790.3889dp + 792.6667dp + 794.9444dp + 797.2222dp + 799.5000dp + 801.7778dp + 804.0556dp + 806.3333dp + 808.6111dp + 810.8889dp + 813.1667dp + 815.4444dp + 817.7222dp + 820.0000dp + 831.3889dp + 842.7778dp + 911.1111dp + 933.8889dp + 961.2222dp + 1075.1111dp + 1138.8889dp + 1366.6667dp + 1457.7778dp + 1640.0000dp + diff --git a/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml new file mode 100644 index 00000000..fcf6cc6c --- /dev/null +++ b/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 13.6667sp + 15.9444sp + 18.2222sp + 20.5000sp + 22.7778sp + 25.0556sp + 27.3333sp + 29.6111sp + 31.8889sp + 34.1667sp + 36.4444sp + 38.7222sp + 41.0000sp + 43.2778sp + 45.5556sp + 47.8333sp + 50.1111sp + 52.3889sp + 54.6667sp + 56.9444sp + 63.7778sp + 68.3333sp + 72.8889sp + 77.4444sp + 82.0000sp + 86.5556sp + 91.1111sp + 95.6667sp + 109.3333sp + diff --git a/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml new file mode 100644 index 00000000..6cbf700d --- /dev/null +++ b/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -160.0000dp + -80.0000dp + -53.3333dp + -32.0000dp + -26.6667dp + -21.3333dp + -13.3333dp + -5.3333dp + -2.6667dp + + 0.2667dp + 1.3333dp + 2.6667dp + 4.0000dp + 5.3333dp + 6.6667dp + 8.0000dp + 9.3333dp + 10.6667dp + 12.0000dp + 13.3333dp + 16.0000dp + 18.6667dp + 21.3333dp + 24.0000dp + 26.6667dp + 29.3333dp + 32.0000dp + 34.6667dp + 37.3333dp + 40.0000dp + 42.6667dp + 45.3333dp + 48.0000dp + 50.6667dp + 53.3333dp + 56.0000dp + 58.6667dp + 61.3333dp + 64.0000dp + 66.6667dp + 69.3333dp + 72.0000dp + 74.6667dp + 77.3333dp + 80.0000dp + 82.6667dp + 85.3333dp + 88.0000dp + 90.6667dp + 93.3333dp + 96.0000dp + 98.6667dp + 101.3333dp + 104.0000dp + 106.6667dp + 109.3333dp + 112.0000dp + 114.6667dp + 117.3333dp + 120.0000dp + 122.6667dp + 125.3333dp + 128.0000dp + 130.6667dp + 133.3333dp + 136.0000dp + 138.6667dp + 141.3333dp + 144.0000dp + 146.6667dp + 149.3333dp + 152.0000dp + 154.6667dp + 157.3333dp + 160.0000dp + 162.6667dp + 165.3333dp + 168.0000dp + 170.6667dp + 173.3333dp + 176.0000dp + 178.6667dp + 181.3333dp + 184.0000dp + 186.6667dp + 189.3333dp + 192.0000dp + 194.6667dp + 197.3333dp + 200.0000dp + 202.6667dp + 205.3333dp + 208.0000dp + 210.6667dp + 213.3333dp + 216.0000dp + 218.6667dp + 221.3333dp + 224.0000dp + 226.6667dp + 229.3333dp + 232.0000dp + 234.6667dp + 237.3333dp + 240.0000dp + 242.6667dp + 245.3333dp + 248.0000dp + 250.6667dp + 253.3333dp + 256.0000dp + 258.6667dp + 261.3333dp + 264.0000dp + 266.6667dp + 269.3333dp + 272.0000dp + 274.6667dp + 277.3333dp + 280.0000dp + 282.6667dp + 285.3333dp + 288.0000dp + 290.6667dp + 293.3333dp + 296.0000dp + 298.6667dp + 301.3333dp + 304.0000dp + 306.6667dp + 309.3333dp + 312.0000dp + 314.6667dp + 317.3333dp + 320.0000dp + 322.6667dp + 325.3333dp + 328.0000dp + 330.6667dp + 333.3333dp + 336.0000dp + 338.6667dp + 341.3333dp + 344.0000dp + 346.6667dp + 349.3333dp + 352.0000dp + 354.6667dp + 357.3333dp + 360.0000dp + 362.6667dp + 365.3333dp + 368.0000dp + 370.6667dp + 373.3333dp + 376.0000dp + 378.6667dp + 381.3333dp + 384.0000dp + 386.6667dp + 389.3333dp + 392.0000dp + 394.6667dp + 397.3333dp + 400.0000dp + 402.6667dp + 405.3333dp + 408.0000dp + 410.6667dp + 413.3333dp + 416.0000dp + 418.6667dp + 421.3333dp + 424.0000dp + 426.6667dp + 429.3333dp + 432.0000dp + 434.6667dp + 437.3333dp + 440.0000dp + 442.6667dp + 445.3333dp + 448.0000dp + 450.6667dp + 453.3333dp + 456.0000dp + 458.6667dp + 461.3333dp + 464.0000dp + 466.6667dp + 469.3333dp + 472.0000dp + 474.6667dp + 477.3333dp + 480.0000dp + 482.6667dp + 485.3333dp + 488.0000dp + 490.6667dp + 493.3333dp + 496.0000dp + 498.6667dp + 501.3333dp + 504.0000dp + 506.6667dp + 509.3333dp + 512.0000dp + 514.6667dp + 517.3333dp + 520.0000dp + 522.6667dp + 525.3333dp + 528.0000dp + 530.6667dp + 533.3333dp + 536.0000dp + 538.6667dp + 541.3333dp + 544.0000dp + 546.6667dp + 549.3333dp + 552.0000dp + 554.6667dp + 557.3333dp + 560.0000dp + 562.6667dp + 565.3333dp + 568.0000dp + 570.6667dp + 573.3333dp + 576.0000dp + 578.6667dp + 581.3333dp + 584.0000dp + 586.6667dp + 589.3333dp + 592.0000dp + 594.6667dp + 597.3333dp + 600.0000dp + 602.6667dp + 605.3333dp + 608.0000dp + 610.6667dp + 613.3333dp + 616.0000dp + 618.6667dp + 621.3333dp + 624.0000dp + 626.6667dp + 629.3333dp + 632.0000dp + 634.6667dp + 637.3333dp + 640.0000dp + 642.6667dp + 645.3333dp + 648.0000dp + 650.6667dp + 653.3333dp + 656.0000dp + 658.6667dp + 661.3333dp + 664.0000dp + 666.6667dp + 669.3333dp + 672.0000dp + 674.6667dp + 677.3333dp + 680.0000dp + 682.6667dp + 685.3333dp + 688.0000dp + 690.6667dp + 693.3333dp + 696.0000dp + 698.6667dp + 701.3333dp + 704.0000dp + 706.6667dp + 709.3333dp + 712.0000dp + 714.6667dp + 717.3333dp + 720.0000dp + 722.6667dp + 725.3333dp + 728.0000dp + 730.6667dp + 733.3333dp + 736.0000dp + 738.6667dp + 741.3333dp + 744.0000dp + 746.6667dp + 749.3333dp + 752.0000dp + 754.6667dp + 757.3333dp + 760.0000dp + 762.6667dp + 765.3333dp + 768.0000dp + 770.6667dp + 773.3333dp + 776.0000dp + 778.6667dp + 781.3333dp + 784.0000dp + 786.6667dp + 789.3333dp + 792.0000dp + 794.6667dp + 797.3333dp + 800.0000dp + 802.6667dp + 805.3333dp + 808.0000dp + 810.6667dp + 813.3333dp + 816.0000dp + 818.6667dp + 821.3333dp + 824.0000dp + 826.6667dp + 829.3333dp + 832.0000dp + 834.6667dp + 837.3333dp + 840.0000dp + 842.6667dp + 845.3333dp + 848.0000dp + 850.6667dp + 853.3333dp + 856.0000dp + 858.6667dp + 861.3333dp + 864.0000dp + 866.6667dp + 869.3333dp + 872.0000dp + 874.6667dp + 877.3333dp + 880.0000dp + 882.6667dp + 885.3333dp + 888.0000dp + 890.6667dp + 893.3333dp + 896.0000dp + 898.6667dp + 901.3333dp + 904.0000dp + 906.6667dp + 909.3333dp + 912.0000dp + 914.6667dp + 917.3333dp + 920.0000dp + 922.6667dp + 925.3333dp + 928.0000dp + 930.6667dp + 933.3333dp + 936.0000dp + 938.6667dp + 941.3333dp + 944.0000dp + 946.6667dp + 949.3333dp + 952.0000dp + 954.6667dp + 957.3333dp + 960.0000dp + 973.3333dp + 986.6667dp + 1066.6667dp + 1093.3333dp + 1125.3333dp + 1258.6667dp + 1333.3333dp + 1600.0000dp + 1706.6667dp + 1920.0000dp + diff --git a/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml new file mode 100644 index 00000000..62001dfa --- /dev/null +++ b/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 16.0000sp + 18.6667sp + 21.3333sp + 24.0000sp + 26.6667sp + 29.3333sp + 32.0000sp + 34.6667sp + 37.3333sp + 40.0000sp + 42.6667sp + 45.3333sp + 48.0000sp + 50.6667sp + 53.3333sp + 56.0000sp + 58.6667sp + 61.3333sp + 64.0000sp + 66.6667sp + 74.6667sp + 80.0000sp + 85.3333sp + 90.6667sp + 96.0000sp + 101.3333sp + 106.6667sp + 112.0000sp + 128.0000sp + diff --git a/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml b/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml new file mode 100644 index 00000000..7aabe934 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -160.1667dp + -80.0833dp + -53.3889dp + -32.0333dp + -26.6944dp + -21.3556dp + -13.3472dp + -5.3389dp + -2.6694dp + + 0.2669dp + 1.3347dp + 2.6694dp + 4.0042dp + 5.3389dp + 6.6736dp + 8.0083dp + 9.3431dp + 10.6778dp + 12.0125dp + 13.3472dp + 16.0167dp + 18.6861dp + 21.3556dp + 24.0250dp + 26.6944dp + 29.3639dp + 32.0333dp + 34.7028dp + 37.3722dp + 40.0417dp + 42.7111dp + 45.3806dp + 48.0500dp + 50.7194dp + 53.3889dp + 56.0583dp + 58.7278dp + 61.3972dp + 64.0667dp + 66.7361dp + 69.4056dp + 72.0750dp + 74.7444dp + 77.4139dp + 80.0833dp + 82.7528dp + 85.4222dp + 88.0917dp + 90.7611dp + 93.4306dp + 96.1000dp + 98.7694dp + 101.4389dp + 104.1083dp + 106.7778dp + 109.4472dp + 112.1167dp + 114.7861dp + 117.4556dp + 120.1250dp + 122.7944dp + 125.4639dp + 128.1333dp + 130.8028dp + 133.4722dp + 136.1417dp + 138.8111dp + 141.4806dp + 144.1500dp + 146.8194dp + 149.4889dp + 152.1583dp + 154.8278dp + 157.4972dp + 160.1667dp + 162.8361dp + 165.5056dp + 168.1750dp + 170.8444dp + 173.5139dp + 176.1833dp + 178.8528dp + 181.5222dp + 184.1917dp + 186.8611dp + 189.5306dp + 192.2000dp + 194.8694dp + 197.5389dp + 200.2083dp + 202.8778dp + 205.5472dp + 208.2167dp + 210.8861dp + 213.5556dp + 216.2250dp + 218.8944dp + 221.5639dp + 224.2333dp + 226.9028dp + 229.5722dp + 232.2417dp + 234.9111dp + 237.5806dp + 240.2500dp + 242.9194dp + 245.5889dp + 248.2583dp + 250.9278dp + 253.5972dp + 256.2667dp + 258.9361dp + 261.6056dp + 264.2750dp + 266.9444dp + 269.6139dp + 272.2833dp + 274.9528dp + 277.6222dp + 280.2917dp + 282.9611dp + 285.6306dp + 288.3000dp + 290.9694dp + 293.6389dp + 296.3083dp + 298.9778dp + 301.6472dp + 304.3167dp + 306.9861dp + 309.6556dp + 312.3250dp + 314.9944dp + 317.6639dp + 320.3333dp + 323.0028dp + 325.6722dp + 328.3417dp + 331.0111dp + 333.6806dp + 336.3500dp + 339.0194dp + 341.6889dp + 344.3583dp + 347.0278dp + 349.6972dp + 352.3667dp + 355.0361dp + 357.7056dp + 360.3750dp + 363.0444dp + 365.7139dp + 368.3833dp + 371.0528dp + 373.7222dp + 376.3917dp + 379.0611dp + 381.7306dp + 384.4000dp + 387.0694dp + 389.7389dp + 392.4083dp + 395.0778dp + 397.7472dp + 400.4167dp + 403.0861dp + 405.7556dp + 408.4250dp + 411.0944dp + 413.7639dp + 416.4333dp + 419.1028dp + 421.7722dp + 424.4417dp + 427.1111dp + 429.7806dp + 432.4500dp + 435.1194dp + 437.7889dp + 440.4583dp + 443.1278dp + 445.7972dp + 448.4667dp + 451.1361dp + 453.8056dp + 456.4750dp + 459.1444dp + 461.8139dp + 464.4833dp + 467.1528dp + 469.8222dp + 472.4917dp + 475.1611dp + 477.8306dp + 480.5000dp + 483.1694dp + 485.8389dp + 488.5083dp + 491.1778dp + 493.8472dp + 496.5167dp + 499.1861dp + 501.8556dp + 504.5250dp + 507.1944dp + 509.8639dp + 512.5333dp + 515.2028dp + 517.8722dp + 520.5417dp + 523.2111dp + 525.8806dp + 528.5500dp + 531.2194dp + 533.8889dp + 536.5583dp + 539.2278dp + 541.8972dp + 544.5667dp + 547.2361dp + 549.9056dp + 552.5750dp + 555.2444dp + 557.9139dp + 560.5833dp + 563.2528dp + 565.9222dp + 568.5917dp + 571.2611dp + 573.9306dp + 576.6000dp + 579.2694dp + 581.9389dp + 584.6083dp + 587.2778dp + 589.9472dp + 592.6167dp + 595.2861dp + 597.9556dp + 600.6250dp + 603.2944dp + 605.9639dp + 608.6333dp + 611.3028dp + 613.9722dp + 616.6417dp + 619.3111dp + 621.9806dp + 624.6500dp + 627.3194dp + 629.9889dp + 632.6583dp + 635.3278dp + 637.9972dp + 640.6667dp + 643.3361dp + 646.0056dp + 648.6750dp + 651.3444dp + 654.0139dp + 656.6833dp + 659.3528dp + 662.0222dp + 664.6917dp + 667.3611dp + 670.0306dp + 672.7000dp + 675.3694dp + 678.0389dp + 680.7083dp + 683.3778dp + 686.0472dp + 688.7167dp + 691.3861dp + 694.0556dp + 696.7250dp + 699.3944dp + 702.0639dp + 704.7333dp + 707.4028dp + 710.0722dp + 712.7417dp + 715.4111dp + 718.0806dp + 720.7500dp + 723.4194dp + 726.0889dp + 728.7583dp + 731.4278dp + 734.0972dp + 736.7667dp + 739.4361dp + 742.1056dp + 744.7750dp + 747.4444dp + 750.1139dp + 752.7833dp + 755.4528dp + 758.1222dp + 760.7917dp + 763.4611dp + 766.1306dp + 768.8000dp + 771.4694dp + 774.1389dp + 776.8083dp + 779.4778dp + 782.1472dp + 784.8167dp + 787.4861dp + 790.1556dp + 792.8250dp + 795.4944dp + 798.1639dp + 800.8333dp + 803.5028dp + 806.1722dp + 808.8417dp + 811.5111dp + 814.1806dp + 816.8500dp + 819.5194dp + 822.1889dp + 824.8583dp + 827.5278dp + 830.1972dp + 832.8667dp + 835.5361dp + 838.2056dp + 840.8750dp + 843.5444dp + 846.2139dp + 848.8833dp + 851.5528dp + 854.2222dp + 856.8917dp + 859.5611dp + 862.2306dp + 864.9000dp + 867.5694dp + 870.2389dp + 872.9083dp + 875.5778dp + 878.2472dp + 880.9167dp + 883.5861dp + 886.2556dp + 888.9250dp + 891.5944dp + 894.2639dp + 896.9333dp + 899.6028dp + 902.2722dp + 904.9417dp + 907.6111dp + 910.2806dp + 912.9500dp + 915.6194dp + 918.2889dp + 920.9583dp + 923.6278dp + 926.2972dp + 928.9667dp + 931.6361dp + 934.3056dp + 936.9750dp + 939.6444dp + 942.3139dp + 944.9833dp + 947.6528dp + 950.3222dp + 952.9917dp + 955.6611dp + 958.3306dp + 961.0000dp + 974.3472dp + 987.6944dp + 1067.7778dp + 1094.4722dp + 1126.5056dp + 1259.9778dp + 1334.7222dp + 1601.6667dp + 1708.4444dp + 1922.0000dp + diff --git a/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml b/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml new file mode 100644 index 00000000..db8bdcd3 --- /dev/null +++ b/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 16.0167sp + 18.6861sp + 21.3556sp + 24.0250sp + 26.6944sp + 29.3639sp + 32.0333sp + 34.7028sp + 37.3722sp + 40.0417sp + 42.7111sp + 45.3806sp + 48.0500sp + 50.7194sp + 53.3889sp + 56.0583sp + 58.7278sp + 61.3972sp + 64.0667sp + 66.7361sp + 74.7444sp + 80.0833sp + 85.4222sp + 90.7611sp + 96.1000sp + 101.4389sp + 106.7778sp + 112.1167sp + 128.1333sp + diff --git a/library/base/src/main/res-sw/values/dimens_dp.xml b/library/base/src/main/res-sw/values/dimens_dp.xml new file mode 100644 index 00000000..453d1fec --- /dev/null +++ b/library/base/src/main/res-sw/values/dimens_dp.xml @@ -0,0 +1,390 @@ + + + + -60dp + -30dp + -20dp + -12dp + -10dp + -8dp + -5dp + -2dp + -1dp + + 0.1dp + 0.5dp + 1dp + 1.5dp + 2dp + 2.5dp + 3dp + 3.5dp + 4dp + 4.5dp + 5dp + 6dp + 7dp + 8dp + 9dp + 10dp + 11dp + 12dp + 13dp + 14dp + 15dp + 16dp + 17dp + 18dp + 19dp + 20dp + 21dp + 22dp + 23dp + 24dp + 25dp + 26dp + 27dp + 28dp + 29dp + 30dp + 31dp + 32dp + 33dp + 34dp + 35dp + 36dp + 37dp + 38dp + 39dp + 40dp + 41dp + 42dp + 43dp + 44dp + 45dp + 46dp + 47dp + 48dp + 49dp + 50dp + 51dp + 52dp + 53dp + 54dp + 55dp + 56dp + 57dp + 58dp + 59dp + 60dp + 61dp + 62dp + 63dp + 64dp + 65dp + 66dp + 67dp + 68dp + 69dp + 70dp + 71dp + 72dp + 73dp + 74dp + 75dp + 76dp + 77dp + 78dp + 79dp + 80dp + 81dp + 82dp + 83dp + 84dp + 85dp + 86dp + 87dp + 88dp + 89dp + 90dp + 91dp + 92dp + 93dp + 94dp + 95dp + 96dp + 97dp + 98dp + 99dp + 100dp + 101dp + 102dp + 103dp + 104dp + 105dp + 106dp + 107dp + 108dp + 109dp + 110dp + 111dp + 112dp + 113dp + 114dp + 115dp + 116dp + 117dp + 118dp + 119dp + 120dp + 121dp + 122dp + 123dp + 124dp + 125dp + 126dp + 127dp + 128dp + 129dp + 130dp + 131dp + 132dp + 133dp + 134dp + 135dp + 136dp + 137dp + 138dp + 139dp + 140dp + 141dp + 142dp + 143dp + 144dp + 145dp + 146dp + 147dp + 148dp + 149dp + 150dp + 151dp + 152dp + 153dp + 154dp + 155dp + 156dp + 157dp + 158dp + 159dp + 160dp + 161dp + 162dp + 163dp + 164dp + 165dp + 166dp + 167dp + 168dp + 169dp + 170dp + 171dp + 172dp + 173dp + 174dp + 175dp + 176dp + 177dp + 178dp + 179dp + 180dp + 181dp + 182dp + 183dp + 184dp + 185dp + 186dp + 187dp + 188dp + 189dp + 190dp + 191dp + 192dp + 193dp + 194dp + 195dp + 196dp + 197dp + 198dp + 199dp + 200dp + 201dp + 202dp + 203dp + 204dp + 205dp + 206dp + 207dp + 208dp + 209dp + 210dp + 211dp + 212dp + 213dp + 214dp + 215dp + 216dp + 217dp + 218dp + 219dp + 220dp + 221dp + 222dp + 223dp + 224dp + 225dp + 226dp + 227dp + 228dp + 229dp + 230dp + 231dp + 232dp + 233dp + 234dp + 235dp + 236dp + 237dp + 238dp + 239dp + 240dp + 241dp + 242dp + 243dp + 244dp + 245dp + 246dp + 247dp + 248dp + 249dp + 250dp + 251dp + 252dp + 253dp + 254dp + 255dp + 256dp + 257dp + 258dp + 259dp + 260dp + 261dp + 262dp + 263dp + 264dp + 265dp + 266dp + 267dp + 268dp + 269dp + 270dp + 271dp + 272dp + 273dp + 274dp + 275dp + 276dp + 277dp + 278dp + 279dp + 280dp + 281dp + 282dp + 283dp + 284dp + 285dp + 286dp + 287dp + 288dp + 289dp + 290dp + 291dp + 292dp + 293dp + 294dp + 295dp + 296dp + 297dp + 298dp + 299dp + 300dp + 301dp + 302dp + 303dp + 304dp + 305dp + 306dp + 307dp + 308dp + 309dp + 310dp + 311dp + 312dp + 313dp + 314dp + 315dp + 316dp + 317dp + 318dp + 319dp + 320dp + 321dp + 322dp + 323dp + 324dp + 325dp + 326dp + 327dp + 328dp + 329dp + 330dp + 331dp + 332dp + 333dp + 334dp + 335dp + 336dp + 337dp + 338dp + 339dp + 340dp + 341dp + 342dp + 343dp + 344dp + 345dp + 346dp + 347dp + 348dp + 349dp + 350dp + 351dp + 352dp + 353dp + 354dp + 355dp + 356dp + 357dp + 358dp + 359dp + 360dp + 365dp + 370dp + 400dp + 410dp + 422dp + 472dp + 500dp + 600dp + 640dp + 720dp + diff --git a/library/base/src/main/res-sw/values/dimens_sp.xml b/library/base/src/main/res-sw/values/dimens_sp.xml new file mode 100644 index 00000000..1fd222ec --- /dev/null +++ b/library/base/src/main/res-sw/values/dimens_sp.xml @@ -0,0 +1,33 @@ + + + + 6sp + 7sp + 8sp + 9sp + 10sp + 11sp + 12sp + 13sp + 14sp + 15sp + 16sp + 17sp + 18sp + 19sp + 20sp + 21sp + 22sp + 23sp + 24sp + 25sp + 28sp + 30sp + 32sp + 34sp + 36sp + 38sp + 40sp + 42sp + 48sp + diff --git a/base/src/main/res/anim/from_bottom_layout.xml b/library/base/src/main/res/anim/layout_fall_down.xml similarity index 77% rename from base/src/main/res/anim/from_bottom_layout.xml rename to library/base/src/main/res/anim/layout_fall_down.xml index 8b905e7b..45cffb8d 100644 --- a/base/src/main/res/anim/from_bottom_layout.xml +++ b/library/base/src/main/res/anim/layout_fall_down.xml @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/base/src/main/res/anim/fall_down_item.xml b/library/base/src/main/res/anim/layout_fall_down_item.xml similarity index 100% rename from base/src/main/res/anim/fall_down_item.xml rename to library/base/src/main/res/anim/layout_fall_down_item.xml diff --git a/base/src/main/res/anim/fall_down_layout.xml b/library/base/src/main/res/anim/layout_from_bottom.xml similarity index 76% rename from base/src/main/res/anim/fall_down_layout.xml rename to library/base/src/main/res/anim/layout_from_bottom.xml index 32cb14b6..28e36cd1 100644 --- a/base/src/main/res/anim/fall_down_layout.xml +++ b/library/base/src/main/res/anim/layout_from_bottom.xml @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/base/src/main/res/anim/from_bottom_item.xml b/library/base/src/main/res/anim/layout_from_bottom_item.xml similarity index 100% rename from base/src/main/res/anim/from_bottom_item.xml rename to library/base/src/main/res/anim/layout_from_bottom_item.xml diff --git a/base/src/main/res/anim/from_right_layout.xml b/library/base/src/main/res/anim/layout_from_right.xml similarity index 76% rename from base/src/main/res/anim/from_right_layout.xml rename to library/base/src/main/res/anim/layout_from_right.xml index 02ef45ca..6a344e1d 100644 --- a/base/src/main/res/anim/from_right_layout.xml +++ b/library/base/src/main/res/anim/layout_from_right.xml @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/base/src/main/res/anim/from_right_item.xml b/library/base/src/main/res/anim/layout_from_right_item.xml similarity index 100% rename from base/src/main/res/anim/from_right_item.xml rename to library/base/src/main/res/anim/layout_from_right_item.xml diff --git a/base/src/main/res/anim/bottom_in_window.xml b/library/base/src/main/res/anim/window_bottom_in.xml similarity index 100% rename from base/src/main/res/anim/bottom_in_window.xml rename to library/base/src/main/res/anim/window_bottom_in.xml diff --git a/base/src/main/res/anim/bottom_out_window.xml b/library/base/src/main/res/anim/window_bottom_out.xml similarity index 100% rename from base/src/main/res/anim/bottom_out_window.xml rename to library/base/src/main/res/anim/window_bottom_out.xml diff --git a/base/src/main/res/anim/ios_in_window.xml b/library/base/src/main/res/anim/window_ios_in.xml similarity index 100% rename from base/src/main/res/anim/ios_in_window.xml rename to library/base/src/main/res/anim/window_ios_in.xml diff --git a/base/src/main/res/anim/ios_out_window.xml b/library/base/src/main/res/anim/window_ios_out.xml similarity index 100% rename from base/src/main/res/anim/ios_out_window.xml rename to library/base/src/main/res/anim/window_ios_out.xml diff --git a/base/src/main/res/anim/left_in_window.xml b/library/base/src/main/res/anim/window_left_in.xml similarity index 100% rename from base/src/main/res/anim/left_in_window.xml rename to library/base/src/main/res/anim/window_left_in.xml diff --git a/base/src/main/res/anim/left_out_window.xml b/library/base/src/main/res/anim/window_left_out.xml similarity index 100% rename from base/src/main/res/anim/left_out_window.xml rename to library/base/src/main/res/anim/window_left_out.xml diff --git a/base/src/main/res/anim/right_in_window.xml b/library/base/src/main/res/anim/window_right_in.xml similarity index 100% rename from base/src/main/res/anim/right_in_window.xml rename to library/base/src/main/res/anim/window_right_in.xml diff --git a/base/src/main/res/anim/right_out_window.xml b/library/base/src/main/res/anim/window_right_out.xml similarity index 100% rename from base/src/main/res/anim/right_out_window.xml rename to library/base/src/main/res/anim/window_right_out.xml diff --git a/base/src/main/res/anim/scale_in_window.xml b/library/base/src/main/res/anim/window_scale_in.xml similarity index 98% rename from base/src/main/res/anim/scale_in_window.xml rename to library/base/src/main/res/anim/window_scale_in.xml index ef519b33..069c2da0 100644 --- a/base/src/main/res/anim/scale_in_window.xml +++ b/library/base/src/main/res/anim/window_scale_in.xml @@ -9,7 +9,7 @@ android:pivotY="50%" android:toXScale="1.05" android:toYScale="1.05" /> - + - + - + true - @anim/scale_in_window - @anim/scale_out_window + @anim/window_scale_in + @anim/window_scale_out 0dp 0dp @@ -36,38 +36,38 @@ \ No newline at end of file diff --git a/copy/build.gradle b/library/copy/build.gradle similarity index 52% rename from copy/build.gradle rename to library/copy/build.gradle index bd65689a..594c9152 100644 --- a/copy/build.gradle +++ b/library/copy/build.gradle @@ -1,2 +1,2 @@ -apply plugin: 'com.android.library' -apply from: '../config.gradle' \ No newline at end of file +apply plugin: 'com.android.library' +apply from: '../../common.gradle' \ No newline at end of file diff --git a/copy/src/main/AndroidManifest.xml b/library/copy/src/main/AndroidManifest.xml similarity index 100% rename from copy/src/main/AndroidManifest.xml rename to library/copy/src/main/AndroidManifest.xml diff --git a/copy/src/main/java/com/hjq/copy/Copy.java b/library/copy/src/main/java/com/hjq/copy/Copy.java similarity index 100% rename from copy/src/main/java/com/hjq/copy/Copy.java rename to library/copy/src/main/java/com/hjq/copy/Copy.java diff --git a/library/umeng/build.gradle b/library/umeng/build.gradle new file mode 100644 index 00000000..90593754 --- /dev/null +++ b/library/umeng/build.gradle @@ -0,0 +1,45 @@ +apply plugin : 'com.android.library' +apply from : '../../common.gradle' + +android { + + defaultConfig { + // 模块混淆配置 + consumerProguardFiles 'proguard-umeng.pro' + + // 构建配置字段 + buildConfigField('String', 'UM_KEY', '\"' + UMENG_APP_KEY + '\"') + buildConfigField('String', 'QQ_ID', '\"' + QQ_APP_ID + '\"') + buildConfigField('String', 'QQ_SECRET', '\"' + QQ_APP_SECRET + '\"') + buildConfigField('String', 'WX_ID', '\"' + WX_APP_ID + '\"') + buildConfigField('String', 'WX_SECRET', '\"' + WX_APP_SECRET + '\"') + + // 清单占位符 + addManifestPlaceholders([ + 'UM_KEY' : UMENG_APP_KEY, + 'QQ_ID' : QQ_APP_ID, + 'QQ_SECRET' : QQ_APP_SECRET, + 'WX_ID' : WX_APP_ID, + 'WX_SECRET' : WX_APP_SECRET + ]) + } +} + +// 友盟统计集成文档:https://developer.umeng.com/docs/119267/detail/118584 +// 友盟社会化集成文档:https://developer.umeng.com/docs/128606/detail/193879 +dependencies { + // 友盟公共库 + api 'com.umeng.umsdk:common:9.4.0' + api 'com.umeng.umsdk:asms:1.2.3' + // 友盟分享库 + api 'com.umeng.umsdk:share-core:7.1.5' + // 友盟微信分享 + api 'com.umeng.umsdk:share-wx:7.1.5' + // 友盟 QQ 分享 + api 'com.umeng.umsdk:share-qq:7.1.5' + + // QQ 组件:https://wiki.open.qq.com/wiki/QQ%E7%94%A8%E6%88%B7%E8%83%BD%E5%8A%9B + api 'com.tencent.tauth:qqopensdk:3.53.0' + // 微信组件:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html + api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.9' +} \ No newline at end of file diff --git a/library/umeng/proguard-umeng.pro b/library/umeng/proguard-umeng.pro new file mode 100644 index 00000000..477bc553 --- /dev/null +++ b/library/umeng/proguard-umeng.pro @@ -0,0 +1,5 @@ +# 友盟相关 SDK +-keep class com.umeng.** {*;} + +# QQ 和 微信 SDK +-keep class com.tencent.** {*;} \ No newline at end of file diff --git a/umeng/src/main/AndroidManifest.xml b/library/umeng/src/main/AndroidManifest.xml similarity index 63% rename from umeng/src/main/AndroidManifest.xml rename to library/umeng/src/main/AndroidManifest.xml index 97034812..cb83c8cc 100644 --- a/umeng/src/main/AndroidManifest.xml +++ b/library/umeng/src/main/AndroidManifest.xml @@ -1,86 +1,76 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/umeng/src/main/java/com/hjq/umeng/Platform.java b/library/umeng/src/main/java/com/hjq/umeng/Platform.java similarity index 100% rename from umeng/src/main/java/com/hjq/umeng/Platform.java rename to library/umeng/src/main/java/com/hjq/umeng/Platform.java diff --git a/library/umeng/src/main/java/com/hjq/umeng/UmengClient.java b/library/umeng/src/main/java/com/hjq/umeng/UmengClient.java new file mode 100644 index 00000000..1582443f --- /dev/null +++ b/library/umeng/src/main/java/com/hjq/umeng/UmengClient.java @@ -0,0 +1,141 @@ +package com.hjq.umeng; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.umeng.analytics.MobclickAgent; +import com.umeng.commonsdk.UMConfigure; +import com.umeng.socialize.PlatformConfig; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2019/04/03 + * desc : 友盟客户端 + */ +public final class UmengClient { + + private static String sDeviceOaid; + + /** + * 初始化友盟相关 SDK + */ + public static void init(Application application, boolean logEnable) { + preInit(application, logEnable); + // 友盟统计:https://developer.umeng.com/docs/66632/detail/101814#h1-u521Du59CBu5316u53CAu901Au7528u63A5u53E32 + UMConfigure.init(application, BuildConfig.UM_KEY,"umeng", UMConfigure.DEVICE_TYPE_PHONE, ""); + // 获取设备的 oaid + UMConfigure.getOaid(application, oaid -> sDeviceOaid = oaid); + } + + /** + * 预初始化 SDK(在用户没有同意隐私协议前调用) + */ + public static void preInit(Application application, boolean logEnable) { + UMConfigure.preInit(application, BuildConfig.UM_KEY,"umeng"); + // 选用自动采集模式:https://developer.umeng.com/docs/119267/detail/118588#h1-u9875u9762u91C7u96C63 + MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO); + + // 初始化各个平台的 ID 和 Key + PlatformConfig.setWeixin(BuildConfig.WX_ID, BuildConfig.WX_SECRET); + PlatformConfig.setQQZone(BuildConfig.QQ_ID, BuildConfig.QQ_SECRET); + + // 初始化各个平台的文件提供者(必须要初始化,否则会导致无法分享文件) + String fileProvider = application.getPackageName() + ".provider"; + PlatformConfig.setWXFileProvider(fileProvider); + PlatformConfig.setQQFileProvider(fileProvider); + + // 是否开启日志打印 + UMConfigure.setLogEnabled(logEnable); + } + + /** + * 分享 + * + * @param activity Activity对象 + * @param platform 分享平台 + * @param action 分享意图 + * @param listener 分享监听 + */ + public static void share(Activity activity, Platform platform, ShareAction action, @Nullable UmengShare.OnShareListener listener) { + if (!isAppInstalled(activity, platform.getPackageName())) { + // 当分享的平台软件可能没有被安装的时候 + if (listener == null) { + return; + } + listener.onError(platform, new PackageManager.NameNotFoundException("Is not installed")); + return; + } + action.setPlatform(platform.getThirdParty()) + .setCallback(new UmengShare.ShareListenerWrapper(platform.getThirdParty(), listener)) + .share(); + } + + /** + * 登录 + * + * @param activity Activity对象 + * @param platform 登录平台 + * @param listener 登录监听 + */ + public static void login(Activity activity, Platform platform, @Nullable UmengLogin.OnLoginListener listener) { + if (!isAppInstalled(activity, platform)) { + // 当登录的平台软件可能没有被安装的时候 + if (listener == null) { + return; + } + listener.onError(platform, new PackageManager.NameNotFoundException("Is not installed")); + return; + } + + try { + // 删除旧的第三方登录授权 + UMShareAPI.get(activity).deleteOauth(activity, platform.getThirdParty(), null); + // 要先等上面的代码执行完毕之后 + Thread.sleep(200); + // 开启新的第三方登录授权 + UMShareAPI.get(activity).getPlatformInfo(activity, platform.getThirdParty(), new UmengLogin.LoginListenerWrapper(platform.getThirdParty(), listener)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * 设置回调 + */ + public static void onActivityResult(Activity activity, int requestCode, int resultCode, @Nullable Intent data) { + UMShareAPI.get(activity).onActivityResult(requestCode, resultCode, data); + } + + /** + * 获取设备 oaid + */ + public static String getDeviceOaid() { + return sDeviceOaid; + } + + /** + * 判断 App 是否安装 + */ + public static boolean isAppInstalled(Context context, Platform platform) { + return isAppInstalled(context, platform.getPackageName()); + } + + private static boolean isAppInstalled(Context context, @NonNull String packageName) { + try { + context.getPackageManager().getApplicationInfo(packageName, 0); + return true; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return false; + } + } +} \ No newline at end of file diff --git a/umeng/src/main/java/com/hjq/umeng/UmengLogin.java b/library/umeng/src/main/java/com/hjq/umeng/UmengLogin.java similarity index 72% rename from umeng/src/main/java/com/hjq/umeng/UmengLogin.java rename to library/umeng/src/main/java/com/hjq/umeng/UmengLogin.java index f16c6377..3acce6d1 100644 --- a/umeng/src/main/java/com/hjq/umeng/UmengLogin.java +++ b/library/umeng/src/main/java/com/hjq/umeng/UmengLogin.java @@ -1,9 +1,10 @@ package com.hjq.umeng; +import androidx.annotation.Nullable; + import com.umeng.socialize.UMAuthListener; import com.umeng.socialize.bean.SHARE_MEDIA; -import java.lang.ref.SoftReference; import java.util.Map; /** @@ -65,14 +66,16 @@ public boolean isMan() { } /** - * 为什么要用软引用,因为友盟会将监听回调(UMAuthListener)持有成静态的 + * 为什么要包起来?因为友盟会将监听回调(UMAuthListener)持有成静态的,回调完没有及时释放 */ - public static final class LoginListenerWrapper extends SoftReference implements UMAuthListener { + public static final class LoginListenerWrapper implements UMAuthListener { + @Nullable + private OnLoginListener mListener; private final Platform mPlatform; - LoginListenerWrapper(SHARE_MEDIA platform, OnLoginListener listener) { - super(listener); + LoginListenerWrapper(SHARE_MEDIA platform, @Nullable OnLoginListener listener) { + mListener = listener; switch (platform) { case QQ: mPlatform = Platform.QQ; @@ -91,7 +94,12 @@ public static final class LoginListenerWrapper extends SoftReference data) { - if (get() != null) { - get().onSucceed(mPlatform, new LoginData(data)); + if (mListener == null) { + return; } + mListener.onSucceed(mPlatform, new LoginData(data)); + mListener = null; } /** @@ -116,9 +126,12 @@ public void onComplete(SHARE_MEDIA platform, int action, Map dat */ @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { - if (get() != null) { - get().onError(mPlatform, t); + t.printStackTrace(); + if (mListener == null) { + return; } + mListener.onError(mPlatform, t); + mListener = null; } /** @@ -129,18 +142,27 @@ public void onError(SHARE_MEDIA platform, int action, Throwable t) { */ @Override public void onCancel(SHARE_MEDIA platform, int action) { - if (get() != null) { - get().onCancel(mPlatform); + if (mListener == null) { + return; } + mListener.onCancel(mPlatform); + mListener = null; } } public interface OnLoginListener { + /** + * 授权开始 + * + * @param platform 平台对象 + */ + default void onStart(Platform platform) {} + /** * 授权成功的回调 * - * @param platform 平台名称 + * @param platform 平台对象 * @param data 用户资料返回 */ void onSucceed(Platform platform, LoginData data); @@ -148,7 +170,7 @@ public interface OnLoginListener { /** * 授权失败的回调 * - * @param platform 平台名称 + * @param platform 平台对象 * @param t 错误原因 */ default void onError(Platform platform, Throwable t) {} @@ -156,7 +178,7 @@ default void onError(Platform platform, Throwable t) {} /** * 授权取消的回调 * - * @param platform 平台名称 + * @param platform 平台对象 */ default void onCancel(Platform platform) {} } diff --git a/library/umeng/src/main/java/com/hjq/umeng/UmengShare.java b/library/umeng/src/main/java/com/hjq/umeng/UmengShare.java new file mode 100644 index 00000000..a7e4a4f8 --- /dev/null +++ b/library/umeng/src/main/java/com/hjq/umeng/UmengShare.java @@ -0,0 +1,134 @@ +package com.hjq.umeng; + +import androidx.annotation.Nullable; + +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2019/04/03 + * desc : 友盟第三方分享 + */ +public final class UmengShare { + + /** + * 为什么要包起来?因为友盟会将监听回调(UMShareListener)持有成静态的,回调完没有及时释放 + */ + public static final class ShareListenerWrapper implements UMShareListener { + + private final Platform mPlatform; + @Nullable + private OnShareListener mListener; + + ShareListenerWrapper(SHARE_MEDIA platform, @Nullable OnShareListener listener) { + mListener = listener; + switch (platform) { + case QQ: + mPlatform = Platform.QQ; + break; + case QZONE: + mPlatform = Platform.QZONE; + break; + case WEIXIN: + mPlatform = Platform.WECHAT; + break; + case WEIXIN_CIRCLE: + mPlatform = Platform.CIRCLE; + break; + default: + throw new IllegalStateException("are you ok?"); + } + } + + /** + * 分享开始的回调 + * + * @param platform 平台名称 + */ + @Override + public void onStart(SHARE_MEDIA platform) { + if (mListener == null) { + return; + } + mListener.onStart(mPlatform); + } + + /** + * 分享成功的回调 + * + * @param platform 平台名称 + */ + @Override + public void onResult(SHARE_MEDIA platform) { + if (mListener == null) { + return; + } + mListener.onSucceed(mPlatform); + mListener = null; + } + + /** + * 分享失败的回调 + * + * @param platform 平台名称 + * @param t 错误原因 + */ + @Override + public void onError(SHARE_MEDIA platform, Throwable t) { + t.printStackTrace(); + if (mListener == null) { + return; + } + mListener.onError(mPlatform, t); + mListener = null; + } + + /** + * 分享取消的回调 + * + * @param platform 平台名称 + */ + @Override + public void onCancel(SHARE_MEDIA platform) { + if (mListener == null) { + return; + } + mListener.onCancel(mPlatform); + mListener = null; + } + } + + public interface OnShareListener { + + /** + * 分享开始 + * + * @param platform 平台对象 + */ + default void onStart(Platform platform) {} + + /** + * 分享成功的回调 + * + * @param platform 平台对象 + */ + void onSucceed(Platform platform); + + /** + * 分享失败的回调 + * + * @param platform 平台对象 + * @param t 错误原因 + */ + default void onError(Platform platform, Throwable t) {} + + /** + * 分享取消的回调 + * + * @param platform 平台对象 + */ + default void onCancel(Platform platform) {} + } +} \ No newline at end of file diff --git a/widget/build.gradle b/library/widget/build.gradle similarity index 56% rename from widget/build.gradle rename to library/widget/build.gradle index 094f465e..832b35b7 100644 --- a/widget/build.gradle +++ b/library/widget/build.gradle @@ -1,7 +1,7 @@ -apply plugin : 'com.android.library' -apply from : '../config.gradle' - -dependencies { - // 基础库(不包任何第三方框架) - implementation project(':base') +apply plugin : 'com.android.library' +apply from : '../../common.gradle' + +dependencies { + // 基础库(不包任何第三方框架) + implementation project(':library:base') } \ No newline at end of file diff --git a/widget/src/main/AndroidManifest.xml b/library/widget/src/main/AndroidManifest.xml similarity index 100% rename from widget/src/main/AndroidManifest.xml rename to library/widget/src/main/AndroidManifest.xml diff --git a/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.java b/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.java similarity index 97% rename from widget/src/main/java/com/hjq/widget/layout/CustomViewStub.java rename to library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.java index e00d098b..967f8c2e 100644 --- a/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.java +++ b/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.java @@ -21,6 +21,7 @@ */ public final class CustomViewStub extends FrameLayout { + @Nullable private OnViewStubListener mListener; private final int mLayoutResource; @@ -92,7 +93,7 @@ public View getInflateView() { /** * 设置监听器 */ - public void setOnViewStubListener(OnViewStubListener listener) { + public void setOnViewStubListener(@Nullable OnViewStubListener listener) { mListener = listener; } diff --git a/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.java b/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.java new file mode 100644 index 00000000..3a99f4aa --- /dev/null +++ b/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.java @@ -0,0 +1,287 @@ +package com.hjq.widget.layout; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewParent; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.core.view.NestedScrollingChild; +import androidx.core.view.NestedScrollingChildHelper; +import androidx.core.view.NestedScrollingParent; +import androidx.core.view.NestedScrollingParentHelper; +import androidx.core.view.ViewCompat; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/08/11 + * desc : 支持嵌套滚动的 LinearLayout + */ +public class NestedLinearLayout extends LinearLayout implements NestedScrollingChild, NestedScrollingParent { + + private static final int INVALID_POINTER = -1; + + private final NestedScrollingChildHelper mChildHelper; + private final NestedScrollingParentHelper mParentHelper; + + private final int[] mScrollConsumed = new int[2]; + private final int[] mScrollOffset = new int[2]; + + private final float mTouchSlop; + private final float mMaximumVelocity; + private final float mMinimumVelocity; + + private int mLastMotionY; + private int mActivePointerId; + + private VelocityTracker mVelocityTracker; + + private boolean mIsBeingDragged; + + public NestedLinearLayout(Context context) { + this(context, null, 0); + } + + public NestedLinearLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public NestedLinearLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setWillNotDraw(false); + mChildHelper = new NestedScrollingChildHelper(this); + mParentHelper = new NestedScrollingParentHelper(this); + setNestedScrollingEnabled(true); + mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); + mMaximumVelocity = ViewConfiguration.get(getContext()).getScaledMaximumFlingVelocity(); + mMinimumVelocity = ViewConfiguration.get(getContext()).getScaledMinimumFlingVelocity(); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent ev) { + MotionEvent event = MotionEvent.obtain(ev); + initVelocityTrackerIfNotExists(); + final int actionMasked = event.getActionMasked(); + + switch (actionMasked) { + case MotionEvent.ACTION_DOWN: { + mVelocityTracker.addMovement(ev); + + mLastMotionY = (int) event.getY(); + mActivePointerId = event.getPointerId(0); + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); + break; + } + case MotionEvent.ACTION_MOVE: + final int activePointerIndex = event.findPointerIndex(mActivePointerId); + if (activePointerIndex == -1) { + break; + } + + final int y = (int) event.getY(activePointerIndex); + int deltaY = mLastMotionY - y; + + if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) { + deltaY -= mScrollConsumed[1]; + event.offsetLocation(0, mScrollOffset[1]); + } + if (!mIsBeingDragged && Math.abs(mLastMotionY - y) > mTouchSlop) { + final ViewParent parent = getParent(); + if (parent != null) { + parent.requestDisallowInterceptTouchEvent(true); + } + mIsBeingDragged = true; + if (deltaY > 0) { + deltaY -= mTouchSlop; + } else { + deltaY += mTouchSlop; + } + } + + if (mIsBeingDragged) { + mVelocityTracker.addMovement(ev); + + mLastMotionY = y - mScrollOffset[1]; + if (dispatchNestedScroll(0, 0, 0, deltaY, mScrollOffset)) { + mLastMotionY -= mScrollOffset[1]; + event.offsetLocation(0, mScrollOffset[1]); + } + } + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + if (mIsBeingDragged) { + mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + int initialVelocity = (int) mVelocityTracker.getYVelocity(mActivePointerId); + + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + flingWithNestedDispatch(-initialVelocity) ; + } + } + mActivePointerId = INVALID_POINTER; + endDrag(); + break; + case MotionEvent.ACTION_POINTER_DOWN: { + final int index = event.getActionIndex(); + mLastMotionY = (int) event.getY(index); + mActivePointerId = event.getPointerId(index); + break; + } + case MotionEvent.ACTION_POINTER_UP: + onSecondaryPointerUp(event); + mLastMotionY = (int) event.getY(event.findPointerIndex(mActivePointerId)); + break; + default: + break; + } + + event.recycle(); + return true; + } + + private void onSecondaryPointerUp(MotionEvent ev) { + final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) + >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; + final int pointerId = ev.getPointerId(pointerIndex); + if (pointerId == mActivePointerId) { + final int newPointerIndex = pointerIndex == 0 ? 1 : 0; + mLastMotionY = (int) ev.getY(newPointerIndex); + mActivePointerId = ev.getPointerId(newPointerIndex); + if (mVelocityTracker != null) { + mVelocityTracker.clear(); + } + } + } + + private void endDrag() { + mIsBeingDragged = false; + recycleVelocityTracker(); + stopNestedScroll(); + } + + private void flingWithNestedDispatch(int velocityY) { + if (!dispatchNestedPreFling(0, velocityY)) { + dispatchNestedFling(0, velocityY, true); + } + } + + private void initVelocityTrackerIfNotExists() { + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain(); + } + } + + private void recycleVelocityTracker() { + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + } + + @Override + public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { + if (disallowIntercept) { + recycleVelocityTracker(); + } + super.requestDisallowInterceptTouchEvent(disallowIntercept); + } + + // NestedScrollingChild + + @Override + public void setNestedScrollingEnabled(boolean enabled) { + mChildHelper.setNestedScrollingEnabled(enabled); + } + + @Override + public boolean isNestedScrollingEnabled() { + return mChildHelper.isNestedScrollingEnabled(); + } + + @Override + public boolean startNestedScroll(int axes) { + return mChildHelper.startNestedScroll(axes); + } + + @Override + public void stopNestedScroll() { + mChildHelper.stopNestedScroll(); + } + + @Override + public boolean hasNestedScrollingParent() { + return mChildHelper.hasNestedScrollingParent(); + } + + @Override + public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { + return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { + return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { + return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); + } + + @Override + public boolean dispatchNestedPreFling(float velocityX, float velocityY) { + return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); + } + + // NestedScrollingParent + + @Override + public boolean onStartNestedScroll(@NonNull View child, @NonNull View target, int nestedScrollAxes) { + return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + + @Override + public void onNestedScrollAccepted(@NonNull View child, @NonNull View target, int nestedScrollAxes) { + mParentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes); + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); + } + + @Override + public void onStopNestedScroll(@NonNull View target) { + mParentHelper.onStopNestedScroll(target); + stopNestedScroll(); + } + + @Override + public void onNestedScroll(@NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, + int dyUnconsumed) { + dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null); + } + + @Override + public void onNestedPreScroll(@NonNull View target, int dx, int dy, @NonNull int[] consumed) { + dispatchNestedPreScroll(dx, dy, consumed, null); + } + + @Override + public boolean onNestedFling(@NonNull View target, float velocityX, float velocityY, boolean consumed) { + return dispatchNestedFling(velocityX, velocityY, consumed); + } + + @Override + public boolean onNestedPreFling(@NonNull View target, float velocityX, float velocityY) { + return dispatchNestedPreFling(velocityX, velocityY); + } + + @Override + public int getNestedScrollAxes() { + return mParentHelper.getNestedScrollAxes(); + } +} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.java b/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.java similarity index 100% rename from widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.java rename to library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.java diff --git a/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.java b/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.java similarity index 99% rename from widget/src/main/java/com/hjq/widget/layout/NestedViewPager.java rename to library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.java index 8d79500d..610aa20e 100644 --- a/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.java +++ b/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.java @@ -25,14 +25,12 @@ public class NestedViewPager extends ViewPager implements NestedScrollingParent, private final NestedScrollingChildHelper mChildHelper; public NestedViewPager(@NonNull Context context) { - super(context); + this(context, null); } public NestedViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); - } - { mParentHelper = new NestedScrollingParentHelper(this); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); diff --git a/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.java b/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.java similarity index 100% rename from widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.java rename to library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.java diff --git a/widget/src/main/java/com/hjq/widget/layout/RatioFrameLayout.java b/library/widget/src/main/java/com/hjq/widget/layout/RatioFrameLayout.java similarity index 94% rename from widget/src/main/java/com/hjq/widget/layout/RatioFrameLayout.java rename to library/widget/src/main/java/com/hjq/widget/layout/RatioFrameLayout.java index c1ab6877..1255e54a 100644 --- a/widget/src/main/java/com/hjq/widget/layout/RatioFrameLayout.java +++ b/library/widget/src/main/java/com/hjq/widget/layout/RatioFrameLayout.java @@ -42,15 +42,15 @@ public RatioFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RatioFrameLayout); String sizeRatio = array.getString(R.styleable.RatioFrameLayout_sizeRatio); if (!TextUtils.isEmpty(sizeRatio)) { - String[] split = sizeRatio.split(":"); - switch (split.length) { + String[] arrays = sizeRatio.split(":"); + switch (arrays.length) { case 1: - mWidthRatio = Float.parseFloat(split[0]); + mWidthRatio = Float.parseFloat(arrays[0]); mHeightRatio = 1; break; case 2: - mWidthRatio = Float.parseFloat(split[0]); - mHeightRatio = Float.parseFloat(split[1]); + mWidthRatio = Float.parseFloat(arrays[0]); + mHeightRatio = Float.parseFloat(arrays[1]); break; default: throw new IllegalArgumentException("are you ok?"); @@ -119,6 +119,7 @@ public float getSizeRatio() { public void setSizeRatio(float widthRatio, float heightRatio) { mWidthRatio = widthRatio; mHeightRatio = heightRatio; + requestLayout(); invalidate(); } } \ No newline at end of file diff --git a/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.java b/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.java new file mode 100644 index 00000000..9bf850e6 --- /dev/null +++ b/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.java @@ -0,0 +1,484 @@ +package com.hjq.widget.layout; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.StateListDrawable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.core.content.ContextCompat; + +import com.hjq.widget.R; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2019/01/23 + * desc : 设置条自定义控件 + */ +public final class SettingBar extends FrameLayout { + + /** 无色值 */ + public static final int NO_COLOR = Color.TRANSPARENT; + + private final LinearLayout mMainLayout; + private final TextView mLeftView; + private final TextView mRightView; + private final View mLineView; + + /** 图标着色器 */ + private int mLeftDrawableTint, mRightDrawableTint; + + /** 图标显示大小 */ + private int mLeftDrawableSize, mRightDrawableSize; + + public SettingBar(Context context) { + this(context, null); + } + + public SettingBar(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SettingBar(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public SettingBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + mMainLayout = new LinearLayout(getContext()); + mLeftView = new TextView(getContext()); + mRightView = new TextView(getContext()); + mLineView = new View(getContext()); + + mMainLayout.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL)); + + LinearLayout.LayoutParams leftParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + leftParams.gravity = Gravity.CENTER_VERTICAL; + mLeftView.setLayoutParams(leftParams); + + LinearLayout.LayoutParams rightParams = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT); + rightParams.gravity = Gravity.CENTER_VERTICAL; + rightParams.weight = 1; + mRightView.setLayoutParams(rightParams); + + mLineView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, 1, Gravity.BOTTOM)); + + mLeftView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); + mRightView.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); + + mLeftView.setSingleLine(true); + mRightView.setSingleLine(true); + + mLeftView.setEllipsize(TextUtils.TruncateAt.END); + mRightView.setEllipsize(TextUtils.TruncateAt.END); + + mLeftView.setLineSpacing(getResources().getDimension(R.dimen.dp_5), mLeftView.getLineSpacingMultiplier()); + mRightView.setLineSpacing(getResources().getDimension(R.dimen.dp_5), mRightView.getLineSpacingMultiplier()); + + mLeftView.setPaddingRelative((int) getResources().getDimension(R.dimen.dp_15), + (int) getResources().getDimension(R.dimen.dp_12), + (int) getResources().getDimension(R.dimen.dp_15), + (int) getResources().getDimension(R.dimen.dp_12)); + mRightView.setPaddingRelative((int) getResources().getDimension(R.dimen.dp_15), + (int) getResources().getDimension(R.dimen.dp_12), + (int) getResources().getDimension(R.dimen.dp_15), + (int) getResources().getDimension(R.dimen.dp_12)); + + final TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.SettingBar); + + // 文本设置 + if (array.hasValue(R.styleable.SettingBar_bar_leftText)) { + setLeftText(array.getString(R.styleable.SettingBar_bar_leftText)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_rightText)) { + setRightText(array.getString(R.styleable.SettingBar_bar_rightText)); + } + + // 提示设置 + if (array.hasValue(R.styleable.SettingBar_bar_leftTextHint)) { + setLeftTextHint(array.getString(R.styleable.SettingBar_bar_leftTextHint)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_rightTextHint)) { + setRightTextHint(array.getString(R.styleable.SettingBar_bar_rightTextHint)); + } + + // 图标显示的大小 + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawableSize)) { + setLeftDrawableSize(array.getDimensionPixelSize(R.styleable.SettingBar_bar_leftDrawableSize, 0)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawableSize)) { + setRightDrawableSize(array.getDimensionPixelSize(R.styleable.SettingBar_bar_rightDrawableSize, 0)); + } + + // 图标着色器 + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawableTint)) { + setLeftDraawbleTint(array.getColor(R.styleable.SettingBar_bar_leftDrawableTint, NO_COLOR)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawableTint)) { + setRightDrawableTint(array.getColor(R.styleable.SettingBar_bar_rightDrawableTint, NO_COLOR)); + } + + // 图标和文字之间的间距 + setLeftDrawablePadding(array.hasValue(R.styleable.SettingBar_bar_leftDrawablePadding) ? + array.getDimensionPixelSize(R.styleable.SettingBar_bar_leftDrawablePadding, 0) : + (int) getResources().getDimension(R.dimen.dp_10)); + setRightDrawablePadding(array.hasValue(R.styleable.SettingBar_bar_rightDrawablePadding) ? + array.getDimensionPixelSize(R.styleable.SettingBar_bar_rightDrawablePadding, 0) : + (int) getResources().getDimension(R.dimen.dp_10)); + + // 图标设置 + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawable)) { + setLeftDrawable(array.getDrawable(R.styleable.SettingBar_bar_leftDrawable)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawable)) { + setRightDrawable(array.getDrawable(R.styleable.SettingBar_bar_rightDrawable)); + } + + // 文字颜色设置 + setLeftTextColor(array.getColor(R.styleable.SettingBar_bar_leftTextColor, ContextCompat.getColor(getContext(), R.color.black80))); + setRightTextColor(array.getColor(R.styleable.SettingBar_bar_rightTextColor, ContextCompat.getColor(getContext(), R.color.black60))); + + // 文字大小设置 + setLeftTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SettingBar_bar_leftTextSize, (int) getResources().getDimension(R.dimen.sp_15))); + setRightTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SettingBar_bar_rightTextSize, (int) getResources().getDimension(R.dimen.sp_14))); + + // 分割线设置 + if (array.hasValue(R.styleable.SettingBar_bar_lineDrawable)) { + setLineDrawable(array.getDrawable(R.styleable.SettingBar_bar_lineDrawable)); + } else { + setLineDrawable(new ColorDrawable(0xFFECECEC)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_lineVisible)) { + setLineVisible(array.getBoolean(R.styleable.SettingBar_bar_lineVisible, true)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_lineSize)) { + setLineSize(array.getDimensionPixelSize(R.styleable.SettingBar_bar_lineSize, 0)); + } + + if (array.hasValue(R.styleable.SettingBar_bar_lineMargin)) { + setLineMargin(array.getDimensionPixelSize(R.styleable.SettingBar_bar_lineMargin, 0)); + } + + if (getBackground() == null) { + StateListDrawable drawable = new StateListDrawable(); + drawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5))); + drawable.addState(new int[]{android.R.attr.state_selected}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5))); + drawable.addState(new int[]{android.R.attr.state_focused}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5))); + drawable.addState(new int[]{}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.white))); + setBackground(drawable); + + // 必须要设置可点击,否则点击屏幕任何角落都会触发按压事件 + setFocusable(true); + setClickable(true); + } + + array.recycle(); + + mMainLayout.addView(mLeftView); + mMainLayout.addView(mRightView); + + addView(mMainLayout, 0); + addView(mLineView, 1); + } + + /** + * 设置左边的文本 + */ + public SettingBar setLeftText(@StringRes int id) { + return setLeftText(getResources().getString(id)); + } + + public SettingBar setLeftText(CharSequence text) { + mLeftView.setText(text); + return this; + } + + public CharSequence getLeftText() { + return mLeftView.getText(); + } + + /** + * 设置左边的提示 + */ + public SettingBar setLeftTextHint(@StringRes int id) { + return setLeftTextHint(getResources().getString(id)); + } + + public SettingBar setLeftTextHint(CharSequence hint) { + mLeftView.setHint(hint); + return this; + } + + /** + * 设置右边的标题 + */ + public SettingBar setRightText(@StringRes int id) { + setRightText(getResources().getString(id)); + return this; + } + + public SettingBar setRightText(CharSequence text) { + mRightView.setText(text); + return this; + } + + public CharSequence getRightText() { + return mRightView.getText(); + } + + /** + * 设置右边的提示 + */ + public SettingBar setRightTextHint(@StringRes int id) { + return setRightTextHint(getResources().getString(id)); + } + + public SettingBar setRightTextHint(CharSequence hint) { + mRightView.setHint(hint); + return this; + } + + /** + * 设置左边的图标 + */ + public SettingBar setLeftDrawable(@DrawableRes int id) { + setLeftDrawable(ContextCompat.getDrawable(getContext(), id)); + return this; + } + + public SettingBar setLeftDrawable(Drawable drawable) { + mLeftView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); + setLeftDrawableSize(mLeftDrawableSize); + setLeftDraawbleTint(mLeftDrawableTint); + return this; + } + + public Drawable getLeftDrawable() { + return mLeftView.getCompoundDrawables()[0]; + } + + /** + * 设置右边的图标 + */ + public SettingBar setRightDrawable(@DrawableRes int id) { + setRightDrawable(ContextCompat.getDrawable(getContext(), id)); + return this; + } + + public SettingBar setRightDrawable(Drawable drawable) { + mRightView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); + setRightDrawableSize(mRightDrawableSize); + setRightDrawableTint(mRightDrawableTint); + return this; + } + + public Drawable getRightDrawable() { + return mRightView.getCompoundDrawables()[2]; + } + + /** + * 设置左边的图标间距 + */ + public SettingBar setLeftDrawablePadding(int padding) { + mLeftView.setCompoundDrawablePadding(padding); + return this; + } + + /** + * 设置右边的图标间距 + */ + public SettingBar setRightDrawablePadding(int padding) { + mRightView.setCompoundDrawablePadding(padding); + return this; + } + + /** + * 设置左边的图标大小 + */ + public SettingBar setLeftDrawableSize(int size) { + mLeftDrawableSize = size; + Drawable drawable = getLeftDrawable(); + if (drawable != null) { + if (size > 0) { + drawable.setBounds(0 ,0, size, size); + } else { + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + } + mLeftView.setCompoundDrawables(drawable, null, null, null); + } + return this; + } + + /** + * 设置右边的图标大小 + */ + public SettingBar setRightDrawableSize(int size) { + mRightDrawableSize = size; + Drawable drawable = getRightDrawable(); + if (drawable != null) { + if (size > 0) { + drawable.setBounds(0 ,0, size, size); + } else { + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + } + mRightView.setCompoundDrawables(null, null, drawable, null); + } + return this; + } + + /** + * 设置左边的图标着色器 + */ + public SettingBar setLeftDraawbleTint(int color) { + mLeftDrawableTint = color; + Drawable drawable = getLeftDrawable(); + if (drawable != null && color != NO_COLOR) { + drawable.mutate(); + drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + } + return this; + } + + /** + * 设置右边的图标着色器 + */ + public SettingBar setRightDrawableTint(int color) { + mRightDrawableTint = color; + Drawable drawable = getRightDrawable(); + if (drawable != null && color != NO_COLOR) { + drawable.mutate(); + drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + } + return this; + } + + /** + * 设置左边的文本颜色 + */ + public SettingBar setLeftTextColor(@ColorInt int color) { + mLeftView.setTextColor(color); + return this; + } + + /** + * 设置右边的文本颜色 + */ + public SettingBar setRightTextColor(@ColorInt int color) { + mRightView.setTextColor(color); + return this; + } + + /** + * 设置左边的文字大小 + */ + public SettingBar setLeftTextSize(int unit, float size) { + mLeftView.setTextSize(unit, size); + return this; + } + + /** + * 设置右边的文字大小 + */ + public SettingBar setRightTextSize(int unit, float size) { + mRightView.setTextSize(unit, size); + return this; + } + + /** + * 设置分割线是否显示 + */ + public SettingBar setLineVisible(boolean visible) { + mLineView.setVisibility(visible ? VISIBLE : GONE); + return this; + } + + /** + * 设置分割线的颜色 + */ + public SettingBar setLineColor(@ColorInt int color) { + return setLineDrawable(new ColorDrawable(color)); + } + public SettingBar setLineDrawable(Drawable drawable) { + mLineView.setBackground(drawable); + return this; + } + + /** + * 设置分割线的大小 + */ + public SettingBar setLineSize(int size) { + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mLineView.getLayoutParams(); + if (params == null) { + params = generateDefaultLayoutParams(); + } + params.height = size; + mLineView.setLayoutParams(params); + return this; + } + + /** + * 设置分割线边界 + */ + public SettingBar setLineMargin(int margin) { + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mLineView.getLayoutParams(); + if (params == null) { + params = generateDefaultLayoutParams(); + } + params.leftMargin = margin; + params.rightMargin = margin; + mLineView.setLayoutParams(params); + return this; + } + + /** + * 获取主布局 + */ + public LinearLayout getMainLayout() { + return mMainLayout; + } + + /** + * 获取左 TextView + */ + public TextView getLeftView() { + return mLeftView; + } + + /** + * 获取右 TextView + */ + public TextView getRightView() { + return mRightView; + } + + /** + * 获取分割线 + */ + public View getLineView() { + return mLineView; + } +} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/layout/SimpleLayout.java b/library/widget/src/main/java/com/hjq/widget/layout/SimpleLayout.java similarity index 95% rename from widget/src/main/java/com/hjq/widget/layout/SimpleLayout.java rename to library/widget/src/main/java/com/hjq/widget/layout/SimpleLayout.java index aa5317cd..ebafb655 100644 --- a/widget/src/main/java/com/hjq/widget/layout/SimpleLayout.java +++ b/library/widget/src/main/java/com/hjq/widget/layout/SimpleLayout.java @@ -9,7 +9,8 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2018/10/18 - * desc : 简单的 Layout(常用于自定义组合控件继承的基类,可以起到性能优化的作用) + * desc : 简单的 Layout 容器,比 FrameLayout 更加轻量 + * 可以用于自定义组合控件继承的基类,可以起到性能优化的作用 */ public class SimpleLayout extends ViewGroup { diff --git a/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.java b/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.java similarity index 80% rename from widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.java rename to library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.java index 131d89ce..35762a4d 100644 --- a/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.java +++ b/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.java @@ -20,7 +20,7 @@ * author : Android 轮子哥 * github : https://github.com/getActivity/AndroidProject * time : 2019/09/21 - * desc : 支持添加底部和头部的 RecyclerView + * desc : 支持添加头部和底部的 RecyclerView */ @SuppressWarnings("rawtypes") public final class WrapRecyclerView extends RecyclerView { @@ -140,17 +140,19 @@ public void refreshHeaderFooterViews() { */ public void adjustSpanSize() { final RecyclerView.LayoutManager layoutManager = getLayoutManager(); - if (layoutManager instanceof GridLayoutManager) { - ((GridLayoutManager) layoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { - - @Override - public int getSpanSize(int position) { - return (position < mWrapAdapter.getHeaderViewsCount() - || position >= mWrapAdapter.getHeaderViewsCount() + (mRealAdapter == null ? 0 : mRealAdapter.getItemCount())) - ? ((GridLayoutManager) layoutManager).getSpanCount() : 1; - } - }); + if (!(layoutManager instanceof GridLayoutManager)) { + return; } + + ((GridLayoutManager) layoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + + @Override + public int getSpanSize(int position) { + return (position < mWrapAdapter.getHeaderViewsCount() + || position >= mWrapAdapter.getHeaderViewsCount() + (mRealAdapter == null ? 0 : mRealAdapter.getItemCount())) + ? ((GridLayoutManager) layoutManager).getSpanCount() : 1; + } + }); } /** @@ -179,36 +181,40 @@ private static final class WrapRecyclerAdapter extends RecyclerView.Adapter { + if (getVisibility() == View.INVISIBLE) { + setVisibility(View.VISIBLE); + } + ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f); + valueAnimator.setDuration(ANIM_TIME); + valueAnimator.addUpdateListener(animation -> { + float value = (float) animation.getAnimatedValue(); + setAlpha(value); + setScaleX(value); + setScaleY(value); + }); + valueAnimator.start(); + }; + + /** + * 隐藏悬浮球动画 + */ + private final Runnable mHideRunnable = () -> { + if (getVisibility() == View.INVISIBLE) { + return; + } + ValueAnimator valueAnimator = ValueAnimator.ofFloat(1f, 0f); + valueAnimator.setDuration(ANIM_TIME); + valueAnimator.addUpdateListener(animation -> { + float value = (float) animation.getAnimatedValue(); + setAlpha(value); + setScaleX(value); + setScaleY(value); + if (value == 0) { + setVisibility(View.INVISIBLE); + } + }); + valueAnimator.start(); + }; +} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/view/PasswordEditText.java b/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.java similarity index 96% rename from widget/src/main/java/com/hjq/widget/view/PasswordEditText.java rename to library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.java index 242600eb..3f601bb1 100644 --- a/widget/src/main/java/com/hjq/widget/view/PasswordEditText.java +++ b/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.java @@ -11,6 +11,7 @@ import android.view.MotionEvent; import android.view.View; +import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; @@ -30,7 +31,9 @@ public final class PasswordEditText extends RegexEditText private final Drawable mVisibleDrawable; private final Drawable mInvisibleDrawable; + @Nullable private OnTouchListener mTouchListener; + @Nullable private OnFocusChangeListener mFocusChangeListener; public PasswordEditText(Context context) { @@ -90,12 +93,12 @@ private void refreshDrawableStatus() { } @Override - public void setOnFocusChangeListener(OnFocusChangeListener onFocusChangeListener) { + public void setOnFocusChangeListener(@Nullable OnFocusChangeListener onFocusChangeListener) { mFocusChangeListener = onFocusChangeListener; } @Override - public void setOnTouchListener(OnTouchListener onTouchListener) { + public void setOnTouchListener(@Nullable OnTouchListener onTouchListener) { mTouchListener = onTouchListener; } diff --git a/library/widget/src/main/java/com/hjq/widget/view/PlayButton.java b/library/widget/src/main/java/com/hjq/widget/view/PlayButton.java new file mode 100644 index 00000000..772f1614 --- /dev/null +++ b/library/widget/src/main/java/com/hjq/widget/view/PlayButton.java @@ -0,0 +1,255 @@ +package com.hjq.widget.view; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.CornerPathEffect; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PathMeasure; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.AnticipateInterpolator; + +import androidx.annotation.Nullable; + +import com.hjq.widget.R; + +/** + * author : codeestX & Android 轮子哥 + * github : https://github.com/codeestX/ENViews + * time : 2021/09/12 + * desc : 播放暂停动效的按钮 + */ +public final class PlayButton extends View { + + /** 播放状态 */ + public static final int STATE_PLAY = 0; + /** 暂停状态 */ + public static final int STATE_PAUSE = 1; + + /** 当前状态 */ + private int mCurrentState = STATE_PAUSE; + + /** 动画时间 */ + private int mAnimDuration; + + private final Paint mPaint; + + private int mWidth, mHeight; + + private int mCenterX, mCenterY; + + private int mCircleRadius; + + private RectF mRectF, mBgRectF; + + private float mFraction = 1; + + private final Path mPath, mDstPath; + + private final PathMeasure mPathMeasure; + + private float mPathLength; + + public PlayButton(Context context) { + this(context, null); + } + + public PlayButton(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public PlayButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PlayButton); + int lineColor = typedArray.getColor(R.styleable.PlayButton_pb_lineColor, Color.WHITE); + int lineSize = typedArray.getInteger(R.styleable.PlayButton_pb_lineSize, (int) getResources().getDimension(R.dimen.dp_4)); + mAnimDuration = typedArray.getInteger(R.styleable.PlayButton_pb_animDuration, 200); + typedArray.recycle(); + + // 关闭硬件加速 + setLayerType(View.LAYER_TYPE_SOFTWARE, null); + + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeCap(Paint.Cap.ROUND); + mPaint.setColor(lineColor); + mPaint.setStrokeWidth(lineSize); + mPaint.setPathEffect(new CornerPathEffect(1)); + + mPath = new Path(); + mDstPath = new Path(); + mPathMeasure = new PathMeasure(); + } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { + super.onSizeChanged(width, height, oldWidth, oldHeight); + mWidth = width * 9 / 10; + mHeight = height * 9 / 10; + mCircleRadius = mWidth / (int) getResources().getDimension(R.dimen.dp_4); + mCenterX = width / 2; + mCenterY = height / 2; + mRectF = new RectF(mCenterX - mCircleRadius, mCenterY + 0.6f * mCircleRadius, + mCenterX + mCircleRadius, mCenterY + 2.6f * mCircleRadius); + mBgRectF = new RectF(mCenterX - mWidth / 2f ,mCenterY - mHeight / 2f , + mCenterX + mWidth / 2f, mCenterY + mHeight / 2f); + mPath.moveTo(mCenterX - mCircleRadius, mCenterY + 1.8f * mCircleRadius); + mPath.lineTo(mCenterX - mCircleRadius, mCenterY - 1.8f * mCircleRadius); + mPath.lineTo(mCenterX + mCircleRadius, mCenterY); + mPath.close(); + mPathMeasure.setPath(mPath, false); + mPathLength = mPathMeasure.getLength(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + switch (MeasureSpec.getMode(widthMeasureSpec)) { + case MeasureSpec.AT_MOST: + case MeasureSpec.UNSPECIFIED: + widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) getResources().getDimension(R.dimen.dp_60), MeasureSpec.EXACTLY); + break; + case MeasureSpec.EXACTLY: + default: + break; + } + + switch (MeasureSpec.getMode(heightMeasureSpec)) { + case MeasureSpec.AT_MOST: + case MeasureSpec.UNSPECIFIED: + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) getResources().getDimension(R.dimen.dp_60), MeasureSpec.EXACTLY); + break; + case MeasureSpec.EXACTLY: + default: + break; + } + + setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawCircle(mCenterX, mCenterY, mWidth / 2f, mPaint); + if (mFraction < 0) { + // 弹性部分 + canvas.drawLine(mCenterX + mCircleRadius, mCenterY - 1.6f * mCircleRadius + 10 * mCircleRadius * mFraction, + mCenterX + mCircleRadius, mCenterY + 1.6f * mCircleRadius + 10 * mCircleRadius * mFraction, mPaint); + + canvas.drawLine(mCenterX - mCircleRadius, mCenterY - 1.6f * mCircleRadius, + mCenterX - mCircleRadius, mCenterY + 1.6f * mCircleRadius, mPaint); + + canvas.drawArc(mBgRectF, -105 , 360 , false, mPaint); + } else if (mFraction <= 0.3) { + // 右侧直线和下方曲线 + canvas.drawLine(mCenterX + mCircleRadius, mCenterY - 1.6f * mCircleRadius + mCircleRadius * 3.2f / 0.3f * mFraction, + mCenterX + mCircleRadius, mCenterY + 1.6f * mCircleRadius, mPaint); + + canvas.drawLine(mCenterX - mCircleRadius, mCenterY - 1.6f * mCircleRadius, + mCenterX - mCircleRadius, mCenterY + 1.6f * mCircleRadius, mPaint); + + if (mFraction != 0) { + canvas.drawArc(mRectF, 0f, 180f / 0.3f * mFraction, false, mPaint); + } + + canvas.drawArc(mBgRectF, -105 + 360 * mFraction, 360 * (1 - mFraction), false, mPaint); + } else if (mFraction <= 0.6) { + // 下方曲线和三角形 + canvas.drawArc(mRectF, 180f / 0.3f * (mFraction - 0.3f), 180 - 180f / 0.3f * (mFraction - 0.3f), false , mPaint); + + mDstPath.reset(); + mPathMeasure.getSegment(0.02f * mPathLength, 0.38f * mPathLength + 0.42f * mPathLength / 0.3f * (mFraction - 0.3f) , + mDstPath, true); + canvas.drawPath(mDstPath, mPaint); + + canvas.drawArc(mBgRectF, -105 + 360 * mFraction, 360 * (1 - mFraction), false, mPaint); + } else if (mFraction <= 0.8) { + // 三角形 + mDstPath.reset(); + mPathMeasure.getSegment(0.02f * mPathLength + 0.2f * mPathLength / 0.2f * (mFraction - 0.6f) + , 0.8f * mPathLength + 0.2f * mPathLength / 0.2f * (mFraction - 0.6f) , + mDstPath, true); + canvas.drawPath(mDstPath, mPaint); + + canvas.drawArc(mBgRectF, -105 + 360 * mFraction, 360 * (1 - mFraction), false, mPaint); + } else { + // 弹性部分 + mDstPath.reset(); + mPathMeasure.getSegment(10 * mCircleRadius * (mFraction - 1) + , mPathLength , + mDstPath, true); + canvas.drawPath(mDstPath, mPaint); + } + } + + /** + * 播放状态 + */ + public void play() { + if (mCurrentState == STATE_PLAY) { + return; + } + mCurrentState = STATE_PLAY; + ValueAnimator valueAnimator = ValueAnimator.ofFloat(1f, 100f); + valueAnimator.setDuration(mAnimDuration); + valueAnimator.setInterpolator(new AnticipateInterpolator()); + valueAnimator.addUpdateListener(animation -> { + mFraction = 1 - animation.getAnimatedFraction(); + invalidate(); + }); + valueAnimator.start(); + } + + /** + * 暂停状态 + */ + public void pause() { + if (mCurrentState == STATE_PAUSE) { + return; + } + mCurrentState = STATE_PAUSE; + ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.f, 100f); + valueAnimator.setDuration(mAnimDuration); + valueAnimator.setInterpolator(new AnticipateInterpolator()); + valueAnimator.addUpdateListener(animation -> { + mFraction = animation.getAnimatedFraction(); + invalidate(); + }); + valueAnimator.start(); + } + + /** + * 获取当前状态 + */ + public int getCurrentState() { + return mCurrentState; + } + + /** + * 设置动画时间 + */ + public void setAnimDuration(int duration) { + mAnimDuration = duration; + } + + /** + * 设置线条颜色 + */ + public void setLineColor(int color) { + mPaint.setColor(color); + invalidate(); + } + + /** + * 设置线条大小 + */ + public void setLineSize(int size) { + mPaint.setStrokeWidth(size); + invalidate(); + } +} \ No newline at end of file diff --git a/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.java b/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.java new file mode 100644 index 00000000..e4c5ae73 --- /dev/null +++ b/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.java @@ -0,0 +1,39 @@ +package com.hjq.widget.view; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/09/12 + * desc : 长按半透明松手恢复的 TextView + */ +public final class PressAlphaTextView extends AppCompatTextView { + + public PressAlphaTextView(@NonNull Context context) { + super(context); + } + + public PressAlphaTextView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public PressAlphaTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void dispatchSetPressed(boolean pressed) { + // 判断当前手指是否按下了 + if (pressed) { + setAlpha(0.5f); + } else { + setAlpha(1f); + } + } +} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/view/RegexEditText.java b/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.java similarity index 94% rename from widget/src/main/java/com/hjq/widget/view/RegexEditText.java rename to library/widget/src/main/java/com/hjq/widget/view/RegexEditText.java index f99698b3..0af7fb6d 100644 --- a/widget/src/main/java/com/hjq/widget/view/RegexEditText.java +++ b/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.java @@ -27,6 +27,8 @@ public class RegexEditText extends AppCompatEditText implements InputFilter { public static final String REGEX_CHINESE = "[\\u4e00-\\u9fa5]*"; /** 英文(大写和小写的英文) */ public static final String REGEX_ENGLISH = "[a-zA-Z]*"; + /** 数字(只允许输入纯数字)*/ + public static final String REGEX_NUMBER = "\\d*"; /** 计数(非 0 开头的数字) */ public static final String REGEX_COUNT = "[1-9]\\d*"; /** 用户名(中文、英文、数字) */ @@ -65,12 +67,15 @@ public RegexEditText(Context context, AttributeSet attrs, int defStyleAttr) { setInputRegex(REGEX_ENGLISH); break; case 0x04: - setInputRegex(REGEX_COUNT); + setInputRegex(REGEX_NUMBER); break; case 0x05: - setInputRegex(REGEX_NAME); + setInputRegex(REGEX_COUNT); break; case 0x06: + setInputRegex(REGEX_NAME); + break; + case 0x07: setInputRegex(REGEX_NONNULL); break; default: @@ -146,6 +151,13 @@ public void addFilters(InputFilter filter) { super.setFilters(newFilters); } + /** + * 清空筛选规则 + */ + public void clearFilters() { + super.setFilters(new InputFilter[0]); + } + /** * {@link InputFilter} * diff --git a/widget/src/main/java/com/hjq/widget/view/ScaleImageView.java b/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.java similarity index 100% rename from widget/src/main/java/com/hjq/widget/view/ScaleImageView.java rename to library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.java diff --git a/library/widget/src/main/java/com/hjq/widget/view/SimpleRatingBar.java b/library/widget/src/main/java/com/hjq/widget/view/SimpleRatingBar.java new file mode 100644 index 00000000..e18a5069 --- /dev/null +++ b/library/widget/src/main/java/com/hjq/widget/view/SimpleRatingBar.java @@ -0,0 +1,266 @@ +package com.hjq.widget.view; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import androidx.annotation.DrawableRes; +import androidx.core.content.ContextCompat; + +import com.hjq.widget.R; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2021/07/11 + * desc : 自定义评分控件(系统的 RatingBar 不好用) + */ +public final class SimpleRatingBar extends View { + + /** 默认的星星图标 */ + private Drawable mNormalDrawable; + /** 选中的星星图标 */ + private Drawable mFillDrawable; + /** 选中的星星图标 */ + private Drawable mHalfDrawable; + + /** 当前星等级 */ + private float mCurrentGrade; + /** 星星总数量 */ + private int mGradeCount; + /** 星星的宽度 */ + private int mGradeWidth; + /** 星星的高度 */ + private int mGradeHeight; + /** 星星之间的间隔 */ + private int mGradeSpace; + /** 星星选择跨度 */ + private GradleStep mGradeStep; + + /** 星星变化监听事件 */ + private OnRatingChangeListener mListener; + + /** 星星位置记录 */ + private final Rect mGradeBounds = new Rect(); + + public SimpleRatingBar(Context context) { + this(context, null); + } + + public SimpleRatingBar(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SimpleRatingBar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SimpleRatingBar); + + mNormalDrawable = ContextCompat.getDrawable(getContext(), array.getResourceId(R.styleable.SimpleRatingBar_normalDrawable, R.drawable.rating_star_off_ic)); + mHalfDrawable = ContextCompat.getDrawable(getContext(), array.getResourceId(R.styleable.SimpleRatingBar_halfDrawable, R.drawable.rating_star_half_ic)); + mFillDrawable = ContextCompat.getDrawable(getContext(), array.getResourceId(R.styleable.SimpleRatingBar_fillDrawable, R.drawable.rating_star_fill_ic)); + // 两张图片的宽高不一致 + if (mNormalDrawable.getIntrinsicWidth() != mFillDrawable.getIntrinsicWidth() || + mNormalDrawable.getIntrinsicWidth() != mHalfDrawable.getIntrinsicWidth() || + mNormalDrawable.getIntrinsicHeight() != mFillDrawable.getIntrinsicHeight() || + mNormalDrawable.getIntrinsicHeight() != mHalfDrawable.getIntrinsicHeight()) { + throw new IllegalStateException("The width and height of the picture do not agree"); + } + + mCurrentGrade = array.getFloat(R.styleable.SimpleRatingBar_grade, 0); + mGradeCount = array.getInt(R.styleable.SimpleRatingBar_gradeCount, 5); + mGradeWidth = array.getDimensionPixelSize(R.styleable.SimpleRatingBar_gradeWidth, mNormalDrawable.getIntrinsicWidth()); + mGradeHeight = array.getDimensionPixelSize(R.styleable.SimpleRatingBar_gradeHeight, mFillDrawable.getIntrinsicHeight()); + mGradeSpace = (int) array.getDimension(R.styleable.SimpleRatingBar_gradeSpace, mGradeWidth / 4f); + switch (array.getInt(R.styleable.SimpleRatingBar_gradeStep, 0)) { + case 0x01: + mGradeStep = GradleStep.ONE; + break; + case 0x00: + default: + mGradeStep = GradleStep.HALF; + break; + } + + array.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int measuredWidth = (mGradeWidth * mGradeCount) + (mGradeSpace * (mGradeCount + 1)); + int measuredHeight = mGradeHeight; + + setMeasuredDimension(measuredWidth + getPaddingLeft() + getPaddingRight(), + measuredHeight + getPaddingTop() + getPaddingBottom()); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) { + // 如果控件处于不可用状态,直接不处理 + if (!isEnabled()) { + return false; + } + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + float grade = 0; + float distance = event.getX() - getPaddingLeft() - mGradeSpace; + if (distance > 0) { + grade = distance / (mGradeWidth + mGradeSpace); + } + + grade = Math.min(Math.max(grade, 0), mGradeCount); + + if (grade - (int) grade > 0) { + if (grade - (int) grade > 0.5f) { + // 0.5 - 1 算一颗星 + grade = (int) (grade + 0.5f); + } else { + // 0 - 0.5 算半颗星 + grade = (int) grade + 0.5f; + } + } + + if (grade * 10 != mCurrentGrade * 10) { + mCurrentGrade = grade; + invalidate(); + if (mListener != null) { + mListener.onRatingChanged(this, mCurrentGrade, true); + } + } + break; + default: + break; + } + + return true; + } + + @Override + protected void onDraw(Canvas canvas) { + for (int i = 0; i < mGradeCount; i++) { + + int start = mGradeSpace + (mGradeWidth + mGradeSpace) * i; + + mGradeBounds.left = getPaddingLeft() + start; + mGradeBounds.top = getPaddingTop(); + mGradeBounds.right = mGradeBounds.left + mGradeWidth; + mGradeBounds.bottom = mGradeBounds.top + mGradeHeight; + + if (mCurrentGrade > i) { + if (mHalfDrawable != null && mGradeStep == GradleStep.HALF && + (int) mCurrentGrade == i && mCurrentGrade - (int) mCurrentGrade == 0.5f) { + mHalfDrawable.setBounds(mGradeBounds); + mHalfDrawable.draw(canvas); + } else { + mFillDrawable.setBounds(mGradeBounds); + mFillDrawable.draw(canvas); + } + } else { + mNormalDrawable.setBounds(mGradeBounds); + mNormalDrawable.draw(canvas); + } + } + } + + public void setRatingDrawable(@DrawableRes int normalDrawableId, @DrawableRes int halfDrawableId, @DrawableRes int fillDrawableId) { + setRatingDrawable(ContextCompat.getDrawable(getContext(), normalDrawableId), + ContextCompat.getDrawable(getContext(), halfDrawableId), + ContextCompat.getDrawable(getContext(), fillDrawableId)); + } + + public void setRatingDrawable(Drawable normalDrawable, Drawable halfDrawable, Drawable fillDrawable) { + if (normalDrawable == null || fillDrawable == null) { + throw new IllegalStateException("Drawable cannot be empty"); + } + + // 两张图片的宽高不一致 + if (normalDrawable.getIntrinsicWidth() != fillDrawable.getIntrinsicWidth() || + normalDrawable.getIntrinsicHeight() != fillDrawable.getIntrinsicHeight()) { + throw new IllegalStateException("The width and height of the picture do not agree"); + } + + mNormalDrawable = normalDrawable; + mHalfDrawable = halfDrawable; + mFillDrawable = fillDrawable; + mGradeWidth = mNormalDrawable.getIntrinsicWidth(); + mGradeHeight = mNormalDrawable.getIntrinsicHeight(); + requestLayout(); + } + + public float getGrade() { + return mCurrentGrade; + } + + public void setGrade(float grade) { + if (grade > mGradeCount) { + grade = mGradeCount; + } + + if (grade - (int) grade != 0.5f || grade - (int) grade > 0) { + throw new IllegalArgumentException("grade must be a multiple of 0.5f"); + } + mCurrentGrade = grade; + invalidate(); + if (mListener != null) { + mListener.onRatingChanged(this, mCurrentGrade, false); + } + } + + public int getGradeCount() { + return mGradeCount; + } + + public void setGradeCount(int count) { + if (count > mCurrentGrade) { + mCurrentGrade = count; + } + mGradeCount = count; + invalidate(); + } + + public void setGradeSpace(int space) { + mGradeSpace = space; + requestLayout(); + } + + public void setGradeStep(GradleStep step) { + mGradeStep = step; + invalidate(); + } + + public GradleStep getGradeStep() { + return mGradeStep; + } + + public void setOnRatingBarChangeListener(OnRatingChangeListener listener) { + mListener = listener; + } + + public enum GradleStep { + + /** 半颗星 */ + HALF, + /** 一颗星 */ + ONE + } + + public interface OnRatingChangeListener { + + /** + * 评分发生变化监听时回调 + * + * @param grade 当前星星数 + * @param touch 是否通过触摸改变 + */ + void onRatingChanged(SimpleRatingBar ratingBar, float grade, boolean touch); + } +} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/view/SlantedTextView.java b/library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.java similarity index 98% rename from widget/src/main/java/com/hjq/widget/view/SlantedTextView.java rename to library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.java index d8515022..95338ecd 100644 --- a/widget/src/main/java/com/hjq/widget/view/SlantedTextView.java +++ b/library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.java @@ -78,8 +78,7 @@ public SlantedTextView(Context context, AttributeSet attrs, int defStyleAttr) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SlantedTextView); setText(array.getString(R.styleable.SlantedTextView_android_text)); - setTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SlantedTextView_android_textSize, - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()))); + setTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SlantedTextView_android_textSize, (int) getResources().getDimension(R.dimen.sp_12))); setTextColor(array.getColor(R.styleable.SlantedTextView_android_textColor, Color.WHITE)); setTextStyle(Typeface.defaultFromStyle(array.getInt(R.styleable.SlantedTextView_android_textStyle, Typeface.NORMAL))); setGravity(array.getInt(R.styleable.SlantedTextView_android_gravity, Gravity.END)); diff --git a/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.java b/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.java new file mode 100644 index 00000000..3db8b4e0 --- /dev/null +++ b/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.java @@ -0,0 +1,87 @@ +package com.hjq.widget.view; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +/** + * author : Android 轮子哥 + * github : https://github.com/getActivity/AndroidProject + * time : 2019/08/18 + * desc : 自动显示和隐藏的 TextView + */ +public final class SmartTextView extends AppCompatTextView { + + public SmartTextView(Context context) { + this(context, null); + } + + public SmartTextView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.textViewStyle); + } + + public SmartTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + refreshVisibilityStatus(); + } + + @Override + public void setText(CharSequence text, BufferType type) { + super.setText(text, type); + refreshVisibilityStatus(); + } + + @Override + public void setCompoundDrawables(@Nullable Drawable left, @Nullable Drawable top, @Nullable Drawable right, @Nullable Drawable bottom) { + super.setCompoundDrawables(left, top, right, bottom); + refreshVisibilityStatus(); + } + + @Override + public void setCompoundDrawablesRelative(@Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end, @Nullable Drawable bottom) { + super.setCompoundDrawablesRelative(start, top, end, bottom); + refreshVisibilityStatus(); + } + + /** + * 刷新当前可见状态 + */ + private void refreshVisibilityStatus() { + // 判断当前有没有设置文本达到自动隐藏和显示的效果 + if (isEmptyContent() && getVisibility() != GONE) { + setVisibility(GONE); + return; + } + + if (getVisibility() != VISIBLE) { + setVisibility(VISIBLE); + } + } + + /** + * TextView 内容是否为空 + */ + private boolean isEmptyContent() { + if (!TextUtils.isEmpty(getText())) { + return false; + } + Drawable[] compoundDrawables = getCompoundDrawables(); + Drawable[] compoundDrawablesRelative = getCompoundDrawablesRelative(); + for (Drawable drawable : compoundDrawables) { + if (drawable != null) { + return false; + } + } + + for (Drawable drawable : compoundDrawablesRelative) { + if (drawable != null) { + return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/view/SubmitButton.java b/library/widget/src/main/java/com/hjq/widget/view/SubmitButton.java similarity index 100% rename from widget/src/main/java/com/hjq/widget/view/SubmitButton.java rename to library/widget/src/main/java/com/hjq/widget/view/SubmitButton.java diff --git a/widget/src/main/java/com/hjq/widget/view/SwitchButton.java b/library/widget/src/main/java/com/hjq/widget/view/SwitchButton.java similarity index 96% rename from widget/src/main/java/com/hjq/widget/view/SwitchButton.java rename to library/widget/src/main/java/com/hjq/widget/view/SwitchButton.java index 941b718c..12a86736 100644 --- a/widget/src/main/java/com/hjq/widget/view/SwitchButton.java +++ b/library/widget/src/main/java/com/hjq/widget/view/SwitchButton.java @@ -13,7 +13,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; -import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; import android.view.animation.AccelerateInterpolator; @@ -54,7 +53,7 @@ public final class SwitchButton extends View { /** 当前的选中状态 */ private int mCheckedState; - private boolean isCanVisibleDrawing = false; + private boolean mCanVisibleDrawing = false; /** 是否显示按钮阴影 */ protected boolean mShadow; @@ -72,6 +71,7 @@ public final class SwitchButton extends View { /** 按钮阴影色 */ protected int mShadowColor = 0xFF333333; /** 监听器 */ + @Nullable private OnCheckedChangeListener mListener; private float mRight; @@ -117,8 +117,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { switch (MeasureSpec.getMode(widthMeasureSpec)) { case MeasureSpec.AT_MOST: case MeasureSpec.UNSPECIFIED: - widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 56, getResources().getDisplayMetrics()) - + getPaddingLeft() + getPaddingRight()), MeasureSpec.EXACTLY); + widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (getResources().getDimension(R.dimen.dp_56) + getPaddingLeft() + getPaddingRight()), MeasureSpec.EXACTLY); break; case MeasureSpec.EXACTLY: default: @@ -139,9 +138,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @Override protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { - isCanVisibleDrawing = width > getPaddingLeft() + getPaddingRight() && height > getPaddingTop() + getPaddingBottom(); + mCanVisibleDrawing = width > getPaddingLeft() + getPaddingRight() && height > getPaddingTop() + getPaddingBottom(); - if (isCanVisibleDrawing) { + if (mCanVisibleDrawing) { int actuallyDrawingAreaWidth = width - getPaddingLeft() - getPaddingRight(); int actuallyDrawingAreaHeight = height - getPaddingTop() - getPaddingBottom(); @@ -291,7 +290,7 @@ private float calcBTranslate(float percent) { @Override protected void onDraw(Canvas canvas) { - if (!isCanVisibleDrawing) { + if (!mCanVisibleDrawing) { return; } @@ -313,7 +312,11 @@ protected void onDraw(Canvas canvas) { final float scaleOffset = (mRight - mCenterX - mRadius) * (isOn ? 1 - dsAnim : dsAnim); canvas.save(); canvas.scale(scale, scale, mCenterX + scaleOffset, mCenterY); - mPaint.setColor(0xFFFFFFFF); + if (isEnabled()) { + mPaint.setColor(0xFFFFFFFF); + } else { + mPaint.setColor(0xFFBBBBBB); + } canvas.drawPath(mBackgroundPath, mPaint); canvas.restore(); // To prepare center bar path @@ -473,7 +476,7 @@ public void setChecked(boolean checked, boolean callback) { /** * 设置选中状态改变监听 */ - public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { + public void setOnCheckedChangeListener(@Nullable OnCheckedChangeListener listener) { mListener = listener; } diff --git a/widget/src/main/res/drawable/input_delete_ic.xml b/library/widget/src/main/res/drawable/input_delete_ic.xml similarity index 89% rename from widget/src/main/res/drawable/input_delete_ic.xml rename to library/widget/src/main/res/drawable/input_delete_ic.xml index 7f143c41..58bebecb 100644 --- a/widget/src/main/res/drawable/input_delete_ic.xml +++ b/library/widget/src/main/res/drawable/input_delete_ic.xml @@ -1,7 +1,7 @@ diff --git a/widget/src/main/res/drawable/password_off_ic.xml b/library/widget/src/main/res/drawable/password_off_ic.xml similarity index 95% rename from widget/src/main/res/drawable/password_off_ic.xml rename to library/widget/src/main/res/drawable/password_off_ic.xml index cae45977..79e0e795 100644 --- a/widget/src/main/res/drawable/password_off_ic.xml +++ b/library/widget/src/main/res/drawable/password_off_ic.xml @@ -1,7 +1,7 @@ diff --git a/widget/src/main/res/drawable/password_on_ic.xml b/library/widget/src/main/res/drawable/password_on_ic.xml similarity index 94% rename from widget/src/main/res/drawable/password_on_ic.xml rename to library/widget/src/main/res/drawable/password_on_ic.xml index dbff3e4c..2e31b579 100644 --- a/widget/src/main/res/drawable/password_on_ic.xml +++ b/library/widget/src/main/res/drawable/password_on_ic.xml @@ -1,7 +1,7 @@ diff --git a/library/widget/src/main/res/drawable/rating_star_fill_ic.xml b/library/widget/src/main/res/drawable/rating_star_fill_ic.xml new file mode 100644 index 00000000..dc397ccd --- /dev/null +++ b/library/widget/src/main/res/drawable/rating_star_fill_ic.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/library/widget/src/main/res/drawable/rating_star_half_ic.xml b/library/widget/src/main/res/drawable/rating_star_half_ic.xml new file mode 100644 index 00000000..cc9e1ff5 --- /dev/null +++ b/library/widget/src/main/res/drawable/rating_star_half_ic.xml @@ -0,0 +1,66 @@ + + + + + + + \ No newline at end of file diff --git a/library/widget/src/main/res/drawable/rating_star_off_ic.xml b/library/widget/src/main/res/drawable/rating_star_off_ic.xml new file mode 100644 index 00000000..09e1fad0 --- /dev/null +++ b/library/widget/src/main/res/drawable/rating_star_off_ic.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/library/widget/src/main/res/values/attrs.xml b/library/widget/src/main/res/values/attrs.xml new file mode 100644 index 00000000..5efc0404 --- /dev/null +++ b/library/widget/src/main/res/values/attrs.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/maven.gradle b/maven.gradle new file mode 100644 index 00000000..2b69256f --- /dev/null +++ b/maven.gradle @@ -0,0 +1,16 @@ +static def addCommonMaven(RepositoryHandler handler) { + // 阿里云云效仓库:https://maven.aliyun.com/mvn/guide + handler.maven { url 'https://maven.aliyun.com/repository/public' } + handler.maven { url 'https://maven.aliyun.com/repository/google' } + // 华为开源镜像:https://mirrors.huaweicloud.com + handler.maven { url 'https://repo.huaweicloud.com/repository/maven' } + // JitPack 远程仓库:https://jitpack.io + handler.maven { url 'https://jitpack.io' } + // MavenCentral 远程仓库:https://mvnrepository.com + handler.mavenCentral() + handler.google() + // noinspection JcenterRepositoryObsolete + handler.jcenter() +} + +ext.addCommonMaven = this.&addCommonMaven \ No newline at end of file diff --git a/picture/activity/1.jpg b/picture/activity/1.jpg index 679400a0..7f7dff0b 100644 Binary files a/picture/activity/1.jpg and b/picture/activity/1.jpg differ diff --git a/picture/activity/10.jpg b/picture/activity/10.jpg index e16fea43..01df4b97 100644 Binary files a/picture/activity/10.jpg and b/picture/activity/10.jpg differ diff --git a/picture/activity/11.jpg b/picture/activity/11.jpg index 8a5445f3..b6ea0d76 100644 Binary files a/picture/activity/11.jpg and b/picture/activity/11.jpg differ diff --git a/picture/activity/12.jpg b/picture/activity/12.jpg index 26d49daa..b178662d 100644 Binary files a/picture/activity/12.jpg and b/picture/activity/12.jpg differ diff --git a/picture/activity/13.jpg b/picture/activity/13.jpg index 0c79eb47..516d7ad6 100644 Binary files a/picture/activity/13.jpg and b/picture/activity/13.jpg differ diff --git a/picture/activity/14.jpg b/picture/activity/14.jpg index 633a503e..a686a9e7 100644 Binary files a/picture/activity/14.jpg and b/picture/activity/14.jpg differ diff --git a/picture/activity/15.jpg b/picture/activity/15.jpg index 4b72e15d..8e3e38f4 100644 Binary files a/picture/activity/15.jpg and b/picture/activity/15.jpg differ diff --git a/picture/activity/16.jpg b/picture/activity/16.jpg index ac7b9fdf..041fb4c2 100644 Binary files a/picture/activity/16.jpg and b/picture/activity/16.jpg differ diff --git a/picture/activity/17.jpg b/picture/activity/17.jpg index aa4a6837..a3c86b5e 100644 Binary files a/picture/activity/17.jpg and b/picture/activity/17.jpg differ diff --git a/picture/activity/18.jpg b/picture/activity/18.jpg index fb513e66..deb0bf25 100644 Binary files a/picture/activity/18.jpg and b/picture/activity/18.jpg differ diff --git a/picture/activity/19.jpg b/picture/activity/19.jpg index 85292e72..f1908b6d 100644 Binary files a/picture/activity/19.jpg and b/picture/activity/19.jpg differ diff --git a/picture/activity/2.jpg b/picture/activity/2.jpg index f0608b50..10a7ae30 100644 Binary files a/picture/activity/2.jpg and b/picture/activity/2.jpg differ diff --git a/picture/activity/20.jpg b/picture/activity/20.jpg index c52eec48..5246dd07 100644 Binary files a/picture/activity/20.jpg and b/picture/activity/20.jpg differ diff --git a/picture/activity/21.jpg b/picture/activity/21.jpg index b6aa851c..472c9d7f 100644 Binary files a/picture/activity/21.jpg and b/picture/activity/21.jpg differ diff --git a/picture/activity/22.jpg b/picture/activity/22.jpg index 9c92e3e4..2cea8df3 100644 Binary files a/picture/activity/22.jpg and b/picture/activity/22.jpg differ diff --git a/picture/activity/23.jpg b/picture/activity/23.jpg index 89bab476..08ebe949 100644 Binary files a/picture/activity/23.jpg and b/picture/activity/23.jpg differ diff --git a/picture/activity/24.jpg b/picture/activity/24.jpg index 8dce27cd..dc2636a5 100644 Binary files a/picture/activity/24.jpg and b/picture/activity/24.jpg differ diff --git a/picture/activity/25.jpg b/picture/activity/25.jpg index 88607850..5053ac0a 100644 Binary files a/picture/activity/25.jpg and b/picture/activity/25.jpg differ diff --git a/picture/activity/26.jpg b/picture/activity/26.jpg index 0d3b3026..68ad89f9 100644 Binary files a/picture/activity/26.jpg and b/picture/activity/26.jpg differ diff --git a/picture/activity/27.jpg b/picture/activity/27.jpg index 1a5c18b6..f2640972 100644 Binary files a/picture/activity/27.jpg and b/picture/activity/27.jpg differ diff --git a/picture/activity/28.jpg b/picture/activity/28.jpg index 17b8daaa..095fa519 100644 Binary files a/picture/activity/28.jpg and b/picture/activity/28.jpg differ diff --git a/picture/activity/29.jpg b/picture/activity/29.jpg index 0d6f0b5a..8b781914 100644 Binary files a/picture/activity/29.jpg and b/picture/activity/29.jpg differ diff --git a/picture/activity/3.jpg b/picture/activity/3.jpg index c04e3e4f..554e09a8 100644 Binary files a/picture/activity/3.jpg and b/picture/activity/3.jpg differ diff --git a/picture/activity/30.jpg b/picture/activity/30.jpg index c8393570..3c165b11 100644 Binary files a/picture/activity/30.jpg and b/picture/activity/30.jpg differ diff --git a/picture/activity/31.jpg b/picture/activity/31.jpg index 89a17722..2a69643a 100644 Binary files a/picture/activity/31.jpg and b/picture/activity/31.jpg differ diff --git a/picture/activity/32.jpg b/picture/activity/32.jpg index 07e6497d..310203a1 100644 Binary files a/picture/activity/32.jpg and b/picture/activity/32.jpg differ diff --git a/picture/activity/33.jpg b/picture/activity/33.jpg index 665f92bb..94ff1ce5 100644 Binary files a/picture/activity/33.jpg and b/picture/activity/33.jpg differ diff --git a/picture/activity/34.jpg b/picture/activity/34.jpg index af7d73f9..d1c1fd7b 100644 Binary files a/picture/activity/34.jpg and b/picture/activity/34.jpg differ diff --git a/picture/activity/35.jpg b/picture/activity/35.jpg index 2dacc173..67580ed0 100644 Binary files a/picture/activity/35.jpg and b/picture/activity/35.jpg differ diff --git a/picture/activity/36.jpg b/picture/activity/36.jpg index 971d1779..ec74d050 100644 Binary files a/picture/activity/36.jpg and b/picture/activity/36.jpg differ diff --git a/picture/activity/37.jpg b/picture/activity/37.jpg deleted file mode 100644 index 78132688..00000000 Binary files a/picture/activity/37.jpg and /dev/null differ diff --git a/picture/activity/4.jpg b/picture/activity/4.jpg index 935debdb..2c0cb071 100644 Binary files a/picture/activity/4.jpg and b/picture/activity/4.jpg differ diff --git a/picture/activity/5.jpg b/picture/activity/5.jpg index 708a4e68..e00fbc94 100644 Binary files a/picture/activity/5.jpg and b/picture/activity/5.jpg differ diff --git a/picture/activity/6.jpg b/picture/activity/6.jpg index f86417a6..0dad1fad 100644 Binary files a/picture/activity/6.jpg and b/picture/activity/6.jpg differ diff --git a/picture/activity/7.jpg b/picture/activity/7.jpg index b0bb2ef7..0d06921f 100644 Binary files a/picture/activity/7.jpg and b/picture/activity/7.jpg differ diff --git a/picture/activity/8.jpg b/picture/activity/8.jpg index 18123881..7a97b590 100644 Binary files a/picture/activity/8.jpg and b/picture/activity/8.jpg differ diff --git a/picture/activity/9.jpg b/picture/activity/9.jpg index 3eafbc1e..154f2b7d 100644 Binary files a/picture/activity/9.jpg and b/picture/activity/9.jpg differ diff --git a/picture/dialog/1.jpg b/picture/dialog/1.jpg index 8cbcb4a1..06529b63 100644 Binary files a/picture/dialog/1.jpg and b/picture/dialog/1.jpg differ diff --git a/picture/dialog/10.jpg b/picture/dialog/10.jpg index 4e624ced..0dfa5d1d 100644 Binary files a/picture/dialog/10.jpg and b/picture/dialog/10.jpg differ diff --git a/picture/dialog/11.jpg b/picture/dialog/11.jpg index bb1d3500..1195141f 100644 Binary files a/picture/dialog/11.jpg and b/picture/dialog/11.jpg differ diff --git a/picture/dialog/12.jpg b/picture/dialog/12.jpg index c1d48fff..b9927c20 100644 Binary files a/picture/dialog/12.jpg and b/picture/dialog/12.jpg differ diff --git a/picture/dialog/13.jpg b/picture/dialog/13.jpg index 1545d812..41540c53 100644 Binary files a/picture/dialog/13.jpg and b/picture/dialog/13.jpg differ diff --git a/picture/dialog/14.jpg b/picture/dialog/14.jpg index 182dfb2c..43cc7b4c 100644 Binary files a/picture/dialog/14.jpg and b/picture/dialog/14.jpg differ diff --git a/picture/dialog/15.jpg b/picture/dialog/15.jpg index 442cf9b7..fb198cb7 100644 Binary files a/picture/dialog/15.jpg and b/picture/dialog/15.jpg differ diff --git a/picture/dialog/16.jpg b/picture/dialog/16.jpg index 25fb38e1..9b53f4b5 100644 Binary files a/picture/dialog/16.jpg and b/picture/dialog/16.jpg differ diff --git a/picture/dialog/17.jpg b/picture/dialog/17.jpg index 0919794e..304ddb21 100644 Binary files a/picture/dialog/17.jpg and b/picture/dialog/17.jpg differ diff --git a/picture/dialog/18.jpg b/picture/dialog/18.jpg index 8c4800e0..5413e50b 100644 Binary files a/picture/dialog/18.jpg and b/picture/dialog/18.jpg differ diff --git a/picture/dialog/2.jpg b/picture/dialog/2.jpg index 4705b7bf..90fc8410 100644 Binary files a/picture/dialog/2.jpg and b/picture/dialog/2.jpg differ diff --git a/picture/dialog/3.jpg b/picture/dialog/3.jpg index 1f680d0f..a1fe0508 100644 Binary files a/picture/dialog/3.jpg and b/picture/dialog/3.jpg differ diff --git a/picture/dialog/4.jpg b/picture/dialog/4.jpg index a628301f..9b801a87 100644 Binary files a/picture/dialog/4.jpg and b/picture/dialog/4.jpg differ diff --git a/picture/dialog/5.jpg b/picture/dialog/5.jpg index 2e783f4d..6ab5fc0f 100644 Binary files a/picture/dialog/5.jpg and b/picture/dialog/5.jpg differ diff --git a/picture/dialog/6.jpg b/picture/dialog/6.jpg index da0e7243..2ae805d5 100644 Binary files a/picture/dialog/6.jpg and b/picture/dialog/6.jpg differ diff --git a/picture/dialog/7.jpg b/picture/dialog/7.jpg index e50181ac..34d08e0d 100644 Binary files a/picture/dialog/7.jpg and b/picture/dialog/7.jpg differ diff --git a/picture/dialog/8.jpg b/picture/dialog/8.jpg index 59dbb4bc..8d4f6212 100644 Binary files a/picture/dialog/8.jpg and b/picture/dialog/8.jpg differ diff --git a/picture/dialog/9.jpg b/picture/dialog/9.jpg index c24f6ac3..ee657b80 100644 Binary files a/picture/dialog/9.jpg and b/picture/dialog/9.jpg differ diff --git a/picture/gif/1.gif b/picture/gif/1.gif index 9e51f1af..34620024 100644 Binary files a/picture/gif/1.gif and b/picture/gif/1.gif differ diff --git a/picture/gif/10.gif b/picture/gif/10.gif new file mode 100644 index 00000000..f1f663f9 Binary files /dev/null and b/picture/gif/10.gif differ diff --git a/picture/gif/11.gif b/picture/gif/11.gif new file mode 100644 index 00000000..924ea54c Binary files /dev/null and b/picture/gif/11.gif differ diff --git a/picture/gif/12.gif b/picture/gif/12.gif new file mode 100644 index 00000000..2b665a3c Binary files /dev/null and b/picture/gif/12.gif differ diff --git a/picture/gif/2.gif b/picture/gif/2.gif index fe85974e..8b5c3b25 100644 Binary files a/picture/gif/2.gif and b/picture/gif/2.gif differ diff --git a/picture/gif/3.gif b/picture/gif/3.gif index 00a0dcc6..c04187a4 100644 Binary files a/picture/gif/3.gif and b/picture/gif/3.gif differ diff --git a/picture/gif/4.gif b/picture/gif/4.gif index 6d61fc47..2a535d0a 100644 Binary files a/picture/gif/4.gif and b/picture/gif/4.gif differ diff --git a/picture/gif/5.gif b/picture/gif/5.gif index c3f68e03..691958bd 100644 Binary files a/picture/gif/5.gif and b/picture/gif/5.gif differ diff --git a/picture/gif/6.gif b/picture/gif/6.gif index 88a44eca..0a702919 100644 Binary files a/picture/gif/6.gif and b/picture/gif/6.gif differ diff --git a/picture/gif/7.gif b/picture/gif/7.gif new file mode 100644 index 00000000..c2929d2b Binary files /dev/null and b/picture/gif/7.gif differ diff --git a/picture/gif/8.gif b/picture/gif/8.gif new file mode 100644 index 00000000..6b4d33bf Binary files /dev/null and b/picture/gif/8.gif differ diff --git a/picture/gif/9.gif b/picture/gif/9.gif new file mode 100644 index 00000000..b731a22d Binary files /dev/null and b/picture/gif/9.gif differ diff --git a/picture/help/image.jpg b/picture/help/vote1.jpg similarity index 100% rename from picture/help/image.jpg rename to picture/help/vote1.jpg diff --git a/picture/help/vote2.jpg b/picture/help/vote2.jpg new file mode 100644 index 00000000..2ea4c7b0 Binary files /dev/null and b/picture/help/vote2.jpg differ diff --git a/picture/resource/rating_bar_fill.svg b/picture/resource/rating_bar_fill.svg new file mode 100644 index 00000000..84c1196d --- /dev/null +++ b/picture/resource/rating_bar_fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/picture/resource/rating_bar_half.svg b/picture/resource/rating_bar_half.svg new file mode 100644 index 00000000..4b23f38c --- /dev/null +++ b/picture/resource/rating_bar_half.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/picture/resource/status_empty_ic.png b/picture/resource/status_empty_ic.png new file mode 100644 index 00000000..5f04c2bb Binary files /dev/null and b/picture/resource/status_empty_ic.png differ diff --git a/picture/resource/status_empty_ic.svg b/picture/resource/status_empty_ic.svg new file mode 100644 index 00000000..a0aad479 --- /dev/null +++ b/picture/resource/status_empty_ic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/picture/resource/status_error_ic.png b/picture/resource/status_error_ic.png new file mode 100644 index 00000000..ff41e59a Binary files /dev/null and b/picture/resource/status_error_ic.png differ diff --git a/picture/resource/status_error_ic.svg b/picture/resource/status_error_ic.svg new file mode 100644 index 00000000..5bb5cfec --- /dev/null +++ b/picture/resource/status_error_ic.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/picture/resource/status_nerwork_ic.png b/picture/resource/status_nerwork_ic.png new file mode 100644 index 00000000..f43800c0 Binary files /dev/null and b/picture/resource/status_nerwork_ic.png differ diff --git a/picture/resource/status_nerwork_ic.svg b/picture/resource/status_nerwork_ic.svg new file mode 100644 index 00000000..0de636b6 --- /dev/null +++ b/picture/resource/status_nerwork_ic.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/picture/resource/status_order_ic.png b/picture/resource/status_order_ic.png new file mode 100644 index 00000000..f0945e5d Binary files /dev/null and b/picture/resource/status_order_ic.png differ diff --git a/picture/resource/status_order_ic.svg b/picture/resource/status_order_ic.svg new file mode 100644 index 00000000..aec69603 --- /dev/null +++ b/picture/resource/status_order_ic.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/picture/resource/tip_error_ic.png b/picture/resource/tip_error_ic.png new file mode 100644 index 00000000..931ac892 Binary files /dev/null and b/picture/resource/tip_error_ic.png differ diff --git a/picture/resource/tip_error_ic.svg b/picture/resource/tip_error_ic.svg new file mode 100644 index 00000000..bef9ab29 --- /dev/null +++ b/picture/resource/tip_error_ic.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/picture/resource/tip_finish_ic.png b/picture/resource/tip_finish_ic.png new file mode 100644 index 00000000..11423ec3 Binary files /dev/null and b/picture/resource/tip_finish_ic.png differ diff --git a/picture/resource/tip_finish_ic.svg b/picture/resource/tip_finish_ic.svg new file mode 100644 index 00000000..633480b5 --- /dev/null +++ b/picture/resource/tip_finish_ic.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/picture/resource/tip_warning_ic.png b/picture/resource/tip_warning_ic.png new file mode 100644 index 00000000..830b7895 Binary files /dev/null and b/picture/resource/tip_warning_ic.png differ diff --git a/picture/resource/tip_warning_ic.svg b/picture/resource/tip_warning_ic.svg new file mode 100644 index 00000000..30ae931b --- /dev/null +++ b/picture/resource/tip_warning_ic.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/settings.gradle b/settings.gradle index 57821ab3..95e6f5e9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ include ':app' -include ':base' -include ':widget' -include ':umeng' \ No newline at end of file +include ':library:base' +include ':library:widget' +include ':library:umeng' \ No newline at end of file diff --git a/umeng/build.gradle b/umeng/build.gradle deleted file mode 100644 index e6d3112d..00000000 --- a/umeng/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -apply plugin : 'com.android.library' -apply from : '../config.gradle' - -android { - - defaultConfig { - // 模块混淆配置 - consumerProguardFiles 'proguard-umeng.pro' - - // 清单占位符 - manifestPlaceholders = [ - // 友盟 AppKey - 'UMENG_APPKEY' : '5cb16d93570df399fd0014e2', - // QQ AppId - 'QQ_APPID' : '101828096', - // QQ AppKey - 'QQ_APPKEY' : '9dfd3300c3aa3c4596a07796c64914b2', - // 微信 AppId - 'WX_APPID' : 'wxd35706cc9f46114c', - // 微信 AppKey - 'WX_APPKEY' : '0c8c7cf831dd135a32b3e395ea459b5a' - ] - } -} - -dependencies { - // 友盟社会化:https://bintray.com/umsdk/release/share-core - //implementation 'com.umeng.umsdk:share-core:6.9.8' - // QQ SDK:https://bintray.com/umsdk/release/share-qq - //implementation 'com.umeng.umsdk:share-qq:6.9.8' - // 微信 SDK:https://bintray.com/umsdk/release/share-wx - //implementation 'com.umeng.umsdk:share-wx:6.9.8' -} \ No newline at end of file diff --git a/umeng/libs/umeng-analytics-8.1.6.jar b/umeng/libs/umeng-analytics-8.1.6.jar deleted file mode 100644 index f18defed..00000000 Binary files a/umeng/libs/umeng-analytics-8.1.6.jar and /dev/null differ diff --git a/umeng/libs/umeng-common-2.2.5.jar b/umeng/libs/umeng-common-2.2.5.jar deleted file mode 100644 index 2f9a7bfd..00000000 Binary files a/umeng/libs/umeng-common-2.2.5.jar and /dev/null differ diff --git a/umeng/libs/umeng-share-QQ-simplify-6.9.8.jar b/umeng/libs/umeng-share-QQ-simplify-6.9.8.jar deleted file mode 100644 index 0e7a593b..00000000 Binary files a/umeng/libs/umeng-share-QQ-simplify-6.9.8.jar and /dev/null differ diff --git a/umeng/libs/umeng-share-core-6.9.8.jar b/umeng/libs/umeng-share-core-6.9.8.jar deleted file mode 100644 index 47cfae41..00000000 Binary files a/umeng/libs/umeng-share-core-6.9.8.jar and /dev/null differ diff --git a/umeng/libs/umeng-share-wechat-simplify-6.9.8.jar b/umeng/libs/umeng-share-wechat-simplify-6.9.8.jar deleted file mode 100644 index ce96e97c..00000000 Binary files a/umeng/libs/umeng-share-wechat-simplify-6.9.8.jar and /dev/null differ diff --git a/umeng/proguard-umeng.pro b/umeng/proguard-umeng.pro deleted file mode 100644 index bbc72409..00000000 --- a/umeng/proguard-umeng.pro +++ /dev/null @@ -1,105 +0,0 @@ -# 友盟统计 --keep class com.umeng.** {*;} --keepclassmembers class * { - public (org.json.JSONObject); -} --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keep public class [com.hjq.umeng].R$*{ - public static final int *; -} - -# 友盟社会化 --dontshrink --dontoptimize --dontwarn com.google.android.maps.** --dontwarn android.webkit.WebView --dontwarn com.umeng.** --dontwarn com.tencent.weibo.sdk.** --dontwarn com.facebook.** --keep public class javax.** --keep public class android.webkit.** --dontwarn android.support.v4.** --keep enum com.facebook.** --keepattributes Exceptions,InnerClasses,Signature --keepattributes *Annotation* --keepattributes SourceFile,LineNumberTable - --keep public interface com.facebook.** --keep public interface com.tencent.** --keep public interface com.umeng.socialize.** --keep public interface com.umeng.socialize.sensor.** --keep public interface com.umeng.scrshot.** - --keep public class com.umeng.socialize.* {*;} - - --keep class com.facebook.** --keep class com.facebook.** { *; } --keep class com.umeng.scrshot.** --keep public class com.tencent.** {*;} --keep class com.umeng.socialize.sensor.** --keep class com.umeng.socialize.handler.** --keep class com.umeng.socialize.handler.* --keep class com.umeng.weixin.handler.** --keep class com.umeng.weixin.handler.* --keep class com.umeng.qq.handler.** --keep class com.umeng.qq.handler.* --keep class UMMoreHandler{*;} --keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;} --keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;} --keep class im.yixin.sdk.api.YXMessage {*;} --keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;} --keep class com.tencent.mm.sdk.** { - *; -} --keep class com.tencent.mm.opensdk.** { - *; -} --keep class com.tencent.wxop.** { - *; -} --keep class com.tencent.mm.sdk.** { - *; -} - --keep class com.twitter.** { *; } - --keep class com.tencent.** {*;} --dontwarn com.tencent.** --keep class com.kakao.** {*;} --dontwarn com.kakao.** --keep public class com.umeng.com.umeng.soexample.R$*{ - public static final int *; -} --keep public class com.linkedin.android.mobilesdk.R$*{ - public static final int *; -} --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keep class com.tencent.open.TDialog$* --keep class com.tencent.open.TDialog$* {*;} --keep class com.tencent.open.PKDialog --keep class com.tencent.open.PKDialog {*;} --keep class com.tencent.open.PKDialog$* --keep class com.tencent.open.PKDialog$* {*;} --keep class com.umeng.socialize.impl.ImageImpl {*;} --keep class com.sina.** {*;} --dontwarn com.sina.** --keep class com.alipay.share.sdk.** { - *; -} - --keepnames class * implements android.os.Parcelable { - public static final ** CREATOR; -} - --keep class com.linkedin.** { *; } --keep class com.android.dingtalk.share.ddsharemodule.** { *; } --keepattributes Signature \ No newline at end of file diff --git a/umeng/src/main/java/com/hjq/umeng/UmengClient.java b/umeng/src/main/java/com/hjq/umeng/UmengClient.java deleted file mode 100644 index 71ef9140..00000000 --- a/umeng/src/main/java/com/hjq/umeng/UmengClient.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.hjq.umeng; - -import android.app.Activity; -import android.app.Application; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.umeng.analytics.MobclickAgent; -import com.umeng.commonsdk.UMConfigure; -import com.umeng.socialize.PlatformConfig; -import com.umeng.socialize.ShareAction; -import com.umeng.socialize.UMShareAPI; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/04/03 - * desc : 友盟客户端 - */ -public final class UmengClient { - - /** - * 初始化友盟相关 SDK - */ - public static void init(Application application) { - - try { - Bundle metaData = application.getPackageManager().getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA).metaData; - // 友盟统计,API 说明:https://developer.umeng.com/docs/66632/detail/101814#h1-u521Du59CBu5316u53CAu901Au7528u63A5u53E32 - UMConfigure.init(application, String.valueOf(metaData.get("UMENG_APPKEY")),"umeng", UMConfigure.DEVICE_TYPE_PHONE, ""); - // 选用自动采集模式:https://developer.umeng.com/docs/119267/detail/118588#h1-u9875u9762u91C7u96C63 - MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO); - // 初始化各个平台的 Key - PlatformConfig.setWeixin(String.valueOf(metaData.get("WX_APPID")), String.valueOf(metaData.get("WX_APPKEY"))); - PlatformConfig.setQQZone(String.valueOf(metaData.get("QQ_APPID")), String.valueOf(metaData.get("QQ_APPKEY"))); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - } - - /** - * 分享 - * - * @param activity Activity对象 - * @param platform 分享平台 - * @param data 分享内容 - * @param listener 分享监听 - */ - public static void share(Activity activity, Platform platform, UmengShare.ShareData data, UmengShare.OnShareListener listener) { - if (isAppInstalled(activity, platform.getPackageName())) { - new ShareAction(activity) - .setPlatform(platform.getThirdParty()) - .withMedia(data.create()) - .setCallback(listener != null ? new UmengShare.ShareListenerWrapper(platform.getThirdParty(), listener) : null) - .share(); - return; - } - // 当分享的平台软件可能没有被安装的时候 - if (listener != null) { - listener.onError(platform, new PackageManager.NameNotFoundException("Is not installed")); - } - } - - /** - * 登录 - * - * @param activity Activity对象 - * @param platform 登录平台 - * @param listener 登录监听 - */ - public static void login(Activity activity, Platform platform, UmengLogin.OnLoginListener listener) { - if (isAppInstalled(activity, platform)) { - try { - // 删除旧的第三方登录授权 - UMShareAPI.get(activity).deleteOauth(activity, platform.getThirdParty(), null); - // 要先等上面的代码执行完毕之后 - Thread.sleep(200); - // 开启新的第三方登录授权 - UMShareAPI.get(activity).getPlatformInfo(activity, platform.getThirdParty(), listener != null ? new UmengLogin.LoginListenerWrapper(platform.getThirdParty(), listener) : null); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return; - } - // 当登录的平台软件可能没有被安装的时候 - if (listener != null) { - listener.onError(platform, new PackageManager.NameNotFoundException("Is not installed")); - } - } - - /** - * 设置回调 - */ - public static void onActivityResult(Activity activity, int requestCode, int resultCode, @Nullable Intent data) { - UMShareAPI.get(activity).onActivityResult(requestCode, resultCode, data); - } - - /** - * 判断 App 是否安装 - */ - public static boolean isAppInstalled(Context context, Platform platform) { - return isAppInstalled(context, platform.getPackageName()); - } - - private static boolean isAppInstalled(Context context, @NonNull final String packageName) { - try { - context.getPackageManager().getApplicationInfo(packageName, 0); - return true; - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return false; - } - } -} \ No newline at end of file diff --git a/umeng/src/main/java/com/hjq/umeng/UmengShare.java b/umeng/src/main/java/com/hjq/umeng/UmengShare.java deleted file mode 100644 index cde24aec..00000000 --- a/umeng/src/main/java/com/hjq/umeng/UmengShare.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.hjq.umeng; - -import android.content.Context; - -import androidx.annotation.DrawableRes; - -import com.umeng.socialize.UMShareListener; -import com.umeng.socialize.bean.SHARE_MEDIA; -import com.umeng.socialize.media.UMImage; -import com.umeng.socialize.media.UMWeb; - -import java.lang.ref.SoftReference; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/04/03 - * desc : 友盟第三方分享 - */ -public final class UmengShare { - - public static final class ShareData { - - /** 上下文对象 */ - private final Context mContext; - /** 分享标题 */ - private String mShareTitle; - /** 分享 URL */ - private String mShareUrl; - /** 分享描述 */ - private String mShareDescription; - /** 分享缩略图 */ - private UMImage mShareLogo; - - public ShareData(Context context) { - mContext = context; - } - - public void setShareTitle(String title) { - mShareTitle = title; - } - - public void setShareUrl(String url) { - mShareUrl = url; - } - - public void setShareDescription(String description) { - mShareDescription = description; - } - - public void setShareLogo(String logo) { - mShareLogo = new UMImage(mContext, logo); - } - - public void setShareLogo(@DrawableRes int id) { - mShareLogo = new UMImage(mContext, id); - } - - public String getShareUrl() { - return mShareUrl; - } - - UMWeb create() { - UMWeb content = new UMWeb(mShareUrl); - content.setTitle(mShareTitle); - if (mShareLogo != null) { - content.setThumb(mShareLogo); - } - content.setDescription(mShareDescription); - return content; - } - } - - /** - * 为什么要用软引用,因为友盟会将监听回调(UMShareListener)持有成静态的 - */ - public static final class ShareListenerWrapper extends SoftReference implements UMShareListener { - - private final Platform mPlatform; - - ShareListenerWrapper(SHARE_MEDIA platform, OnShareListener listener) { - super(listener); - switch (platform) { - case QQ: - mPlatform = Platform.QQ; - break; - case QZONE: - mPlatform = Platform.QZONE; - break; - case WEIXIN: - mPlatform = Platform.WECHAT; - break; - case WEIXIN_CIRCLE: - mPlatform = Platform.CIRCLE; - break; - default: - throw new IllegalStateException("are you ok?"); - } - } - - /** - * 授权开始的回调 - * - * @param platform 平台名称 - */ - @Override - public void onStart(SHARE_MEDIA platform) {} - - /** - * 授权成功的回调 - * - * @param platform 平台名称 - */ - @Override - public void onResult(SHARE_MEDIA platform) { - if (get() != null) { - get().onSucceed(mPlatform); - } - } - - /** - * 授权失败的回调 - * - * @param platform 平台名称 - * @param t 错误原因 - */ - @Override - public void onError(SHARE_MEDIA platform, Throwable t) { - if (get() != null) { - get().onError(mPlatform, t); - } - } - - /** - * 授权取消的回调 - * - * @param platform 平台名称 - */ - @Override - public void onCancel(SHARE_MEDIA platform) { - if (get() != null) { - get().onCancel(mPlatform); - } - } - } - - public interface OnShareListener { - - /** - * 分享成功的回调 - * - * @param platform 平台名称 - */ - void onSucceed(Platform platform); - - /** - * 分享失败的回调 - * - * @param platform 平台名称 - * @param t 错误原因 - */ - default void onError(Platform platform, Throwable t) {} - - /** - * 分享取消的回调 - * - * @param platform 平台名称 - */ - default void onCancel(Platform platform) {} - } -} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/layout/SettingBar.java b/widget/src/main/java/com/hjq/widget/layout/SettingBar.java deleted file mode 100644 index cbf92138..00000000 --- a/widget/src/main/java/com/hjq/widget/layout/SettingBar.java +++ /dev/null @@ -1,358 +0,0 @@ -package com.hjq.widget.layout; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.StateListDrawable; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.TextView; - -import androidx.annotation.ColorInt; -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.core.content.ContextCompat; - -import com.hjq.widget.R; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/01/23 - * desc : 设置条自定义控件 - */ -public final class SettingBar extends FrameLayout { - - private final LinearLayout mLinearLayout; - private final TextView mLeftView; - private final TextView mRightView; - private final View mLineView; - - public SettingBar(Context context) { - this(context, null); - } - - public SettingBar(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SettingBar(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public SettingBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - - mLinearLayout = new LinearLayout(getContext()); - mLeftView = new TextView(getContext()); - mRightView = new TextView(getContext()); - mLineView = new View(getContext()); - - mLeftView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); - mRightView.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); - - mLeftView.setSingleLine(true); - mRightView.setSingleLine(true); - - mLeftView.setEllipsize(TextUtils.TruncateAt.END); - mRightView.setEllipsize(TextUtils.TruncateAt.END); - - mLeftView.setLineSpacing(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()), mLeftView.getLineSpacingMultiplier()); - mRightView.setLineSpacing(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()), mRightView.getLineSpacingMultiplier()); - - mLeftView.setPaddingRelative((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, getResources().getDisplayMetrics())); - mRightView.setPaddingRelative((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, getResources().getDisplayMetrics())); - - mLeftView.setCompoundDrawablePadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics())); - mRightView.setCompoundDrawablePadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics())); - - final TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.SettingBar); - - // 文本设置 - if (array.hasValue(R.styleable.SettingBar_bar_leftText)) { - setLeftText(array.getString(R.styleable.SettingBar_bar_leftText)); - } - - if (array.hasValue(R.styleable.SettingBar_bar_rightText)) { - setRightText(array.getString(R.styleable.SettingBar_bar_rightText)); - } - - // 提示设置 - if (array.hasValue(R.styleable.SettingBar_bar_leftHint)) { - setLeftHint(array.getString(R.styleable.SettingBar_bar_leftHint)); - } - - if (array.hasValue(R.styleable.SettingBar_bar_rightHint)) { - setRightHint(array.getString(R.styleable.SettingBar_bar_rightHint)); - } - - // 图标设置 - if (array.hasValue(R.styleable.SettingBar_bar_leftIcon)) { - setLeftIcon(array.getDrawable(R.styleable.SettingBar_bar_leftIcon)); - } - - if (array.hasValue(R.styleable.SettingBar_bar_rightIcon)) { - setRightIcon(array.getDrawable(R.styleable.SettingBar_bar_rightIcon)); - } - - // 文字颜色设置 - setLeftColor(array.getColor(R.styleable.SettingBar_bar_leftColor, ContextCompat.getColor(getContext(), R.color.black80))); - setRightColor(array.getColor(R.styleable.SettingBar_bar_rightColor, ContextCompat.getColor(getContext(), R.color.black60))); - - // 文字大小设置 - setLeftSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SettingBar_bar_leftSize, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics()))); - setRightSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SettingBar_bar_rightSize, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics()))); - - // 分割线设置 - if (array.hasValue(R.styleable.SettingBar_bar_lineColor)) { - setLineDrawable(array.getDrawable(R.styleable.SettingBar_bar_lineColor)); - } else { - setLineDrawable(new ColorDrawable(0xFFECECEC)); - } - - if (array.hasValue(R.styleable.SettingBar_bar_lineVisible)) { - setLineVisible(array.getBoolean(R.styleable.SettingBar_bar_lineVisible, true)); - } - - if (array.hasValue(R.styleable.SettingBar_bar_lineSize)) { - setLineSize(array.getDimensionPixelSize(R.styleable.SettingBar_bar_lineSize, 0)); - } - - if (array.hasValue(R.styleable.SettingBar_bar_lineMargin)) { - setLineMargin(array.getDimensionPixelSize(R.styleable.SettingBar_bar_lineMargin, 0)); - } - - if (getBackground() == null) { - StateListDrawable drawable = new StateListDrawable(); - drawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5))); - drawable.addState(new int[]{android.R.attr.state_selected}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5))); - drawable.addState(new int[]{android.R.attr.state_focused}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5))); - drawable.addState(new int[]{}, new ColorDrawable(ContextCompat.getColor(getContext(), R.color.white))); - setBackground(drawable); - - // 必须要设置可点击,否则点击屏幕任何角落都会触发按压事件 - setFocusable(true); - setClickable(true); - } - - array.recycle(); - - LinearLayout.LayoutParams leftParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); - leftParams.gravity = Gravity.CENTER_VERTICAL; - mLinearLayout.addView(mLeftView, leftParams); - - LinearLayout.LayoutParams rightParams = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT); - rightParams.gravity = Gravity.CENTER_VERTICAL; - rightParams.weight = 1; - mLinearLayout.addView(mRightView, rightParams); - - addView(mLinearLayout, 0, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL)); - addView(mLineView, 1, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, 1, Gravity.BOTTOM)); - } - - /** - * 设置左边的标题 - */ - public SettingBar setLeftText(@StringRes int id) { - return setLeftText(getResources().getString(id)); - } - - public SettingBar setLeftText(CharSequence text) { - mLeftView.setText(text); - return this; - } - - public CharSequence getLeftText() { - return mLeftView.getText(); - } - - /** - * 设置左边的提示 - */ - public SettingBar setLeftHint(@StringRes int id) { - return setLeftHint(getResources().getString(id)); - } - - public SettingBar setLeftHint(CharSequence hint) { - mLeftView.setHint(hint); - return this; - } - - /** - * 设置右边的标题 - */ - public SettingBar setRightText(@StringRes int id) { - setRightText(getResources().getString(id)); - return this; - } - - public SettingBar setRightText(CharSequence text) { - mRightView.setText(text); - return this; - } - - public CharSequence getRightText() { - return mRightView.getText(); - } - - /** - * 设置右边的提示 - */ - public SettingBar setRightHint(@StringRes int id) { - return setRightHint(getResources().getString(id)); - } - - public SettingBar setRightHint(CharSequence hint) { - mRightView.setHint(hint); - return this; - } - - /** - * 设置左边的图标 - */ - public SettingBar setLeftIcon(@DrawableRes int id) { - setLeftIcon(ContextCompat.getDrawable(getContext(), id)); - return this; - } - - public SettingBar setLeftIcon(Drawable drawable) { - mLeftView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); - return this; - } - - public Drawable getLeftIcon() { - return mLeftView.getCompoundDrawables()[0]; - } - - /** - * 设置右边的图标 - */ - public SettingBar setRightIcon(@DrawableRes int id) { - setRightIcon(ContextCompat.getDrawable(getContext(), id)); - return this; - } - - public SettingBar setRightIcon(Drawable drawable) { - mRightView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); - return this; - } - - public Drawable getRightIcon() { - return mRightView.getCompoundDrawables()[2]; - } - - /** - * 设置左标题颜色 - */ - public SettingBar setLeftColor(@ColorInt int color) { - mLeftView.setTextColor(color); - return this; - } - - /** - * 设置右标题颜色 - */ - public SettingBar setRightColor(@ColorInt int color) { - mRightView.setTextColor(color); - return this; - } - - /** - * 设置左标题的文本大小 - */ - public SettingBar setLeftSize(int unit, float size) { - mLeftView.setTextSize(unit, size); - return this; - } - - /** - * 设置右标题的文本大小 - */ - public SettingBar setRightSize(int unit, float size) { - mRightView.setTextSize(unit, size); - return this; - } - - /** - * 设置分割线是否显示 - */ - public SettingBar setLineVisible(boolean visible) { - mLineView.setVisibility(visible ? VISIBLE : GONE); - return this; - } - - /** - * 设置分割线的颜色 - */ - public SettingBar setLineColor(@ColorInt int color) { - return setLineDrawable(new ColorDrawable(color)); - } - public SettingBar setLineDrawable(Drawable drawable) { - mLineView.setBackground(drawable); - return this; - } - - /** - * 设置分割线的大小 - */ - public SettingBar setLineSize(int size) { - ViewGroup.LayoutParams layoutParams = mLineView.getLayoutParams(); - layoutParams.height = size; - mLineView.setLayoutParams(layoutParams); - return this; - } - - /** - * 设置分割线边界 - */ - public SettingBar setLineMargin(int margin) { - FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mLineView.getLayoutParams(); - params.leftMargin = margin; - params.rightMargin = margin; - mLineView.setLayoutParams(params); - return this; - } - - /** - * 获取主布局 - */ - public LinearLayout getMainLayout() { - return mLinearLayout; - } - - /** - * 获取左标题 - */ - public TextView getLeftView() { - return mLeftView; - } - - /** - * 获取右标题 - */ - public TextView getRightView() { - return mRightView; - } - - /** - * 获取分割线 - */ - public View getLineView() { - return mLineView; - } -} \ No newline at end of file diff --git a/widget/src/main/java/com/hjq/widget/view/SmartTextView.java b/widget/src/main/java/com/hjq/widget/view/SmartTextView.java deleted file mode 100644 index ccccb86a..00000000 --- a/widget/src/main/java/com/hjq/widget/view/SmartTextView.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.hjq.widget.view; - -import android.content.Context; -import android.text.TextUtils; -import android.util.AttributeSet; - -import androidx.appcompat.widget.AppCompatTextView; - -/** - * author : Android 轮子哥 - * github : https://github.com/getActivity/AndroidProject - * time : 2019/08/18 - * desc : 自动显示和隐藏的 TextView - */ -public final class SmartTextView extends AppCompatTextView { - - public SmartTextView(Context context) { - this(context, null); - } - - public SmartTextView(Context context, AttributeSet attrs) { - this(context, attrs, android.R.attr.textViewStyle); - } - - public SmartTextView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - public void setText(CharSequence text, BufferType type) { - super.setText(text, type); - // 判断当前有没有设置文本达到自动隐藏和显示的效果 - if (TextUtils.isEmpty(text) && getVisibility() != GONE) { - setVisibility(GONE); - return; - } - - if (getVisibility() != VISIBLE) { - setVisibility(VISIBLE); - } - } -} \ No newline at end of file diff --git a/widget/src/main/res/values/attrs.xml b/widget/src/main/res/values/attrs.xml deleted file mode 100644 index a3ec02f0..00000000 --- a/widget/src/main/res/values/attrs.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file