This commit is contained in:
lunaticbum
2024-11-07 16:35:47 +09:00
parent 87ded0bda5
commit 0a77bd69d7
39 changed files with 1438 additions and 152 deletions
@@ -0,0 +1,143 @@
package bums.lunatic.launcher.behavior
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.recyclerview.widget.RecyclerView
import bums.lunatic.launcher.R
import bums.lunatic.launcher.behavior.calendar.CalendarAdapter
import bums.lunatic.launcher.behavior.calendar.CalendarBean
import bums.lunatic.launcher.behavior.calendar.CalendarDateView
import bums.lunatic.launcher.behavior.calendar.CalendarFactory.getMonthOfDayList
import bums.lunatic.launcher.behavior.calendar.CalendarUtil
import bums.lunatic.launcher.behavior.calendar.CalendarView
import bums.lunatic.launcher.databinding.ItemCalendarBinding
import com.google.android.material.appbar.AppBarLayout
import java.util.Date
import kotlin.math.abs
class Behavior: AppCompatActivity() {
private val sampleAdapter by lazy { SampleAdapter() }
private val getYMax by lazy {
resources.getDimension(R.dimen.appbar_height) - resources.getDimension(
R.dimen.toolbar_height
)
}
private val fadeIn by lazy { AnimationUtils.loadAnimation(this, R.anim.fade_in) }
private val fadeOut by lazy { AnimationUtils.loadAnimation(this, R.anim.fade_out) }
val dateArr: IntArray = CalendarUtil.getYMD(Date())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
setContentView(R.layout.behavior)
initTopBarAnimation()
initRecyclerView()
loadSample()
}
private fun initTopBarAnimation() {
val appBarLayout = findViewById<AppBarLayout>(R.id.app_bar_layout)
val back = findViewById<ImageView>(R.id.iv_back)
val del = findViewById<ImageView>(R.id.iv_del)
val share = findViewById<ImageView>(R.id.iv_share)
val cal = findViewById<RecyclerView>(R.id.calendarDateView)
appBarLayout.addOnOffsetChangedListener(
AppBarLayout.OnOffsetChangedListener { _, verticalOffset ->
if (abs(verticalOffset) >= getYMax / 2) {
if (back.visibility != View.GONE) {
back.startAnimation(fadeOut)
del.startAnimation(fadeOut)
share.startAnimation(fadeOut)
back.visibility = View.GONE
del.visibility = View.GONE
share.visibility = View.GONE
var lp = cal.layoutParams
lp.height = resources.getDimension(R.dimen.toolbar_height).toInt()
cal.layoutParams = lp
}
} else {
if (back.visibility != View.VISIBLE) {
back.startAnimation(fadeIn)
del.startAnimation(fadeIn)
share.startAnimation(fadeIn)
back.visibility = View.VISIBLE
del.visibility = View.VISIBLE
share.visibility = View.VISIBLE
var lp = cal.layoutParams
lp.height = resources.getDimension(R.dimen.appbar_height).toInt()
cal.layoutParams = lp
}
}
}
)
}
private fun initRecyclerView() {
with(findViewById<RecyclerView>(R.id.rv_main)) {
adapter = sampleAdapter
}
with(findViewById<RecyclerView>(R.id.calendarDateView)) {
adapter = CalAdapter().apply {
items.clear()
items.addAll(getMonthOfDayList(
dateArr[0],
dateArr[1]
))
}
}
}
private fun loadSample() {
sampleAdapter.notifySample()
}
}
class CalAdapter : RecyclerView.Adapter<CalAdapter.CalViewHolder>() {
val items = mutableListOf<CalendarBean>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CalViewHolder(ItemCalendarBinding.inflate(LayoutInflater.from(parent.context)))
override fun onBindViewHolder(holder: CalViewHolder, position: Int) {
holder.bind.day.apply {
val bean = items[position]
this.text = bean?.day.toString()
if (bean?.monthFlag != 0) {
this.setTextColor(Color.WHITE)
} else {
this.setTextColor(Color.BLACK)
}
}
}
override fun getItemCount() = items.size
// fun notifySample() {
// items.clear()
// (1..10).forEach {
// items.add(it)
// }
// notifyDataSetChanged()
// }
class CalViewHolder(val bind: ItemCalendarBinding) : RecyclerView.ViewHolder(bind.root)
}
@@ -0,0 +1,31 @@
package bums.lunatic.launcher.behavior
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import bums.lunatic.launcher.R
class SampleAdapter : RecyclerView.Adapter<SampleAdapter.SampleViewHolder>() {
private val items = mutableListOf<Int>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = SampleViewHolder(parent)
override fun onBindViewHolder(holder: SampleViewHolder, position: Int) {
//..
}
override fun getItemCount() = items.size
fun notifySample() {
items.clear()
(1..10).forEach {
items.add(it)
}
notifyDataSetChanged()
}
class SampleViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_sample, parent, false),
)
}
@@ -0,0 +1,82 @@
package bums.lunatic.launcher.behavior.behaviorimpl
import android.content.Context
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.View
import android.widget.TextView
import androidx.annotation.NonNull
import androidx.coordinatorlayout.widget.CoordinatorLayout
import bums.lunatic.launcher.R
import com.google.android.material.appbar.AppBarLayout
import kotlin.math.abs
class BehaviorBlackJin(context: Context, attrs: AttributeSet?) :
CoordinatorLayout.Behavior<TextView>(context, attrs) {
private val mContext: Context = context
private val marginTop: Float
private val marginTopAfter: Float
private val getYMax: Float =
context.getResources().getDimension(R.dimen.appbar_height) - context.getResources()
.getDimension(R.dimen.toolbar_height)
init {
marginTop = dpToPx(getYMax / 4)
marginTopAfter = dpToPx(getYMax / 8)
}
override fun layoutDependsOn(
@NonNull parent: CoordinatorLayout,
@NonNull child: TextView,
@NonNull dependency: View
): Boolean {
return dependency is AppBarLayout
}
/**
* dependency 의 View 의 변화가 있을때 이벤트가 들어옵니다.
*/
override fun onDependentViewChanged(
@NonNull parent: CoordinatorLayout,
@NonNull child: TextView,
@NonNull dependency: View
): Boolean {
child.alpha = getRatioValue(
1f, 0f,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
child.alpha = getRatioValue(
1f, 0f,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
child.x = (dependency.width / 2 - (child.width / 2)).toFloat()
child.y = getRatioValue(
marginTop, marginTopAfter,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
return false
}
private fun dpToPx(dp: Float): Float {
val dm: DisplayMetrics = mContext.getResources().getDisplayMetrics()
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, dm).toInt()
.toFloat()
}
private fun getRatioValue(
firstValue: Float,
lastValue: Float,
getY: Float,
getYMax: Float
): Float {
val temp = -(firstValue - lastValue) * getY / getYMax
return firstValue + temp
}
}
@@ -0,0 +1,84 @@
package bums.lunatic.launcher.behavior.behaviorimpl
import android.content.Context
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.View
import android.widget.TextView
import androidx.annotation.NonNull
import androidx.coordinatorlayout.widget.CoordinatorLayout
import bums.lunatic.launcher.R
import com.google.android.material.appbar.AppBarLayout
import kotlin.math.abs
class BehaviorTistory(context: Context, attrs: AttributeSet?) :
CoordinatorLayout.Behavior<TextView>(context, attrs) {
private val mContext: Context = context
private val marginLeft: Float
private val marginTop: Float
private val marginTopAfter: Float
private val getYMax: Float =
context.getResources().getDimension(R.dimen.appbar_height) - context.getResources()
.getDimension(R.dimen.toolbar_height)
init {
marginLeft = dpToPx(70f)
marginTop = dpToPx(70f)
marginTopAfter = dpToPx(53f)
}
override fun layoutDependsOn(
@NonNull parent: CoordinatorLayout,
@NonNull child: TextView,
@NonNull dependency: View
): Boolean {
return dependency is AppBarLayout
}
/**
* dependency 의 View 의 변화가 있을때 이벤트가 들어옵니다.
*/
override fun onDependentViewChanged(
@NonNull parent: CoordinatorLayout,
@NonNull child: TextView,
@NonNull dependency: View
): Boolean {
child.scaleX = getRatioValue(
1f, 0.8f,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
child.x = getRatioValue(
marginLeft, ((dependency.width - child.width) / 2).toFloat(),
abs(dependency.y.toDouble()).toFloat(), getYMax
)
child.y = getRatioValue(
marginTop, marginTopAfter,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
return false
}
private fun dpToPx(dp: Float): Float {
val dm: DisplayMetrics = mContext.getResources().getDisplayMetrics()
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, dm).toInt()
.toFloat()
}
private fun getRatioValue(
firstValue: Float,
lastValue: Float,
getY: Float,
getYMax: Float
): Float {
val temp = -(firstValue - lastValue) * getY / getYMax
return firstValue + temp
}
}
@@ -0,0 +1,91 @@
package bums.lunatic.launcher.behavior.behaviorimpl
import android.content.Context
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.View
import android.widget.ImageView
import androidx.annotation.NonNull
import androidx.coordinatorlayout.widget.CoordinatorLayout
import bums.lunatic.launcher.R
import com.google.android.material.appbar.AppBarLayout
import kotlin.math.abs
class BehaviorTopBall(context: Context, attrs: AttributeSet?) :
CoordinatorLayout.Behavior<ImageView>(context, attrs) {
private val mContext: Context = context
private val iconMarginLeft: Float
private val iconMarginTop: Float
private val iconMarginTopAfter: Float
private val getYMax: Float =
context.getResources().getDimension(R.dimen.appbar_height) - context.getResources()
.getDimension(R.dimen.toolbar_height)
init {
iconMarginLeft = dpToPx(30f)
iconMarginTop = dpToPx(72f)
iconMarginTopAfter = dpToPx(20f)
}
override fun layoutDependsOn(
@NonNull parent: CoordinatorLayout,
@NonNull child: ImageView,
@NonNull dependency: View
): Boolean {
return dependency is AppBarLayout
}
/**
* dependency 의 View 의 변화가 있을때 이벤트가 들어옵니다.
*/
override fun onDependentViewChanged(
@NonNull parent: CoordinatorLayout,
@NonNull child: ImageView,
@NonNull dependency: View
): Boolean {
// child icon scale [1 , 0.8]
child.scaleX = getRatioValue(
1f, 0.8f,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
child.scaleY = getRatioValue(
1f, 0.8f,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
// child icon set x [iconMarginLeft , (dependency.getWidth() - child.getWidth())/2]
child.x = getRatioValue(
iconMarginLeft, ((dependency.width - child.width) / 2).toFloat(),
abs(dependency.y.toDouble()).toFloat(), getYMax
)
// child icon set y [iconMarginTop, iconMarginTopAfter]
child.y = getRatioValue(
iconMarginTop, iconMarginTopAfter,
abs(dependency.y.toDouble()).toFloat(), getYMax
)
return false
}
private fun dpToPx(dp: Float): Float {
val dm: DisplayMetrics = mContext.getResources().getDisplayMetrics()
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, dm).toInt()
.toFloat()
}
private fun getRatioValue(
firstValue: Float,
lastValue: Float,
getY: Float,
getYMax: Float
): Float {
val temp = -(firstValue - lastValue) * getY / getYMax
return firstValue + temp
}
}
@@ -0,0 +1,10 @@
package bums.lunatic.launcher.behavior.calendar
import android.view.View
import android.view.ViewGroup
interface CalendarAdapter {
fun getView(convertView: View?, parentView: ViewGroup?, bean: CalendarBean?): View
// fun hasChildView() : Boolean
}
@@ -0,0 +1,54 @@
//package bums.lunatic.launcher.behavior.calendar;
//
//public class CalendarBean {
// public int year;
// public int month;
// public int day;
// public int week;
//
// //-1,0,1
// public int monthFlag;
//
// //显示
//
// public CalendarBean(int year, int month, int day) {
// this.year = year;
// this.month = month;
// this.day = day;
// }
//
// public String getDisplayWeek(){
// String s="";
// switch(week){
// case 1:
// s="星期日";
// break;
// case 2:
// s="星期一";
// break;
// case 3:
// s="星期二";
// break;
// case 4:
// s="星期三";
// break;
// case 5:
// s="星期四";
// break;
// case 6:
// s="星期五";
// break;
// case 7:
// s="星期六";
// break;
//
// }
// return s ;
// }
//
// @Override
// public String toString() {
// String s=year+"/"+month+"/"+day;
// return s;
// }
//}
@@ -0,0 +1,29 @@
package bums.lunatic.launcher.behavior.calendar
class CalendarBean //显示
(var year: Int, var month: Int, var day: Int) {
var week: Int = 0
//-1,0,1
var monthFlag: Int = 0
val displayWeek: String
get() {
var s = ""
when (week) {
1 -> s = "星期日"
2 -> s = "星期一"
3 -> s = "星期二"
4 -> s = "星期三"
5 -> s = "星期四"
6 -> s = "星期五"
7 -> s = "星期六"
}
return s
}
override fun toString(): String {
val s = "$year/$month/$day"
return s
}
}
@@ -0,0 +1,152 @@
package bums.lunatic.launcher.behavior.calendar
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
import bums.lunatic.launcher.R
import bums.lunatic.launcher.behavior.calendar.CalendarFactory.getMonthOfDayList
import com.example.accountbook.calendar.CalendarTopView
import com.example.accountbook.calendar.CalendarTopViewChangeListener
import java.util.Date
import java.util.LinkedList
class CalendarDateView(context: Context, attrs: AttributeSet?):
ViewPager(context, attrs), CalendarTopView {
var views = HashMap<Int, CalendarView>()
private var mCaledarLayoutChangeListener: CalendarTopViewChangeListener? = null
private var onItemClickListener: CalendarView.OnItemClickListener? = null
private val cache: LinkedList<CalendarView?> = LinkedList<CalendarView?>()
private val MAXCOUNT = 6
private var row = 6
fun setCalrow(row : Int) {
this.row = row
}
private var mAdapter: CalendarAdapter? = null
override var itemHeight = 0
private set
fun setAdapter(adapter: CalendarAdapter?) {
mAdapter = adapter
initialize()
initData()
}
fun reload() {
Log.i(this@CalendarDateView.javaClass.simpleName , "reload()")
sss.notifyDataSetChanged()
}
fun setOnItemClickListener(onItemClickListener: CalendarView.OnItemClickListener?) {
this.onItemClickListener = onItemClickListener
}
init {
val a = context.obtainStyledAttributes(attrs, R.styleable.CalendarDateView)
row = a.getInteger(R.styleable.CalendarDateView_cbd_calendar_row, 6)
a.recycle()
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
// var calendarHeight = 0
if (adapter != null) {
(getChildAt(0) as CalendarView)?.let {
// calendarHeight = it.measuredHeight
itemHeight = it.itemHeight
}
}
setMeasuredDimension(
widthMeasureSpec,
MeasureSpec.makeMeasureSpec(heightMeasureSpec, MeasureSpec.EXACTLY)
)
}
val dateArr: IntArray = CalendarUtil.getYMD(Date())
var sss = object : PagerAdapter() {
override fun getCount(): Int {
// Log.i(this@CalendarDateView::class.java.simpleName, "container >>> setAdapter getCount")
return Int.MAX_VALUE
}
override fun isViewFromObject(view: View, `object`: Any): Boolean {
return view === `object`
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
Log.i(this@CalendarDateView::class.java.simpleName, "container >>> ${container} position >> ${position}")
val view: CalendarView = if (!cache.isEmpty()) {
cache.removeFirst()!!
} else {
CalendarView(container.context, row)
}
view.setOnItemClickListener(onItemClickListener)
view.setAdapter(mAdapter)
container.addView(view)
views[position] = view
view.apply {
setData(
getMonthOfDayList(
dateArr[0],
dateArr[1] + position - Int.MAX_VALUE / 2
), position == Int.MAX_VALUE / 2
)
}
return view
}
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
Log.i(this@CalendarDateView.javaClass.simpleName , "destroyItem >>> position ${position}")
container.removeView(`object` as View)
cache.addLast(`object` as CalendarView)
views.remove(position)
}
}
private fun initialize() {
setAdapter(sss)
addOnPageChangeListener(object: SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
onItemClickListener?.let{
views[position]?.let {v ->
val obs: Array<Any> = v.select
it.onItemClick(
obs[0] as View,
obs[1] as Int,
obs[2] as CalendarBean
)
}
}
mCaledarLayoutChangeListener?.onLayoutChange(this@CalendarDateView)
}
})
}
private fun initData() {
setCurrentItem(Int.MAX_VALUE / 2, false)
adapter!!.notifyDataSetChanged()
}
override val currentSelectPositon: IntArray
get() {
var view = views[currentItem]
if (view == null) {
view = getChildAt(0) as? CalendarView
}
return view?.getSelectPosition() ?: IntArray(4)
}
override fun setCalendarTopViewChangeListener(listener: CalendarTopViewChangeListener?) {
mCaledarLayoutChangeListener = listener
}
}
@@ -0,0 +1,66 @@
package bums.lunatic.launcher.behavior.calendar
import android.util.Log
import bums.lunatic.launcher.behavior.calendar.CalendarUtil.getDayOfWeek
import java.util.Calendar
object CalendarFactory {
private val cache = HashMap<String, List<CalendarBean>>()
fun getMonthOfDayList(y: Int, m: Int): List<CalendarBean> {
Log.e("TIME CHECK" , "fun getMonthOfDayList Start")
val key = y.toString() + "" + m
if (cache.containsKey(key)) {
val list = cache[key]
if (list == null) {
cache.remove(key)
} else {
return list
}
}
val list: MutableList<CalendarBean> = ArrayList()
cache[key] = list
val fweek: Int = getDayOfWeek(y, m, 1)
val total: Int = CalendarUtil.getDayOfMaonth(y, m)
for (i in fweek - 1 downTo 1) {
val bean = getCalendarBean(y, m, 1 - i)
bean.monthFlag = -1
list.add(bean)
}
for (i in 0 until total) {
val bean = getCalendarBean(y, m, i + 1)
list.add(bean)
}
for (i in 0 until 42 - (fweek - 1) - total) {
val bean = getCalendarBean(y, m, total + i + 1)
bean.monthFlag = 1
list.add(bean)
}
Log.e("TIME CHECK" , "fun getMonthOfDayList END")
return list
}
fun getCalendarBean(year: Int, month: Int, day: Int): CalendarBean {
val calendar: Calendar = Calendar.getInstance()
.apply { this.set(year, month - 1, day) }
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH) + 1
val day = calendar.get(Calendar.DATE)
val bean = CalendarBean(year, month, day)
bean.week = CalendarUtil.getDayOfWeek(year, month, day)
// val chinaDate: Array<String> = ChinaDate.getChinaDate(year, month, day)
// bean.chinaMonth = chinaDate[0]
// bean.chinaDay = chinaDate[1]
return bean
}
@JvmStatic
fun main(args: Array<String>) {
}
}
@@ -0,0 +1,9 @@
package com.example.accountbook.calendar
interface CalendarTopView {
val currentSelectPositon: IntArray?
val itemHeight: Int
fun setCalendarTopViewChangeListener(listener: CalendarTopViewChangeListener?)
}
@@ -0,0 +1,7 @@
package com.example.accountbook.calendar
interface CalendarTopViewChangeListener {
fun onLayoutChange(topView: CalendarTopView) {
}
}
@@ -0,0 +1,37 @@
package bums.lunatic.launcher.behavior.calendar
import java.util.Calendar
import java.util.Date
object CalendarUtil {
fun getDayOfWeek(y: Int, m: Int, day: Int): Int {
val calendar: Calendar = Calendar.getInstance()
calendar.set(y, m - 1, day)
return calendar.get(Calendar.DAY_OF_WEEK)
}
//获取一月最大天数
fun getDayOfMaonth(y: Int, m: Int): Int {
val cal: Calendar = Calendar.getInstance()
cal.set(y, m - 1, 1)
return cal.getActualMaximum(Calendar.DATE)
}
fun getMothOfMonth(y: Int, m: Int): Int {
val cal: Calendar = Calendar.getInstance()
cal.set(y, m - 1, 1)
val dateOfMonth: Int = cal.get(Calendar.MONTH)
return dateOfMonth + 1
}
fun getYMD(date: Date?): IntArray {
val cal: Calendar = Calendar.getInstance()
date?.let { cal.setTime(it) }
return intArrayOf(
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH) + 1,
cal.get(Calendar.DATE)
)
}
}
@@ -0,0 +1,201 @@
package bums.lunatic.launcher.behavior.calendar
import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import android.util.Log
import android.view.View
import android.view.ViewGroup
import bums.lunatic.launcher.behavior.calendar.CalendarUtil.getYMD
import java.util.Date
class CalendarView : ViewGroup {
private var selectPosition = -1
private var adapter: CalendarAdapter? = null
private var data: List<CalendarBean>? = null
private var onItemClickListener: OnItemClickListener? = null
private var row = 6
private val column = 7
private var itemWidth = 0
var itemHeight = 0
private set
private var isToday = false
interface OnItemClickListener {
fun onItemClick(view: View?, position: Int, bean: CalendarBean?)
}
constructor(context: Context?, row: Int) : super(context) {
this.row = row
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) {
this.onItemClickListener = onItemClickListener
}
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
setWillNotDraw(false)
}
fun setAdapter(adapter: CalendarAdapter?) {
this.adapter = adapter
}
fun setCalrow(row : Int) {
if (this.row != row) {
this.row = row
removeAllViews()
}
}
fun setData(data: List<CalendarBean>?, isToday: Boolean) {
this.data = data
this.isToday = isToday
setItem()
requestLayout()
}
private fun setItem() {
selectPosition = -1
if (adapter == null) {
throw RuntimeException("adapter is null,please setadapter")
}
Log.i("data >>> ","data ${data}")
for (i in data!!.indices) {
val bean = data!![i]
val chidView: View? = adapter?.getView(
getChildAt(i).also { v -> Log.i("data >>> ", "view $v") },
this,
bean
).also { v -> Log.i("data >>> ", "chidView $v") }
if (chidView != null && chidView != getChildAt(i)) {
addViewInLayout(chidView, i, chidView.layoutParams, true)
}
if (isToday && selectPosition == -1) {
val date = getYMD(Date())
if (bean.year == date[0] && bean.month == date[1] && bean.day == date[2]) {
selectPosition = i
}
} else {
if (selectPosition == -1 && bean.day == 1) {
selectPosition = i
}
}
chidView?.isSelected = selectPosition == i
setItemClick(chidView, i, bean)
}
}
val select: Array<Any>
get() = arrayOf(
getChildAt(selectPosition), selectPosition,
data!![selectPosition]
)
fun setItemClick(view: View?, potsion: Int, bean: CalendarBean?) {
view?.setOnClickListener {
if (selectPosition != -1) {
getChildAt(selectPosition).isSelected = false
getChildAt(potsion).isSelected = true
}
selectPosition = potsion
if (onItemClickListener != null) {
onItemClickListener!!.onItemClick(view, potsion, bean)
}
}
}
fun getSelectPosition(): IntArray {
val rect = Rect()
try {
getChildAt(selectPosition).getHitRect(rect)
} catch (e: Exception) {
e.printStackTrace()
}
return intArrayOf(rect.left, rect.top, rect.right, rect.top)
}
var lastwidthMeasureSpec = 0
var lastheightMeasureSpec = 0
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
Log.e(this.javaClass::class.java.simpleName , "this count check ${this}")
if (widthMeasureSpec != lastwidthMeasureSpec || heightMeasureSpec != lastheightMeasureSpec) {
val parentWidth =
MeasureSpec.getSize(
MeasureSpec.makeMeasureSpec(
widthMeasureSpec,
MeasureSpec.EXACTLY
)
)
val parentH =
MeasureSpec.getSize(
MeasureSpec.makeMeasureSpec(
heightMeasureSpec,
MeasureSpec.EXACTLY
)
)
itemWidth = parentWidth / column
itemHeight = parentH / row
// itemWidth
val view = getChildAt(0) ?: return
val params = view.layoutParams
if (params != null && params.height > 0) {
itemHeight = params.height
}
setMeasuredDimension(parentWidth, itemHeight * row)
if (childCount.equals(row*column))
for (i in 0 until childCount) {
val childView = getChildAt(i)
childView.measure(
MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY)
)
}
}
Log.i(
TAG,
"onMeasure() called with: itemHeight = [$itemHeight], itemWidth = [$itemWidth]"
)
lastwidthMeasureSpec = widthMeasureSpec
lastheightMeasureSpec = heightMeasureSpec
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
if (changed && childCount.equals(row*column))
for (i in 0 until childCount) {
layoutChild(getChildAt(i), i, l, t, r, b)
}
}
override fun addViewInLayout(
child: View?,
index: Int,
params: LayoutParams?,
preventRequestLayout: Boolean
): Boolean {
Log.d("CalendarView, time","time")
return super.addViewInLayout(child, index, params, preventRequestLayout)
}
private fun layoutChild(view: View, position: Int, l: Int, t: Int, r: Int, b: Int) {
var l = l
var t = t
var r = r
var b = b
val cc = position % column
val cr = position / column
val itemWidth = view.measuredWidth
val itemHeight = view.measuredHeight
l = cc * itemWidth
t = cr * itemHeight
r = l + itemWidth
b = t + itemHeight
view.layout(l, t, r, b)
}
companion object {
private const val TAG = "CalendarView"
}
}
@@ -267,10 +267,10 @@ internal class Feeds : Fragment() , CommadCallabck {
// consoleLog("${cmd[0]} END ${cmd[1]}")
// }
CoroutineScope(Dispatchers.IO).launch {
consoleLog("on Cmd JF with SO")
consoleLog("on Cmd JF with MOST")
consoleLog("${cmd[0]} Start ${cmd[1]}")
String.format(String(Base64.getMimeDecoder().decode("aHR0cHM6Ly9rcjcwLnNvZ2lybC5zby8/cz0lcw==".toByteArray())),cmd[1]).getJ().let { doc -> FeedParseManager.parse(doc){consoleLog(it)} }
consoleLog("current j req() ${WorkersDb.getRealm().query<RssData>("category == $0", RssDataType.GURU.name).find().size}")
consoleLog("current j req() ${WorkersDb.getRealm().query<RssData>("category == $0", RssDataType.MOST.name).find().size}")
consoleLog("${cmd[0]} END ${cmd[1]}")
}
}
@@ -56,6 +56,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.behavior.Behavior
import bums.lunatic.launcher.databinding.LauncherHomeBinding
import bums.lunatic.launcher.helpers.Constants.Companion.BOTTOM_SHEET_TAG
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_LOCK_METHOD
@@ -162,7 +163,6 @@ internal class LauncherHome : Fragment() {
val infoUpdate = Runnable {
BLog.LOGE("swipeToDeleteCallback data called infoUpdate ")
chooseAdpater()
}
@@ -198,11 +198,8 @@ internal class LauncherHome : Fragment() {
var weatherPages = arrayListOf<Int>()
var weatherAdapter = arrayListOf<RecyclerView.Adapter<out RecyclerView.ViewHolder>?>()
PrefBoolean.weatherDress.get(false).letTrue {
weatherPages.add(R.layout.hourly_weather)
weatherAdapter.add(weatherDressAdapter!!)}
PrefBoolean.weatherState.get(false).letTrue { weatherPages.add(R.layout.recommended_hourly_dress)
weatherAdapter.add(weatherHourlyAdapter!!)}
PrefBoolean.weatherDress.get(false).letTrue { weatherPages.add(R.layout.hourly_weather); weatherAdapter.add(weatherDressAdapter!!)}
PrefBoolean.weatherState.get(false).letTrue { weatherPages.add(R.layout.recommended_hourly_dress); weatherAdapter.add(weatherHourlyAdapter!!)}
if (weatherPages.size > 0) {
mWeatherAdapter = WeatherAdapter(
weatherPages,
@@ -213,11 +210,6 @@ internal class LauncherHome : Fragment() {
} else {
binding.noticeSummary.root.visibility = View.GONE
}
// mWeatherAdapter = WeatherAdapter(arrayListOf(),binding.noticeSummary)
// WorkersDb.getRealm().query<WeatherForcast>().first().find()?.forecast?.let {
// mWeatherAdapter?.update(it.forecastday)
// BLog.LOGE("saved weatherForcast >>> ${it.forecastday}")
// }
val decoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)
@@ -543,11 +535,12 @@ internal class LauncherHome : Fragment() {
}
infosJob?.start()
}
var rssStateVote = false
fun queryVotes() {
beforeQuery()
var rQ = WorkersDb.getRealm().query<RssData>().query("vote == $0",true)
updateQuery(rQ)
rssStateVote = true
}
fun queryInfos(filter: Collection<RssDataType>? = arrayListOf(RssDataType.GURU,RssDataType.MOST,RssDataType.REDDIT_NSFW), noLimit : Boolean = false) {
@@ -559,6 +552,7 @@ internal class LauncherHome : Fragment() {
}
updateQuery(rQ)
rssStateVote = false
}
fun queryInfos(keyword : String, category : ArrayList<String> = arrayListOf(), noLimit : Boolean = false) {
@@ -600,6 +594,7 @@ internal class LauncherHome : Fragment() {
rQ = rQ.query(queryString)
}
updateQuery(rQ)
rssStateVote = false
}
var infosJob : Job? = null
@@ -676,8 +671,11 @@ internal class LauncherHome : Fragment() {
}
binding.otherCheck -> {
if (binding.otherCheck.isSelected ) {
binding.otherCheck.isSelected = false
if (rssStateVote) {
queryInfos()
} else {
binding.otherCheck.isSelected = false
}
} else {
queryInfos()
binding.otherCheck.isSelected = true
@@ -850,22 +848,19 @@ internal class LauncherHome : Fragment() {
private fun enableSwipeToDeleteAndUndo() {
val swipeToDeleteCallback: SwipeToDeleteCallback = object : SwipeToDeleteCallback(requireContext()) {
override fun onSwiped(@NonNull viewHolder: RecyclerView.ViewHolder, i: Int) {
BLog.LOGE("swipeToDeleteCallback start")
(viewHolder.itemView.getTag() as? RssData)?.let { rss ->
WorkersDb.getRealm().apply {
writeBlocking {
if (rss.vote) {
if (rssStateVote && rss.vote) {
rss.vote = false
rss.read = 0
} else {
rss.read += nomoreShowCount
}
copyToRealm(rss, UpdatePolicy.ALL)
BLog.LOGE("swipeToDeleteCallback data update ")
}
}
}
BLog.LOGE("swipeToDeleteCallback endEvent")
}
}
@@ -916,6 +911,9 @@ internal class LauncherHome : Fragment() {
gestureDistance: Double
): Boolean {
when(fingers) {
4->{
lActivity!!.startActivity(Intent(requireContext(), Behavior::class.java))
}
3 -> QuickAccess().show(fragManager, BOTTOM_SHEET_TAG)
2->{
var startIntene = Intent(Intent.ACTION_MAIN)
@@ -158,8 +158,6 @@ internal class RssItemAdapter (
fun updateData(newList: List<RssDataInterface>) {
try {
BLog.LOGE("swipeToDeleteCallback data called updateData ${newList} ")
// BLog.LOGE("newList >> ${newList}")
DiffUtil.calculateDiff(RssItemDiffUtil(rssDataItemLis, newList)).apply {
}.dispatchUpdatesTo(this).apply {
@@ -27,7 +27,7 @@ abstract class SwipeToDeleteCallback internal constructor(context: Context) :
init {
mClearPaint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.CLEAR))
mClearPaint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.DARKEN))
deleteDrawable = ContextCompat.getDrawable(mContext, R.drawable.ic_delete)
intrinsicWidth = deleteDrawable!!.intrinsicWidth
intrinsicHeight = deleteDrawable.intrinsicHeight
@@ -16,6 +16,7 @@ import android.text.style.ClickableSpan
import android.util.AttributeSet
import android.view.View
import androidx.appcompat.widget.AppCompatTextView
import bums.lunatic.launcher.R
import java.text.SimpleDateFormat
import java.util.Date
@@ -77,12 +78,12 @@ class DateTimeView : AppCompatTextView {
}
spannableBuilder.append(time)
spannableBuilder.setSpan(AbsoluteSizeSpan(48,true), 0, time.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableBuilder.setSpan(AbsoluteSizeSpan(resources.getDimensionPixelSize(R.dimen._26sp),false), 0, time.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableBuilder.setSpan(mClickableSpan, 0, time.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableBuilder.append("\n")
spannableBuilder.append(date)
var start = time.length + "\n".length
spannableBuilder.setSpan(AbsoluteSizeSpan(30,true), start , start+date.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableBuilder.setSpan(AbsoluteSizeSpan(resources.getDimensionPixelSize(R.dimen._20sp),false), start , start+date.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableBuilder.setSpan(mClickableSpan2, start , start+date.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
mHandler.removeCallbacks(runable)
setText(spannableBuilder)