diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d1ebe20..292c1b9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,13 @@ + + + + + + diff --git a/app/src/main/java/net/headlezz/notificationlogger/MainActivity.java b/app/src/main/java/net/headlezz/notificationlogger/MainActivity.java index b2b65de..834397e 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/MainActivity.java +++ b/app/src/main/java/net/headlezz/notificationlogger/MainActivity.java @@ -10,6 +10,8 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import net.headlezz.notificationlogger.createnotification.NotificationCreationFragment; + import butterknife.Bind; import butterknife.ButterKnife; diff --git a/app/src/main/java/net/headlezz/notificationlogger/NotificationCreationFragment.java b/app/src/main/java/net/headlezz/notificationlogger/NotificationCreationFragment.java deleted file mode 100644 index 87a62c4..0000000 --- a/app/src/main/java/net/headlezz/notificationlogger/NotificationCreationFragment.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.headlezz.notificationlogger; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -public class NotificationCreationFragment extends Fragment { - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - TextView textView = new TextView(getContext()); - textView.setGravity(Gravity.CENTER); - textView.setText(getClass().getSimpleName()); - return textView; - } - -} diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/DispatchableNotification.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/DispatchableNotification.java new file mode 100644 index 0000000..9194c55 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/DispatchableNotification.java @@ -0,0 +1,197 @@ +package net.headlezz.notificationlogger.createnotification; + + +import android.app.AlarmManager; +import android.app.Notification; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.NotificationManagerCompat; +import android.support.v7.app.NotificationCompat; + +import java.util.Date; + +public class DispatchableNotification { + + private Context mContext; + + private String mMessage; + private String mTitle; + private int mId; + + private boolean mSound; + private boolean mVibrate; + private boolean mBlink; + private boolean mAutoCancel; + + private int mIcon; + private String mCategory; + + public DispatchableNotification(Context mContext, String mMessage, String mTitle, int mId, boolean mSound, boolean mVibrate, boolean mBlink, boolean mAutoCancel, int mIcon, String mCategory) { + this.mContext = mContext; + this.mMessage = mMessage; + this.mTitle = mTitle; + this.mId = mId; + this.mSound = mSound; + this.mVibrate = mVibrate; + this.mBlink = mBlink; + this.mAutoCancel = mAutoCancel; + this.mIcon = mIcon; + this.mCategory = mCategory; + } + + private Notification buildNotification() { + int defaults; + if (mSound && mVibrate && mBlink) + defaults = Notification.DEFAULT_ALL; + else { + if (mSound) { + if (mVibrate) + defaults = Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE; + else if (mBlink) + defaults = Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS; + else + defaults = Notification.DEFAULT_SOUND; + } else if (mVibrate) { + if (mBlink) + defaults = Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS; + else + defaults = Notification.DEFAULT_VIBRATE; + } else + defaults = Notification.DEFAULT_LIGHTS; + } + + return new NotificationCompat.Builder(mContext) + .setContentText(mMessage) + .setContentTitle(mTitle) + .setSmallIcon(mIcon) + .setCategory(mCategory) + .setAutoCancel(mAutoCancel) + .setDefaults(defaults) + .build(); + } + + public void dispatch() { + NotificationManagerCompat.from(mContext).notify(mId, buildNotification()); + } + + public void shedule(Date date) { + Intent notificationIntent = new Intent(); + notificationIntent.setAction(NotificationAlarmReceiver.BROADCAST_INTENT_ACTION); + Bundle b = new Bundle(); + serializeToBundle(b); + notificationIntent.putExtras(b); + + PendingIntent pI = PendingIntent.getBroadcast(mContext, mId, notificationIntent, 0); + AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); + am.set(AlarmManager.RTC_WAKEUP, date.getTime(), pI); + } + + public void serializeToBundle(Bundle b) { + b.putString("message", mMessage); + b.putString("title", mTitle); + b.putInt("id", mId); + b.putBoolean("sound", mSound); + b.putBoolean("vibrate", mVibrate); + b.putBoolean("blink", mBlink); + b.putBoolean("autocancel", mAutoCancel); + b.putInt("icon", mIcon); + b.putString("category", mCategory); + } + + public static DispatchableNotification fromBundle(Context context, Bundle b) { + return new DispatchableNotification.Builder(context) + .setMessage(b.getString("message")) + .setTitle(b.getString("title")) + .setId(b.getInt("id")) + .setSound(b.getBoolean("sound")) + .setVibrate(b.getBoolean("vibrate")) + .setBlink(b.getBoolean("blink")) + .setAutoCancel(b.getBoolean("autocancel")) + .setIcon(b.getInt("icon")) + .setCategory(b.getString("category")) + .build(); + } + + public static class Builder { + private Context mContext; + + private String mMessage; + private String mTitle; + private int mId; + + private boolean mSound; + private boolean mVibrate; + private boolean mBlink; + private boolean mAutoCancel; + + private int mIcon; + private String mCategory; + + public Builder(Context context) { + mContext = context; + } + + public Builder setMessage(String message) { + this.mMessage = message; + return this; + } + + public Builder setTitle(String title) { + this.mTitle = title; + return this; + } + + public Builder setId(int id) { + this.mId = id; + return this; + } + + public Builder setSound(boolean sound) { + this.mSound = sound; + return this; + } + + public Builder setVibrate(boolean vibrate) { + this.mVibrate = vibrate; + return this; + } + + public Builder setBlink(boolean blink) { + this.mBlink = blink; + return this; + } + + public Builder setAutoCancel(boolean autoCancel) { + this.mAutoCancel = autoCancel; + return this; + } + + public Builder setIcon(int icon) { + this.mIcon = icon; + return this; + } + + public Builder setCategory(String category) { + this.mCategory = category; + return this; + } + + public DispatchableNotification build() { + return new DispatchableNotification( + mContext, + mMessage, + mTitle, + mId, + mSound, + mVibrate, + mBlink, + mAutoCancel, + mIcon, + mCategory + ); + } + } + +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationAlarmReceiver.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationAlarmReceiver.java new file mode 100644 index 0000000..1f21639 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationAlarmReceiver.java @@ -0,0 +1,19 @@ +package net.headlezz.notificationlogger.createnotification; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import net.headlezz.notificationlogger.createnotification.DispatchableNotification; + +public class NotificationAlarmReceiver extends BroadcastReceiver { + + public static String BROADCAST_INTENT_ACTION = "net.headlezz.notificationbroadcast"; + + @Override + public void onReceive(Context context, Intent intent) { + DispatchableNotification dn = DispatchableNotification.fromBundle(context, intent.getExtras()); + dn.dispatch(); + } + +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java new file mode 100644 index 0000000..e6c937d --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java @@ -0,0 +1,197 @@ +package net.headlezz.notificationlogger.createnotification; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.NotificationCompat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; + +import net.headlezz.notificationlogger.R; + +import java.util.Date; + +import butterknife.Bind; +import butterknife.ButterKnife; + +public class NotificationCreationFragment extends Fragment implements View.OnClickListener, NotificationScheduleHelper.NotificationScheduleManagerCallback { + + // TODO intent + + @Bind(R.id.create_etId) + EditText etId; + + @Bind(R.id.create_etTitle) + EditText etTitle; + + @Bind(R.id.create_etMessage) + EditText etMessage; + + @Bind(R.id.create_cbAutoCancel) + CheckBox cbAutoCancel; + + @Bind(R.id.create_cbBlink) + CheckBox cbBlink; + + @Bind(R.id.create_cbSound) + CheckBox cbSound; + + @Bind(R.id.create_cbVibrate) + CheckBox cbVibrate; + + @Bind(R.id.create_spCategory) + Spinner spCategory; + + @Bind(R.id.create_spIntent) + Spinner spIntent; + + @Bind(R.id.create_spIcon) + Spinner spIcon; + + @Bind(R.id.create_btDispatch) + Button btDispatch; + + @Bind(R.id.create_btSchedule) + Button btSchedule; + + final int[] mNotificationIcons = new int[]{ + R.drawable.ic_adb, + R.drawable.ic_bluetooth_audio, + R.drawable.ic_drive_eta, + R.drawable.ic_event_note, + R.drawable.ic_ondemand_video, + R.drawable.ic_power, + R.drawable.ic_sd_card, + R.drawable.ic_sms + }; + + final String[] categories = new String[] { + NotificationCompat.CATEGORY_ALARM, + NotificationCompat.CATEGORY_CALL, + NotificationCompat.CATEGORY_EMAIL, + NotificationCompat.CATEGORY_ERROR, + NotificationCompat.CATEGORY_EVENT, + NotificationCompat.CATEGORY_MESSAGE, + NotificationCompat.CATEGORY_PROGRESS, + NotificationCompat.CATEGORY_PROMO, + NotificationCompat.CATEGORY_RECOMMENDATION, + NotificationCompat.CATEGORY_SERVICE, + NotificationCompat.CATEGORY_SOCIAL, + NotificationCompat.CATEGORY_STATUS, + NotificationCompat.CATEGORY_SYSTEM, + NotificationCompat.CATEGORY_TRANSPORT + }; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.notification_creation_frag, container, false); + ButterKnife.bind(this, view); + + ArrayAdapter categoryAdapter = ArrayAdapter.createFromResource(getContext(), R.array.create_categories, android.R.layout.simple_spinner_item); + categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spCategory.setAdapter(categoryAdapter); + + SpinnerIconAdapter iconAdapter = new SpinnerIconAdapter(getContext(), getResources().getStringArray(R.array.create_icons), mNotificationIcons); + iconAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spIcon.setAdapter(iconAdapter); + + btDispatch.setOnClickListener(this); + btSchedule.setOnClickListener(this); + + return view; + } + + + @Override + public void onClick(View v) { + boolean validationError = false; + String message = etMessage.getText().toString(); + if(message.isEmpty()) { + etMessage.setError("Message must not be empty."); + validationError = true; + } + String title = etTitle.getText().toString(); + if(title.isEmpty()) { + etTitle.setError("Title must not be empty."); + validationError = true; + } + String idString = etId.getText().toString(); + int id = 1; + try { + id = Integer.parseInt(idString); + } catch(NumberFormatException e) { + etId.setError("Please enter a valid id"); + validationError = true; + } + + if(validationError) + return; + + DispatchableNotification dn = new DispatchableNotification.Builder(getContext()) + .setTitle(title) + .setMessage(message) + .setId(id) + .setIcon(mNotificationIcons[spIcon.getSelectedItemPosition()]) + .setSound(cbSound.isChecked()) + .setVibrate(cbVibrate.isChecked()) + .setBlink(cbBlink.isChecked()) + .setAutoCancel(cbAutoCancel.isChecked()) + .setCategory(categories[spCategory.getSelectedItemPosition()]) + .build(); + + if(v.getId() == R.id.create_btDispatch) + dn.dispatch(); + else + sheduleNotification(dn); + } + + private void sheduleNotification(DispatchableNotification dn) { + new NotificationScheduleHelper(getContext(), dn, this).shedule(); + } + + @SuppressWarnings("ConstantConditions") + @Override + public void onNotificationScheduleCreated(Date date, DispatchableNotification dn) { + // delayn the shedule to see if user presses the undo button + Snackbar snack = Snackbar.make(getView(), getString(R.string.create_shedule_snack, date.toString()), Snackbar.LENGTH_LONG); + ScheduleSnackbarListener listener = new ScheduleSnackbarListener(dn, date); + snack.setCallback(listener); + snack.setAction(getString(R.string.create_shedule_snack_undo), listener); + snack.show(); + } + + /** + * Snackbar listener to track if the user undoes the schedule operation + */ + class ScheduleSnackbarListener extends Snackbar.Callback implements View.OnClickListener { + + private DispatchableNotification mNotification; + private Date mDispatchDate; + private boolean dispatch = true; + + public ScheduleSnackbarListener(DispatchableNotification notification, Date dispatchDate) { + mDispatchDate = dispatchDate; + mNotification = notification; + } + + @Override + public void onClick(View v) { + dispatch = false; + } + + @Override + public void onDismissed(Snackbar snackbar, int event) { + super.onDismissed(snackbar, event); + if(dispatch) + mNotification.shedule(mDispatchDate); + } + } +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationScheduleHelper.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationScheduleHelper.java new file mode 100644 index 0000000..da8bc7a --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationScheduleHelper.java @@ -0,0 +1,70 @@ +package net.headlezz.notificationlogger.createnotification; + + +import android.app.DatePickerDialog; +import android.app.TimePickerDialog; +import android.content.Context; +import android.widget.DatePicker; +import android.widget.TimePicker; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * Helper class to create the date to schedule a notification + */ +public class NotificationScheduleHelper { + + private Context mContext; + private DispatchableNotification mNotification; + NotificationScheduleManagerCallback mCallback; + + interface NotificationScheduleManagerCallback { + void onNotificationScheduleCreated(Date date, DispatchableNotification dn); + } + + public NotificationScheduleHelper(Context context, DispatchableNotification dn, NotificationScheduleManagerCallback cb) { + mContext = context; + mNotification = dn; + mCallback = cb; + } + + public void shedule() { + openSheduleDialogs(); + } + + private void openSheduleDialogs() { + NotificationSheduleCreationListener mListener = new NotificationSheduleCreationListener(); + Calendar cal = new GregorianCalendar(); + DatePickerDialog dialog = new DatePickerDialog(mContext, mListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); + dialog.show(); + } + + public void onTimeSet(int year, int monthOfYear, int dayOfMonth, int hour, int minute) { + mCallback.onNotificationScheduleCreated(new Date(year-1900, monthOfYear, dayOfMonth, hour, minute), mNotification); + } + + + class NotificationSheduleCreationListener implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { + + private int year; + private int monthOfYear; + private int dayOfMonth; + + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + this.year = year; + this.monthOfYear = monthOfYear; + this.dayOfMonth = dayOfMonth; + Calendar cal = new GregorianCalendar(); + new TimePickerDialog(mContext, this, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)+1, true).show(); + } + + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + NotificationScheduleHelper.this.onTimeSet(year, monthOfYear, dayOfMonth, hourOfDay, minute); + } + } + +} diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/SpinnerIconAdapter.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/SpinnerIconAdapter.java new file mode 100644 index 0000000..175f447 --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/SpinnerIconAdapter.java @@ -0,0 +1,57 @@ +package net.headlezz.notificationlogger.createnotification; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import net.headlezz.notificationlogger.R; + +public class SpinnerIconAdapter extends ArrayAdapter { + + private static final int DROPDOWN_RESOURCE = R.layout.simple_spinner_dropdown_item_with_icon; + private static final int ITEM_RESOURCE = R.layout.simple_spinner_item_with_icon; + + private int[] itemIcons; + private LayoutInflater mInflater; + + public SpinnerIconAdapter(Context context, CharSequence[] items, int[] itemIcons) { + super(context, ITEM_RESOURCE, items); + if(itemIcons.length != getCount()) + throw new IllegalArgumentException("Icon resource size doesnt match item count"); + this.itemIcons = itemIcons; + mInflater = LayoutInflater.from(getContext()); + + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if(convertView == null) { + convertView = mInflater.inflate(ITEM_RESOURCE, parent, false); + } + TextView textView = (TextView) convertView.findViewById(android.R.id.text1); + textView.setText(getItem(position)); + ImageView iconView = (ImageView) convertView.findViewById(R.id.spinner_icon); + Drawable icon = getContext().getResources().getDrawable(itemIcons[position]); + iconView.setImageDrawable(icon); + return convertView; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + if(convertView == null) { + convertView = mInflater.inflate(DROPDOWN_RESOURCE, parent, false); + } + TextView textView = (TextView) convertView.findViewById(android.R.id.text1); + textView.setText(getItem(position)); + ImageView iconView = (ImageView) convertView.findViewById(R.id.spinner_icon); + Drawable icon = getContext().getResources().getDrawable(itemIcons[position]); + iconView.setImageDrawable(icon); + return convertView; + } + +} diff --git a/app/src/main/res/drawable-hdpi/ic_adb.png b/app/src/main/res/drawable-hdpi/ic_adb.png new file mode 100644 index 0000000..2c33dab Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_adb.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_bluetooth_audio.png b/app/src/main/res/drawable-hdpi/ic_bluetooth_audio.png new file mode 100644 index 0000000..21caac0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_bluetooth_audio.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_drive_eta.png b/app/src/main/res/drawable-hdpi/ic_drive_eta.png new file mode 100644 index 0000000..cb85d32 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_drive_eta.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_event_note.png b/app/src/main/res/drawable-hdpi/ic_event_note.png new file mode 100644 index 0000000..5eba6b8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_event_note.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_ondemand_video.png b/app/src/main/res/drawable-hdpi/ic_ondemand_video.png new file mode 100644 index 0000000..e383bb8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_ondemand_video.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_power.png b/app/src/main/res/drawable-hdpi/ic_power.png new file mode 100644 index 0000000..4130f22 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_power.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_sd_card.png b/app/src/main/res/drawable-hdpi/ic_sd_card.png new file mode 100644 index 0000000..880feb1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_sd_card.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_sms.png b/app/src/main/res/drawable-hdpi/ic_sms.png new file mode 100644 index 0000000..b18bad3 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_sms.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_adb.png b/app/src/main/res/drawable-mdpi/ic_adb.png new file mode 100644 index 0000000..19d946b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_adb.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_bluetooth_audio.png b/app/src/main/res/drawable-mdpi/ic_bluetooth_audio.png new file mode 100644 index 0000000..56d7de7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_bluetooth_audio.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_drive_eta.png b/app/src/main/res/drawable-mdpi/ic_drive_eta.png new file mode 100644 index 0000000..37b5672 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_drive_eta.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_event_note.png b/app/src/main/res/drawable-mdpi/ic_event_note.png new file mode 100644 index 0000000..6bbcb6f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_event_note.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_ondemand_video.png b/app/src/main/res/drawable-mdpi/ic_ondemand_video.png new file mode 100644 index 0000000..3ec2079 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_ondemand_video.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_power.png b/app/src/main/res/drawable-mdpi/ic_power.png new file mode 100644 index 0000000..ccbdd6f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_power.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_sd_card.png b/app/src/main/res/drawable-mdpi/ic_sd_card.png new file mode 100644 index 0000000..4bb88a8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_sd_card.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_sms.png b/app/src/main/res/drawable-mdpi/ic_sms.png new file mode 100644 index 0000000..f68d4d6 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_sms.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_adb.png b/app/src/main/res/drawable-xhdpi/ic_adb.png new file mode 100644 index 0000000..b71a395 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_adb.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_bluetooth_audio.png b/app/src/main/res/drawable-xhdpi/ic_bluetooth_audio.png new file mode 100644 index 0000000..bab5795 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_bluetooth_audio.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_drive_eta.png b/app/src/main/res/drawable-xhdpi/ic_drive_eta.png new file mode 100644 index 0000000..ab4bf5f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_drive_eta.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_event_note.png b/app/src/main/res/drawable-xhdpi/ic_event_note.png new file mode 100644 index 0000000..0062b39 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_event_note.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_ondemand_video.png b/app/src/main/res/drawable-xhdpi/ic_ondemand_video.png new file mode 100644 index 0000000..052f8a3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_ondemand_video.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_power.png b/app/src/main/res/drawable-xhdpi/ic_power.png new file mode 100644 index 0000000..1e95875 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_power.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_sd_card.png b/app/src/main/res/drawable-xhdpi/ic_sd_card.png new file mode 100644 index 0000000..1816ba3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_sd_card.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_sms.png b/app/src/main/res/drawable-xhdpi/ic_sms.png new file mode 100644 index 0000000..d746ed6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_sms.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_adb.png b/app/src/main/res/drawable-xxhdpi/ic_adb.png new file mode 100644 index 0000000..1bd9483 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_adb.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bluetooth_audio.png b/app/src/main/res/drawable-xxhdpi/ic_bluetooth_audio.png new file mode 100644 index 0000000..d78b4d5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_bluetooth_audio.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_drive_eta.png b/app/src/main/res/drawable-xxhdpi/ic_drive_eta.png new file mode 100644 index 0000000..416c70f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_drive_eta.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_event_note.png b/app/src/main/res/drawable-xxhdpi/ic_event_note.png new file mode 100644 index 0000000..67802e9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_event_note.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_ondemand_video.png b/app/src/main/res/drawable-xxhdpi/ic_ondemand_video.png new file mode 100644 index 0000000..97ed667 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_ondemand_video.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_power.png b/app/src/main/res/drawable-xxhdpi/ic_power.png new file mode 100644 index 0000000..8cdd8c3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_power.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_sd_card.png b/app/src/main/res/drawable-xxhdpi/ic_sd_card.png new file mode 100644 index 0000000..0c9f1d5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_sd_card.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_sms.png b/app/src/main/res/drawable-xxhdpi/ic_sms.png new file mode 100644 index 0000000..f652cf3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_sms.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_adb.png b/app/src/main/res/drawable-xxxhdpi/ic_adb.png new file mode 100644 index 0000000..d60ccee Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_adb.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bluetooth_audio.png b/app/src/main/res/drawable-xxxhdpi/ic_bluetooth_audio.png new file mode 100644 index 0000000..0b2986b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_bluetooth_audio.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_drive_eta.png b/app/src/main/res/drawable-xxxhdpi/ic_drive_eta.png new file mode 100644 index 0000000..2ee9aeb Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_drive_eta.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_event_note.png b/app/src/main/res/drawable-xxxhdpi/ic_event_note.png new file mode 100644 index 0000000..eaed773 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_event_note.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_ondemand_video.png b/app/src/main/res/drawable-xxxhdpi/ic_ondemand_video.png new file mode 100644 index 0000000..36abb81 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_ondemand_video.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_power.png b/app/src/main/res/drawable-xxxhdpi/ic_power.png new file mode 100644 index 0000000..9494aac Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_power.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sd_card.png b/app/src/main/res/drawable-xxxhdpi/ic_sd_card.png new file mode 100644 index 0000000..6226e5b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_sd_card.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sms.png b/app/src/main/res/drawable-xxxhdpi/ic_sms.png new file mode 100644 index 0000000..bb88fb4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_sms.png differ diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index 43381c7..12ae9a6 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -7,27 +7,25 @@ + - - - - - + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/notification_creation_frag.xml b/app/src/main/res/layout/notification_creation_frag.xml new file mode 100644 index 0000000..6686e9e --- /dev/null +++ b/app/src/main/res/layout/notification_creation_frag.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +