diff --git a/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java b/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java index 3b95f5a91..1f155696d 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java +++ b/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java @@ -167,7 +167,7 @@ public class DBHelper extends SQLiteOpenHelper { } public void getEvents(int fromTS, int toTS) { - List events = new ArrayList<>(); + final List events = new ArrayList<>(); for (int ts = fromTS; ts <= toTS; ts += Constants.DAY) { events.addAll(getEventsFor(ts)); } diff --git a/app/src/main/java/com/simplemobiletools/calendar/MyWidgetProvider.java b/app/src/main/java/com/simplemobiletools/calendar/MyWidgetProvider.java index d7c132b77..966387261 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/MyWidgetProvider.java +++ b/app/src/main/java/com/simplemobiletools/calendar/MyWidgetProvider.java @@ -104,7 +104,7 @@ public class MyWidgetProvider extends AppWidgetProvider implements Calendar { private void setupButtons() { setupIntent(PREV, R.id.top_left_arrow); setupIntent(NEXT, R.id.top_right_arrow); - setupAppOpenIntent(R.id.top_text); + setupAppOpenIntent(R.id.month_value); } private SharedPreferences initPrefs(Context context) { @@ -161,7 +161,7 @@ public class MyWidgetProvider extends AppWidgetProvider implements Calendar { } private void updateTopViews() { - mRemoteViews.setInt(R.id.top_text, "setTextColor", mTextColor); + mRemoteViews.setInt(R.id.month_value, "setTextColor", mTextColor); Bitmap bmp = getColoredIcon(mContext, mTextColor, R.mipmap.arrow_left); mRemoteViews.setImageViewBitmap(R.id.top_left_arrow, bmp); @@ -171,7 +171,7 @@ public class MyWidgetProvider extends AppWidgetProvider implements Calendar { } public void updateMonth(String month) { - mRemoteViews.setTextViewText(R.id.top_text, month); + mRemoteViews.setTextViewText(R.id.month_value, month); } @Override diff --git a/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java b/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java index ad2bfd4f4..31d0e637f 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java +++ b/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java @@ -43,7 +43,7 @@ import butterknife.OnClick; public class DayActivity extends SimpleActivity implements DBHelper.DBOperationsListener, AdapterView.OnItemClickListener, AbsListView.MultiChoiceModeListener { - @BindView(R.id.top_text) TextView mDateTV; + @BindView(R.id.month_value) TextView mDateTV; @BindView(R.id.day_events) ListView mEventsList; @BindView(R.id.day_coordinator) CoordinatorLayout mCoordinatorLayout; @BindView(R.id.top_left_arrow) ImageView mLeftArrow; @@ -123,7 +123,7 @@ public class DayActivity extends SimpleActivity switchToDay(tomorrowCode); } - @OnClick(R.id.top_text) + @OnClick(R.id.month_value) public void pickDay() { final int theme = mConfig.getIsDarkTheme() ? R.style.MyAlertDialog_Dark : R.style.MyAlertDialog; final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, theme); diff --git a/app/src/main/java/com/simplemobiletools/calendar/fragments/MonthFragment.java b/app/src/main/java/com/simplemobiletools/calendar/fragments/MonthFragment.java deleted file mode 100644 index c52bd6ea1..000000000 --- a/app/src/main/java/com/simplemobiletools/calendar/fragments/MonthFragment.java +++ /dev/null @@ -1,233 +0,0 @@ -package com.simplemobiletools.calendar.fragments; - -import android.content.DialogInterface; -import android.content.Intent; -import android.content.res.Resources; -import android.graphics.Color; -import android.graphics.PorterDuff; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.app.AlertDialog; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.DatePicker; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.NumberPicker; -import android.widget.TextView; - -import com.simplemobiletools.calendar.Calendar; -import com.simplemobiletools.calendar.CalendarImpl; -import com.simplemobiletools.calendar.Config; -import com.simplemobiletools.calendar.Constants; -import com.simplemobiletools.calendar.Formatter; -import com.simplemobiletools.calendar.R; -import com.simplemobiletools.calendar.Utils; -import com.simplemobiletools.calendar.activities.DayActivity; -import com.simplemobiletools.calendar.models.Day; - -import org.joda.time.DateTime; - -import java.util.List; - -import butterknife.BindDimen; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; - -public class MonthFragment extends Fragment implements Calendar { - @BindView(R.id.top_text) TextView mMonthTV; - @BindView(R.id.top_left_arrow) ImageView mLeftArrow; - @BindView(R.id.top_right_arrow) ImageView mRightArrow; - - @BindDimen(R.dimen.day_text_size) float mDayTextSize; - @BindDimen(R.dimen.today_text_size) float mTodayTextSize; - - private View mView; - private CalendarImpl mCalendar; - private Resources mRes; - private Config mConfig; - private NavigationListener mListener; - private String mPackageName; - private String mCode; - - private int mTextColor; - private int mWeakTextColor; - private int mTextColorWithEvent; - private int mWeakTextColorWithEvent; - private boolean mSundayFirst; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mView = inflater.inflate(R.layout.calendar_layout, container, false); - ButterKnife.bind(this, mView); - mRes = getResources(); - - mCode = getArguments().getString(Constants.DAY_CODE); - mConfig = Config.newInstance(getContext()); - mSundayFirst = mConfig.getIsSundayFirst(); - - setupColors(); - - mPackageName = getActivity().getPackageName(); - mDayTextSize /= mRes.getDisplayMetrics().density; - mTodayTextSize /= mRes.getDisplayMetrics().density; - setupLabels(); - - return mView; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mCalendar = new CalendarImpl(this, getContext()); - mCalendar.updateCalendar(Formatter.getDateTimeFromCode(mCode)); - } - - @Override - public void onResume() { - super.onResume(); - if (mConfig.getIsSundayFirst() != mSundayFirst) { - mSundayFirst = mConfig.getIsSundayFirst(); - setupLabels(); - } - } - - @Override - public void updateCalendar(String month, List days) { - mMonthTV.setText(month); - updateDays(days); - } - - public void setListener(NavigationListener listener) { - mListener = listener; - } - - private void setupColors() { - final int baseColor = mConfig.getIsDarkTheme() ? Color.WHITE : Color.BLACK; - mTextColor = Utils.adjustAlpha(baseColor, Constants.HIGH_ALPHA); - mTextColorWithEvent = Utils.adjustAlpha(mRes.getColor(R.color.colorPrimary), Constants.HIGH_ALPHA); - mWeakTextColor = Utils.adjustAlpha(baseColor, Constants.LOW_ALPHA); - mWeakTextColorWithEvent = Utils.adjustAlpha(mRes.getColor(R.color.colorPrimary), Constants.LOW_ALPHA); - mLeftArrow.getDrawable().mutate().setColorFilter(mTextColor, PorterDuff.Mode.SRC_ATOP); - mRightArrow.getDrawable().mutate().setColorFilter(mTextColor, PorterDuff.Mode.SRC_ATOP); - mLeftArrow.setBackground(null); - mRightArrow.setBackground(null); - } - - @OnClick(R.id.top_left_arrow) - public void leftArrowClicked() { - if (mListener != null) - mListener.goLeft(); - } - - @OnClick(R.id.top_right_arrow) - public void rightArrowClicked() { - if (mListener != null) - mListener.goRight(); - } - - @OnClick(R.id.top_text) - public void pickMonth() { - final int theme = mConfig.getIsDarkTheme() ? R.style.MyAlertDialog_Dark : R.style.MyAlertDialog; - final AlertDialog.Builder alertDialog = new AlertDialog.Builder(getContext(), theme); - final View view = getLayoutInflater(getArguments()).inflate(R.layout.date_picker, null); - final DatePicker datePicker = (DatePicker) view.findViewById(R.id.date_picker); - hideDayPicker(datePicker); - - final DateTime dateTime = new DateTime(mCalendar.getTargetDate().toString()); - datePicker.init(dateTime.getYear(), dateTime.getMonthOfYear() - 1, 1, null); - - alertDialog.setView(view); - alertDialog.setNegativeButton(R.string.cancel, null); - alertDialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - final int month = datePicker.getMonth() + 1; - final int year = datePicker.getYear(); - if (mListener != null) - mListener.goToDateTime(new DateTime().withMonthOfYear(month).withYear(year)); - } - }); - - alertDialog.show(); - } - - private void hideDayPicker(DatePicker datePicker) { - final LinearLayout ll = (LinearLayout) datePicker.getChildAt(0); - final LinearLayout ll2 = (LinearLayout) ll.getChildAt(0); - final NumberPicker picker1 = (NumberPicker) ll2.getChildAt(0); - final NumberPicker picker2 = (NumberPicker) ll2.getChildAt(1); - final NumberPicker dayPicker = (picker1.getMaxValue() > picker2.getMaxValue()) ? picker1 : picker2; - dayPicker.setVisibility(View.GONE); - } - - private void setupLabels() { - int letters[] = Utils.getLetterIDs(); - - for (int i = 0; i < 7; i++) { - final TextView dayTV = (TextView) mView.findViewById(mRes.getIdentifier("label_" + i, "id", mPackageName)); - if (dayTV != null) { - dayTV.setTextSize(mDayTextSize); - dayTV.setTextColor(mWeakTextColor); - - int index = i; - if (!mSundayFirst) - index = (index + 1) % letters.length; - - dayTV.setText(getString(letters[index])); - } - } - } - - private void updateDays(List days) { - final int len = days.size(); - - for (int i = 0; i < len; i++) { - final Day day = days.get(i); - final TextView dayTV = (TextView) mView.findViewById(mRes.getIdentifier("day_" + i, "id", mPackageName)); - if (dayTV == null) - continue; - - int curTextColor = day.getHasEvent() ? mWeakTextColorWithEvent : mWeakTextColor; - float curTextSize = mDayTextSize; - - if (day.getIsThisMonth()) { - curTextColor = day.getHasEvent() ? mTextColorWithEvent : mTextColor; - } - - if (day.getIsToday()) { - curTextSize = mTodayTextSize; - } - - dayTV.setText(String.valueOf(day.getValue())); - dayTV.setTextColor(curTextColor); - dayTV.setTextSize(curTextSize); - - dayTV.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openDay(day.getCode()); - } - }); - } - } - - private void openDay(String code) { - if (code.isEmpty()) - return; - - final Intent intent = new Intent(getContext(), DayActivity.class); - intent.putExtra(Constants.DAY_CODE, code); - startActivity(intent); - } - - public interface NavigationListener { - void goLeft(); - - void goRight(); - - void goToDateTime(DateTime dateTime); - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt new file mode 100644 index 000000000..f9849773c --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt @@ -0,0 +1,194 @@ +package com.simplemobiletools.calendar.fragments + +import android.content.Intent +import android.content.res.Resources +import android.graphics.Color +import android.graphics.PorterDuff +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v7.app.AlertDialog +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.* +import com.simplemobiletools.calendar.* +import com.simplemobiletools.calendar.activities.DayActivity +import com.simplemobiletools.calendar.models.Day +import kotlinx.android.synthetic.main.calendar_layout.view.* +import kotlinx.android.synthetic.main.top_navigation.view.* +import org.joda.time.DateTime + +class MonthFragment : Fragment(), Calendar { + private var mDayTextSize: Float = 0f + private var mTodayTextSize: Float = 0f + private var mPackageName: String = "" + private var mTextColor: Int = 0 + private var mWeakTextColor: Int = 0 + private var mTextColorWithEvent: Int = 0 + private var mWeakTextColorWithEvent: Int = 0 + private var mSundayFirst: Boolean = false + private var mCode: String = "" + + private var mCalendar: CalendarImpl? = null + private var mListener: NavigationListener? = null + + lateinit var mRes: Resources + lateinit var mHolder: RelativeLayout + lateinit var mConfig: Config + + override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val view = inflater!!.inflate(R.layout.calendar_layout, container, false) + mRes = resources + + mHolder = view.calendar_holder + mCode = arguments.getString(Constants.DAY_CODE) + mConfig = Config.newInstance(context) + mSundayFirst = mConfig.isSundayFirst + + setupColors() + + mPackageName = activity.packageName + mDayTextSize = mRes.getDimension(R.dimen.day_text_size) / mRes.displayMetrics.density + mTodayTextSize = mRes.getDimension(R.dimen.today_text_size) / mRes.displayMetrics.density + setupLabels() + + return view + } + + override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mCalendar = CalendarImpl(this, context) + mCalendar!!.updateCalendar(Formatter.getDateTimeFromCode(mCode)) + } + + override fun onResume() { + super.onResume() + if (mConfig.isSundayFirst != mSundayFirst) { + mSundayFirst = mConfig.isSundayFirst + setupLabels() + } + } + + override fun updateCalendar(month: String, days: List) { + mHolder.month_value.text = month + updateDays(days) + } + + fun setListener(listener: NavigationListener) { + mListener = listener + } + + private fun setupColors() { + val baseColor = if (mConfig.isDarkTheme) Color.WHITE else Color.BLACK + mTextColor = Utils.adjustAlpha(baseColor, Constants.HIGH_ALPHA) + mTextColorWithEvent = Utils.adjustAlpha(mRes.getColor(R.color.colorPrimary), Constants.HIGH_ALPHA) + mWeakTextColor = Utils.adjustAlpha(baseColor, Constants.LOW_ALPHA) + mWeakTextColorWithEvent = Utils.adjustAlpha(mRes.getColor(R.color.colorPrimary), Constants.LOW_ALPHA) + mHolder.top_left_arrow.drawable.mutate().setColorFilter(mTextColor, PorterDuff.Mode.SRC_ATOP) + mHolder.top_right_arrow.drawable.mutate().setColorFilter(mTextColor, PorterDuff.Mode.SRC_ATOP) + mHolder.top_left_arrow.background = null + mHolder.top_right_arrow.background = null + + mHolder.top_left_arrow.setOnClickListener { + if (mListener != null) + mListener!!.goLeft() + } + + mHolder.top_right_arrow.setOnClickListener { + if (mListener != null) + mListener!!.goRight() + } + + mHolder.month_value.setOnClickListener { showMonthDialog() } + } + + fun showMonthDialog() { + val theme = if (mConfig.isDarkTheme) R.style.MyAlertDialog_Dark else R.style.MyAlertDialog + val alertDialog = AlertDialog.Builder(context, theme) + val view = getLayoutInflater(arguments).inflate(R.layout.date_picker, null) + val datePicker = view.findViewById(R.id.date_picker) as DatePicker + hideDayPicker(datePicker) + + val dateTime = DateTime(mCalendar!!.targetDate.toString()) + datePicker.init(dateTime.year, dateTime.monthOfYear - 1, 1, null) + + alertDialog.setView(view) + alertDialog.setNegativeButton(R.string.cancel, null) + alertDialog.setPositiveButton(R.string.ok) { dialog, id -> + val month = datePicker.month + 1 + val year = datePicker.year + if (mListener != null) + mListener!!.goToDateTime(DateTime().withMonthOfYear(month).withYear(year)) + } + + alertDialog.show() + } + + private fun hideDayPicker(datePicker: DatePicker) { + val ll = datePicker.getChildAt(0) as LinearLayout + val ll2 = ll.getChildAt(0) as LinearLayout + val picker1 = ll2.getChildAt(0) as NumberPicker + val picker2 = ll2.getChildAt(1) as NumberPicker + val dayPicker = if (picker1.maxValue > picker2.maxValue) picker1 else picker2 + dayPicker.visibility = View.GONE + } + + private fun setupLabels() { + val letters = Utils.getLetterIDs() + + for (i in 0..6) { + val dayTV = mHolder.findViewById(mRes.getIdentifier("label_" + i, "id", mPackageName)) as TextView + dayTV.textSize = mDayTextSize + dayTV.setTextColor(mWeakTextColor) + + var index = i + if (!mSundayFirst) + index = (index + 1) % letters.size + + dayTV.text = getString(letters[index]) + } + } + + private fun updateDays(days: List) { + val len = days.size + + for (i in 0..len - 1) { + val day = days[i] + val dayTV = mHolder.findViewById(mRes.getIdentifier("day_" + i, "id", mPackageName)) as TextView + + var curTextColor = if (day.hasEvent) mWeakTextColorWithEvent else mWeakTextColor + var curTextSize = mDayTextSize + + if (day.isThisMonth) { + curTextColor = if (day.hasEvent) mTextColorWithEvent else mTextColor + } + + if (day.isToday) { + curTextSize = mTodayTextSize + } + + dayTV.text = day.value.toString() + dayTV.setTextColor(curTextColor) + dayTV.textSize = curTextSize + + dayTV.setOnClickListener { openDay(day.code) } + } + } + + private fun openDay(code: String) { + if (code.isEmpty()) + return + + val intent = Intent(context, DayActivity::class.java) + intent.putExtra(Constants.DAY_CODE, code) + startActivity(intent) + } + + interface NavigationListener { + fun goLeft() + + fun goRight() + + fun goToDateTime(dateTime: DateTime) + } +} diff --git a/app/src/main/res/layout/activity_day.xml b/app/src/main/res/layout/activity_day.xml index 35709e197..b49418b27 100644 --- a/app/src/main/res/layout/activity_day.xml +++ b/app/src/main/res/layout/activity_day.xml @@ -18,7 +18,7 @@ android:id="@+id/day_events" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@+id/top_text" + android:layout_below="@+id/month_value" android:choiceMode="multipleChoiceModal" android:clipToPadding="false" android:paddingLeft="@dimen/activity_margin"/> diff --git a/app/src/main/res/layout/calendar_layout.xml b/app/src/main/res/layout/calendar_layout.xml index ee9d1fade..584c76887 100644 --- a/app/src/main/res/layout/calendar_layout.xml +++ b/app/src/main/res/layout/calendar_layout.xml @@ -12,7 +12,7 @@ android:id="@+id/table_holder" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_below="@+id/top_text" + android:layout_below="@+id/month_value" android:gravity="center" android:orientation="vertical"> diff --git a/app/src/main/res/layout/top_navigation.xml b/app/src/main/res/layout/top_navigation.xml index 4114f43f9..adf6e179f 100644 --- a/app/src/main/res/layout/top_navigation.xml +++ b/app/src/main/res/layout/top_navigation.xml @@ -8,13 +8,13 @@ style="@style/ArrowStyle" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_alignBottom="@+id/top_text" - android:layout_alignTop="@+id/top_text" + android:layout_alignBottom="@+id/month_value" + android:layout_alignTop="@+id/month_value" android:padding="@dimen/activity_margin" android:src="@mipmap/arrow_left"/>