package com.evancharlton.mileage.dao; import com.evancharlton.mileage.R; import com.evancharlton.mileage.ServiceIntervalsListActivity; import com.evancharlton.mileage.alarms.IntervalReceiver; import com.evancharlton.mileage.dao.Dao.DataObject; import com.evancharlton.mileage.math.Calculator; import com.evancharlton.mileage.provider.Settings; import com.evancharlton.mileage.provider.tables.ServiceIntervalsTable; import android.app.Activity; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.widget.Toast; import java.util.Date; @DataObject(path = ServiceIntervalsTable.URI) public class ServiceInterval extends Dao { public static final String TITLE = "title"; public static final String DESCRIPTION = "description"; public static final String START_DATE = "start_timestamp"; public static final String START_ODOMETER = "start_odometer"; public static final String VEHICLE_ID = "vehicle_id"; public static final String TEMPLATE_ID = "service_interval_template_id"; public static final String DURATION = "duration"; public static final String DISTANCE = "distance"; @Validate(R.string.error_invalid_interval_title) @Column(type = Column.STRING, name = TITLE) protected String mTitle; @Validate(R.string.error_invalid_interval_description) @Column(type = Column.STRING, name = DESCRIPTION) protected String mDescription; @Validate @Column(type = Column.TIMESTAMP, name = START_DATE) protected Date mStartDate; @Validate(R.string.error_invalid_interval_odometer) @Column(type = Column.DOUBLE, name = START_ODOMETER) protected double mStartOdometer; @Validate(R.string.error_invalid_interval_vehicle) @Range.Positive @Column(type = Column.LONG, name = VEHICLE_ID) protected long mVehicleId; @Validate @Column(type = Column.LONG, name = TEMPLATE_ID) protected long mTemplateId; @Validate(R.string.error_invalid_interval_duration) @Column(type = Column.LONG, name = DURATION) protected long mDuration; @Validate(R.string.error_invalid_interval_distance) @Column(type = Column.LONG, name = DISTANCE) protected long mDistance; public ServiceInterval(ContentValues values) { super(values); } public ServiceInterval(Cursor cursor) { super(cursor); } public static final ServiceInterval loadById(final Context context, final long id) { Uri uri = ContentUris.withAppendedId(ServiceIntervalsTable.BASE_URI, id); Cursor cursor = context.getContentResolver().query(uri, ServiceIntervalsTable.PROJECTION, null, null, null); ServiceInterval interval = null; if (cursor.getCount() > 0) { interval = new ServiceInterval(cursor); } cursor.close(); if (interval == null) { throw new IllegalArgumentException("Unable to load service interval #" + id); } return interval; } public void scheduleAlarm(final Context context, long when) { // schedule the alarm AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Date trigger = new Date(when); mgr.set(AlarmManager.RTC, trigger.getTime(), getPendingIntent(context)); String date = Calculator.getDateString(context, Calculator.DATE_DATE, trigger); Toast.makeText(context, context.getString(R.string.service_interval_set, date), Toast.LENGTH_LONG).show(); } public void deleteAlarm(final Context context) { if (isExistingObject()) { // cancel the alarm AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mgr.cancel(getPendingIntent(context)); Toast.makeText(context, context.getString(R.string.service_interval_canceled), Toast.LENGTH_SHORT).show(); } } private PendingIntent getPendingIntent(Context context) { Intent action = new Intent(context, IntervalReceiver.class); action.putExtra(ServiceInterval._ID, getId()); return PendingIntent.getBroadcast(context, (int) getId(), action, PendingIntent.FLAG_UPDATE_CURRENT); } public void raiseNotification(Context context) { // TODO(3.2) - Support per-interval notification settings SharedPreferences prefs = context.getSharedPreferences(Settings.NAME, Context.MODE_PRIVATE); if (prefs.getBoolean(Settings.NOTIFICATIONS_ENABLED, true)) { Intent i = new Intent(context, ServiceIntervalsListActivity.class); Vehicle v = Vehicle.loadById(context, getVehicleId()); String description = context.getString(R.string.service_interval_due, v.getTitle()); Notification notification = new Notification(R.drawable.icon, getDescription(), System.currentTimeMillis()); i.putExtra(ServiceInterval._ID, getId()); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0); notification.flags = Notification.FLAG_AUTO_CANCEL; if (prefs.getBoolean(Settings.NOTIFICATIONS_LED, true)) { notification.flags |= Notification.FLAG_SHOW_LIGHTS; notification.ledARGB = 0xFFFCAF15; notification.ledOffMS = 500; notification.ledOnMS = 500; } if (prefs.getBoolean(Settings.NOTIFICATIONS_VIBRATE, true)) { notification.vibrate = new long[] { 250, 250, 250, 250 }; } String uri = prefs.getString(Settings.NOTIFICATIONS_RINGTONE, ""); if (uri != null && uri.length() > 0) { notification.sound = Uri.parse(uri); } notification.defaults = Notification.DEFAULT_ALL; notification.setLatestEventInfo(context, getDescription(), description, contentIntent); NotificationManager notificationMgr = (NotificationManager) context .getSystemService(Activity.NOTIFICATION_SERVICE); if (notificationMgr != null) { notificationMgr.notify((int) getId(), notification); } } } @Override public boolean delete(final Context context) { deleteAlarm(context); return super.delete(context); } public String getTitle() { return mTitle; } public void setTitle(String title) { mTitle = title; } public String getDescription() { return mDescription; } public void setDescription(String description) { mDescription = description; } public long getStartDate() { return mStartDate.getTime(); } public void setStartDate(long startDate) { if (mStartDate == null) { mStartDate = new Date(System.currentTimeMillis()); } else { mStartDate.setTime(startDate); } } public double getStartOdometer() { return mStartOdometer; } public void setStartOdometer(double startOdometer) { mStartOdometer = startOdometer; } public long getVehicleId() { return mVehicleId; } public void setVehicleId(long vehicleId) { mVehicleId = vehicleId; } public long getTemplateId() { return mTemplateId; } public void setTemplateId(long templateId) { mTemplateId = templateId; } public long getDuration() { return mDuration; } public void setDuration(long duration) { mDuration = duration; } public long getDistance() { return mDistance; } public void setDistance(long distance) { mDistance = distance; } }