/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.activities.habits.list.views;
import android.content.*;
import android.support.annotation.*;
import android.util.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.habits.list.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.utils.*;
import static android.view.View.MeasureSpec.*;
public class CheckmarkPanelView extends LinearLayout implements Preferences.Listener
{
private static final int CHECKMARK_LEFT_TO_RIGHT = 0;
private static final int CHECKMARK_RIGHT_TO_LEFT = 1;
@Nullable
private Preferences prefs;
private int checkmarkValues[];
private int nButtons;
private int color;
private Controller controller;
@NonNull
private Habit habit;
private int dataOffset;
public CheckmarkPanelView(Context context)
{
super(context);
init();
}
public CheckmarkPanelView(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public CheckmarkButtonView indexToButton(int i)
{
int position = i;
if (getCheckmarkOrder() == CHECKMARK_RIGHT_TO_LEFT)
position = nButtons - i - 1;
return (CheckmarkButtonView) getChildAt(position);
}
public void setButtonCount(int newButtonCount)
{
if(nButtons != newButtonCount)
{
nButtons = newButtonCount;
addCheckmarkButtons();
}
setupCheckmarkButtons();
}
public void setCheckmarkValues(int[] checkmarkValues)
{
this.checkmarkValues = checkmarkValues;
setupCheckmarkButtons();
}
public void setColor(int color)
{
this.color = color;
setupCheckmarkButtons();
}
public void setController(Controller controller)
{
this.controller = controller;
setupCheckmarkButtons();
}
public void setDataOffset(int dataOffset)
{
this.dataOffset = dataOffset;
setupCheckmarkButtons();
}
public void setHabit(@NonNull Habit habit)
{
this.habit = habit;
setupCheckmarkButtons();
}
@Override
protected void onMeasure(int widthSpec, int heightSpec)
{
float buttonWidth = getResources().getDimension(R.dimen.checkmarkWidth);
float buttonHeight =
getResources().getDimension(R.dimen.checkmarkHeight);
float width = buttonWidth * nButtons;
widthSpec = makeMeasureSpec((int) width, EXACTLY);
heightSpec = makeMeasureSpec((int) buttonHeight, EXACTLY);
super.onMeasure(widthSpec, heightSpec);
}
private void addCheckmarkButtons()
{
removeAllViews();
for (int i = 0; i < nButtons; i++)
addView(new CheckmarkButtonView(getContext()));
}
private int getCheckmarkOrder()
{
if (prefs == null) return CHECKMARK_LEFT_TO_RIGHT;
return prefs.shouldReverseCheckmarks() ? CHECKMARK_RIGHT_TO_LEFT :
CHECKMARK_LEFT_TO_RIGHT;
}
private void init()
{
Context appContext = getContext().getApplicationContext();
if(appContext instanceof HabitsApplication)
{
HabitsApplication app = (HabitsApplication) appContext;
prefs = app.getComponent().getPreferences();
}
setWillNotDraw(false);
}
private void setupButtonControllers(long timestamp,
CheckmarkButtonView buttonView)
{
if (controller == null) return;
if (!(getContext() instanceof ListHabitsActivity)) return;
ListHabitsActivity activity = (ListHabitsActivity) getContext();
CheckmarkButtonControllerFactory buttonControllerFactory = activity
.getListHabitsComponent()
.getCheckmarkButtonControllerFactory();
CheckmarkButtonController buttonController =
buttonControllerFactory.create(habit, timestamp);
buttonController.setListener(controller);
buttonController.setView(buttonView);
buttonView.setController(buttonController);
}
private void setupCheckmarkButtons()
{
long timestamp = DateUtils.getStartOfToday();
long day = DateUtils.millisecondsInOneDay;
timestamp -= day * dataOffset;
for (int i = 0; i < nButtons; i++)
{
CheckmarkButtonView buttonView = indexToButton(i);
if(i + dataOffset >= checkmarkValues.length) break;
buttonView.setValue(checkmarkValues[i + dataOffset]);
buttonView.setColor(color);
setupButtonControllers(timestamp, buttonView);
timestamp -= day;
}
}
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
if(prefs != null) prefs.addListener(this);
}
@Override
protected void onDetachedFromWindow()
{
if(prefs != null) prefs.removeListener(this);
super.onDetachedFromWindow();
}
@Override
public void onCheckmarkOrderChanged()
{
setupCheckmarkButtons();
}
public interface Controller extends CheckmarkButtonController.Listener
{
}
}