Commit b1cf49ea authored by shiyl's avatar shiyl

新建商品业务组件

parent 87fe1f26
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'kotlin-kapt'
id 'kotlin-parcelize'
}
android {
......@@ -57,11 +57,9 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
androidExtensions {
experimental = true
}
viewBinding {
enabled = true
buildFeatures {
viewBinding true
dataBinding true
}
kapt {
generateStubs = true
......@@ -74,8 +72,11 @@ android {
}
dependencies {
// 注意高德地图jar引入需要使用compile,implementation不生效
compile fileTree(include: '*.jar', dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// kotlin实现MVVM框架之使用DataBinding之unresolved reference: BR解决办法
kapt "com.android.databinding:compiler:4.0.1"
implementation rootProject.ext.dependencies.publicImplementation
testImplementation rootProject.ext.dependencies.testImplementation
androidTestImplementation rootProject.ext.dependencies.androidTestImplementation
......@@ -83,7 +84,6 @@ dependencies {
api deps.xarc.xbrid
api "com.yidian.xarc:xevent:0.0.3"
api "com.yidian.xpage:xpagenative:0.0.1"
implementation(name: 'openDefault-10.10.0', ext: 'aar')
//https://github.com/CymChad/BaseRecyclerViewAdapterHelper
api "com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4"
......@@ -92,5 +92,5 @@ dependencies {
}
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
}
\ No newline at end of file
package com.yidian.common
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
class ParcelizeMap(var map: Map<String, String?>?): Parcelable
\ No newline at end of file
class ParcelizeMap(var map: Map<String, String?>?): Parcelable
......@@ -9,7 +9,6 @@ class XRouterPathConstants {
const val NEWS_MAIN = "/MainActivity"
const val NEWS_CONTENT = "/news"
const val GALLERY = "/imageGallery"
const val PROTOCOL = "/protocol"
const val SUPPORT = "/productSupport"
......@@ -79,5 +78,8 @@ class XRouterPathConstants {
// 钱包 —— 常见问题
const val COMMON_PROBLEM = "/wallet/CommonProblemActivity"
// 商品 —— 优惠券选择类目
const val chooseCategoryActivity = "/commodity/ChooseCategoryActivity"
}
}
......@@ -6,6 +6,7 @@ import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.constant.SpinnerStyle
import timber.log.Timber
open class YdBaseApplication : Application() {
companion object {
......@@ -15,6 +16,10 @@ open class YdBaseApplication : Application() {
override fun onCreate() {
super.onCreate()
// 先初始化日志防止调用时报初始化异常
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
initSmartRefreshLayout()
}
......
......@@ -10,75 +10,74 @@ import com.yidian.nightmode.preference.NightModeConfig
import com.yidian.xpage.XPageViewProtocol
abstract class BaseActivity<VB :ViewBinding> : NightAppCompatActivity(), XPageViewProtocol {
protected lateinit var viewBind:VB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBind = createViewBinding()
extraViewBinding()
setContentView(viewBind.root)
init(savedInstanceState)
abstract class BaseActivity<VB : ViewBinding> : NightAppCompatActivity(), XPageViewProtocol {
protected lateinit var viewBind: VB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBind = createViewBinding()
extraViewBinding()
setContentView(viewBind.root)
init(savedInstanceState)
}
/**
* 如果有多个viewBinding需要初始化时
*/
open fun extraViewBinding() {
}
override fun updateCover(isNight: Boolean) {}
override fun getCurrentTheme(isNight: Boolean): Int {
return if (isNight) R.style.subway_theme_night else R.style.subway_theme_day
}
override fun setContentView(view: View) {
SystemBarUtils.setStatusBarTransparent(this.window)
if (allowChangeStatusBarTextColor()) {
setStatusBarTextColor(NightModeConfig.getInstance().nightMode)
}
super.setContentView(view)
}
/**
* 如果有多个viewBinding需要初始化时
*/
open fun extraViewBinding() {
}
private fun allowChangeStatusBarTextColor(): Boolean {
return SystemBarUtils.supportTranslucentStatusBar() && SystemBarUtils.supportChangeStatusBarTextColor()
}
override fun updateCover(isNight: Boolean) {}
abstract fun createViewBinding(): VB
override fun getCurrentTheme(isNight: Boolean): Int {
return if (isNight) R.style.subway_theme_night else R.style.subway_theme_day
override fun onNightModeChanged(isNight: Boolean) {
super.onNightModeChanged(isNight)
if (allowChangeStatusBarTextColor()) {
setStatusBarTextColor(isNight)
}
override fun setContentView(view:View){
SystemBarUtils.setStatusBarTransparent(this.window)
if (allowChangeStatusBarTextColor() ) {
setStatusBarTextColor(NightModeConfig.getInstance().nightMode)
}
super.setContentView(view)
}
open fun setStatusBarTextColor(isNight: Boolean) {
if (isNight) {
if (this.useWhiteStatusBarTextColorInNightMode()) {
SystemBarUtils.setStatusBarTextColorWhite(this)
} else {
SystemBarUtils.setStatusBarTextColorBlack(this)
}
} else if (this.useBlackStatusBarTextColorInDayMode()) {
SystemBarUtils.setStatusBarTextColorBlack(this)
} else {
SystemBarUtils.setStatusBarTextColorWhite(this)
}
}
private fun useBlackStatusBarTextColorInDayMode(): Boolean {
return true
}
private fun allowChangeStatusBarTextColor(): Boolean {
return SystemBarUtils.supportTranslucentStatusBar() && SystemBarUtils.supportChangeStatusBarTextColor()
}
abstract fun createViewBinding(): VB
override fun onNightModeChanged(isNight: Boolean) {
super.onNightModeChanged(isNight)
if (allowChangeStatusBarTextColor()) {
setStatusBarTextColor(isNight)
}
}
open fun setStatusBarTextColor(isNight: Boolean) {
if (isNight) {
if (this.useWhiteStatusBarTextColorInNightMode()) {
SystemBarUtils.setStatusBarTextColorWhite(this)
} else {
SystemBarUtils.setStatusBarTextColorBlack(this)
}
} else if (this.useBlackStatusBarTextColorInDayMode()) {
SystemBarUtils.setStatusBarTextColorBlack(this)
} else {
SystemBarUtils.setStatusBarTextColorWhite(this)
}
}
private fun useBlackStatusBarTextColorInDayMode(): Boolean {
return true
}
private fun useWhiteStatusBarTextColorInNightMode(): Boolean {
return true
}
private fun useWhiteStatusBarTextColorInNightMode(): Boolean {
return true
}
protected open fun init(savedInstanceState: Bundle?) {}
protected open fun init(savedInstanceState: Bundle?) {}
}
package com.yidian.common.mvvm
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.ViewDataBinding
import com.yidian.common.mvvm.delegate.viewBindings
import com.yidian.common.widget.LoadingDialog
import com.yidian.news.ui.SystemBarUtils
import com.yidian.nightmode.preference.NightModeConfig
abstract class BaseMvvmActivity<V : ViewDataBinding, VM : BaseViewModel> : AppCompatActivity(), BaseViewComponent<VM> {
override val loadingDialog: LoadingDialog by lazy { LoadingDialog(this, false) }
/**
* 模版方法:创建型模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
* 实际作用:将 layoutId 延迟到子类中实现
*
* @return layout Id
*/
protected abstract val layoutId: Int
/**
* 模版方法:创建型模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
* 实际作用:将 vm 延迟到子类中实现
*
* @return vm ViewModel
*/
protected abstract val vm: VM
/**
* 初始化视图,为具体实现类提供统一的函数签名
*/
protected abstract fun initView()
/**
* 严格 MVVM
* - 仅基类可见 binding 对象,向下透明;
* - 避免在子 Activity 中通过 binding 直接操作 View。
*/
protected val binding: V by lazy {
viewBindings(layoutId,vm)
}
// 向下提供 rootView
protected val rootView: View by lazy { binding.root }
/**
* 生命周期函数
*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.binding.executePendingBindings()
this.initStatusBar()
this.initView()
vm.subscribeUiEvent(this)
}
private fun initStatusBar() {
SystemBarUtils.setStatusBarTransparent(this.window)
if (allowChangeStatusBarTextColor()) {
setStatusBarTextColor(NightModeConfig.getInstance().nightMode)
}
}
open fun setStatusBarTextColor(isNight: Boolean) {
if (isNight) {
if (this.useWhiteStatusBarTextColorInNightMode()) {
SystemBarUtils.setStatusBarTextColorWhite(this)
} else {
SystemBarUtils.setStatusBarTextColorBlack(this)
}
} else if (this.useBlackStatusBarTextColorInDayMode()) {
SystemBarUtils.setStatusBarTextColorBlack(this)
} else {
SystemBarUtils.setStatusBarTextColorWhite(this)
}
}
private fun useBlackStatusBarTextColorInDayMode(): Boolean {
return true
}
private fun useWhiteStatusBarTextColorInNightMode(): Boolean {
return true
}
private fun allowChangeStatusBarTextColor(): Boolean {
return SystemBarUtils.supportTranslucentStatusBar() && SystemBarUtils.supportChangeStatusBarTextColor()
}
}
package com.yidian.common.mvvm
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import com.yidian.common.mvvm.delegate.viewBindings
import com.yidian.common.widget.LoadingDialog
abstract class BaseMvvmFragment<V : ViewDataBinding, VM : BaseViewModel>(
@LayoutRes private val layoutId: Int
) : Fragment(), BaseViewComponent<VM> {
override val loadingDialog: LoadingDialog by lazy { LoadingDialog(requireActivity()) }
/**
* 模版方法模式
*/
protected abstract fun initView()
/**
* 模版方法模式
*/
// VM 的类型通过范性限定,因此直接使用 val 的形式
protected abstract val vm: VM
/**
* 模版方法模式
*/
// V 的类型通过范性限定,因此直接使用 val 的形式
protected val binding: V by lazy {
viewBindings(layoutId,vm)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
}
/**
* Fragment 的 data-binding 发生在 [onCreateView] 函数内部,在此函数返回之前,尽量不要使用 vm 即 binding 对象
*/
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// setupDataBinding(inflater, container)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
vm.subscribeUiEvent(viewLifecycleOwner)
initView()
}
}
package com.yidian.common.mvvm
import android.view.View
import androidx.lifecycle.LifecycleOwner
import com.yidian.common.constant.ResultCode
import com.yidian.common.utils.ToastUtils
import com.yidian.common.widget.LoadingDialog
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.debounce
interface BaseViewComponent<VM : BaseViewModel> {
val loadingDialog: LoadingDialog
fun showLoading() {
loadingDialog.showDialog("努力加载中...")
}
fun hideLoading() {
loadingDialog.hideDialog()
}
private fun VM.subscribeErrorEvent(lifecycleOwner: LifecycleOwner) {
errorEvent.observe(lifecycleOwner) {
when (it.code) {
ResultCode.INVALID -> {
// 特定code分别处理
}
else -> {
if (it.message.isNotBlank()) {
ToastUtils.showShortSafe(it.message)
}
}
}
}
}
private fun VM.subscribeLoadingEvent(lifecycleOwner: LifecycleOwner) {
loadingEvent.observe(lifecycleOwner, {
if (it) {
showLoading()
} else {
hideLoading()
}
})
}
fun VM.subscribeUiEvent(lifecycleOwner: LifecycleOwner) {
subscribeLoadingEvent(lifecycleOwner)
subscribeErrorEvent(lifecycleOwner)
}
}
@FlowPreview
@ExperimentalCoroutinesApi
fun View.clickAsFlow() = callbackFlow {
setOnClickListener {
offer(Unit)
}
awaitClose { setOnClickListener(null) }
}.debounce(300)
package com.yidian.common.mvvm
import androidx.annotation.IdRes
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
abstract class BaseViewModel : ViewModel() {
/**
* 页面回退 Event
*/
private val _goBackEvent = MutableLiveData<Unit>()
val goBackEvent: LiveData<Unit> = _goBackEvent
fun postBackEvent() {
_goBackEvent.value = Unit
}
/**
* 页面前进 Event
*/
private val _goNextEvent = MutableLiveData<Any?>()
val goNextEvent: LiveData<Any?> = _goNextEvent
/**
* 重置前进,每次页面跳转后应立即调用
*/
fun resetNextEvent() {
_goNextEvent.value = null
}
/**
* 跳转到指定的导航目的地
*/
fun postNextEvent(@IdRes navId: Int) {
_goNextEvent.value = navId
}
/**
* 跳转到指定的路由
*/
fun postNextEvent(routerName: String) {
_goNextEvent.value = routerName
}
/**
* 自定义跳转,可接收多个参数
*/
fun postNextEvent(list: List<Any?>) {
_goNextEvent.value = list
}
/**
* 错误信息 Event
*/
private val _errorEvent = MutableLiveData<ErrorInfo>()
val errorEvent: LiveData<ErrorInfo> = _errorEvent
fun postErrorEvent(errorInfo: ErrorInfo) {
_errorEvent.value = errorInfo
}
/**
* 加载动画 Event
*/
private val _loadingEvent = MutableLiveData(false)
val loadingEvent: LiveData<Boolean> = _loadingEvent
fun postLoadingEvent(isLoading: Boolean = true) {
_loadingEvent.value = isLoading
}
}
package com.yidian.common.mvvm
/**
* 异常处理结果
*/
data class ErrorInfo(
val code: Int = -1, // 编号
val message: String, // 解释
)
package com.yidian.common.mvvm.binding
import android.view.View
import android.widget.CheckBox
import android.widget.EditText
import android.widget.ImageView
import androidx.databinding.BindingAdapter
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.android.material.tabs.TabLayout
import com.google.android.material.textfield.TextInputLayout
import com.yidian.common.R
import com.yidian.common.extensions.toggleVisibility
/**
* 是否显示该 View
*/
@BindingAdapter("isShow")
fun bindIsShow(view: View, isShow: Boolean) {
view.toggleVisibility(isShow)
}
/**
* 是否显示该 View
*/
@BindingAdapter("isVisible")
fun bindIsVisible(view: View, isVisible: Boolean) {
if (isVisible) {
view.visibility = View.VISIBLE
} else {
view.visibility = View.INVISIBLE
}
}
/**
* 是否显示该 View
*/
@BindingAdapter("isGone")
fun bindIsGone(view: View, isGone: Boolean) {
if (isGone) {
view.visibility = View.GONE
} else {
view.visibility = View.VISIBLE
}
}
/**
* 是否显示Error
*/
@BindingAdapter("textInputError")
fun bindIsShowError(textInputLayout: TextInputLayout, errorMessage: String?) {
textInputLayout.error = errorMessage
}
/**
* 借用 View 的 selected 属性,仿制按钮 enable
*/
@BindingAdapter("isSelected")
fun bindIsSelected(view: View, isSelected: Boolean) {
view.isSelected = isSelected
}
/**
* 为 [TabLayout] 的 Tabs 绑定 title
*/
@BindingAdapter("tabTitles")
fun bindTabLayoutTitles(tab: TabLayout, titles: List<String?>?) {
titles?.forEachIndexed { index, s -> tab.getTabAt(index)?.text = s }
}
@BindingAdapter(value = ["setAdapter"])
fun RecyclerView.bindRecyclerViewAdapter(adapter: RecyclerView.Adapter<*>) {
this.setHasFixedSize(true)
this.adapter = adapter
}
@BindingAdapter("imageUrl")
fun bindImageUrl(imageView: ImageView, imageUrl: String) {
Glide.with(imageView.context).load(imageUrl).centerCrop().placeholder(R.color.color_F6F6F6).into(imageView)
}
@BindingAdapter("imageSrc")
fun setImageSrc(imageView: ImageView, resId: Int) {
imageView.setImageResource(resId)
}
@BindingAdapter("android:editable")
fun setEditable(editText: EditText, boolean: Boolean) {
editText.isFocusable = boolean
editText.isFocusableInTouchMode = boolean
}
@BindingAdapter("android:clickable")
fun clickable(view: View, boolean: Boolean) {
view.isClickable = boolean
}
data class IconState(
val state: Int = 1,
) {
fun isSelected(): Boolean {
return (state and SELECTED) == 1
}
fun isChecked(): Boolean {
return (state and CHECKED) == 1
}
companion object {
private const val BASELINE: Int = 1
private const val SELECTED: Int = BASELINE shr 1
private const val CHECKED: Int = BASELINE shr 2
fun newState(vararg state: IconState): IconState {
return state.reduce { a, b ->
return IconState(a.state or b.state)
}
}
}
}
@BindingAdapter("iconState")
fun View.bindIconState(state: IconState) {
this.isSelected = state.isSelected()
}
@BindingAdapter("iconState")
fun CheckBox.bindIconState(state: IconState) {
this.isSelected = state.isSelected()
this.isChecked = state.isChecked()
}
package com.yidian.common.mvvm.binding
import android.view.View
import androidx.databinding.BindingAdapter
import timber.log.Timber
/**
* 捕获所有android:onClickListener方式的点击事件,添加防抖
*/
@BindingAdapter("android:onClickListener")
fun setViewOnClickListener(view: View, callback: View.OnClickListener) {
view.setOnClickListener(ThrottleOnClickListener(callback))
}
/**
* 捕获所有android:onClickListener方式的点击事件,添加防抖
*/
@BindingAdapter("android:onClick")
fun setViewOnClick(view: View, callback: View.OnClickListener) {
view.setOnClickListener(ThrottleOnClickListener(callback))
}
/**
* 原始OnClickListener的包装
*/
class ThrottleOnClickListener(private val callback: View.OnClickListener) : View.OnClickListener {
// 上次点击时间
private var mLastTime = 0L
override fun onClick(v: View?) {
val currentTime = System.currentTimeMillis()
if (currentTime - mLastTime >= CLICK_THRESHOLD) {
mLastTime = currentTime
// 调用点击方法
callback.onClick(v)
} else {
// 过滤多余的点击
Timber.e("[ThrottleOnClickListener] [onClick] throttle")
}
}
companion object {
// 点击过滤时间间隔
private const val CLICK_THRESHOLD = 500
}
}
package com.yidian.common.mvvm.delegate
import android.view.LayoutInflater
import android.view.View
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import com.yidian.common.BR
import com.yidian.common.mvvm.BaseMvvmActivity
import com.yidian.common.mvvm.BaseMvvmFragment
import com.yidian.common.mvvm.BaseViewModel
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class ActivityDataBindingDelegate<in activity : AppCompatActivity, out T : ViewDataBinding>(
@LayoutRes private val layoutRes: Int,
) : ReadOnlyProperty<activity, T> {
override fun getValue(thisRef: activity, property: KProperty<*>): T {
val contentView: View = thisRef.layoutInflater.inflate(layoutRes, null)
val dataBinding: T = DataBindingUtil.bind<T>(contentView)!!
thisRef.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
dataBinding.lifecycleOwner = thisRef
thisRef.setContentView(layoutRes)
}
})
return dataBinding
}
}
fun <V : ViewDataBinding, VM : BaseViewModel> BaseMvvmActivity<V, VM>.viewBindings(@LayoutRes layoutRes: Int, vm: VM?):V {
val dataBinding = DataBindingUtil.setContentView<V>(this, layoutRes)
dataBinding.lifecycleOwner = this
vm?.let {
dataBinding.setVariable(BR.vm, vm)
}
return dataBinding
}
fun <V : ViewDataBinding, VM : BaseViewModel> BaseMvvmFragment<V, VM>.viewBindings(@LayoutRes layoutRes: Int, vm: VM?):V {
val inflater: LayoutInflater = this.layoutInflater
val dataBinding = DataBindingUtil.inflate<V>(inflater, layoutRes,null,false)
dataBinding.lifecycleOwner = this.viewLifecycleOwner
vm?.let {
dataBinding.setVariable(BR.vm, vm)
}
return dataBinding
}
package com.yidian.common.utils
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
......@@ -60,4 +61,18 @@ object SystemSettingUtils {
e.printStackTrace()
}
}
/**
* 打开应用设置详情页,进行权限管理
*/
fun openAppSettingDetail(context: Context) {
val intent = Intent()
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
intent.addCategory(Intent.CATEGORY_DEFAULT)
intent.data = Uri.parse("package:" + context.packageName)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
context.startActivity(intent)
}
}
package com.yidian.common.utils;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.Gravity;
import android.widget.Toast;
import androidx.annotation.StringRes;
import com.yidian.common.YdBaseApplication;
/**
* 吐司相关工具类
*/
public final class ToastUtils {
private static Toast sToast;
private static int gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
private static int xOffset = 0;
private static int yOffset = (int) (64 * YdBaseApplication.context.getResources().getDisplayMetrics().density + 0.5);
private static final Handler sHandler = new Handler(Looper.getMainLooper());
private ToastUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 设置吐司位置
*
* @param gravity 位置
* @param xOffset x偏移
* @param yOffset y偏移
*/
public static void setGravity(int gravity, int xOffset, int yOffset) {
ToastUtils.gravity = gravity;
ToastUtils.xOffset = xOffset;
ToastUtils.yOffset = yOffset;
}
/**
* 安全地显示短时吐司
*
* @param text 文本
*/
public static void showShortSafe(final CharSequence text) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(text, Toast.LENGTH_SHORT);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示短时吐司
*
* @param resId 资源Id
*/
public static void showShortSafe(final @StringRes int resId) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(resId, Toast.LENGTH_SHORT);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示短时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showShortSafe(final @StringRes int resId, final Object... args) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(resId, Toast.LENGTH_SHORT, args);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示短时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showShortSafe(final String format, final Object... args) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(format, Toast.LENGTH_SHORT, args);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示长时吐司
*
* @param text 文本
*/
public static void showLongSafe(final CharSequence text) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(text, Toast.LENGTH_LONG);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示长时吐司
*
* @param resId 资源Id
*/
public static void showLongSafe(final @StringRes int resId) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(resId, Toast.LENGTH_LONG);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示长时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showLongSafe(final @StringRes int resId, final Object... args) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(resId, Toast.LENGTH_LONG, args);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 安全地显示长时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showLongSafe(final String format, final Object... args) {
try {
sHandler.post(new Runnable() {
@Override
public void run() {
show(format, Toast.LENGTH_LONG, args);
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 显示短时吐司
*
* @param text 文本
*/
public static void showShort(CharSequence text) {
if (TextUtils.isEmpty(text)) return;
show(text, Toast.LENGTH_SHORT);
}
/**
* 显示短时吐司
*
* @param resId 资源Id
*/
public static void showShort(@StringRes int resId) {
show(resId, Toast.LENGTH_SHORT);
}
/**
* 显示短时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showShort(@StringRes int resId, Object... args) {
show(resId, Toast.LENGTH_SHORT, args);
}
/**
* 显示短时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showShort(String format, Object... args) {
if (TextUtils.isEmpty(format)) {
show(format, Toast.LENGTH_SHORT);
} else {
show(format, Toast.LENGTH_SHORT, args);
}
}
/**
* 显示长时吐司
*
* @param text 文本
*/
public static void showLong(CharSequence text) {
show(text, Toast.LENGTH_LONG);
}
/**
* 显示长时吐司
*
* @param resId 资源Id
*/
public static void showLong(@StringRes int resId) {
show(resId, Toast.LENGTH_LONG);
}
/**
* 显示长时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showLong(@StringRes int resId, Object... args) {
show(resId, Toast.LENGTH_LONG, args);
}
/**
* 显示长时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showLong(String format, Object... args) {
show(format, Toast.LENGTH_LONG, args);
}
/**
* 显示吐司
*
* @param resId 资源Id
* @param duration 显示时长
*/
private static void show(@StringRes int resId, int duration) {
show(YdBaseApplication.context.getResources().getText(resId).toString(), duration);
}
/**
* 显示吐司
*
* @param resId 资源Id
* @param duration 显示时长
* @param args 参数
*/
private static void show(@StringRes int resId, int duration, Object... args) {
show(String.format(YdBaseApplication.context.getResources().getString(resId), args), duration);
}
/**
* 显示吐司
*
* @param format 格式
* @param duration 显示时长
* @param args 参数
*/
private static void show(String format, int duration, Object... args) {
show(String.format(format, args), duration);
}
/**
* 显示吐司
*
* @param text 文本
* @param duration 显示时长
*/
private static void show(CharSequence text, int duration) {
try {
if (TextUtils.isEmpty(text)) {
return;
}
cancel();
sToast = Toast.makeText(YdBaseApplication.context, text, duration);
sToast.setGravity(gravity, xOffset, yOffset);
sToast.show();
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 取消吐司显示
*/
public static void cancel() {
if (sToast != null) {
sToast.cancel();
sToast = null;
}
}
}
package com.yidian.common.widget;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.yidian.common.R;
public class DialogBuilder {
private String navigateTxt = "取消";
private String positiveTxt = "确定";
private String titleTxt = "";
private String msgTxt = "";
private boolean showNavigate = true;
private boolean showPositive = false;
private boolean showTitle = false;
private boolean showMsg = false;
private View.OnClickListener navigateClickListener = null;
private View.OnClickListener positiveClickListener = null;
private boolean canceledOnTouchOutside = false;
public CommonDialog build(Context context) {
CommonDialog dialog = new CommonDialog(context);
dialog.navigateTxt = navigateTxt;
dialog.positiveTxt = positiveTxt;
dialog.showNavigate = showNavigate;
dialog.showPositive = showPositive;
dialog.titleTxt = titleTxt;
dialog.msgTxt = msgTxt;
dialog.showTitle = showTitle;
dialog.showMsg = showMsg;
dialog.navigateClickListener = navigateClickListener;
dialog.positiveClickListener = positiveClickListener;
dialog.canceledOnTouchOutside = canceledOnTouchOutside;
return dialog;
}
public DialogBuilder setNavigateTxt(String navigateTxt) {
this.navigateTxt = navigateTxt;
return this;
}
public DialogBuilder setPositiveTxt(String positiveTxt) {
this.positiveTxt = positiveTxt;
return this;
}
public DialogBuilder showNavigate(boolean showNavigate, View.OnClickListener clickListener) {
this.showNavigate = showNavigate;
this.navigateClickListener = clickListener;
return this;
}
public DialogBuilder showPositive(boolean showPositive, View.OnClickListener clickListener) {
this.showPositive = showPositive;
this.positiveClickListener = clickListener;
return this;
}
public DialogBuilder showNavigate(boolean showNavigate, String txt, View.OnClickListener clickListener) {
this.showNavigate = showNavigate;
this.navigateClickListener = clickListener;
this.navigateTxt = txt;
return this;
}
public DialogBuilder showNavigate(boolean showNavigate) {
this.showNavigate = showNavigate;
return this;
}
public DialogBuilder showPositive(boolean showPositive, String txt, View.OnClickListener clickListener) {
this.showPositive = showPositive;
this.positiveClickListener = clickListener;
this.positiveTxt = txt;
return this;
}
public DialogBuilder showTitle(boolean showTitle, String txt) {
this.showTitle = showTitle;
this.titleTxt = txt;
return this;
}
public DialogBuilder showMsg(boolean showMsg, String txt) {
this.showMsg = showMsg;
this.msgTxt = txt;
return this;
}
public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
this.canceledOnTouchOutside = canceledOnTouchOutside;
}
public class CommonDialog extends Dialog {
private String navigateTxt = "取消";
private String positiveTxt = "确定";
private String titleTxt = "确定";
private String msgTxt = "确定";
private boolean showNavigate = true;
private boolean showPositive = false;
private boolean showTitle = false;
private boolean showMsg = false;
private boolean canceledOnTouchOutside = false;
private TextView tv_title;
private TextView tv_message;
private TextView tv_navigate;
private TextView tv_positive;
private View.OnClickListener navigateClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
};
private View.OnClickListener positiveClickListener = null;
public CommonDialog(@NonNull Context context) {
this(context, R.style.base_dialog);
}
public CommonDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_common);
//按空白处不能取消动画
setCanceledOnTouchOutside(canceledOnTouchOutside);
//初始化界面控件
initView();
//初始化界面控件的事件
initEvent();
}
private void initView() {
tv_title = findViewById(R.id.tv_title);
tv_message = findViewById(R.id.tv_message);
tv_navigate = findViewById(R.id.tv_navigate);
tv_positive = findViewById(R.id.tv_positive);
if (showPositive) {
tv_positive.setVisibility(View.VISIBLE);
tv_positive.setText(positiveTxt);
if (positiveClickListener != null) {
tv_positive.setOnClickListener(positiveClickListener);
} else {
tv_positive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
} else {
tv_positive.setVisibility(View.GONE);
}
if (showNavigate) {
tv_navigate.setVisibility(View.VISIBLE);
tv_navigate.setText(navigateTxt);
if (navigateClickListener != null) {
tv_navigate.setOnClickListener(navigateClickListener);
} else {
tv_navigate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
} else {
tv_navigate.setVisibility(View.GONE);
}
if (showNavigate || showPositive) {
findViewById(R.id.ll_btn).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.ll_btn).setVisibility(View.GONE);
}
showTitle = showTitle && titleTxt != null && titleTxt.length() > 0;
showMsg = showMsg && msgTxt != null && msgTxt.length() > 0;
if (showTitle || showMsg) {
findViewById(R.id.ll_content).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.ll_content).setVisibility(View.GONE);
}
if (showTitle) {
tv_title.setVisibility(View.VISIBLE);
tv_title.setText(titleTxt);
} else {
tv_title.setVisibility(View.GONE);
}
if (showMsg) {
tv_message.setVisibility(View.VISIBLE);
tv_message.setText(msgTxt);
} else {
tv_message.setVisibility(View.GONE);
}
}
private void initEvent() {
}
public void setNavigateTxt(String navigateTxt) {
this.navigateTxt = navigateTxt;
}
public void setPositiveTxt(String positiveTxt) {
this.positiveTxt = positiveTxt;
}
public void setTitleTxt(String titleTxt) {
this.titleTxt = titleTxt;
}
public void setMsgTxt(String msgTxt) {
this.msgTxt = msgTxt;
}
public void setShowNavigate(boolean showNavigate) {
this.showNavigate = showNavigate;
}
public void setShowPositive(boolean showPositive) {
this.showPositive = showPositive;
}
public void setShowTitle(boolean showTitle) {
this.showTitle = showTitle;
}
public void setShowMsg(boolean showMsg) {
this.showMsg = showMsg;
}
public void setNavigateClickListener(View.OnClickListener navigateClickListener) {
this.navigateClickListener = navigateClickListener;
}
public void setPositiveClickListener(View.OnClickListener positiveClickListener) {
this.positiveClickListener = positiveClickListener;
}
}
}
package com.yidian.common.widget
import android.content.Context
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import com.yidian.common.R
/**
* 数据加载的loading
*/
class LoadingDialog(context: Context) : AlertDialog(context, R.style.Theme_AppCompat_Dialog) {
constructor(context: Context, cancelable: Boolean) : this(context) {
this.setCancelable(cancelable)
}
private val tvMessage: TextView
private var mStartTime: Long = -1
private var mPostedHide = false
private var mPostedShow = false
private var mDismissed = false
private val mHandler: Handler = Handler()
private val mDelayedHide = Runnable {
mPostedHide = false
mStartTime = -1
dismiss()
}
private val mDelayedShow = Runnable {
mPostedShow = false
if (!mDismissed) {
mStartTime = System.currentTimeMillis()
show()
}
}
/**
* 显示loading
*/
fun showDialog(message: String?) {
tvMessage.text = message
mStartTime = -1
mDismissed = false
mHandler.removeCallbacks(mDelayedHide)
mPostedHide = false
if (!mPostedShow) {
mHandler.postDelayed(mDelayedShow, MIN_DELAY)
mPostedShow = true
}
}
/**
* 隐藏loading
*/
fun hideDialog() {
mDismissed = true
mHandler.removeCallbacks(mDelayedShow)
mPostedShow = false
val diff = System.currentTimeMillis() - mStartTime
if (diff >= MIN_SHOW_TIME || mStartTime == -1L) {
dismiss()
} else {
if (!mPostedHide) {
mHandler.postDelayed(mDelayedHide, MIN_SHOW_TIME - diff)
mPostedHide = true
}
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
mHandler.removeCallbacks(mDelayedHide)
mHandler.removeCallbacks(mDelayedShow)
}
companion object {
private const val MIN_SHOW_TIME = 500
private const val MIN_DELAY = 500L
}
init {
val loadView: View = LayoutInflater.from(getContext()).inflate(R.layout.dialog_loading, null)
setView(loadView)
tvMessage = loadView.findViewById(R.id.tv_message)
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:width="0.8dp"
android:color="#ffffff" />
<!-- 圆角 -->
<corners android:radius="6dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
>
<size android:height="1dp"/>
<solid android:color="#e3e3e3"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
>
<size android:width="1dp"/>
<solid android:color="#e3e3e3"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_dialog"
android:divider="@drawable/h_line"
android:minWidth="260dp"
android:orientation="vertical"
android:showDividers="middle">
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="@dimen/dp16"
android:paddingBottom="@dimen/dp16">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="16dp"
android:gravity="center"
android:textColor="#333333"
android:textSize="@dimen/sp18"
android:textStyle="bold"
android:visibility="visible"
tools:text="消息提示" />
<TextView
android:id="@+id/tv_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|left"
android:lineSpacingExtra="3dp"
android:lineSpacingMultiplier="1.2"
android:textColor="#999999"
android:textSize="@dimen/sp14"
android:visibility="gone"
tools:text="提示消息提示消息提示消息提示消息提示消息提示消息提示消息提示消息"
tools:visibility="visible" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:divider="@drawable/v_line"
android:orientation="horizontal"
android:showDividers="middle">
<TextView
android:id="@+id/tv_navigate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:gravity="center"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:singleLine="true"
android:text="取消"
android:textColor="#666666"
android:textSize="@dimen/sp16" />
<TextView
android:id="@+id/tv_positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:gravity="center"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:singleLine="true"
android:text="确认"
android:textColor="#1157F4"
android:textSize="@dimen/sp16" />
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/white"
android:padding="@dimen/dp20">
<ProgressBar
android:id="@+id/pb"
android:layout_width="@dimen/dp50"
android:layout_height="@dimen/dp50"
android:theme="@style/Widget.AppCompat.ProgressBar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.388" />
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp15"
android:text="加载中..."
android:textColor="#333333"
android:textSize="@dimen/sp16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/pb" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂无数据"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="vertical">
xmlns:tools="http://schemas.android.com/tools">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
<data>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:fitsSystemWindows="true"
android:minHeight="50dp"
android:paddingStart="@dimen/dp15"
android:paddingEnd="@dimen/dp15"
app:layout_scrollFlags="scroll|enterAlways"
app:navigationIcon="@drawable/icon_back">
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FF333333"
android:textSize="18sp"
tools:text="标题" />
android:background="?attr/colorPrimary"
android:fitsSystemWindows="true"
android:minHeight="50dp"
android:paddingStart="@dimen/dp15"
android:paddingEnd="@dimen/dp15"
app:layout_scrollFlags="scroll|enterAlways"
app:navigationIcon="@drawable/icon_back">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FF333333"
android:textSize="18sp"
tools:text="标题" />
</androidx.appcompat.widget.Toolbar>
</androidx.appcompat.widget.Toolbar>
</LinearLayout>
\ No newline at end of file
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="vm"
type="com.yidian.common.mvvm.BaseViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="合作"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -33,4 +33,9 @@
<color name="color_666666">#666666</color>
<color name="color_999999">#999999</color>
<color name="color_F26E3D">#F26E3D</color>
<color name="color_C2C2C2">#C2C2C2</color>
<color name="color_F5F6F7">#F5F6F7</color>
<color name="color_1852F1">#1852F1</color>
<color name="color_F6F6F6">#f6f6f6</color>
</resources>
......@@ -5,8 +5,8 @@ if (rootProject.ext.android.isApplication) {
apply plugin: 'com.android.library'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
android {
compileSdkVersion build_versions.compileSdkVersion
......@@ -51,11 +51,9 @@ android {
}
}
}
androidExtensions {
experimental = true
}
viewBinding {
enabled = true
buildFeatures {
viewBinding true
dataBinding true
}
kapt {
generateStubs = true
......
......@@ -2,4 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yidian.shenghuoquan.commodity">
<application>
<activity android:name=".ui.coupon.ChooseCategoryActivity" />
</application>
</manifest>
\ No newline at end of file
package com.yidian.shenghuoquan.commodity.app
import com.yidian.common.XRouterPathConstants
import com.yidian.shenghuoquan.commodity.ui.coupon.ChooseCategoryActivity
/**
* 注册XPageNode工具类
*/
object ClassMapUtil {
val xPageNodeMap = mapOf(
XRouterPathConstants.Companion.chooseCategoryActivity to ChooseCategoryActivity::class.java
)
}
package com.yidian.shenghuoquan.commodity.app
import android.content.Intent
import com.yidian.common.XRouterPathConstants
import com.yidian.common.YdBaseApplication
import com.yidian.news.util.ProcessUtil
import com.yidian.xpage.XPageManager
import com.yidian.xpage.node.XPageHandler
import com.yidian.xpage.node.XPageNode
import com.yidian.xpage.node.XPageNodePageType
import com.yidian.yac.core.core.YacModuleSpec
@YacModuleSpec
class CommodityApplication : YdBaseApplication() {
override fun onCreate() {
super.onCreate()
if (ProcessUtil.isMainProcess(this)) {
registerXPage()
initService()
}
}
private fun registerXPage() {
ClassMapUtil.xPageNodeMap.forEach {
val node = XPageNode(it.key, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
if (params != null) {
intent.putExtra(XRouterPathConstants.ParamsKey, params as HashMap)
}
intent.setClass(context, it.value)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
})
XPageManager.registeredNode(node)
}
}
private fun initService() {
}
}
package com.yidian.shenghuoquan.commodity.dto
/**
* 类目列表
*/
data class CategoryListDto(
val category_id: Int,// 分类id
val name: String,// 分类名称
val sub_list: List<SubCategory>// 二级分类
)
data class SubCategory(
val category_id: Int,
val name: String
)
/**
* 当前选中的类目信息
*/
data class SelectCategoryDto(
val firstCategoryId: Int,
val firstCategoryName: String,
val secondCategoryId: Int,
val secondCategoryName: String
)
package com.yidian.shenghuoquan.commodity.http
import com.yidian.common.http.HttpParamsUtils
import com.yidian.common.http.HttpResult
import com.yidian.common.http.HttpResultSubscriber
import com.yidian.common.http.TransformUtil
import com.yidian.http.ServiceFactory
import com.yidian.shenghuoquan.commodity.dto.CategoryListDto
import com.yidian.shenghuoquan.commodity.http.callback.ICategoryListCallback
/**
* 优惠券数据源
*/
object CouponDataSource {
private var api = ServiceFactory.getInstance().createService(CouponService::class.java)
/**
* 获取类目列表
*/
fun getCategoryList(apiCallback: ICategoryListCallback, requestParams: HashMap<String, String?>) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(requestParams, timeStamp)
api
.getCategoryList(publicParamsMap, privateParamsMap)
.compose(TransformUtil.defaultSchedulers())
.subscribe(object : HttpResultSubscriber<MutableList<CategoryListDto>?>() {
override fun onSuccess(result: HttpResult<MutableList<CategoryListDto>?>?) {
apiCallback.getCategoryListSuccess(result?.result)
}
override fun onFailer(result: HttpResult<MutableList<CategoryListDto>?>?) {
}
})
}
}
package com.yidian.shenghuoquan.commodity.http
import com.yidian.common.http.HttpResult
import io.reactivex.rxjava3.core.Observable
import retrofit2.http.GET
import retrofit2.http.QueryMap
interface CouponService {
private companion object {
const val categoryList = "/goods/customer/get_goods_category_list"
const val searchCategoryList = "/merchant/enterprise/get_account_role_list"
}
/**
* 获取类目列表
*/
@GET(categoryList)
fun getCategoryList(@QueryMap commonParams: Map<String, String>, @QueryMap params: Map<String, String?>): Observable<HttpResult<Any?>>
/**
* 搜索类目列表(可能会共用上面的接口)
*/
@GET(searchCategoryList)
fun searchCategoryList(@QueryMap commonParams: Map<String, String>, @QueryMap params: Map<String, String?>): Observable<HttpResult<Any?>>
}
package com.yidian.shenghuoquan.commodity.http.callback
import com.yidian.shenghuoquan.commodity.dto.CategoryListDto
interface ICategoryListCallback {
fun getCategoryListSuccess(dto: MutableList<CategoryListDto>?)
}
package com.yidian.shenghuoquan.commodity.ui.coupon
import androidx.activity.viewModels
import com.yidian.common.XRouterPathConstants
import com.yidian.common.extensions.initTitleBar
import com.yidian.common.mvvm.BaseMvvmActivity
import com.yidian.common.utils.ToastUtils
import com.yidian.shenghuoquan.commodity.R
import com.yidian.shenghuoquan.commodity.databinding.CommodityActivityChooseCategoryBinding
import com.yidian.shenghuoquan.commodity.dto.CategoryListDto
import com.yidian.shenghuoquan.commodity.dto.SubCategory
import com.yidian.shenghuoquan.commodity.ui.coupon.adapter.CategoryListAdapter
import com.yidian.shenghuoquan.commodity.ui.coupon.adapter.CategorySubListAdapter
import com.yidian.xpage.XPageViewProtocol
/**
* 商品选择类目
*/
class ChooseCategoryActivity : BaseMvvmActivity<CommodityActivityChooseCategoryBinding, ChooseCategoryViewModel>(), XPageViewProtocol {
private lateinit var categoryList: MutableList<CategoryListDto>
private val adapter = CategoryListAdapter()
private val subAdapter = CategorySubListAdapter()
override val layoutId: Int = R.layout.commodity_activity_choose_category
override val vm: ChooseCategoryViewModel by viewModels()
override fun getXPageName(): String {
return XRouterPathConstants.chooseCategoryActivity
}
override fun initView() {
initTitleBar(binding.include.toolbar, binding.include.tvTitle, "选择类目")
setupRecyclerView()
subscribeUiEvent()
vm.requestCategoryList()
}
/**
* 设置列表
*/
private fun setupRecyclerView() {
binding.rvCategoryList.adapter = adapter
adapter.setEmptyView(R.layout.empty_view)
subAdapter.setEmptyView(R.layout.empty_view)
adapter.setOnItemClickListener { adapter, _, position ->
// 记录当前选中的一级分类
val firstCategory = adapter.data[position] as CategoryListDto
// 更新列表显示二级分类
binding.rvCategoryList.adapter = subAdapter
subAdapter.setList(firstCategory.sub_list)
vm.showSelectFirstLevelName(firstCategory.name)
}
subAdapter.setOnItemClickListener { adapter, _, position ->
// 记录选中的二级分类,并回传一级+二级
val secondCategory = adapter.data[position] as SubCategory
ToastUtils.showShortSafe("选中的二级分类:${secondCategory.name}")
}
}
private fun subscribeUiEvent() {
vm.addListEvent.observe(this, {
it?.let {
categoryList = it
adapter.setList(it)
} ?: adapter.setList(null)
})
vm.showFirstLevelListEvent.observe(this, {
binding.rvCategoryList.adapter = adapter
if (::categoryList.isInitialized) {
adapter.setList(categoryList)
vm.showSelectFirstLevelName()
}
})
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yidian.common.mvvm.BaseViewModel
import com.yidian.common.utils.ToastUtils
import com.yidian.shenghuoquan.commodity.dto.CategoryListDto
import com.yidian.shenghuoquan.commodity.http.CouponDataSource
import com.yidian.shenghuoquan.commodity.http.callback.ICategoryListCallback
/**
* 选择类目ViewModel
*/
class ChooseCategoryViewModel : BaseViewModel() {
var showSelectFirstCategory = MutableLiveData(false)
var selectFirstCategoryName = MutableLiveData<String>()
/**
* 类目列表数据 Event
*/
private val _addListEvent = MutableLiveData<MutableList<CategoryListDto>?>()
val addListEvent: LiveData<MutableList<CategoryListDto>?> = _addListEvent
/**
* 切换显示一级分类 Event
*/
private val _showFirstLevelListEvent = MutableLiveData<Unit>()
val showFirstLevelListEvent: LiveData<Unit> = _showFirstLevelListEvent
/**
* 请求类目列表
*/
fun requestCategoryList() {
val paramsMap = HashMap<String, String?>()
paramsMap["category_name"] = ""
CouponDataSource.getCategoryList(requestCategoryListCallBack, paramsMap)
}
private val requestCategoryListCallBack = object : ICategoryListCallback {
override fun getCategoryListSuccess(dto: MutableList<CategoryListDto>?) {
// 更新列表
_addListEvent.value = dto
}
}
fun gotoSearch() {
ToastUtils.showShortSafe("类目搜索")
}
fun showSelectFirstLevelName(name: String = "") {
if (name.isBlank()) {
showSelectFirstCategory.value = false
} else {
showSelectFirstCategory.value = true
selectFirstCategoryName.value = name
}
}
fun showFirstLevelList() {
_showFirstLevelListEvent.value = Unit
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.adapter
import android.widget.TextView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.yidian.shenghuoquan.commodity.R
import com.yidian.shenghuoquan.commodity.dto.CategoryListDto
class CategoryListAdapter : BaseQuickAdapter<CategoryListDto, BaseViewHolder>(R.layout.commodity_layout_category_list_item) {
override fun convert(holder: BaseViewHolder, item: CategoryListDto) {
holder.getView<TextView>(R.id.tv_category_name).text = item.name
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.adapter
import android.widget.TextView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.yidian.shenghuoquan.commodity.R
import com.yidian.shenghuoquan.commodity.dto.SubCategory
class CategorySubListAdapter: BaseQuickAdapter<SubCategory, BaseViewHolder>(R.layout.commodity_layout_category_list_item) {
override fun convert(holder: BaseViewHolder, item: SubCategory) {
holder.getView<TextView>(R.id.tv_category_name).text = item.name
}
}
......@@ -2,4 +2,16 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yidian.shenghuoquan.commodity">
<application>
<activity android:name=".ui.coupon.ChooseCategoryActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp" />
<solid android:color="@color/color_F5F6F7" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="vm"
type="com.yidian.shenghuoquan.commodity.ui.coupon.ChooseCategoryViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<include
android:id="@+id/include"
layout="@layout/layout_common_toolbar" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/sp40"
android:layout_marginStart="@dimen/dp20"
android:layout_marginTop="@dimen/dp10"
android:layout_marginEnd="@dimen/dp20"
android:layout_marginBottom="@dimen/dp10"
android:background="@drawable/shape_gray_bg"
android:drawableStart="@drawable/icon_search"
android:gravity="center_vertical"
android:onClick="@{() -> vm.gotoSearch()}"
android:paddingStart="@dimen/dp10"
android:text="请输入关键词搜索商品类目"
android:textColor="@color/color_C2C2C2"
android:textSize="@dimen/sp16" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp60"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/dp20"
android:paddingEnd="@dimen/dp20">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableEnd="@drawable/icon_next_arrow"
android:drawablePadding="@dimen/dp10"
android:onClick="@{() -> vm.showFirstLevelList()}"
android:text="@{vm.selectFirstCategoryName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
app:isShow="@{vm.showSelectFirstCategory}" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="@dimen/dp10"
android:text="请选择"
android:textColor="@color/color_1852F1"
android:textSize="@dimen/sp16"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="@dimen/dp20"
android:layout_height="@dimen/dp2"
android:background="@color/color_1852F1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<View style="@style/cut_off_line_style" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_category_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@null"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="3"
tools:listitem="@layout/commodity_layout_category_list_item" />
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/dp60"
android:paddingStart="@dimen/dp20"
android:paddingEnd="@dimen/dp20">
<TextView
android:id="@+id/tv_category_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="你好" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
</resources>
\ No newline at end of file
......@@ -5,8 +5,8 @@ if (rootProject.ext.android.isApplication){
apply plugin: 'com.android.library'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
android {
compileSdkVersion build_versions.compileSdkVersion
......@@ -50,11 +50,9 @@ android {
}
}
}
androidExtensions{
experimental = true
}
viewBinding{
enabled = true
buildFeatures {
viewBinding true
dataBinding true
}
kapt{
generateStubs = true
......@@ -83,5 +81,5 @@ dependencies {
exclude(group: 'com.yidian.android', module: 'NetworkImageLib')
}
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
}
\ No newline at end of file
......@@ -64,10 +64,6 @@
android:name=".ui.ProductSupportActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.GalleryActivity"
android:theme="@style/Transparent" />
<activity android:name=".ui.LoginLifeCircleActivity" />
<activity
......
......@@ -3,10 +3,11 @@ package com.yidian.shenghuoquan.newscontent.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.BottomSelectBean
import com.yidian.shenghuoquan.newscontent.databinding.ItemBottomSelectBinding
import kotlinx.android.synthetic.main.item_bottom_select.view.*
/**
* author: yinjiacheng
......@@ -37,7 +38,7 @@ class BottomSelectAdapter<T : BottomSelectBean> @JvmOverloads constructor(
}
override fun onBindViewHolder(holder: BottomSelectViewHolder, position: Int) {
holder.itemView.tv_content.text = mData[position].item
holder.itemView.findViewById<TextView>(R.id.tv_content).text = mData[position].item
holder.itemView.setOnClickListener {
mListener?.onItemClick(it, position, mData[position])
}
......@@ -64,4 +65,4 @@ class BottomSelectAdapter<T : BottomSelectBean> @JvmOverloads constructor(
interface OnItemClickListener<T> {
fun onItemClick(view: View, position: Int, data: T)
}
}
\ No newline at end of file
}
package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.common.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.ImageItemBean
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.view_pager_item.*
class CommenViewPagerAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<ImageItemBean> by lazy { ArrayList<ImageItemBean>() }
private lateinit var mOnItemClickListener: OnItemClickListener<ImageItemBean>
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.view_pager_item))
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position])
holder.photo_view.setOnClickListener{
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
override fun getItemCount(): Int {
return dataList.size
}
fun update(newData: ArrayList<ImageItemBean>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<ImageItemBean>) {
mOnItemClickListener = onItemClickListener
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
fun setData(imageItemBean: ImageItemBean) {
Glide.with(itemView.context).load(imageItemBean.imageUrl).into(photo_view)
}
}
}
......@@ -2,51 +2,53 @@ package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.common.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_feedback_detail.*
class FeedbackDetailAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<String> by lazy { ArrayList<String>() }
private lateinit var mOnItemClickListener: OnItemClickListener<String>
class FeedbackDetailAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_feedback_detail))
}
private val dataList: ArrayList<String> by lazy { ArrayList<String>() }
private lateinit var mOnItemClickListener: OnItemClickListener<String>
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position])
holder.itemView.setOnClickListener{
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_feedback_detail))
}
fun update(newData: ArrayList<String>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
val tvContent = holder.itemView.findViewById<TextView>(R.id.tv_content)
holder.setData(dataList[position], tvContent)
holder.itemView.setOnClickListener {
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
override fun getItemCount(): Int {
return dataList.size
fun update(newData: ArrayList<String>) {
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<String>) {
mOnItemClickListener = onItemClickListener
}
override fun getItemCount(): Int {
return dataList.size
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<String>) {
mOnItemClickListener = onItemClickListener
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
fun setData(content: String) {
tv_content.text = content
}
fun setData(content: String, tvContent: TextView) {
tvContent.text = content
}
}
}
......@@ -4,12 +4,12 @@ import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.http.httpbean.LifeAccountItemBean
import kotlinx.android.synthetic.main.item_life_account_identity.view.*
/**
* author: yinjiacheng
......@@ -35,15 +35,16 @@ class LifeAccountIdentityAdapter(val context: Context) :
override fun onBindViewHolder(holder: LifeAccountIdentityViewHolder, position: Int) {
val data = mData[position]
holder.itemView.tv_life_account.text = data.life_account_name
holder.itemView.findViewById<TextView>(R.id.tv_life_account).text = data.life_account_name
val tvLifeIdentity = holder.itemView.findViewById<TextView>(R.id.tv_life_identity)
if (data.role_type == 1) {
holder.itemView.tv_life_identity.text = "超级管理员"
holder.itemView.tv_life_identity.setBackgroundResource(R.drawable.bg_item_manager_selected_on)
holder.itemView.tv_life_identity.setTextColor(ContextCompat.getColor(context, R.color.color_FFFFFFFF))
tvLifeIdentity.text = "超级管理员"
tvLifeIdentity.setBackgroundResource(R.drawable.bg_item_manager_selected_on)
tvLifeIdentity.setTextColor(ContextCompat.getColor(context, R.color.color_FFFFFFFF))
} else {
holder.itemView.tv_life_identity.text = "普通员工"
holder.itemView.tv_life_identity.setBackgroundResource(R.drawable.bg_item_manager_selected_off)
holder.itemView.tv_life_identity.setTextColor(ContextCompat.getColor(context, R.color.color_FFEAAF35))
tvLifeIdentity.text = "普通员工"
tvLifeIdentity.setBackgroundResource(R.drawable.bg_item_manager_selected_off)
tvLifeIdentity.setTextColor(ContextCompat.getColor(context, R.color.color_FFEAAF35))
}
holder.itemView.setOnClickListener {
......
......@@ -2,13 +2,14 @@ package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.common.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.SharePlatformBean
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_share_platform.*
class ShareAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object{
......@@ -33,7 +34,7 @@ class ShareAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position])
holder.setData(dataList[position], holder)
holder.itemView.setOnClickListener{
mOnItemClickListener.onClick(it, position, dataList[position])
}
......@@ -59,9 +60,9 @@ class ShareAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override val containerView: View
get() = itemView
fun setData(sharePlatformBean: SharePlatformBean) {
iv_platform.setBackgroundResource(sharePlatformBean.imageId)
tv_platform.text = sharePlatformBean.name
fun setData(sharePlatformBean: SharePlatformBean, holder: ViewHolder) {
holder.itemView.findViewById<ImageView>(R.id.iv_platform).setBackgroundResource(sharePlatformBean.imageId)
holder.itemView.findViewById<TextView>(R.id.tv_platform).text = sharePlatformBean.name
}
}
}
......@@ -2,42 +2,42 @@ package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_update_version_des.*
class UpdateVersionDesAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<String> by lazy { ArrayList<String>() }
class UpdateVersionDesAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<String> by lazy { ArrayList<String>() }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_update_version_des))
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_update_version_des))
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position])
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position], holder)
}
override fun getItemCount(): Int {
return dataList.size
}
override fun getItemCount(): Int {
return dataList.size
}
fun update(newData: ArrayList<String>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
fun update(newData: ArrayList<String>) {
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
fun setData(des: String) {
tv_versionDes.text = des
}
fun setData(des: String, holder: ViewHolder) {
holder.itemView.findViewById<TextView>(R.id.tv_versionDes).text = des
}
}
}
......@@ -4,7 +4,6 @@ import android.content.Intent
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_CAREER
import com.yidian.common.XRouterPathConstants.Companion.FLASH
import com.yidian.common.XRouterPathConstants.Companion.GALLERY
import com.yidian.common.XRouterPathConstants.Companion.ID_CARD_TEST
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_AUTH
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_CREATE
......@@ -20,7 +19,6 @@ import com.yidian.common.XRouterPathConstants.Companion.LOGIN_LIFE_CIRCLE
import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_AUTH_INFO
import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_CENTER
import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_INFO
import com.yidian.common.XRouterPathConstants.Companion.MY_WALLET
import com.yidian.common.XRouterPathConstants.Companion.NEWS_CONTENT
import com.yidian.common.XRouterPathConstants.Companion.NEWS_MAIN
import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_ADD_STAFF
......@@ -33,10 +31,6 @@ import com.yidian.common.XRouterPathConstants.Companion.PROTOCOL
import com.yidian.common.XRouterPathConstants.Companion.STORE_MANAGEMENT
import com.yidian.common.XRouterPathConstants.Companion.SUPPORT
import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING
import com.yidian.common.XRouterPathConstants.Companion.TRANSACTION_DETAILS
import com.yidian.common.XRouterPathConstants.Companion.TRANSACTION_LIST
import com.yidian.common.XRouterPathConstants.Companion.VERIFY_IDENTITY
import com.yidian.common.XRouterPathConstants.Companion.WITHDRAW
import com.yidian.common.YdBaseApplication
import com.yidian.news.util.ProcessUtil
import com.yidian.nightmode.util.NightModeUtil
......@@ -275,17 +269,6 @@ class NewsContentApplication : YdBaseApplication() {
context.startActivity(intent)
}
}),
XPageNode(GALLERY, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
if (params != null) {
intent.putExtra(XRouterPathConstants.ParamsKey, params as HashMap)
}
intent.setClass(context, GalleryActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}),
XPageNode(CHOOSE_CAREER, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
......
package com.yidian.shenghuoquan.newscontent.bean
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
class ImageItemBean(var imageUrl: String): Parcelable
\ No newline at end of file
class ImageItemBean(var imageUrl: String): Parcelable
......@@ -2,7 +2,7 @@ package com.yidian.shenghuoquan.newscontent.personnel.bean
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
/**
* 账号列表数据类
......
package com.yidian.shenghuoquan.newscontent.ui
import android.Manifest
import android.Manifest.permission.ACCESS_BACKGROUND_LOCATION
import android.content.Intent
import android.os.Bundle
import com.orhanobut.hawk.Hawk
......@@ -10,6 +9,8 @@ import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.FLASH
import com.yidian.common.base.BaseActivity
import com.yidian.common.utils.SystemSettingUtils
import com.yidian.common.widget.DialogBuilder
import com.yidian.shenghuoquan.newscontent.databinding.ActivityFlashBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback
......@@ -17,7 +18,6 @@ import com.yidian.shenghuoquan.newscontent.http.httpbean.LifeAccountItemBean
import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountIdentityActivity
import com.yidian.shenghuoquan.newscontent.ui.center.MerchantCenterActivity
import com.yidian.shenghuoquan.newscontent.utils.StorageUtil
import com.yidian.utils.ToastUtil
import com.yidian.xpage.XPageManager
class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListCallback {
......@@ -101,23 +101,31 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
private fun getPermissions() {
val rxPermissions = RxPermissions(this)
rxPermissions.request(
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
ACCESS_BACKGROUND_LOCATION
)
.subscribe {
if (it) {
launcher()
// startActivity(Intent(this@FlashActivity, SelectAddressActivity::class.java))
} else {
ToastUtil.showToast(this, "请在设置里同意读取存储卡权限")
showPermissionDialog("需要电话、存储、位置")
}
}
}
private fun showPermissionDialog(permission: String) {
var dialog: DialogBuilder.CommonDialog? = null
dialog = DialogBuilder()
.showTitle(true, permission + "权限,请到 “应用信息 -> 权限” 中授予!")
.showPositive(true) {
SystemSettingUtils.openAppSettingDetail(this)
dialog?.dismiss()
}
.showNavigate(true)
.build(this)
dialog?.show()
}
}
package com.yidian.shenghuoquan.newscontent.ui
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import androidx.viewpager2.widget.ViewPager2
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.GALLERY
import com.yidian.common.base.BaseActivity
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.CommenViewPagerAdapter
import com.yidian.shenghuoquan.newscontent.bean.ImageItemBean
import com.yidian.shenghuoquan.newscontent.databinding.ActivityGalleryBinding
import com.yidian.shenghuoquan.newscontent.ui.dialog.ShareImageDialog
class GalleryActivity: BaseActivity<ActivityGalleryBinding>() {
private val vpAdapter: CommenViewPagerAdapter = CommenViewPagerAdapter()
private var imageTotalNum: Int = 0
private lateinit var articleUrl: String
private lateinit var imageUrl: String
private var shareImageDialog: ShareImageDialog? = null
private lateinit var imageList: ArrayList<ImageItemBean>
override fun getXPageName(): String {
return GALLERY
}
override fun createViewBinding(): ActivityGalleryBinding {
return ActivityGalleryBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
viewBind.vpImage.adapter = vpAdapter
if(intent.getSerializableExtra(XRouterPathConstants.ParamsKey) != null){
val paramsMap = intent.getSerializableExtra(XRouterPathConstants.ParamsKey) as HashMap<*, *>
val index = paramsMap["index"] as Int
imageList = paramsMap["imageList"] as ArrayList<ImageItemBean>
articleUrl = paramsMap["articleUrl"] as String
imageTotalNum = imageList.size
if(imageTotalNum > 0){
imageUrl = imageList[index].imageUrl
vpAdapter.update(imageList)
val showIndex = index + 1
viewBind.tvPage.text = "$showIndex/$imageTotalNum"
viewBind.vpImage.setCurrentItem(index, false)
}
setClickListener()
}
}
private fun setClickListener(){
viewBind.vpImage.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
@SuppressLint("SetTextI18n")
override fun onPageSelected(position: Int) {
val currentPage = position + 1
viewBind.tvPage.text = "$currentPage/$imageTotalNum"
imageUrl = imageList[position].imageUrl
}
})
vpAdapter.setOnItemClickListener(object : OnItemClickListener<ImageItemBean> {
override fun onClick(view: View?, position: Int, item: ImageItemBean?) {
finish()
}
})
viewBind.ivShare.setOnClickListener {
shareImage(imageUrl)
}
}
private fun shareImage(imageUrl: String) {
if(shareImageDialog == null){
shareImageDialog = ShareImageDialog(this, R.style.share_dialog)
}
shareImageDialog!!.setData(imageUrl)
shareImageDialog!!.show()
}
}
\ No newline at end of file
......@@ -7,6 +7,7 @@ import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.LOGIN_LIFE_CIRCLE
import com.yidian.common.base.BaseActivity
import com.yidian.common.extensions.clickAntiShake
import com.yidian.common.extensions.hide
import com.yidian.common.extensions.show
import com.yidian.common.http.HttpResult
......@@ -132,6 +133,11 @@ class LoginLifeCircleActivity : BaseActivity<ActivityLoginBinding>(), IGetLifeAc
urlMap[ProtocolActivity.ProtocolUrlKey] = AppConfig.privacyPolicyStatement
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
// todo 测试代码
viewBind.tvCategory.clickAntiShake {
XPageManager.push(XRouterPathConstants.chooseCategoryActivity, null)
}
}
private fun changeLoginButtonStatus() {
......
......@@ -20,7 +20,6 @@ import com.yidian.common.PoiListAdapter
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivitySelectAddressBinding
import kotlinx.android.synthetic.main.activity_select_address.*
/**
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/black">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_image"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.yidian.nightmode.widget.YdImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/image_cover_top"/>
<com.yidian.nightmode.widget.YdImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@mipmap/image_cover_bottom"/>
<com.yidian.nightmode.widget.YdImageView
android:id="@+id/iv_share"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="15dp"
android:layout_marginTop="10dp"
android:src="@mipmap/more_white"/>
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/tv_page"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginBottom="60dp"
android:layout_alignParentBottom="true"
android:textSize="24sp"
android:textColor="@color/white"/>
</RelativeLayout>
\ No newline at end of file
......@@ -166,4 +166,13 @@
</LinearLayout>
<Button
android:id="@+id/tv_category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="选择类目"
android:textColor="#1852f1"
android:textSize="14sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.yidian.nightmode.widget.YdLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/main_bg"
android:fitsSystemWindows="true">
<include
android:id="@+id/search_include"
layout="@layout/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.yidian.nightmode.widget.YdLinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<com.yidian.nightmode.widget.YdLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.yidian.nightmode.widget.YdFrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<com.yidian.nightmode.widget.YdRelativeLayout
android:id="@+id/search_input_container"
android:layout_width="match_parent"
android:layout_height="40dp"
android:focusable="true"
android:focusableInTouchMode="true">
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/btn_search_cancel"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:clickable="true"
android:focusable="true"
android:gravity="center_vertical|right"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/cancel"
android:textColor="@color/subTitle_dark_text"
android:textSize="16sp"
tools:ignore="RtlHardcoded" />
<com.yidian.nightmode.widget.YdLinearLayout
android:id="@+id/search_box_container"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginStart="16dp"
android:layout_toStartOf="@id/btn_search_cancel"
android:background="@drawable/search_bg"
android:orientation="horizontal">
<com.yidian.customwidgets.edittext.CusEditText
android:id="@+id/edtKeyword"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="@null"
android:drawableStart="@mipmap/icon_search"
android:drawablePadding="6dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:hint="@string/search_hint"
android:imeOptions="actionSearch"
android:inputType="text"
android:paddingStart="10dp"
android:singleLine="true"
android:textColor="?attr/title_text"
android:textColorHint="@color/search_text_gray"
android:textCursorDrawable="@null"
android:textSize="14sp"
tools:ignore="RtlSymmetry" />
<com.yidian.nightmode.widget.YdImageButton
android:id="@+id/search_content_clear"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@null"
android:paddingStart="1dp"
android:paddingEnd="14dp"
android:scaleType="center"
android:src="@mipmap/search_close"
android:visibility="visible" />
</com.yidian.nightmode.widget.YdLinearLayout>
</com.yidian.nightmode.widget.YdRelativeLayout>
</com.yidian.nightmode.widget.YdFrameLayout>
<com.yidian.nightmode.widget.YdRecyclerView
android:id="@+id/hint_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none"
android:visibility="gone" />
<com.yidian.nightmode.widget.YdLinearLayout
android:id="@+id/search_history_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone">
<com.yidian.customwidgets.container.ExpandableRecyclerView
android:id="@+id/history_list"
android:layout_width="match_parent"
android:layout_height="100dp"
android:overScrollMode="never"
android:scrollbars="none"
tools:itemCount="5"
tools:layoutManager="LinearLayoutManager"
tools:listitem="@layout/item_view_search_history" />
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/clear_history"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableStart="@mipmap/clear_history_icon"
android:padding="8dp"
android:text="@string/clear_search_history"
android:textColor="@color/subTitle_light_text"
android:textSize="14sp"
android:visibility="gone" />
</com.yidian.nightmode.widget.YdLinearLayout>
</com.yidian.nightmode.widget.YdLinearLayout>
......@@ -5,7 +5,6 @@ if (rootProject.ext.android.isApplication){
apply plugin: 'com.android.library'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion build_versions.compileSdkVersion
......@@ -45,9 +44,6 @@ android {
}
}
}
androidExtensions{
experimental = true
}
viewBinding{
enabled = true
}
......
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'yac-engine'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
android {
compileSdkVersion build_versions.compileSdkVersion
......@@ -87,6 +87,10 @@ android {
kapt {
generateStubs = true
}
buildFeatures {
viewBinding true
dataBinding true
}
repositories {
flatDir {
dirs 'libs'
......@@ -99,11 +103,14 @@ android {
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// kotlin实现MVVM框架之使用DataBinding之unresolved reference: BR解决办法
kapt "com.android.databinding:compiler:4.0.1"
rootProject.ext.dependencies.other.each {
implementation project(it)
}
if (!rootProject.ext.android.isApplication) {
implementation project(":Components:newscontent")
implementation project(":Components:commodity")
implementation project(":Components:userinfo")
}
implementation rootProject.ext.dependencies.publicImplementation
......
......@@ -282,6 +282,8 @@ public static final int *;
-keep class com.yidian.common.utils.*{*;}
-keep class com.yidian.shenghuoquan.newscontent.utils.*{*;}
-keep class com.yidian.shenghuoquan.newscontent.bean.**{*;}
-keep class com.yidian.shenghuoquan.**.bean.**{*;}
-keep class com.yidian.shenghuoquan.**.dto.**{*;}
-keep class com.yidian.common.cardutils.bean.*{*;}
-keep class com.yidian.framework.mobile.xdiamond.SecretUtil{*;}
-keep class com.yidian.yac.pm.appupdate.*{*;}
......
......@@ -18,11 +18,10 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--用于访问网络,网络定位需要上网-->
<meta-data
......@@ -245,7 +244,7 @@
</intent-filter>
</service>
<service android:name="com.amap.api.location.APSService"></service>
<service android:name="com.amap.api.location.APSService" />
<service
android:name="com.umeng.message.UmengDownloadResourceService"
......@@ -256,9 +255,9 @@
<!-- <provider-->
<!-- android:name="com.umeng.message.provider.MessageProvider"-->
<!-- android:authorities="${application_id}.umeng.message"-->
<!-- android:exported="false">-->
<!-- <grant-uri-permission android:pathPattern=".*" />-->
<!-- </provider>-->
<!-- android:exported="false">-->
<!-- <grant-uri-permission android:pathPattern=".*" />-->
<!-- </provider>-->
<!-- 以上为友盟推送基本配置信息 end-->
</application>
......
......@@ -27,8 +27,15 @@ ext.dependencies = [
'androidx.appcompat:appcompat:1.2.0',
'com.google.android.material:material:1.2.1',
'androidx.constraintlayout:constraintlayout:2.0.4',
'androidx.fragment:fragment-ktx:1.3.0',
'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0',
'androidx.lifecycle:lifecycle-extensions:2.2.0',
'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0',
'jp.co.cyberagent.android:gpuimage:2.1.0',
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9',
// 日志 https://github.com/JakeWharton/timber
'com.jakewharton.timber:timber:4.7.1',
// 刷新
'com.scwang.smart:refresh-layout-kernel:2.0.1',
'com.scwang.smart:refresh-header-classics:2.0.1',
......
......@@ -33,7 +33,7 @@ android {
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:25+'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment