mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
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:
parent
874773b881
commit
381f9eca0c
13 changed files with 401 additions and 456 deletions
|
|
@ -289,7 +289,7 @@ public class ContributionsFragment
|
|||
});
|
||||
}
|
||||
notification.setOnClickListener(view -> {
|
||||
NotificationActivity.startYourself(getContext(), "unread");
|
||||
NotificationActivity.Companion.startYourself(getContext(), "unread");
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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),
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue