developers/samples/android: f9872ded3bb6cd3c01ab0881a58764f5171b4c64 developers/build: 23e77f8a040c0b35531a68e776363f32fa7feeeb Change-Id: I93e7c66e0cff22d3852d36a1a1257bb10eec3ba0
190 lines
6.3 KiB
Java
190 lines
6.3 KiB
Java
/*
|
|
* Copyright 2016 The Android Open Source Project
|
|
*
|
|
* 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 com.example.android.directboot.alarms;
|
|
|
|
import com.example.android.directboot.R;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.support.v7.util.SortedList;
|
|
import android.support.v7.widget.RecyclerView;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
|
|
import java.text.DateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Calendar;
|
|
import java.util.Locale;
|
|
import java.util.Set;
|
|
|
|
/**
|
|
* Adapter responsible for interactions between the {@link RecyclerView} and the
|
|
* scheduled alarms.
|
|
*/
|
|
public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.AlarmViewHolder> {
|
|
|
|
private SortedList<Alarm> mAlarmList;
|
|
private AlarmStorage mAlarmStorage;
|
|
private AlarmUtil mAlarmUtil;
|
|
private DateFormat mDateFormat;
|
|
private DateFormat mTimeFormat;
|
|
private Context mContext;
|
|
|
|
public AlarmAdapter(Context context, Set<Alarm> alarms) {
|
|
mAlarmList = new SortedList<>(Alarm.class, new SortedListCallback());
|
|
mAlarmList.addAll(alarms);
|
|
mAlarmStorage = new AlarmStorage(context);
|
|
mContext = context;
|
|
mAlarmUtil = new AlarmUtil(context);
|
|
mDateFormat = new SimpleDateFormat("MMM dd", Locale.getDefault());
|
|
mTimeFormat = new SimpleDateFormat("kk:mm", Locale.getDefault());
|
|
}
|
|
|
|
@Override
|
|
public AlarmViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
View v = LayoutInflater.from(parent.getContext())
|
|
.inflate(R.layout.alarm_row, parent, false);
|
|
return new AlarmViewHolder(v);
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(AlarmViewHolder holder, final int position) {
|
|
Alarm alarm = mAlarmList.get(position);
|
|
Calendar alarmTime = Calendar.getInstance();
|
|
alarmTime.set(Calendar.MONTH, alarm.month);
|
|
alarmTime.set(Calendar.DATE, alarm.date);
|
|
alarmTime.set(Calendar.HOUR_OF_DAY, alarm.hour);
|
|
alarmTime.set(Calendar.MINUTE, alarm.minute);
|
|
holder.mAlarmTimeTextView
|
|
.setText(mTimeFormat.format(alarmTime.getTime()));
|
|
holder.mAlarmDateTextView
|
|
.setText(mDateFormat.format(alarmTime.getTime()));
|
|
holder.mDeleteImageView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
Alarm toBeDeleted = mAlarmList.get(position);
|
|
mAlarmList.removeItemAt(position);
|
|
mAlarmStorage.deleteAlarm(toBeDeleted);
|
|
mAlarmUtil.cancelAlarm(toBeDeleted);
|
|
notifyDataSetChanged();
|
|
Toast.makeText(mContext, mContext.getString(R.string.alarm_deleted,
|
|
toBeDeleted.hour, toBeDeleted.minute), Toast.LENGTH_SHORT).show();
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return mAlarmList.size();
|
|
}
|
|
|
|
public void addAlarm(Alarm alarm) {
|
|
mAlarmList.add(alarm);
|
|
notifyDataSetChanged();
|
|
}
|
|
|
|
public void deleteAlarm(Alarm alarm) {
|
|
mAlarmList.remove(alarm);
|
|
notifyDataSetChanged();
|
|
}
|
|
|
|
public static class AlarmViewHolder extends RecyclerView.ViewHolder {
|
|
|
|
private TextView mAlarmTimeTextView;
|
|
private TextView mAlarmDateTextView;
|
|
private ImageView mDeleteImageView;
|
|
|
|
public AlarmViewHolder(View itemView) {
|
|
super(itemView);
|
|
mAlarmTimeTextView = (TextView) itemView.findViewById(R.id.text_alarm_time);
|
|
mAlarmDateTextView = (TextView) itemView.findViewById(R.id.text_alarm_date);
|
|
mDeleteImageView = (ImageView) itemView.findViewById(R.id.image_delete_alarm);
|
|
}
|
|
}
|
|
|
|
|
|
private static class SortedListCallback extends SortedList.Callback<Alarm> {
|
|
|
|
@Override
|
|
public int compare(Alarm o1, Alarm o2) {
|
|
return o1.compareTo(o2);
|
|
}
|
|
|
|
@Override
|
|
public void onInserted(int position, int count) {
|
|
//No op
|
|
}
|
|
|
|
@Override
|
|
public void onRemoved(int position, int count) {
|
|
//No op
|
|
}
|
|
|
|
@Override
|
|
public void onMoved(int fromPosition, int toPosition) {
|
|
//No op
|
|
}
|
|
|
|
@Override
|
|
public void onChanged(int position, int count) {
|
|
//No op
|
|
}
|
|
|
|
@Override
|
|
public boolean areContentsTheSame(Alarm oldItem, Alarm newItem) {
|
|
return oldItem.equals(newItem);
|
|
}
|
|
|
|
@Override
|
|
public boolean areItemsTheSame(Alarm item1, Alarm item2) {
|
|
return item1.equals(item2);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ItemDecoration that draws an divider between items in a RecyclerView.
|
|
*/
|
|
public static class DividerItemDecoration extends RecyclerView.ItemDecoration {
|
|
|
|
private Drawable mDivider;
|
|
|
|
public DividerItemDecoration(Context context) {
|
|
mDivider = context.getDrawable(R.drawable.divider);
|
|
}
|
|
|
|
@Override
|
|
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
|
|
int left = parent.getPaddingLeft();
|
|
int right = parent.getWidth() - parent.getPaddingRight();
|
|
for (int i = 0; i < parent.getChildCount(); i++) {
|
|
View child = parent.getChildAt(i);
|
|
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
|
|
.getLayoutParams();
|
|
int top = child.getBottom() + params.bottomMargin;
|
|
int bottom = top + mDivider.getIntrinsicHeight();
|
|
mDivider.setBounds(left, top, right, bottom);
|
|
mDivider.draw(c);
|
|
}
|
|
}
|
|
}
|
|
}
|