diff --git a/app/build.gradle b/app/build.gradle index 314ad1230..21525be3d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ ext { } dependencies { - compile 'com.simplemobiletools:commons:2.29.11' + compile 'com.simplemobiletools:commons:2.29.13' compile 'joda-time:joda-time:2.9.1' compile 'com.facebook.stetho:stetho:1.4.1' compile 'com.bignerdranch.android:recyclerview-multiselect:0.2' diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt index a923251cd..995b5cf2b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt @@ -81,7 +81,7 @@ class WidgetMonthlyConfigureActivity : AppCompatActivity(), MonthlyCalendar { MonthlyCalendarImpl(this, applicationContext).updateMonthlyCalendar(DateTime(), false) } - fun saveConfig() { + private fun saveConfig() { storeWidgetColors() requestWidgetUpdate() @@ -99,14 +99,14 @@ class WidgetMonthlyConfigureActivity : AppCompatActivity(), MonthlyCalendar { } } - fun pickBackgroundColor() { + private fun pickBackgroundColor() { ColorPickerDialog(this, mBgColorWithoutTransparency) { mBgColorWithoutTransparency = it updateBgColor() } } - fun pickTextColor() { + private fun pickTextColor() { ColorPickerDialog(this, mTextColor) { mTextColorWithoutTransparency = it updateTextColors() @@ -159,7 +159,7 @@ class WidgetMonthlyConfigureActivity : AppCompatActivity(), MonthlyCalendar { val todayCircle = resources.getDrawable(R.drawable.circle_empty) todayCircle.setColorFilter(mTextColor, PorterDuff.Mode.SRC_IN) - for (i in 0..len - 1) { + for (i in 0 until len) { val day = mDays!![i] var curTextColor = mWeakTextColor @@ -171,7 +171,7 @@ class WidgetMonthlyConfigureActivity : AppCompatActivity(), MonthlyCalendar { text = day.value.toString() setTextColor(curTextColor) - paintFlags = if (day.hasEvent) (paintFlags or Paint.UNDERLINE_TEXT_FLAG) else (paintFlags.removeFlag(Paint.UNDERLINE_TEXT_FLAG)) + paintFlags = if (day.hasEvent()) (paintFlags or Paint.UNDERLINE_TEXT_FLAG) else (paintFlags.removeFlag(Paint.UNDERLINE_TEXT_FLAG)) background = if (day.isToday) todayCircle else null } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt index f3929a6b1..9e3961090 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt @@ -20,6 +20,7 @@ import com.simplemobiletools.calendar.helpers.* import com.simplemobiletools.calendar.interfaces.MonthlyCalendar import com.simplemobiletools.calendar.interfaces.NavigationListener import com.simplemobiletools.calendar.models.DayMonthly +import com.simplemobiletools.calendar.views.DayMonthlyView import com.simplemobiletools.commons.extensions.adjustAlpha import com.simplemobiletools.commons.extensions.beGone import com.simplemobiletools.commons.extensions.beVisibleIf @@ -117,7 +118,7 @@ class MonthFragment : Fragment(), MonthlyCalendar { } } - fun showMonthDialog() { + private fun showMonthDialog() { activity.setTheme(context.getAppropriateTheme()) val view = getLayoutInflater(arguments).inflate(R.layout.date_picker, null) val datePicker = view.findViewById(R.id.date_picker) as DatePicker @@ -174,50 +175,16 @@ class MonthFragment : Fragment(), MonthlyCalendar { } } - val weakerText = mTextColor.adjustAlpha(MEDIUM_ALPHA) - - for (i in 0..len - 1) { + for (i in 0 until len) { val day = days[i] - var curTextColor = mWeakTextColor - if (day.isThisMonth) { - curTextColor = mTextColor - } - - (mHolder.findViewById(mRes.getIdentifier("day_$i", "id", mPackageName)) as TextView).apply { - text = day.value.toString() - setTextColor(curTextColor) + (mHolder.findViewById(mRes.getIdentifier("day_$i", "id", mPackageName)) as DayMonthlyView).apply { + setDay(day) setOnClickListener { openDay(day.code) } - - background = if (!day.isThisMonth) { - null - } else if (day.isToday && day.hasEvent) { - val drawable = mRes.getDrawable(R.drawable.monthly_day_with_event_today).mutate() - drawable.setColorFilter(getDayDotColor(day, weakerText), PorterDuff.Mode.SRC_IN) - drawable - } else if (day.isToday) { - val todayCircle = mRes.getDrawable(R.drawable.circle_empty) - todayCircle.setColorFilter(weakerText, PorterDuff.Mode.SRC_IN) - todayCircle - } else if (day.hasEvent) { - val drawable = mRes.getDrawable(R.drawable.monthly_day_dot).mutate() - drawable.setColorFilter(getDayDotColor(day, weakerText), PorterDuff.Mode.SRC_IN) - drawable - } else { - null - } } } } - private fun getDayDotColor(day: DayMonthly, defaultColor: Int): Int { - val colors = day.eventColors.distinct() - return if (colors.size == 1) - colors[0] - else - defaultColor - } - private fun openDay(code: String) { if (code.isEmpty()) return diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt index 339056b32..0a0f4e8c9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt @@ -10,13 +10,14 @@ import com.simplemobiletools.calendar.models.DayMonthly import com.simplemobiletools.calendar.models.Event import org.joda.time.DateTime import java.util.* +import kotlin.collections.ArrayList class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context) { private val DAYS_CNT = 42 private val YEAR_PATTERN = "YYYY" private val mToday: String = DateTime().toString(Formatter.DAYCODE_PATTERN) - var mEvents = ArrayList() + private var mEvents = ArrayList() var mFilterEventTypes = true lateinit var mTargetDate: DateTime @@ -49,25 +50,29 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context) var value = prevMonthDays - firstDayIndex + 1 var curDay: DateTime = mTargetDate - for (i in 0..DAYS_CNT - 1) { - if (i < firstDayIndex) { - isThisMonth = false - curDay = mTargetDate.withDayOfMonth(1).minusMonths(1) - } else if (i == firstDayIndex) { - value = 1 - isThisMonth = true - curDay = mTargetDate - } else if (value == currMonthDays + 1) { - value = 1 - isThisMonth = false - curDay = mTargetDate.withDayOfMonth(1).plusMonths(1) + for (i in 0 until DAYS_CNT) { + when { + i < firstDayIndex -> { + isThisMonth = false + curDay = mTargetDate.withDayOfMonth(1).minusMonths(1) + } + i == firstDayIndex -> { + value = 1 + isThisMonth = true + curDay = mTargetDate + } + value == currMonthDays + 1 -> { + value = 1 + isThisMonth = false + curDay = mTargetDate.withDayOfMonth(1).plusMonths(1) + } } isToday = isThisMonth && isToday(mTargetDate, value) val newDay = curDay.withDayOfMonth(value) val dayCode = Formatter.getDayCodeFromDateTime(newDay) - val day = DayMonthly(value, isThisMonth, isToday, dayCode, false, newDay.weekOfWeekyear, ArrayList()) + val day = DayMonthly(value, isThisMonth, isToday, dayCode, newDay.weekOfWeekyear, ArrayList()) days.add(day) value++ } @@ -98,13 +103,7 @@ class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context) } days.filter { dayEvents.keys.contains(it.code) }.forEach { - val day = it - day.hasEvent = true - - val events = dayEvents[it.code] - events!!.forEach { - day.eventColors.add(it.color) - } + it.dayEvents = dayEvents[it.code]!! } mCallback.updateMonthlyCalendar(monthName, days) } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt index c15d427dc..6b33609c4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt @@ -157,7 +157,7 @@ class MyWidgetMonthlyProvider : AppWidgetProvider(), MonthlyCalendar { } } - for (i in 0..len - 1) { + for (i in 0 until len) { val day = days[i] val id = mRes.getIdentifier("day_$i", "id", packageName) var curTextColor = mWeakTextColor @@ -167,7 +167,7 @@ class MyWidgetMonthlyProvider : AppWidgetProvider(), MonthlyCalendar { } val text = day.value.toString() - if (day.hasEvent) { + if (day.hasEvent()) { val underlinedText = SpannableString(text) underlinedText.setSpan(UnderlineSpan(), 0, text.length, 0) mRemoteViews?.setTextViewText(id, underlinedText) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt index ce4eab27f..8f8cfe30e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt @@ -1,4 +1,6 @@ package com.simplemobiletools.calendar.models -data class DayMonthly(val value: Int, val isThisMonth: Boolean, val isToday: Boolean, val code: String, var hasEvent: Boolean, val weekOfYear: Int, - var eventColors: ArrayList) +data class DayMonthly(val value: Int, val isThisMonth: Boolean, val isToday: Boolean, val code: String, val weekOfYear: Int, var dayEvents: ArrayList) { + + fun hasEvent() = dayEvents.isNotEmpty() +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/views/DayMonthlyView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/views/DayMonthlyView.kt new file mode 100644 index 000000000..b76567719 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/views/DayMonthlyView.kt @@ -0,0 +1,58 @@ +package com.simplemobiletools.calendar.views + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.PorterDuff +import android.graphics.drawable.BitmapDrawable +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import com.simplemobiletools.calendar.R +import com.simplemobiletools.calendar.extensions.config +import com.simplemobiletools.calendar.helpers.LOW_ALPHA +import com.simplemobiletools.calendar.models.DayMonthly +import com.simplemobiletools.commons.extensions.adjustAlpha +import com.simplemobiletools.commons.extensions.getContrastColor +import com.simplemobiletools.commons.extensions.onGlobalLayout + +class DayMonthlyView(context: Context, attrs: AttributeSet, defStyle: Int) : LinearLayout(context, attrs, defStyle) { + constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) + + private var textColor = context.config.textColor + private var weakTextColor = textColor.adjustAlpha(LOW_ALPHA) + + init { + orientation = LinearLayout.VERTICAL + gravity = Gravity.CENTER_HORIZONTAL + } + + fun setDay(day: DayMonthly) { + removeAllViews() + (View.inflate(context, R.layout.day_monthly_item_view, null) as TextView).apply { + setTextColor(if (day.isThisMonth) textColor else weakTextColor) + text = day.value.toString() + gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL + layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) + addView(this) + + if (day.isToday) { + val primaryColor = context.config.primaryColor + setTextColor(primaryColor.getContrastColor()) + + onGlobalLayout { + val height = this@apply.height + if (height > 0) { + val baseDrawable = context.resources.getDrawable(R.drawable.monthly_today_circle) + val bitmap = (baseDrawable as BitmapDrawable).bitmap + val scaledDrawable = BitmapDrawable(resources, Bitmap.createScaledBitmap(bitmap, height, height, true)) + scaledDrawable.setColorFilter(primaryColor, PorterDuff.Mode.SRC_IN) + background = scaledDrawable + } + } + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt index 4750bc660..54c850882 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt @@ -11,7 +11,7 @@ class MyScrollView : ScrollView { constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) - var scrollViewListener: ScrollViewListener? = null + private var scrollViewListener: ScrollViewListener? = null fun setOnScrollviewListener(scrollViewListener: ScrollViewListener) { this.scrollViewListener = scrollViewListener diff --git a/app/src/main/res/drawable-hdpi/monthly_today_circle.png b/app/src/main/res/drawable-hdpi/monthly_today_circle.png new file mode 100644 index 000000000..cdc17dbb8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/monthly_today_circle.png differ diff --git a/app/src/main/res/drawable-xhdpi/monthly_today_circle.png b/app/src/main/res/drawable-xhdpi/monthly_today_circle.png new file mode 100644 index 000000000..7cf5ffb0f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/monthly_today_circle.png differ diff --git a/app/src/main/res/drawable-xxhdpi/monthly_today_circle.png b/app/src/main/res/drawable-xxhdpi/monthly_today_circle.png new file mode 100644 index 000000000..1fdd4fc7f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/monthly_today_circle.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/monthly_today_circle.png b/app/src/main/res/drawable-xxxhdpi/monthly_today_circle.png new file mode 100644 index 000000000..bbd71f592 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/monthly_today_circle.png differ diff --git a/app/src/main/res/layout/day_monthly_item_view.xml b/app/src/main/res/layout/day_monthly_item_view.xml new file mode 100644 index 000000000..511e5a839 --- /dev/null +++ b/app/src/main/res/layout/day_monthly_item_view.xml @@ -0,0 +1,9 @@ + + diff --git a/app/src/main/res/layout/first_row.xml b/app/src/main/res/layout/first_row.xml index cbd21754a..51bb99f21 100644 --- a/app/src/main/res/layout/first_row.xml +++ b/app/src/main/res/layout/first_row.xml @@ -1,9 +1,9 @@ @@ -13,8 +13,8 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - tools:text="#" android:visibility="gone" + tools:text="#" tools:visibility="visible"/> + android:layout_weight="2"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/top_navigation.xml b/app/src/main/res/layout/top_navigation.xml index c4a1839c3..a3ada46ad 100644 --- a/app/src/main/res/layout/top_navigation.xml +++ b/app/src/main/res/layout/top_navigation.xml @@ -10,7 +10,8 @@ android:layout_height="match_parent" android:layout_alignBottom="@+id/top_value" android:layout_alignTop="@+id/top_value" - android:padding="@dimen/activity_margin" + android:paddingLeft="@dimen/activity_margin" + android:paddingRight="@dimen/activity_margin" android:src="@drawable/ic_pointer_left"/>