From efd77aed419a7b0d1805fee9f62fc822d6e9f12f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 7 Oct 2017 17:17:47 +0200 Subject: [PATCH] change the monthly view layout --- app/build.gradle | 2 +- .../WidgetMonthlyConfigureActivity.kt | 10 +- .../calendar/fragments/MonthFragment.kt | 43 +--- .../calendar/helpers/MonthlyCalendarImpl.kt | 41 ++-- .../helpers/MyWidgetMonthlyProvider.kt | 4 +- .../calendar/models/DayMonthly.kt | 6 +- .../calendar/views/DayMonthlyView.kt | 58 +++++ .../calendar/views/MyScrollView.kt | 2 +- .../drawable-hdpi/monthly_today_circle.png | Bin 0 -> 465 bytes .../drawable-xhdpi/monthly_today_circle.png | Bin 0 -> 695 bytes .../drawable-xxhdpi/monthly_today_circle.png | Bin 0 -> 960 bytes .../drawable-xxxhdpi/monthly_today_circle.png | Bin 0 -> 922 bytes .../main/res/layout/day_monthly_item_view.xml | 9 + app/src/main/res/layout/first_row.xml | 4 +- app/src/main/res/layout/fragment_month.xml | 227 ++++++++---------- app/src/main/res/layout/top_navigation.xml | 10 +- 16 files changed, 207 insertions(+), 209 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/views/DayMonthlyView.kt create mode 100644 app/src/main/res/drawable-hdpi/monthly_today_circle.png create mode 100644 app/src/main/res/drawable-xhdpi/monthly_today_circle.png create mode 100644 app/src/main/res/drawable-xxhdpi/monthly_today_circle.png create mode 100644 app/src/main/res/drawable-xxxhdpi/monthly_today_circle.png create mode 100644 app/src/main/res/layout/day_monthly_item_view.xml 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 0000000000000000000000000000000000000000..cdc17dbb8ba772cd20d15fad0b83f1ce1957c70c GIT binary patch literal 465 zcmV;?0WSWDP)?0GS-(keoVbLR8^^9w2fD1UO;FWY7TxKx8N1!ATxC zJOapry#?0523P^FX0~s-#-$A; z^Uj>3Jan)FnF4sfsIJ%N$;?&&huig%N#^t0(ezjFBAp;1Penh}60_NHBC znVN?{Y?NLY24dItLJ^1&!VBF%%rjo-nWPWkF1Ja=XR{b^0|GI2dSM%g8Q2T!Kn&zw z*aYHq;DwdH)=|w(v)m@Y%*^)nXFtiR5}CkpVqB0f6TO+)b1LL3!d4f?8Dz$_%n9-~ z231mi2E|0m$0(hY&&OdyBIe^b<_EEx99Y@;M^40AJ<|IE_OBc;T4oDy00000NkvXX Hu0mjfmQleR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7cf5ffb0f167e7047ad7f95625b93c9a70b6152d GIT binary patch literal 695 zcmV;o0!aOdP)0HaxlrsO^rT2Z1z$i&5ACTC^BB@s@Z!-2@Hr%&dTAdZg@6j; zwFGJ`c(#e~_wY?hx=D>+U@pt<@cWpZotf`j$DBy20ySU{SO<21E#L$2Cfs%p zTmv`2CC~#pK-W3fpVy%flGY@Bl5{5Nr=-4KPCqS4np{glBOV`rKTm zctuiEQb*EYf$~EJq3@=o%A(~rB(;_xJ&l&6jYY}VCACYGAJUdopGUkRsS!auOG8Co zsqo-!WO>OP8q+-86!|*vJ$Ka0<)d@%NA{x6UXV?mlTwuOaiUohTlU_U`L)SQOPTqQ z9f2>Qttw-F{{oP$f=6W=72rrCEB5FJdg2pV`nvmRm zed%?8aN_~C&4^78IG7~=EK0q^G!jUfMZQcB>6TeXf=IW}oe3n(UkxS%vJyXgOk4+Y d1`_pmn%4|`ZsLX!Xh002ovPDHLkV1kKeH0S^T literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1fdd4fc7fb3b504a079935fcb15841158395edb8 GIT binary patch literal 960 zcmV;x13&zUP)<471u4(J5BfdbG6 zi~z&HAkZI;1AGH^fzQAu@B!G1#`l2(=bVz%=aRaRq-($cFbWI-6VcBr7rfLlW_}s? z2&@A|=iIL(bk=QH(sf`A7zgeG59_^V4J*J~U=>(%&izRE`sYW|9Z4@GeUfyja2!h7 zioWYk7Dl@y%}UypbQI8NEl1IJ&PwV^!)S-3N0K&DGEcnYO~eot)2XPjtaXXHoT5T7N1V@(G+2^;KHUQ`uVnT4{fV z*$&_-@c2@Ht!#M$Jd;g`P7!MuxDQMMS3{`^NIRzeUfhSLrk1i7`YYg8SY5$+4?J+r zeXkyjtMD|zpo7$|tGZ+y{KYBSOX^m(jFo)<Gsp`cJeH|A&RR(d90Pmhr*s}}>rJAk^gb3KX?2!?eGeR9X_;2%BXHoO9Mn3N zmT6U1fOY4b%2UfC77Z$8CMg^x%v%wnHf;N;h zX5s9N$7}4?ZpPPC3Df>2?!#Ea&bgn!0)sMQ}mY?4YR z8!oLf-6M iZjF6Vs}?o*QM})1nbu|-A`4jn0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00RO^L_t(|+U=abP8&fGhkvtj z3KW!r6hwd&rGUal4pgKdFM+Ulgfw}I)KG#%i^~Adk(3}o0YyMcP$+PLf>L1Vm*U3B znfv3lW3cabzS6dA-KUxJ+|KL@o*0tP0lWrK1yBc21F!&K2EYsb*e!r70A~PB02~82 z1#l@McPJAiDvs$hStEdX^9 z`SECiNLICQD>5|^IraUp>qE{`3FH94iC)X_BB&&hGf*Unhn!ge-%(EHdfk(x*T0p@ znJTHEmP-0P=sjq+#B!k5wmVP+X@T__VbBnfeQ!ZpqW?r#yb_UX-xS+Hco@q9xG~xdiY=M3|Lgs{zY_Ui)fZ1RWt-NDrA~5qX;sr0cq8FaTgd zM9v?k*a!2HbRil&6#)0iuTHX znU7Q^UEqab&%)6mnzAs`sXD8ibE!K-^EpO3HHT<;$;f!*aEK+Aqt!I6~ipFSo z;XM8{ALpa_>2_cPRNdqcQ0W^R0Y}e9TuxewL1*+rtcwmG&L<{PES73E2AmZ^8b#Lt z8Ue{^q{+z?q>}alGy{;+%$l;#OtDz11;3fawnO#U4%M?Sre9FT{(a47|EgExPO} wj)x>WV5tvTc0`w_s6rp|CL<75sAB^E0OtX=b&s3^vj6}907*qoM6N<$g5BYcssI20 literal 0 HcmV?d00001 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"/>