/*
* Copyright 2015 Daniel Dittmar
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package dan.dit.whatsthat.riddle;
import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewFlipper;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import dan.dit.whatsthat.R;
import dan.dit.whatsthat.util.ui.ViewFlipperManager;
/**
* Created by daniel on 03.05.15.
*/
public class UnsolvedRiddlesChooser {
private List<Riddle> mAllRiddlesList;
private List<Long> mSelectedIds;
private View mView;
private static final Calendar CALENDAR_CHECKER1 = Calendar.getInstance();
private static final Calendar CALENDAR_CHECKER2 = Calendar.getInstance();
private long mIdToHide;
private UnsolvedFlipper mUnsolvedFlipper;
private String[] mTimesOfDay;
private UnsolvedRiddleSelectionChangeListener mUnsolvedRiddleSelectionListener;
private TextView mUnsolvedRiddleDate;
private Resources mResources;
public int getSelectedRiddlesCount() {
return mSelectedIds == null ? 0 : mSelectedIds.contains(mIdToHide) ? mSelectedIds.size() - 1 : mSelectedIds.size();
}
public interface Callback {
void openUnsolvedRiddle(Collection<Long> toOpenIds);
}
public interface UnsolvedRiddleSelectionChangeListener {
void onUnsolvedRiddleSelectionChanged();
}
public Collection<Long> getSelectedRiddles() {
if (mIdToHide != Riddle.NO_ID && mSelectedIds.size() > 0) {
mSelectedIds.add(mIdToHide);
}
return mSelectedIds;
}
public View makeView(Context context, long idToHide, UnsolvedRiddleSelectionChangeListener listener) {
if (mView != null) {
return mView;
}
mResources = context.getResources();
mTimesOfDay = mResources.getStringArray(R.array.date_time_of_day);
mUnsolvedRiddleSelectionListener = listener;
mIdToHide = idToHide;
mAllRiddlesList = new ArrayList<>(RiddleInitializer.INSTANCE.getRiddleManager().getUnsolvedRiddles());
for (int i = 0; i < mAllRiddlesList.size(); i++) {
if (mAllRiddlesList.get(i).getId() == idToHide) {
mAllRiddlesList.remove(i);
break;
}
}
View baseView = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.unsolved_riddles, null);
mView = baseView;
final TextView titleView = ((TextView) baseView.findViewById(R.id.unsolved_riddles_title));
titleView.setText(mResources.getQuantityString(R.plurals.unsolved_riddles_title, mAllRiddlesList.size(), mAllRiddlesList.size()));
titleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
titleView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
mUnsolvedRiddleDate.setVisibility(View.VISIBLE);
mUnsolvedFlipper.setVisibility(View.VISIBLE);
}
});
mUnsolvedRiddleDate = (TextView) baseView.findViewById(R.id.unsolved_riddle_date);
mUnsolvedFlipper = (UnsolvedFlipper) baseView.findViewById(R.id.unsolved_flipper);
mSelectedIds = new LinkedList<>();
mUnsolvedFlipper.init(this);
return baseView;
}
public static class UnsolvedFlipper extends ViewFlipperManager {
private UnsolvedRiddlesChooser mChooser;
public UnsolvedFlipper(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UnsolvedFlipper(Context context) {
super(context);
}
public UnsolvedFlipper(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void addViews(LayoutInflater inflater, ViewFlipper flipper) {
for (int i = 0; i < mChooser.mAllRiddlesList.size(); i++) {
Riddle curr = mChooser.mAllRiddlesList.get(i);
ImageView icon = (ImageView) inflater.inflate(R.layout.unsolved_riddle, null);
icon.setImageDrawable(curr.getSnapshot(getResources()));
flipper.addView(icon);
}
}
@Override
public void onDisplayedChildChanged(View displayed) {
Riddle current = mChooser.mAllRiddlesList.get(getDisplayedChild());
if (current == null) {
return;
}
mChooser.mUnsolvedRiddleDate.setText(mChooser.getDate(new Date(current.getTimestamp())));
if (mChooser.mSelectedIds.contains(current.getId())) {
mChooser.mUnsolvedRiddleDate.setTextColor(getResources().getColor(R.color.riddle_type_selected));
((ImageView) displayed.findViewById(R.id.riddle_icon)).setImageResource(R.drawable.accept);
} else {
mChooser.mUnsolvedRiddleDate.setTextColor(getResources().getColor(R.color.riddle_type_unselected));
((ImageView) displayed.findViewById(R.id.riddle_icon)).setImageDrawable(current.getSnapshot(mChooser.mResources));
}
}
private void init(UnsolvedRiddlesChooser chooser) {
mChooser = chooser;
init(0);
}
@Override
protected boolean onContentTouched(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
int displayedChild = getDisplayedChild();
if (displayedChild >= 0 && displayedChild < mChooser.mAllRiddlesList.size()) {
Riddle riddle = mChooser.mAllRiddlesList.get(displayedChild);
long id = riddle == null ? Riddle.NO_ID : riddle.getId();
if (!mChooser.mSelectedIds.remove(id)) {
mChooser.mSelectedIds.add(id);
}
mChooser.mUnsolvedRiddleSelectionListener.onUnsolvedRiddleSelectionChanged();
onDisplayedChildChanged(getDisplayedChildView());
return true;
}
} else if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
return true;
}
return false;
}
}
private static int getDaysBeforeToday(Date toCheck, Date today) {
CALENDAR_CHECKER1.setTime(toCheck);
CALENDAR_CHECKER2.setTime(today);
return CALENDAR_CHECKER2.get(Calendar.DAY_OF_YEAR) - CALENDAR_CHECKER1.get(Calendar.DAY_OF_YEAR)
+ (CALENDAR_CHECKER2.get(Calendar.YEAR) - CALENDAR_CHECKER1.get(Calendar.YEAR)) * 365;
}
private String getDate(Date startDate) {
Date today = new Date();
CALENDAR_CHECKER1.setTime(startDate);
int hour = CALENDAR_CHECKER1.get(Calendar.HOUR_OF_DAY);
int timeOfDay;
if (hour < 6 || hour > 22) {
timeOfDay = 0; // night from 23 to 5
} else if (hour > 18) {
timeOfDay = 1; // evening from 19 to 22
} else if (hour > 14) {
timeOfDay = 2; // afternoon from 15 to 18
} else if (hour > 11) {
timeOfDay = 3; // midday from 12 to 14
} else if (hour > 5) {
timeOfDay = 4; // morning from 6 to 11
} else {
timeOfDay = 0; // if not sure, its night..
}
String time = mTimesOfDay != null && timeOfDay < mTimesOfDay.length ? mTimesOfDay[timeOfDay] : String.valueOf(hour + ":" + CALENDAR_CHECKER1.get(Calendar.MINUTE));
int dayDiff = getDaysBeforeToday(startDate, today);
if (dayDiff == 0) {
return (mResources.getString(R.string.date_today, time));
} else if (dayDiff == 1) {
return (mResources.getString(R.string.date_yesterday, time));
} else {
return (mResources.getQuantityString(R.plurals.riddle_dialog_unsolved_days_ago, dayDiff, dayDiff, time));
}
}
}