package com.kenny.openimgur.activities; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import com.kenny.openimgur.R; import com.kenny.openimgur.api.ApiClient; import com.kenny.openimgur.api.responses.BasicResponse; import com.kenny.openimgur.api.responses.NotificationResponse; import com.kenny.openimgur.classes.ImgurNotification; import com.kenny.openimgur.ui.adapters.NotificationAdapter; import com.kenny.openimgur.util.DBContracts; import com.kenny.openimgur.util.LogUtil; import com.kenny.openimgur.util.SqlHelper; import com.kenny.openimgur.util.ViewUtils; import com.kennyc.view.MultiStateView; import java.util.List; import butterknife.BindView; import butterknife.OnClick; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * Created by Kenny-PC on 8/9/2015. */ public class NotificationActivity extends BaseActivity implements View.OnClickListener, View.OnLongClickListener, ActionMode.Callback { public static final String KEY_USER_NOT_LOGGED_IN = "no_user"; private static final String KEY_ITEMS = "items"; private static final String KEY_POSITION = "position"; @BindView(R.id.multiView) MultiStateView mMultiView; @BindView(R.id.list) RecyclerView mList; NotificationAdapter mAdapter; ActionMode mMode; public static Intent createIntent(Context context) { return new Intent(context, NotificationActivity.class); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (user == null) { setResult(Activity.RESULT_CANCELED, new Intent().putExtra(KEY_USER_NOT_LOGGED_IN, true)); Toast.makeText(getApplicationContext(), R.string.notification_no_user, Toast.LENGTH_SHORT).show(); finish(); return; } getSupportActionBar().setTitle(R.string.notifications); setContentView(R.layout.activity_notifications); mList.setLayoutManager(new LinearLayoutManager(getApplicationContext())); if (savedInstanceState != null) { List<ImgurNotification> notifications = savedInstanceState.getParcelableArrayList(KEY_ITEMS); if (notifications != null && !notifications.isEmpty()) { int position = savedInstanceState.getInt(KEY_POSITION, 0); mList.setAdapter(mAdapter = new NotificationAdapter(this, notifications, this, this)); mList.scrollToPosition(position); mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.notifications, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.refresh: mMultiView.setViewState(MultiStateView.VIEW_STATE_LOADING); fetchNotifications(); return true; case R.id.delete: if (mAdapter != null && !mAdapter.isEmpty()) { new AlertDialog.Builder(this, theme.getAlertDialogTheme()) .setTitle(R.string.delete) .setMessage(R.string.notification_delete_all_msg) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mAdapter.clear(); SqlHelper.getInstance(getApplicationContext()).deleteFromTable(DBContracts.NotificationContract.TABLE_NAME); mMultiView.setViewState(MultiStateView.VIEW_STATE_EMPTY); } }).show(); } break; } return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); if (mAdapter == null || mAdapter.isEmpty()) { List<ImgurNotification> notifications = SqlHelper.getInstance(getApplicationContext()).getNotifications(false); if (!notifications.isEmpty()) { LogUtil.v(TAG, "Notifications present in database"); mAdapter = new NotificationAdapter(this, notifications, this, this); mList.setAdapter(mAdapter); mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); markNotificationsRead(); } else { LogUtil.v(TAG, "No notifications found in database, making request"); mMultiView.setViewState(MultiStateView.VIEW_STATE_LOADING); fetchNotifications(); } } } @Override protected void onDestroy() { if (mAdapter != null) mAdapter.onDestroy(); markNotificationsRead(); super.onDestroy(); } @OnClick(R.id.errorButton) @Override public void onClick(View v) { if (v.getId() == R.id.errorButton) { mMultiView.setViewState(MultiStateView.VIEW_STATE_LOADING); fetchNotifications(); return; } ImgurNotification notification = mAdapter.getItem(mList.getChildAdapterPosition(v)); if (mMode != null) { mAdapter.setSelected(notification); if (mAdapter.hasSelectedItems()) { mMode.setTitle(getString(R.string.notification_selected, mAdapter.getSelectedCount())); } else { mMode.finish(); } return; } String url = ApiClient.IMGUR_GALLERY_URL + notification.getContentId(); Intent intent = ViewActivity.createIntent(getApplicationContext(), url, !TextUtils.isEmpty(notification.getAlbumCover())); startActivity(intent); } @Override public boolean onLongClick(View v) { ImgurNotification notification = mAdapter.getItem(mList.getChildAdapterPosition(v)); mAdapter.setSelected(notification); if (mAdapter.hasSelectedItems()) { if (mMode == null) mMode = startActionMode(this); mMode.setTitle(getString(R.string.notification_selected, mAdapter.getSelectedCount())); } else { mMode.finish(); } return true; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.getMenuInflater().inflate(R.menu.notification_cab, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.delete: SqlHelper.getInstance(getApplicationContext()).deleteNotifications(mAdapter.getSelectedNotifications()); mAdapter.deleteNotifications(); mode.finish(); if (mAdapter.isEmpty()) mMultiView.setViewState(MultiStateView.VIEW_STATE_EMPTY); break; } return false; } @Override public void onDestroyActionMode(ActionMode mode) { mAdapter.setSelected(null); mMode = null; } private void fetchNotifications() { ApiClient.getService().getNotifications().enqueue(new Callback<NotificationResponse>() { @Override public void onResponse(Call<NotificationResponse> call, Response<NotificationResponse> response) { if (response == null || response.body() == null) { if (mAdapter == null || mAdapter.isEmpty()) mMultiView.setViewState(MultiStateView.VIEW_STATE_EMPTY); return; } NotificationResponse notificationResponse = response.body(); if (notificationResponse != null && notificationResponse.hasNotifications()) { SqlHelper sql = SqlHelper.getInstance(getApplicationContext()); sql.insertNotifications(notificationResponse); List<ImgurNotification> notifications = sql.getNotifications(false); // Mark any notifications immediately read markNotificationsRead(); if (notifications.isEmpty() && (mAdapter == null || mAdapter.isEmpty())) { mMultiView.setViewState(MultiStateView.VIEW_STATE_EMPTY); } else { if (mAdapter != null) { mAdapter.clear(); mAdapter.addItems(notifications); } else { mAdapter = new NotificationAdapter(NotificationActivity.this, notifications, NotificationActivity.this, NotificationActivity.this); mList.setAdapter(mAdapter); } mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); } } else if (mAdapter == null || mAdapter.isEmpty()) { mMultiView.setViewState(MultiStateView.VIEW_STATE_EMPTY); } else { mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); } } @Override public void onFailure(Call<NotificationResponse> call, Throwable t) { if (mAdapter == null || mAdapter.isEmpty()) { ViewUtils.setErrorText(mMultiView, R.id.errorMessage, ApiClient.getErrorCode(t)); mMultiView.setViewState(MultiStateView.VIEW_STATE_ERROR); } else { Snackbar.make(mMultiView, ApiClient.getErrorCode(t), Snackbar.LENGTH_LONG).show(); mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); } } }); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mAdapter != null && !mAdapter.isEmpty()) { outState.putParcelableArrayList(KEY_ITEMS, mAdapter.retainItems()); LinearLayoutManager manager = (LinearLayoutManager) mList.getLayoutManager(); outState.putInt(KEY_POSITION, manager.findFirstVisibleItemPosition()); } } void markNotificationsRead() { SqlHelper sql = SqlHelper.getInstance(getApplicationContext()); String ids = sql.getNotificationIds(); // Mark all the notifications read when loaded if (!TextUtils.isEmpty(ids)) { sql.markNotificationsRead(); ApiClient.getService().markNotificationsRead(ids).enqueue(new Callback<BasicResponse>() { @Override public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) { if (response != null && response.body() != null) { LogUtil.v(TAG, "Marking Notifications Read Response " + response.body().data); } else { LogUtil.w(TAG, "Did not receive a response when marking notifications read"); } } @Override public void onFailure(Call<BasicResponse> call, Throwable t) { LogUtil.e(TAG, "Failure marking notifications read, error", t); } }); } } @Override protected int getStyleRes() { return theme.isDarkTheme ? R.style.Theme_Opengur_Dark : R.style.Theme_Opengur_Light_DarkActionBar; } }