mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-13 03:09:04 +01:00
145 lines
3.7 KiB
Java
145 lines
3.7 KiB
Java
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<I extends InvitationItem>
|
|
extends BriarActivity
|
|
implements InvitationListener, InvitationClickListener<I> {
|
|
|
|
protected static final Logger LOG =
|
|
Logger.getLogger(InvitationActivity.class.getName());
|
|
|
|
private InvitationAdapter<I, ?> 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<I, ?> getAdapter(Context ctx,
|
|
InvitationClickListener<I> 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<Collection<I>, DbException>(
|
|
this) {
|
|
@Override
|
|
public void onResultUi(Collection<I> items) {
|
|
displayInvitations(revision, items, clear);
|
|
}
|
|
|
|
@Override
|
|
public void onExceptionUi(DbException exception) {
|
|
// TODO proper error handling
|
|
finish();
|
|
}
|
|
});
|
|
}
|
|
|
|
abstract protected InvitationController<I> getController();
|
|
|
|
protected void respondToInvitation(final I item,
|
|
final boolean accept) {
|
|
getController().respondToInvitation(item, accept,
|
|
new UiResultExceptionHandler<Void, DbException>(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<I> 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);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|