From 07d0f2b562481805399a546be938635bdffca162 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:06:35 +0300 Subject: [PATCH 1/9] Add Notification activity to manifest --- app/src/main/AndroidManifest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e262e90882..253bdaea82 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -87,6 +87,10 @@ android:label="@string/title_activity_nearby" android:parentActivityName=".contributions.ContributionsActivity" /> + + Date: Wed, 20 Dec 2017 19:08:17 +0300 Subject: [PATCH 2/9] Contributes Android Injector annotation for dagger --- .../java/fr/free/nrw/commons/di/ActivityBuilderModule.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilderModule.java b/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilderModule.java index 27e16ce236..e4fb134278 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilderModule.java +++ b/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilderModule.java @@ -8,6 +8,7 @@ import fr.free.nrw.commons.auth.SignupActivity; import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.nearby.NearbyActivity; +import fr.free.nrw.commons.notification.NotificationActivity; import fr.free.nrw.commons.settings.SettingsActivity; import fr.free.nrw.commons.upload.MultipleShareActivity; import fr.free.nrw.commons.upload.ShareActivity; @@ -43,4 +44,6 @@ public abstract class ActivityBuilderModule { @ContributesAndroidInjector abstract NearbyActivity bindNearbyActivity(); + @ContributesAndroidInjector + abstract NotificationActivity bindNotificationActivity(); } From 3af6eaf8521bbbe16147e87cdf7ff937f718c1ce Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:10:25 +0300 Subject: [PATCH 3/9] Add notification item to navigation bar --- .../fr/free/nrw/commons/theme/NavigationBaseActivity.java | 5 +++++ app/src/main/res/menu/drawer.xml | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java index 60ea325e40..4e7cf767f2 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java @@ -27,6 +27,7 @@ import fr.free.nrw.commons.auth.LoginActivity; import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.nearby.NearbyActivity; +import fr.free.nrw.commons.notification.NotificationActivity; import fr.free.nrw.commons.settings.SettingsActivity; import timber.log.Timber; @@ -143,6 +144,10 @@ public boolean onNavigationItemSelected(@NonNull final MenuItem item) { .setNegativeButton(R.string.no, (dialog, which) -> dialog.cancel()) .show(); return true; + case R.id.action_notifications: + drawerLayout.closeDrawer(navigationView); + startActivityWithFlags(this, NotificationActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + return true; default: Timber.e("Unknown option [%s] selected from the navigation menu", itemId); return false; diff --git a/app/src/main/res/menu/drawer.xml b/app/src/main/res/menu/drawer.xml index f0a0a5e29f..83c1bf0ade 100644 --- a/app/src/main/res/menu/drawer.xml +++ b/app/src/main/res/menu/drawer.xml @@ -35,4 +35,9 @@ android:icon="@drawable/ic_exit_to_app_black_24dp" android:title="@string/navigation_item_logout"/> + + From 88ea3287c0b39dfc2a87f1c7fe32c6725059a825 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:11:21 +0300 Subject: [PATCH 4/9] Add notification vector --- .../main/res/drawable/ic_notifications_black_24dp.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000000..7009a6763c --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + From ecb1f8ccb34ad92536888c52feeb18fd619b29c2 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:11:46 +0300 Subject: [PATCH 5/9] Add strings --- app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c2e38b9211..5cd10090b4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -194,6 +194,7 @@ Feedback Logout Tutorial + Notifications Nearby places cannot be displayed without location permissions no description found Commons file page From 9aa15739ab7dc360feeb365377a3dc8511e3843d Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:13:33 +0300 Subject: [PATCH 6/9] Add layouts for activity and list items --- .../main/res/layout/activity_notification.xml | 34 +++++++++ app/src/main/res/layout/item_notification.xml | 69 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 app/src/main/res/layout/activity_notification.xml create mode 100644 app/src/main/res/layout/item_notification.xml diff --git a/app/src/main/res/layout/activity_notification.xml b/app/src/main/res/layout/activity_notification.xml new file mode 100644 index 0000000000..b2eb38475d --- /dev/null +++ b/app/src/main/res/layout/activity_notification.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml new file mode 100644 index 0000000000..bd4833d978 --- /dev/null +++ b/app/src/main/res/layout/item_notification.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + \ No newline at end of file From ddf978f8cae75a1ef224d69721545c7c520f1f52 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:27:04 +0300 Subject: [PATCH 7/9] Add sample Notification and Notification controller classes --- .../commons/notification/Notification.java | 26 +++++++++++++++++++ .../notification/NotificationController.java | 23 ++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 app/src/main/java/fr/free/nrw/commons/notification/Notification.java create mode 100644 app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java diff --git a/app/src/main/java/fr/free/nrw/commons/notification/Notification.java b/app/src/main/java/fr/free/nrw/commons/notification/Notification.java new file mode 100644 index 0000000000..cb1aa62b69 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/notification/Notification.java @@ -0,0 +1,26 @@ +package fr.free.nrw.commons.notification; + +/** + * Created by root on 18.12.2017. + */ + +public class Notification { + public NotificationType notificationType; + public String notificationText; + + + Notification (NotificationType notificationType, String notificationText) { + this.notificationType = notificationType; + this.notificationText = notificationText; + } + + + public enum NotificationType { + /* Added for test purposes, needs to be rescheduled after implementing + fetching notifications from server */ + edit, + mention, + message, + block; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java new file mode 100644 index 0000000000..94e2e3612b --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java @@ -0,0 +1,23 @@ +package fr.free.nrw.commons.notification; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by root on 19.12.2017. + */ + +public class NotificationController { + + public static List loadNotifications() { + List notifications = new ArrayList<>(); + notifications.add(new Notification(Notification.NotificationType.message, "notification 1")); + notifications.add(new Notification(Notification.NotificationType.message, "notification 2")); + notifications.add(new Notification(Notification.NotificationType.message, "notification 3")); + notifications.add(new Notification(Notification.NotificationType.message, "notification 4")); + notifications.add(new Notification(Notification.NotificationType.message, "notification 5")); + notifications.add(new Notification(Notification.NotificationType.message, "notification 6")); + notifications.add(new Notification(Notification.NotificationType.message, "notification 7")); + return notifications; + } +} From 76ee338a200eea46223a4486a50cddc5c1b07c95 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 19:28:36 +0300 Subject: [PATCH 8/9] Construct recyler list logic according to Renderers library of pedrovgs --- .../notification/NotificationActivity.java | 50 ++++++++++++++ .../NotificationAdapterFactory.java | 30 ++++++++ .../notification/NotificationRenderer.java | 69 +++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java create mode 100644 app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterFactory.java create mode 100644 app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java new file mode 100644 index 0000000000..9da69e0eb1 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java @@ -0,0 +1,50 @@ +package fr.free.nrw.commons.notification; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Optional; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.theme.NavigationBaseActivity; + +/** + * Created by root on 18.12.2017. + */ + +public class NotificationActivity extends NavigationBaseActivity { + NotificationAdapterFactory notificationAdapterFactory; + + @Nullable + @BindView(R.id.listView) RecyclerView recyclerView; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_notification); + ButterKnife.bind(this); + initListView(); + addNotifications(); + initDrawer(); + } + + private void initListView() { + recyclerView = findViewById(R.id.listView); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + notificationAdapterFactory = new NotificationAdapterFactory(new NotificationRenderer.NotificationClicked() { + @Override + public void notificationClicked(Notification notification) { + + } + }); + } + + private void addNotifications() { + + recyclerView.setAdapter(notificationAdapterFactory.create(NotificationController.loadNotifications())); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterFactory.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterFactory.java new file mode 100644 index 0000000000..83a60dcfb2 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationAdapterFactory.java @@ -0,0 +1,30 @@ +package fr.free.nrw.commons.notification; + +import android.support.annotation.NonNull; + +import com.pedrogomez.renderers.ListAdapteeCollection; +import com.pedrogomez.renderers.RVRendererAdapter; +import com.pedrogomez.renderers.RendererBuilder; + +import java.util.Collections; +import java.util.List; + +/** + * Created by root on 19.12.2017. + */ + +class NotificationAdapterFactory { + private NotificationRenderer.NotificationClicked listener; + + NotificationAdapterFactory(@NonNull NotificationRenderer.NotificationClicked listener) { + this.listener = listener; + } + + public RVRendererAdapter create(List notifications) { + RendererBuilder builder = new RendererBuilder() + .bind(Notification.class, new NotificationRenderer(listener)); + ListAdapteeCollection collection = new ListAdapteeCollection<>( + notifications != null ? notifications : Collections.emptyList()); + return new RVRendererAdapter<>(builder, collection); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java new file mode 100644 index 0000000000..201d00ff4b --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java @@ -0,0 +1,69 @@ +package fr.free.nrw.commons.notification; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.pedrogomez.renderers.Renderer; + +import butterknife.BindView; +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; + +/** + * Created by root on 19.12.2017. + */ + +public class NotificationRenderer extends Renderer { + @BindView(R.id.tvName) + TextView tvName; + @BindView(R.id.tvDesc) TextView tvDesc; + @BindView(R.id.distance) TextView distance; + @BindView(R.id.icon) + ImageView icon; + private NotificationClicked listener; + + + NotificationRenderer(NotificationClicked listener) { + this.listener = listener; + } + + @Override + protected void setUpView(View view) { } + + @Override + protected void hookListeners(View rootView) { + rootView.setOnClickListener(v -> listener.notificationClicked(getContent())); + } + + @Override + protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { + View inflatedView = layoutInflater.inflate(R.layout.item_notification, viewGroup, false); + ButterKnife.bind(this, inflatedView); + return inflatedView; + } + + @Override + public void render() { + Notification notification = getContent(); + tvName.setText(notification.notificationText); + switch (notification.notificationType) { + case edit: + icon.setImageResource(R.drawable.round_icon_unknown); + case message: + icon.setImageResource(R.drawable.round_icon_unknown); + case mention: + icon.setImageResource(R.drawable.round_icon_unknown); + case block: + icon.setImageResource(R.drawable.round_icon_unknown); + default: + icon.setImageResource(R.drawable.round_icon_unknown); + } + } + + public interface NotificationClicked{ + void notificationClicked(Notification notification); + } +} From 7abb530207df4cf97a119e0a9cf15146708ff8aa Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 20 Dec 2017 20:53:30 +0300 Subject: [PATCH 9/9] Add icons for notification list --- .../notification/NotificationController.java | 8 +++--- .../notification/NotificationRenderer.java | 25 ++++++++++--------- .../drawable/ic_chat_bubble_black_24px.xml | 9 +++++++ .../main/res/drawable/ic_edit_black_24dp.xml | 9 +++++++ .../res/drawable/ic_message_black_24dp.xml | 9 +++++++ app/src/main/res/layout/item_notification.xml | 23 +++++++++-------- 6 files changed, 56 insertions(+), 27 deletions(-) create mode 100644 app/src/main/res/drawable/ic_chat_bubble_black_24px.xml create mode 100644 app/src/main/res/drawable/ic_edit_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_message_black_24dp.xml diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java index 94e2e3612b..84f5c15d8e 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationController.java @@ -12,11 +12,11 @@ public class NotificationController { public static List loadNotifications() { List notifications = new ArrayList<>(); notifications.add(new Notification(Notification.NotificationType.message, "notification 1")); - notifications.add(new Notification(Notification.NotificationType.message, "notification 2")); - notifications.add(new Notification(Notification.NotificationType.message, "notification 3")); + notifications.add(new Notification(Notification.NotificationType.edit, "notification 2")); + notifications.add(new Notification(Notification.NotificationType.mention, "notification 3")); notifications.add(new Notification(Notification.NotificationType.message, "notification 4")); - notifications.add(new Notification(Notification.NotificationType.message, "notification 5")); - notifications.add(new Notification(Notification.NotificationType.message, "notification 6")); + notifications.add(new Notification(Notification.NotificationType.edit, "notification 5")); + notifications.add(new Notification(Notification.NotificationType.mention, "notification 6")); notifications.add(new Notification(Notification.NotificationType.message, "notification 7")); return notifications; } diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java index 201d00ff4b..36272d4a2e 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java @@ -17,12 +17,10 @@ */ public class NotificationRenderer extends Renderer { - @BindView(R.id.tvName) - TextView tvName; - @BindView(R.id.tvDesc) TextView tvDesc; - @BindView(R.id.distance) TextView distance; - @BindView(R.id.icon) - ImageView icon; + @BindView(R.id.title) TextView title; + @BindView(R.id.description) TextView description; + @BindView(R.id.time) TextView time; + @BindView(R.id.icon) ImageView icon; private NotificationClicked listener; @@ -48,16 +46,19 @@ protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { @Override public void render() { Notification notification = getContent(); - tvName.setText(notification.notificationText); + title.setText(notification.notificationText); + time.setText("3d"); + description.setText("Example notification description"); switch (notification.notificationType) { case edit: - icon.setImageResource(R.drawable.round_icon_unknown); + icon.setImageResource(R.drawable.ic_edit_black_24dp); + break; case message: - icon.setImageResource(R.drawable.round_icon_unknown); + icon.setImageResource(R.drawable.ic_message_black_24dp); + break; case mention: - icon.setImageResource(R.drawable.round_icon_unknown); - case block: - icon.setImageResource(R.drawable.round_icon_unknown); + icon.setImageResource(R.drawable.ic_chat_bubble_black_24px); + break; default: icon.setImageResource(R.drawable.round_icon_unknown); } diff --git a/app/src/main/res/drawable/ic_chat_bubble_black_24px.xml b/app/src/main/res/drawable/ic_chat_bubble_black_24px.xml new file mode 100644 index 0000000000..8d40c6d63a --- /dev/null +++ b/app/src/main/res/drawable/ic_chat_bubble_black_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_edit_black_24dp.xml b/app/src/main/res/drawable/ic_edit_black_24dp.xml new file mode 100644 index 0000000000..2ab2fb7533 --- /dev/null +++ b/app/src/main/res/drawable/ic_edit_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_message_black_24dp.xml b/app/src/main/res/drawable/ic_message_black_24dp.xml new file mode 100644 index 0000000000..d2876bfad9 --- /dev/null +++ b/app/src/main/res/drawable/ic_message_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml index bd4833d978..d8f4dd8d49 100644 --- a/app/src/main/res/layout/item_notification.xml +++ b/app/src/main/res/layout/item_notification.xml @@ -18,10 +18,11 @@ android:contentDescription="@string/no_image_found" android:scaleType="centerCrop" android:src="@drawable/empty_photo" + android:tint="@color/primaryDarkColor" />