blob: 75fbe0bd10af4e666e5d7ae47f67e9e19098be65 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.android.apps.syncslides;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toolbar;
import io.v.android.apps.syncslides.db.DB;
import io.v.android.apps.syncslides.discovery.DiscoveryManager;
import io.v.android.apps.syncslides.model.Deck;
import io.v.android.apps.syncslides.model.Listener;
import io.v.android.apps.syncslides.model.Participant;
import io.v.android.apps.syncslides.model.Role;
/**
* Provides a list of decks to be shown in the RecyclerView of the
* DeckChooserFragment.
*/
public class DeckListAdapter extends RecyclerView.Adapter<DeckListAdapter.ViewHolder>
implements Listener {
private static final String TAG = "DeckListAdapter";
private DB.DBList<Deck> mDecks;
private DB.DBList<Deck> mLiveDecks;
private DB mDB;
public DeckListAdapter(DB db) {
mDB = db;
}
public void start(Context context) {
if (mDecks != null) {
throw new IllegalStateException("Wrong lifecycle.");
}
Log.d(TAG, "Starting.");
DiscoveryManager dm = DiscoveryManager.make(context);
// Listening stops below in mLiveDecks.discard.
dm.setListener(this);
dm.start(context);
mLiveDecks = dm;
mDecks = DB.Singleton.get(context).getDecks();
mDecks.setListener(new Listener() {
@Override
public void notifyItemChanged(int position) {
DeckListAdapter.this.notifyItemChanged(mLiveDecks.getItemCount() + position);
}
@Override
public void notifyItemInserted(int position) {
DeckListAdapter.this.notifyItemInserted(mLiveDecks.getItemCount() + position);
}
@Override
public void notifyItemRemoved(int position) {
DeckListAdapter.this.notifyItemRemoved(mLiveDecks.getItemCount() + position);
}
});
}
/**
* Stops any background monitoring of the underlying data.
*/
public void stop() {
Log.d(TAG, "Stopping.");
mLiveDecks.discard();
mLiveDecks = null;
mDecks.discard();
mDecks = null;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.deck_card, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int deckIndex) {
final Deck deck;
final Role role;
// If the position is less than the number of live presentation decks, get deck card from
// there (and don't allow the user to delete the deck). If not, get the card from the DB.
if (deckIndex < mLiveDecks.getItemCount()) {
deck = mLiveDecks.get(deckIndex);
holder.mToolbarLiveNow
.setText(holder.itemView.getResources().getString(R.string.presentation_live));
holder.mToolbarLiveNow.setVisibility(View.VISIBLE);
holder.mToolbarLastOpened.setVisibility(View.GONE);
holder.mToolbar.getMenu().clear();
role = Role.AUDIENCE;
} else {
deck = mDecks.get(deckIndex - mLiveDecks.getItemCount());
// TODO(afergan): Set actual date here.
holder.mToolbarLastOpened.setText("Opened on Oct 26, 2015");
holder.mToolbarLastOpened.setVisibility(View.VISIBLE);
holder.mToolbarLiveNow.setVisibility(View.GONE);
holder.mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_delete_deck:
mDB.deleteDeck(deck.getId());
return true;
}
return false;
}
});
role = Role.BROWSER;
}
holder.mToolbarTitle.setText(deck.getTitle());
// TODO(kash): We need to say when the user last viewed the deck.
Bitmap thumb = deck.getThumb();
if (thumb == null) {
thumb = makeDefaultThumb(holder.mToolbar.getContext());
}
holder.mThumb.setImageBitmap(thumb);
holder.mThumb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Clicking through to PresentationActivity.");
final Context context = v.getContext();
if (role == Role.AUDIENCE) {
//String deviceId = "355499060906851"; // Black Nexus 6.
String deviceId = "355499060490393"; // Nexus 6 ZX1G22MLNL
DB.Singleton.get(context).joinPresentation(
// TODO(kash): Use the real syncgroup name.
"/192.168.86.254:8101/" + deviceId + "/%%sync/syncslides/" +
"deckId1/randomPresentationId1",
new DB.Callback<Void>() {
@Override
public void done(Void aVoid) {
showSlides(context, deck, role);
}
});
} else {
showSlides(context, deck, role);
}
}
});
}
private void showSlides(Context context, Deck deck, Role role) {
Intent intent = new Intent(context, PresentationActivity.class);
intent.putExtra(Deck.B.DECK_ID, deck.getId());
intent.putExtra(Participant.B.PARTICIPANT_ROLE, role);
context.startActivity(intent);
}
@Override
public int getItemCount() {
return mLiveDecks.getItemCount() + mDecks.getItemCount();
}
private Bitmap makeDefaultThumb(Context c) {
return BitmapFactory.decodeResource(
c.getResources(), R.drawable.thumb_deck3);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public final ImageView mThumb;
public final Toolbar mToolbar;
public final TextView mToolbarTitle;
public final TextView mToolbarLiveNow;
public final TextView mToolbarLastOpened;
public ViewHolder(final View itemView) {
super(itemView);
mThumb = (ImageView) itemView.findViewById(R.id.deck_thumb);
mToolbar = (Toolbar) itemView.findViewById(R.id.deck_card_toolbar);
mToolbarTitle = (TextView) itemView.findViewById(R.id.deck_card_toolbar_title);
mToolbarLiveNow = (TextView) itemView.findViewById(R.id.deck_card_toolbar_live_now);
mToolbarLastOpened =
(TextView) itemView.findViewById(R.id.deck_card_toolbar_last_opened);
mToolbar.inflateMenu(R.menu.deck_card);
}
}
}