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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/simple_spinner_dropdown_item_with_icon.xml b/app/src/main/res/layout/simple_spinner_dropdown_item_with_icon.xml
new file mode 100644
index 0000000..f9dc116
--- /dev/null
+++ b/app/src/main/res/layout/simple_spinner_dropdown_item_with_icon.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/simple_spinner_item_with_icon.xml b/app/src/main/res/layout/simple_spinner_item_with_icon.xml
new file mode 100644
index 0000000..789890d
--- /dev/null
+++ b/app/src/main/res/layout/simple_spinner_item_with_icon.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/spinner_item_with_icon.xml b/app/src/main/res/layout/spinner_item_with_icon.xml
new file mode 100644
index 0000000..28ca0f6
--- /dev/null
+++ b/app/src/main/res/layout/spinner_item_with_icon.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..7d8a864
--- /dev/null
+++ b/app/src/main/res/values/attrs.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b993b60..1c84b09 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -16,4 +16,47 @@
FAB: Create notification
Create notification
Blacklist
+ Title
+ Message
+ Notification ID
+ Intent:
+ Icon:
+ Category:
+ Sound
+ Vibrate
+ Blink
+ Auto cancel
+ schedule
+ dispatch
+
+ Notification sheduled for %1$s
+ Undo
+
+
+ - Alarm
+ - Call
+ - Email
+ - Error
+ - Event
+ - Message
+ - Progress
+ - Promo
+ - Recommendation
+ - Service
+ - Social
+ - Status
+ - System
+ - Transport
+
+
+
+ - ADB
+ - Bluetooth
+ - Car
+ - Event
+ - Video
+ - Power
+ - SD card
+ - SMS
+