package org.briarproject.android.sharing; import android.content.Context; import android.os.Bundle; import android.support.annotation.StringRes; import android.support.v7.widget.LinearLayoutManager; import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.BriarActivity; import org.briarproject.android.controller.handler.UiResultExceptionHandler; import org.briarproject.android.sharing.InvitationController.InvitationListener; import org.briarproject.android.view.BriarRecyclerView; import org.briarproject.api.db.DbException; import org.briarproject.api.sharing.InvitationItem; import java.util.Collection; import java.util.logging.Logger; import static android.widget.Toast.LENGTH_SHORT; import static org.briarproject.android.sharing.InvitationAdapter.InvitationClickListener; public abstract class InvitationActivity extends BriarActivity implements InvitationListener, InvitationClickListener { protected static final Logger LOG = Logger.getLogger(InvitationActivity.class.getName()); private InvitationAdapter adapter; private BriarRecyclerView list; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.list); adapter = getAdapter(this, this); list = (BriarRecyclerView) findViewById(R.id.list); if (list != null) { list.setLayoutManager(new LinearLayoutManager(this)); list.setAdapter(adapter); } } abstract protected InvitationAdapter getAdapter(Context ctx, InvitationClickListener listener); @Override public void onStart() { super.onStart(); loadInvitations(false); } @Override public void onStop() { super.onStop(); adapter.clear(); list.showProgressBar(); } @Override public void onItemClick(I item, boolean accept) { respondToInvitation(item, accept); // show toast int res = getDeclineRes(); if (accept) res = getAcceptRes(); Toast.makeText(this, res, LENGTH_SHORT).show(); // remove item and finish if it was the last adapter.incrementRevision(); adapter.remove(item); if (adapter.getItemCount() == 0) { supportFinishAfterTransition(); } } @Override public void loadInvitations(final boolean clear) { final int revision = adapter.getRevision(); getController().loadInvitations(clear, new UiResultExceptionHandler, DbException>( this) { @Override public void onResultUi(Collection items) { displayInvitations(revision, items, clear); } @Override public void onExceptionUi(DbException exception) { // TODO proper error handling finish(); } }); } abstract protected InvitationController getController(); protected void respondToInvitation(final I item, final boolean accept) { getController().respondToInvitation(item, accept, new UiResultExceptionHandler(this) { @Override public void onResultUi(Void result) { } @Override public void onExceptionUi(DbException exception) { // TODO proper error handling finish(); } }); } @StringRes abstract protected int getAcceptRes(); @StringRes abstract protected int getDeclineRes(); protected void displayInvitations(final int revision, final Collection invitations, final boolean clear) { runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { if (invitations.isEmpty()) { LOG.info("No more invitations available, finishing"); supportFinishAfterTransition(); } else if (revision == adapter.getRevision()) { adapter.incrementRevision(); if (clear) adapter.setItems(invitations); else adapter.addAll(invitations); } else { LOG.info("Concurrent update, reloading"); loadInvitations(clear); } } }); } }