From 1f5eeb56325e3c2b4d8966c50bc7e140feb57ddc Mon Sep 17 00:00:00 2001 From: M M Arif Date: Fri, 18 Sep 2020 06:51:41 +0200 Subject: [PATCH] Notification badge in navigation menu (#702) Merge branch 'master' into 700-notifications-counter Notification badge in navigation menu Co-authored-by: 6543 <6543@noreply.codeberg.org> Co-authored-by: M M Arif Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/702 --- .../mian/gitnex/activities/MainActivity.java | 51 +++++++++++++++++-- .../fragments/NotificationsFragment.java | 3 +- .../mian/gitnex/interfaces/ApiInterface.java | 3 +- .../mian/gitnex/models/NotificationCount.java | 19 +++++++ .../main/res/layout/badge_notification.xml | 21 ++++++++ app/src/main/res/menu/drawer_menu.xml | 2 + 6 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/mian/gitnex/models/NotificationCount.java create mode 100644 app/src/main/res/layout/badge_notification.xml diff --git a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java index 5187649c..96e7bc4c 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java @@ -10,6 +10,7 @@ import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.util.Log; +import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -55,6 +56,7 @@ import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; import org.mian.gitnex.models.GiteaVersion; +import org.mian.gitnex.models.NotificationCount; import org.mian.gitnex.models.UserInfo; import java.util.ArrayList; import java.util.List; @@ -82,6 +84,14 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig private Context appCtx; private Typeface myTypeface; + private String instanceUrl; + private String loginUid; + private String instanceToken; + + private View hView; + private MenuItem navNotifications; + private TextView notificationCounter; + @Override protected int getLayoutResourceId() { @@ -100,9 +110,9 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig Intent mainIntent = getIntent(); String launchFragment = mainIntent.getStringExtra("launchFragment"); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + instanceUrl = tinyDb.getString("instanceUrl"); + loginUid = tinyDb.getString("loginUid"); + instanceToken = "token " + tinyDb.getString(loginUid + "-token"); if(tinyDb.getString("dateFormat").isEmpty()) { tinyDb.putString("dateFormat", "pretty"); @@ -191,10 +201,15 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig toolbarTitle.setText(getResources().getString(R.string.pageTitleUserAccounts)); } + getNotificationsCount(instanceUrl, instanceToken); + drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); - final View hView = navigationView.getHeaderView(0); + hView = navigationView.getHeaderView(0); + + Menu menu = navigationView.getMenu(); + navNotifications = menu.findItem(R.id.nav_notifications); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); @@ -204,6 +219,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig @Override public void onDrawerOpened(@NonNull View drawerView) { + getNotificationsCount(instanceUrl, instanceToken); } @Override @@ -705,4 +721,31 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig } + private void getNotificationsCount(String instanceUrl, String token) { + + Call call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().checkUnreadNotifications(token); + + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + NotificationCount notificationCount = response.body(); + + if(response.code() == 200) { + + assert notificationCount != null; + notificationCounter = navNotifications.getActionView().findViewById(R.id.counterBadgeNotification); + notificationCounter.setText(String.valueOf(notificationCount.getCounter())); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Log.e("onFailure-notification", t.toString()); + } + }); + } + } diff --git a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java index a07f442a..1fb685d3 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java @@ -36,7 +36,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Objects; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -79,7 +78,7 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap View v = inflater.inflate(R.layout.fragment_notifications, container, false); setHasOptionsMenu(true); - activity = Objects.requireNonNull(getActivity()); + activity = requireActivity(); context = getContext(); tinyDB = new TinyDB(context); diff --git a/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java b/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java index 6d109af7..6c7a78fb 100644 --- a/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java +++ b/app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java @@ -19,6 +19,7 @@ import org.mian.gitnex.models.Labels; import org.mian.gitnex.models.MergePullRequest; import org.mian.gitnex.models.Milestones; import org.mian.gitnex.models.NewFile; +import org.mian.gitnex.models.NotificationCount; import org.mian.gitnex.models.NotificationThread; import org.mian.gitnex.models.OrgOwner; import org.mian.gitnex.models.Organization; @@ -93,7 +94,7 @@ public interface ApiInterface { Call markNotificationThreadsAsRead(@Header("Authorization") String token, @Query("last_read_at") String last_read_at, @Query("all") Boolean all, @Query("status-types") String[] statusTypes, @Query("to-status") String toStatus); @GET("notifications/new") // Check if unread notifications exist - Call checkUnreadNotifications(@Header("Authorization") String token); + Call checkUnreadNotifications(@Header("Authorization") String token); @GET("notifications/threads/{id}") // Get notification thread by ID Call getNotificationThread(@Header("Authorization") String token, @Path("id") Integer id); diff --git a/app/src/main/java/org/mian/gitnex/models/NotificationCount.java b/app/src/main/java/org/mian/gitnex/models/NotificationCount.java new file mode 100644 index 00000000..840a00cb --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/models/NotificationCount.java @@ -0,0 +1,19 @@ +package org.mian.gitnex.models; + +import com.google.gson.annotations.SerializedName; + +/** + * Author M M Arif + */ + +public class NotificationCount { + + @SerializedName("new") + private int counter; + + public int getCounter() { + + return counter; + } + +} diff --git a/app/src/main/res/layout/badge_notification.xml b/app/src/main/res/layout/badge_notification.xml new file mode 100644 index 00000000..11f8f366 --- /dev/null +++ b/app/src/main/res/layout/badge_notification.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml index 5d517bbe..760ef480 100644 --- a/app/src/main/res/menu/drawer_menu.xml +++ b/app/src/main/res/menu/drawer_menu.xml @@ -1,6 +1,7 @@