Migrated notification module from Java to Kotlin (#5955)

* Rename .java to .kt

* Migration of notification module from Java to Kotlin
This commit is contained in:
Saifuddin Adenwala 2024-11-26 17:59:31 +05:30 committed by GitHub
parent 874773b881
commit 381f9eca0c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 401 additions and 456 deletions

View file

@ -289,7 +289,7 @@ public class ContributionsFragment
});
}
notification.setOnClickListener(view -> {
NotificationActivity.startYourself(getContext(), "unread");
NotificationActivity.Companion.startYourself(getContext(), "unread");
});
}

View file

@ -414,7 +414,7 @@ public class MainActivity extends BaseActivity
return true;
case R.id.notifications:
// Starts notification activity on click to notification icon
NotificationActivity.startYourself(this, "unread");
NotificationActivity.Companion.startYourself(this, "unread");
return true;
default:
return super.onOptionsItemSelected(item);

View file

@ -1,288 +0,0 @@
package fr.free.nrw.commons.notification;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.google.android.material.snackbar.Snackbar;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.databinding.ActivityNotificationBinding;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.auth.csrf.InvalidLoginTokenException;
import fr.free.nrw.commons.notification.models.Notification;
import fr.free.nrw.commons.notification.models.NotificationType;
import fr.free.nrw.commons.theme.BaseActivity;
import fr.free.nrw.commons.utils.NetworkUtils;
import fr.free.nrw.commons.utils.ViewUtil;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import javax.inject.Inject;
import kotlin.Unit;
import timber.log.Timber;
/**
* Created by root on 18.12.2017.
*/
public class NotificationActivity extends BaseActivity {
private ActivityNotificationBinding binding;
@Inject
NotificationController controller;
@Inject
SessionManager sessionManager;
private static final String TAG_NOTIFICATION_WORKER_FRAGMENT = "NotificationWorkerFragment";
private NotificationWorkerFragment mNotificationWorkerFragment;
private NotificatinAdapter adapter;
private List<Notification> notificationList;
MenuItem notificationMenuItem;
/**
* Boolean isRead is true if this notification activity is for read section of notification.
*/
private boolean isRead;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isRead = getIntent().getStringExtra("title").equals("read");
binding = ActivityNotificationBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
mNotificationWorkerFragment = (NotificationWorkerFragment) getFragmentManager()
.findFragmentByTag(TAG_NOTIFICATION_WORKER_FRAGMENT);
initListView();
setPageTitle();
setSupportActionBar(binding.toolbar.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
/**
* If this is unread section of the notifications, removeNotification method
* Marks the notification as read,
* Removes the notification from unread,
* Displays the Snackbar.
*
* Otherwise returns (read section).
*
* @param notification
*/
@SuppressLint("CheckResult")
public void removeNotification(Notification notification) {
if (isRead) {
return;
}
Disposable disposable = Observable.defer((Callable<ObservableSource<Boolean>>)
() -> controller.markAsRead(notification))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
if (result) {
notificationList.remove(notification);
setItems(notificationList);
adapter.notifyDataSetChanged();
ViewUtil.showLongSnackbar(binding.container,getString(R.string.notification_mark_read));
if (notificationList.size() == 0) {
setEmptyView();
binding.container.setVisibility(View.GONE);
binding.noNotificationBackground.setVisibility(View.VISIBLE);
}
} else {
adapter.notifyDataSetChanged();
setItems(notificationList);
ViewUtil.showLongToast(this,getString(R.string.some_error));
}
}, throwable -> {
if (throwable instanceof InvalidLoginTokenException) {
final String username = sessionManager.getUserName();
final CommonsApplication.BaseLogoutListener logoutListener = new CommonsApplication.BaseLogoutListener(
this,
getString(R.string.invalid_login_message),
username
);
CommonsApplication.getInstance().clearApplicationData(
this, logoutListener);
} else {
Timber.e(throwable, "Error occurred while loading notifications");
throwable.printStackTrace();
ViewUtil.showShortSnackbar(binding.container, R.string.error_notifications);
binding.progressBar.setVisibility(View.GONE);
ViewUtil.showShortSnackbar(binding.container, R.string.error_notifications);
}
binding.progressBar.setVisibility(View.GONE);
});
getCompositeDisposable().add(disposable);
}
private void initListView() {
binding.listView.setLayoutManager(new LinearLayoutManager(this));
DividerItemDecoration itemDecor = new DividerItemDecoration(binding.listView.getContext(), DividerItemDecoration.VERTICAL);
binding.listView.addItemDecoration(itemDecor);
if (isRead) {
refresh(true);
} else {
refresh(false);
}
adapter = new NotificatinAdapter(item -> {
Timber.d("Notification clicked %s", item.getLink());
if (item.getNotificationType() == NotificationType.EMAIL){
ViewUtil.showLongSnackbar(binding.container,getString(R.string.check_your_email_inbox));
} else {
handleUrl(item.getLink());
}
removeNotification(item);
return Unit.INSTANCE;
});
binding.listView.setAdapter(adapter);
}
private void refresh(boolean archived) {
if (!NetworkUtils.isInternetConnectionEstablished(this)) {
binding.progressBar.setVisibility(View.GONE);
Snackbar.make(binding.container, R.string.no_internet, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry, view -> refresh(archived)).show();
} else {
addNotifications(archived);
}
binding.progressBar.setVisibility(View.VISIBLE);
binding.noNotificationBackground.setVisibility(View.GONE);
binding.container.setVisibility(View.VISIBLE);
}
@SuppressLint("CheckResult")
private void addNotifications(boolean archived) {
Timber.d("Add notifications");
if (mNotificationWorkerFragment == null) {
binding.progressBar.setVisibility(View.VISIBLE);
getCompositeDisposable().add(controller.getNotifications(archived)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(notificationList -> {
Collections.reverse(notificationList);
Timber.d("Number of notifications is %d", notificationList.size());
this.notificationList = notificationList;
if (notificationList.size()==0){
setEmptyView();
binding.container.setVisibility(View.GONE);
binding.noNotificationBackground.setVisibility(View.VISIBLE);
} else {
setItems(notificationList);
}
binding.progressBar.setVisibility(View.GONE);
}, throwable -> {
Timber.e(throwable, "Error occurred while loading notifications ");
ViewUtil.showShortSnackbar(binding.container, R.string.error_notifications);
binding.progressBar.setVisibility(View.GONE);
}));
} else {
notificationList = mNotificationWorkerFragment.getNotificationList();
setItems(notificationList);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_notifications, menu);
notificationMenuItem = menu.findItem(R.id.archived);
setMenuItemTitle();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.archived:
if (item.getTitle().equals(getString(R.string.menu_option_read))) {
NotificationActivity.startYourself(NotificationActivity.this, "read");
}else if (item.getTitle().equals(getString(R.string.menu_option_unread))) {
onBackPressed();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void handleUrl(String url) {
if (url == null || url.equals("")) {
return;
}
Utils.handleWebUrl(this, Uri.parse(url));
}
private void setItems(List<Notification> notificationList) {
if (notificationList == null || notificationList.isEmpty()) {
ViewUtil.showShortSnackbar(binding.container, R.string.no_notifications);
/*progressBar.setVisibility(View.GONE);
recyclerView.setVisibility(View.GONE);*/
binding.container.setVisibility(View.GONE);
setEmptyView();
binding.noNotificationBackground.setVisibility(View.VISIBLE);
return;
}
binding.container.setVisibility(View.VISIBLE);
binding.noNotificationBackground.setVisibility(View.GONE);
adapter.setItems(notificationList);
}
public static void startYourself(Context context, String title) {
Intent intent = new Intent(context, NotificationActivity.class);
intent.putExtra("title", title);
context.startActivity(intent);
}
private void setPageTitle() {
if (getSupportActionBar() != null) {
if (isRead) {
getSupportActionBar().setTitle(R.string.read_notifications);
} else {
getSupportActionBar().setTitle(R.string.notifications);
}
}
}
private void setEmptyView() {
if (isRead) {
binding.noNotificationText.setText(R.string.no_read_notification);
}else {
binding.noNotificationText.setText(R.string.no_notification);
}
}
private void setMenuItemTitle() {
if (isRead) {
notificationMenuItem.setTitle(R.string.menu_option_unread);
}else {
notificationMenuItem.setTitle(R.string.menu_option_read);
}
}
}

View file

@ -0,0 +1,247 @@
package fr.free.nrw.commons.notification
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.R
import fr.free.nrw.commons.Utils
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.auth.csrf.InvalidLoginTokenException
import fr.free.nrw.commons.databinding.ActivityNotificationBinding
import fr.free.nrw.commons.notification.models.Notification
import fr.free.nrw.commons.notification.models.NotificationType
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.NetworkUtils
import fr.free.nrw.commons.utils.ViewUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import timber.log.Timber
import javax.inject.Inject
/**
* Created by root on 18.12.2017.
*/
class NotificationActivity : BaseActivity() {
private lateinit var binding: ActivityNotificationBinding
@Inject
lateinit var controller: NotificationController
@Inject
lateinit var sessionManager: SessionManager
private val tagNotificationWorkerFragment = "NotificationWorkerFragment"
private var mNotificationWorkerFragment: NotificationWorkerFragment? = null
private lateinit var adapter: NotificationAdapter
private var notificationList: MutableList<Notification> = mutableListOf()
private var notificationMenuItem: MenuItem? = null
/**
* Boolean isRead is true if this notification activity is for read section of notification.
*/
private var isRead: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
isRead = intent.getStringExtra("title") == "read"
binding = ActivityNotificationBinding.inflate(layoutInflater)
setContentView(binding.root)
mNotificationWorkerFragment = supportFragmentManager.findFragmentByTag(
tagNotificationWorkerFragment
) as? NotificationWorkerFragment
initListView()
setPageTitle()
setSupportActionBar(binding.toolbar.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
override fun onSupportNavigateUp(): Boolean {
onBackPressed()
return true
}
@SuppressLint("CheckResult", "NotifyDataSetChanged")
fun removeNotification(notification: Notification) {
if (isRead) return
val disposable = Observable.defer { controller.markAsRead(notification) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ result ->
if (result) {
notificationList.remove(notification)
setItems(notificationList)
adapter.notifyDataSetChanged()
ViewUtil.showLongSnackbar(binding.container, getString(R.string.notification_mark_read))
if (notificationList.isEmpty()) {
setEmptyView()
binding.container.visibility = View.GONE
binding.noNotificationBackground.visibility = View.VISIBLE
}
} else {
adapter.notifyDataSetChanged()
setItems(notificationList)
ViewUtil.showLongToast(this, getString(R.string.some_error))
}
}, { throwable ->
if (throwable is InvalidLoginTokenException) {
val username = sessionManager.getUserName()
val logoutListener = CommonsApplication.BaseLogoutListener(
this,
getString(R.string.invalid_login_message),
username
)
CommonsApplication.instance.clearApplicationData(this, logoutListener)
} else {
Timber.e(throwable, "Error occurred while loading notifications")
ViewUtil.showShortSnackbar(binding.container, R.string.error_notifications)
}
binding.progressBar.visibility = View.GONE
})
compositeDisposable.add(disposable)
}
private fun initListView() {
binding.listView.layoutManager = LinearLayoutManager(this)
val itemDecor = DividerItemDecoration(binding.listView.context, DividerItemDecoration.VERTICAL)
binding.listView.addItemDecoration(itemDecor)
refresh(isRead)
adapter = NotificationAdapter { item ->
Timber.d("Notification clicked %s", item.link)
if (item.notificationType == NotificationType.EMAIL) {
ViewUtil.showLongSnackbar(binding.container, getString(R.string.check_your_email_inbox))
} else {
handleUrl(item.link)
}
removeNotification(item)
}
binding.listView.adapter = adapter
}
private fun refresh(archived: Boolean) {
if (!NetworkUtils.isInternetConnectionEstablished(this)) {
binding.progressBar.visibility = View.GONE
Snackbar.make(binding.container, R.string.no_internet, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry) { refresh(archived) }
.show()
} else {
addNotifications(archived)
}
binding.progressBar.visibility = View.VISIBLE
binding.noNotificationBackground.visibility = View.GONE
binding.container.visibility = View.VISIBLE
}
@SuppressLint("CheckResult")
private fun addNotifications(archived: Boolean) {
Timber.d("Add notifications")
if (mNotificationWorkerFragment == null) {
binding.progressBar.visibility = View.VISIBLE
compositeDisposable.add(controller.getNotifications(archived)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ notificationList ->
notificationList.reversed()
Timber.d("Number of notifications is %d", notificationList.size)
this.notificationList = notificationList.toMutableList()
if (notificationList.isEmpty()) {
setEmptyView()
binding.container.visibility = View.GONE
binding.noNotificationBackground.visibility = View.VISIBLE
} else {
setItems(notificationList)
}
binding.progressBar.visibility = View.GONE
}, { throwable ->
Timber.e(throwable, "Error occurred while loading notifications")
ViewUtil.showShortSnackbar(binding.container, R.string.error_notifications)
binding.progressBar.visibility = View.GONE
}))
} else {
notificationList = mNotificationWorkerFragment?.notificationList?.toMutableList() ?: mutableListOf()
setItems(notificationList)
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_notifications, menu)
notificationMenuItem = menu.findItem(R.id.archived)
setMenuItemTitle()
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.archived -> {
if (item.title == getString(R.string.menu_option_read)) {
startYourself(this, "read")
} else if (item.title == getString(R.string.menu_option_unread)) {
onBackPressed()
}
true
}
else -> super.onOptionsItemSelected(item)
}
}
private fun handleUrl(url: String?) {
if (url.isNullOrEmpty()) return
Utils.handleWebUrl(this, Uri.parse(url))
}
private fun setItems(notificationList: List<Notification>?) {
if (notificationList.isNullOrEmpty()) {
ViewUtil.showShortSnackbar(binding.container, R.string.no_notifications)
binding.container.visibility = View.GONE
setEmptyView()
binding.noNotificationBackground.visibility = View.VISIBLE
return
}
binding.container.visibility = View.VISIBLE
binding.noNotificationBackground.visibility = View.GONE
adapter.items = notificationList
}
private fun setPageTitle() {
supportActionBar?.title = if (isRead) {
getString(R.string.read_notifications)
} else {
getString(R.string.notifications)
}
}
private fun setEmptyView() {
binding.noNotificationText.text = if (isRead) {
getString(R.string.no_read_notification)
} else {
getString(R.string.no_notification)
}
}
private fun setMenuItemTitle() {
notificationMenuItem?.title = if (isRead) {
getString(R.string.menu_option_unread)
} else {
getString(R.string.menu_option_read)
}
}
companion object {
fun startYourself(context: Context, title: String) {
val intent = Intent(context, NotificationActivity::class.java)
intent.putExtra("title", title)
context.startActivity(intent)
}
}
}

