package com.wigwamlabs.veckify;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Typeface;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import com.wigwamlabs.spotify.Playlist;
import com.wigwamlabs.spotify.PlaylistProvider;
import com.wigwamlabs.veckify.db.AlarmEntry;
import com.wigwamlabs.veckify.db.AlarmsCursor;
import java.util.ArrayList;
class AlarmAdapter extends CursorAdapter {
private final Callback mCallback;
private final ArrayList<Long> mDeletedItems = new ArrayList<Long>();
private boolean mEnablePlaylistPickers;
private PlaylistProvider mPlaylistProvider;
public AlarmAdapter(Context context, Callback callback) {
super(context, null, 0);
mCallback = callback;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final ViewGroup view = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.item_alarm, parent, false);
view.setTag(new ViewHolder(view, mCallback));
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
final AlarmsCursor alarm = (AlarmsCursor) cursor;
int targetHeight = ViewGroup.LayoutParams.WRAP_CONTENT;
if (isItemDeleted(alarm)) {
targetHeight = 1;
} else {
final ViewHolder vh = (ViewHolder) view.getTag();
vh.update(alarm, mEnablePlaylistPickers, mPlaylistProvider);
}
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp.height != targetHeight) {
lp.height = targetHeight;
view.setLayoutParams(lp);
}
}
private boolean isItemDeleted(AlarmsCursor alarm) {
final long id = alarm._id();
for (long deleted : mDeletedItems) {
if (id == deleted) {
return true;
}
}
return false;
}
public void setEnablePlaylistPickers(boolean enable) {
if (enable != mEnablePlaylistPickers) {
mEnablePlaylistPickers = enable;
notifyDataSetChanged();
}
}
public void setItemsDeleted(long[] ids) {
// we should eventually clear out the deleted items array,
// but we don't expect too many deleted items so for consistency it's safer to keep it around
for (long id : ids) {
mDeletedItems.add(id);
}
notifyDataSetChanged();
}
public void setItemsUndeleted(long[] ids) {
for (Long id : ids) {
mDeletedItems.remove(id);
}
notifyDataSetChanged();
}
public void setPlaylistProvider(PlaylistProvider playlistProvider) {
mPlaylistProvider = playlistProvider;
}
public interface Callback {
void onAlarmEntryChanged(long alarmId, AlarmEntry entry, boolean enableIfPossible);
void onPickTime(long alarmId, AlarmEntry entry);
void onPickPlaylist(long alarmId, AlarmEntry entry, String playlistLink);
void onPickRepeatDays(long alarmId, AlarmEntry entry);
void onPickVolume(long alarmId, AlarmEntry entry);
void onSetTts(long alarmId, AlarmEntry entry);
boolean onDownloadPlaylist(String playlistLink);
}
private static class ViewHolder {
private final Context mContext;
private final Callback mCallback;
private final TextView mTimeView;
private final TextView mPlaylistName;
private final ImageButton mEnabledToggle;
private final TextView mRepeatSchedule;
private final ImageButton mRepeatShuffleToggle;
private final ImageButton mVolumeButton;
private final ImageButton mTellTimeToggle;
private final View mRunNowButton;
private final TextView mTimeToAlarm;
private final View mDownloadPlaylist;
private final AlarmEntry mEntry = new AlarmEntry();
private long mAlarmId;
private String mPlaylistLink;
private Integer mTime;
private Pair<Intent, Intent> mIntents;
private boolean mShuffle;
private Integer mVolume;
private boolean mUpdating;
private boolean mTellTime;
public ViewHolder(ViewGroup view, Callback callback) {
mContext = view.getContext();
mCallback = callback;
// time to alarm
mTimeToAlarm = (TextView) view.findViewById(R.id.timeToAlarm);
// time
mTimeView = (TextView) view.findViewById(R.id.time);
mTimeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallback.onPickTime(mAlarmId, mEntry);
}
});
// playlist
mPlaylistName = (TextView) view.findViewById(R.id.playlistName);
mPlaylistName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallback.onPickPlaylist(mAlarmId, mEntry, mPlaylistLink);
}
});
// download
mDownloadPlaylist = view.findViewById(R.id.downloadPlaylist);
mDownloadPlaylist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback.onDownloadPlaylist(mPlaylistLink)) {
mDownloadPlaylist.setVisibility(View.GONE);
}
}
});
// enabled
mEnabledToggle = (ImageButton) view.findViewById(R.id.enabled);
mEnabledToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEntry.setEnabled(!mEntry.isEnabled());
mCallback.onAlarmEntryChanged(mAlarmId, mEntry, false);
}
});
// repeat schedule
mRepeatSchedule = (TextView) view.findViewById(R.id.repeatSchedule);
mRepeatSchedule.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallback.onPickRepeatDays(mAlarmId, mEntry);
}
});
// repeat/shuffle
mRepeatShuffleToggle = (ImageButton) view.findViewById(R.id.repeatShuffleToggle);
mRepeatShuffleToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEntry.setShuffle(!mShuffle);
mCallback.onAlarmEntryChanged(mAlarmId, mEntry, true);
}
});
// volume
mVolumeButton = (ImageButton) view.findViewById(R.id.volume);
mVolumeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEntry.setVolume(mVolume);
mCallback.onPickVolume(mAlarmId, mEntry);
}
});
// tell time
mTellTimeToggle = (ImageButton) view.findViewById(R.id.telltimeToggle);
mTellTimeToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEntry.setTellTime(mTellTime);
mCallback.onSetTts(mAlarmId, mEntry);
}
});
// run now
mRunNowButton = view.findViewById(R.id.runNowButton);
mRunNowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mContext.startService(mIntents.first);
mContext.startActivity(mIntents.second);
}
});
}
public void update(AlarmsCursor alarm, boolean enablePlaylistPicker, PlaylistProvider playlistProvider) {
mUpdating = true;
mAlarmId = alarm._id();
mTime = alarm.time();
mPlaylistLink = alarm.playlistLink();
mShuffle = alarm.shuffle();
mTellTime = alarm.tellTime();
mVolume = alarm.volume();
final int repeatDays = alarm.repeatDays();
mIntents = alarm.createIntents(mContext);
final String playlistName = alarm.playlistName();
final boolean hasPlaylist = playlistName != null && playlistName.length() > 0;
boolean playlistDownloadable = false;
if (playlistProvider != null) {
final Playlist playlist = playlistProvider.getPlaylist(mPlaylistLink);
playlistDownloadable = (playlist != null && playlist.getOfflineStatus(playlistProvider.getSession()) == Playlist.OFFLINE_STATUS_NO);
}
// create an entry with all values needed to update the entry
mEntry.clear();
final boolean enabled = alarm.enabled();
mEntry.setEnabled(enabled);
mEntry.setTime(mTime);
mEntry.setRepeatDays(repeatDays);
mEntry.setHasPlaylist(hasPlaylist);
if (mTime != null) {
//TODO am/pm
final int hour = mTime.intValue() / 100;
final int minute = mTime.intValue() % 100;
mTimeView.setText(String.format("%d:%02d", hour, minute));
final String timeToNextAlarm = AlarmUtils.getTimeToNextAlarmText(mContext, alarm.enabled(), hour, minute, repeatDays, alarm.oneoffTimeMs(), System.currentTimeMillis());
mTimeToAlarm.setText(timeToNextAlarm);
mTimeToAlarm.setVisibility(timeToNextAlarm == null ? View.GONE : View.VISIBLE);
} else {
mTimeView.setText("-:--");
mTimeToAlarm.setVisibility(View.GONE);
}
mPlaylistName.setText(hasPlaylist ? playlistName : mContext.getText(R.string.noPlaylistSelected));
mPlaylistName.setTypeface(Typeface.DEFAULT, hasPlaylist ? 0 : Typeface.ITALIC);
mPlaylistName.setEnabled(enablePlaylistPicker);
mDownloadPlaylist.setVisibility(playlistDownloadable ? View.VISIBLE : View.GONE);
mEnabledToggle.setImageResource(enabled ? R.drawable.ic_button_alarm_enabled : R.drawable.ic_button_alarm_disabled);
mEnabledToggle.setEnabled(hasPlaylist && mTime != null);
mRepeatSchedule.setText(AlarmUtils.repeatDaysText(mContext, repeatDays));
mRepeatShuffleToggle.setImageResource(alarm.shuffle() ? R.drawable.ic_button_shuffle_inverse : R.drawable.ic_button_repeat_inverse);
mVolumeButton.setImageResource(AlarmUtils.getVolumeDrawable(alarm.volume()));
mRunNowButton.setEnabled(hasPlaylist);
mUpdating = false;
}
}
}