/*
* 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;
import android.content.*;
import android.content.res.*;
import android.support.annotation.*;
import android.support.v7.widget.Toolbar;
import android.view.*;
import android.widget.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.activities.habits.list.views.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.utils.*;
import javax.inject.*;
import butterknife.*;
@ActivityScope
public class ListHabitsRootView extends BaseRootView
implements ModelObservable.Listener, TaskRunner.Listener
{
public static final int MAX_CHECKMARK_COUNT = 60;
@BindView(R.id.listView)
HabitCardListView listView;
@BindView(R.id.llEmpty)
ViewGroup llEmpty;
@BindView(R.id.tvStarEmpty)
TextView tvStarEmpty;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.progressBar)
ProgressBar progressBar;
@BindView(R.id.hintView)
HintView hintView;
@BindView(R.id.header)
HeaderView header;
@NonNull
private final HabitCardListAdapter listAdapter;
private final TaskRunner runner;
@Inject
public ListHabitsRootView(@ActivityContext Context context,
@NonNull HintListFactory hintListFactory,
@NonNull HabitCardListAdapter listAdapter,
@NonNull TaskRunner runner)
{
super(context);
addView(inflate(getContext(), R.layout.list_habits, null));
ButterKnife.bind(this);
this.listAdapter = listAdapter;
listView.setAdapter(listAdapter);
listAdapter.setListView(listView);
this.runner = runner;
progressBar.setIndeterminate(true);
tvStarEmpty.setTypeface(InterfaceUtils.getFontAwesome(getContext()));
String hints[] =
getContext().getResources().getStringArray(R.array.hints);
HintList hintList = hintListFactory.create(hints);
hintView.setHints(hintList);
initToolbar();
}
@NonNull
@Override
public Toolbar getToolbar()
{
return toolbar;
}
@Override
public void onModelChange()
{
updateEmptyView();
}
@Override
public void onTaskFinished(Task task)
{
updateProgressBar();
}
@Override
public void onTaskStarted(Task task)
{
updateProgressBar();
}
public void setController(@NonNull ListHabitsController controller,
@NonNull ListHabitsSelectionMenu menu)
{
HabitCardListController listController =
new HabitCardListController(listAdapter);
listController.setHabitListener(controller);
listController.setSelectionListener(menu);
listView.setController(listController);
menu.setListController(listController);
header.setScrollController(new ScrollableChart.ScrollController() {
@Override
public void onDataOffsetChanged(int newDataOffset)
{
listView.setDataOffset(newDataOffset);
}
});
}
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
runner.addListener(this);
updateProgressBar();
listAdapter.getObservable().addListener(this);
}
@Override
protected void onDetachedFromWindow()
{
listAdapter.getObservable().removeListener(this);
runner.removeListener(this);
super.onDetachedFromWindow();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
int count = getCheckmarkCount();
header.setButtonCount(count);
header.setMaxDataOffset(Math.max(MAX_CHECKMARK_COUNT - count, 0));
listView.setCheckmarkCount(count);
super.onSizeChanged(w, h, oldw, oldh);
}
private int getCheckmarkCount()
{
Resources res = getResources();
float labelWidth = Math.max(getMeasuredWidth() / 3, res.getDimension(R.dimen.habitNameWidth));
float buttonWidth = res.getDimension(R.dimen.checkmarkWidth);
return Math.min(MAX_CHECKMARK_COUNT, Math.max(0,
(int) ((getMeasuredWidth() - labelWidth) / buttonWidth)));
}
private void updateEmptyView()
{
llEmpty.setVisibility(
listAdapter.getItemCount() > 0 ? View.GONE : View.VISIBLE);
}
private void updateProgressBar()
{
postDelayed(() -> {
int activeTaskCount = runner.getActiveTaskCount();
int newVisibility = activeTaskCount > 0 ? VISIBLE : GONE;
if (progressBar.getVisibility() != newVisibility)
progressBar.setVisibility(newVisibility);
}, 500);
}
}