View file

@ -3,7 +3,7 @@ package fr.free.nrw.commons.notification
import fr.free.nrw.commons.notification.models.Notification
import fr.free.nrw.commons.upload.categories.BaseDelegateAdapter
internal class NotificatinAdapter(
internal class NotificationAdapter(
onNotificationClicked: (Notification) -> Unit,
) : BaseDelegateAdapter<Notification>(
notificationDelegate(onNotificationClicked),

View file

@ -1,33 +0,0 @@
package fr.free.nrw.commons.notification;
import fr.free.nrw.commons.notification.models.Notification;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.reactivex.Observable;
import io.reactivex.Single;
/**
* Created by root on 19.12.2017.
*/
@Singleton
public class NotificationController {
private NotificationClient notificationClient;
@Inject
public NotificationController(NotificationClient notificationClient) {
this.notificationClient = notificationClient;
}
public Single<List<Notification>> getNotifications(boolean archived) {
return notificationClient.getNotifications(archived);
}
Observable<Boolean> markAsRead(Notification notification) {
return notificationClient.markNotificationAsRead(notification.getNotificationId());
}
}

View file

@ -0,0 +1,25 @@
package fr.free.nrw.commons.notification
import fr.free.nrw.commons.notification.models.Notification
import javax.inject.Inject
import javax.inject.Singleton
import io.reactivex.Observable
import io.reactivex.Single
/**
* Created by root on 19.12.2017.
*/
@Singleton
class NotificationController @Inject constructor(
private val notificationClient: NotificationClient
) {
fun getNotifications(archived: Boolean): Single<List<Notification>> {
return notificationClient.getNotifications(archived)
}
fun markAsRead(notification: Notification): Observable<Boolean> {
return notificationClient.markNotificationAsRead(notification.notificationId)
}
}

View file

@ -1,73 +0,0 @@
package fr.free.nrw.commons.notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import androidx.core.app.NotificationCompat;
import javax.inject.Inject;
import javax.inject.Singleton;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import static androidx.core.app.NotificationCompat.DEFAULT_ALL;
import static androidx.core.app.NotificationCompat.PRIORITY_HIGH;
/**
* Helper class that can be used to build a generic notification
* Going forward all notifications should be built using this helper class
*/
@Singleton
public class NotificationHelper {
public static final int NOTIFICATION_DELETE = 1;
public static final int NOTIFICATION_EDIT_CATEGORY = 2;
public static final int NOTIFICATION_EDIT_COORDINATES = 3;
public static final int NOTIFICATION_EDIT_DESCRIPTION = 4;
public static final int NOTIFICATION_EDIT_DEPICTIONS = 5;
private final NotificationManager notificationManager;
private final NotificationCompat.Builder notificationBuilder;
@Inject
public NotificationHelper(final Context context) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationBuilder = new NotificationCompat
.Builder(context, CommonsApplication.NOTIFICATION_CHANNEL_ID_ALL)
.setOnlyAlertOnce(true);
}
/**
* Public interface to build and show a notification in the notification bar
* @param context passed context
* @param notificationTitle title of the notification
* @param notificationMessage message to be displayed in the notification
* @param notificationId the notificationID
* @param intent the intent to be fired when the notification is clicked
*/
public void showNotification(
final Context context,
final String notificationTitle,
final String notificationMessage,
final int notificationId,
final Intent intent
) {
notificationBuilder.setDefaults(DEFAULT_ALL)
.setContentTitle(notificationTitle)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(notificationMessage))
.setSmallIcon(R.drawable.ic_launcher)
.setProgress(0, 0, false)
.setOngoing(false)
.setPriority(PRIORITY_HIGH);
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
flags |= PendingIntent.FLAG_IMMUTABLE; // This flag was introduced in API 23
}
final PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, flags);
notificationBuilder.setContentIntent(pendingIntent);
notificationManager.notify(notificationId, notificationBuilder.build());
}
}

View file

@ -0,0 +1,73 @@
package fr.free.nrw.commons.notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.core.app.NotificationCompat
import javax.inject.Inject
import javax.inject.Singleton
import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.R
import androidx.core.app.NotificationCompat.DEFAULT_ALL
import androidx.core.app.NotificationCompat.PRIORITY_HIGH
/**
* Helper class that can be used to build a generic notification
* Going forward all notifications should be built using this helper class
*/
@Singleton
class NotificationHelper @Inject constructor(
context: Context
) {
companion object {
const val NOTIFICATION_DELETE = 1
const val NOTIFICATION_EDIT_CATEGORY = 2
const val NOTIFICATION_EDIT_COORDINATES = 3
const val NOTIFICATION_EDIT_DESCRIPTION = 4
const val NOTIFICATION_EDIT_DEPICTIONS = 5
}
private val notificationManager: NotificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
private val notificationBuilder: NotificationCompat.Builder = NotificationCompat
.Builder(context, CommonsApplication.NOTIFICATION_CHANNEL_ID_ALL)
.setOnlyAlertOnce(true)
/**
* Public interface to build and show a notification in the notification bar
* @param context passed context
* @param notificationTitle title of the notification
* @param notificationMessage message to be displayed in the notification
* @param notificationId the notificationID
* @param intent the intent to be fired when the notification is clicked
*/
fun showNotification(
context: Context,
notificationTitle: String,
notificationMessage: String,
notificationId: Int,
intent: Intent
) {
notificationBuilder.setDefaults(NotificationCompat.DEFAULT_ALL)
.setContentTitle(notificationTitle)
.setStyle(NotificationCompat.BigTextStyle().bigText(notificationMessage))
.setSmallIcon(R.drawable.ic_launcher)
.setProgress(0, 0, false)
.setOngoing(false)
.setPriority(NotificationCompat.PRIORITY_HIGH)
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
val pendingIntent = PendingIntent.getActivity(context, 1, intent, flags)
notificationBuilder.setContentIntent(pendingIntent)
notificationManager.notify(notificationId, notificationBuilder.build())
}
}

View file

@ -1,31 +0,0 @@
package fr.free.nrw.commons.notification;
import android.app.Fragment;
import android.os.Bundle;
import androidx.annotation.Nullable;
import fr.free.nrw.commons.notification.models.Notification;
import java.util.List;
/**
* Created by knightshade on 25/2/18.
*/
public class NotificationWorkerFragment extends Fragment {
private List<Notification> notificationList;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public void setNotificationList(List<Notification> notificationList){
this.notificationList = notificationList;
}
public List<Notification> getNotificationList(){
return notificationList;
}
}

View file

@ -0,0 +1,20 @@
package fr.free.nrw.commons.notification
import android.app.Fragment
import android.os.Bundle
import fr.free.nrw.commons.notification.models.Notification
/**
* Created by knightshade on 25/2/18.
*/
class NotificationWorkerFragment : Fragment() {
var notificationList: List<Notification>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
}
}

View file

@ -1,28 +0,0 @@
package fr.free.nrw.commons.notification.models;
public enum NotificationType {
THANK_YOU_EDIT("thank-you-edit"),
EDIT_USER_TALK("edit-user-talk"),
MENTION("mention"),
EMAIL("email"),
WELCOME("welcome"),
UNKNOWN("unknown");
private String type;
NotificationType(String type) {
this.type = type;
}
public String getType() {
return type;
}
public static NotificationType handledValueOf(String name) {
for (NotificationType e : values()) {
if (e.getType().equals(name)) {
return e;
}
}
return UNKNOWN;
}
}

View file

@ -0,0 +1,33 @@
package fr.free.nrw.commons.notification.models
enum class NotificationType(private val type: String) {
THANK_YOU_EDIT("thank-you-edit"),
EDIT_USER_TALK("edit-user-talk"),
MENTION("mention"),
EMAIL("email"),
WELCOME("welcome"),
UNKNOWN("unknown");
// Getter for the type property
fun getType(): String {
return type
}
companion object {
// Returns the corresponding NotificationType for a given name or UNKNOWN
// if no match is found
fun handledValueOf(name: String): NotificationType {
for (e in values()) {
if (e.type == name) {
return e
}
}
return UNKNOWN
}
}
}