blob: e84b42d223ed1e5eab9bff4bee4e496a1984d970 [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.db;
import android.content.Context;
import java.util.List;
import io.v.android.apps.syncslides.misc.Config;
import io.v.android.apps.syncslides.model.Deck;
import io.v.android.apps.syncslides.model.Listener;
import io.v.android.apps.syncslides.model.Question;
import io.v.android.apps.syncslides.model.Slide;
/**
* Provides high-level methods for getting and setting the state of SyncSlides.
* It is an interface instead of a concrete class to make testing easier.
*/
public interface DB {
class Singleton {
private static volatile DB instance;
public static DB get(Context context) {
DB result = instance;
if (instance == null) {
synchronized (Singleton.class) {
result = instance;
if (result == null) {
instance = result = Config.Syncbase.ENABLE ?
new SyncbaseDB(context) : new FakeDB(context);
}
}
}
return result;
}
}
/**
* Perform initialization steps.
*/
void init();
/**
* Provides a list of elements via an API that fits well with
* RecyclerView.Adapter.
*/
interface DBList<E> {
/**
* Returns the number of items in the list.
*/
int getItemCount();
/**
* Returns the ith item in the list.
*/
E get(int i);
/**
* Sets the listener for changes to the list. There can only be one
* listener.
*/
void setListener(Listener listener);
/**
* Indicates that the list is no longer needed and should stop notifying
* its listener.
*/
void discard();
}
/**
* Gets the list of decks visible to the user.
*
* @return a list of decks
*/
DBList<Deck> getDecks();
/**
* Given a deck ID, gets the list of slides visible to the user.
*
* @return a list of slides
*/
DBList<Slide> getSlides(String deckId);
interface Callback<Result> {
/**
* This callback is run on the UI thread once the method is done.
*
* @param result the loaded data
*/
void done(Result result);
}
/**
* Asynchronously fetch the slides for the given deck.
*
* @param deckId the deck to fetch
* @param callback runs on the UI thread when the slide data is loaded
*/
void getSlides(String deckId, Callback<List<Slide>> callback);
/**
* Imports the slide deck along with its slides.
*
* @param deck deck to import
* @param slides slides belonging to the above deck
*/
void importDeck(Deck deck, Slide[] slides);
/**
* Asynchronously imports the slide deck along with its slides.
*
* @param deck deck to import
* @param slides slides belonging to the above deck
* @param callback runs on the UI thread when the deck has been imported
*/
void importDeck(Deck deck, Slide[] slides, Callback<Void> callback);
/**
* Synchronously gets a deck by Id. Returns null if not found.
*
* @param deckId id of the deck to get
*/
Deck getDeck(String deckId);
/**
* Asynchronously deletes the deck and all of its slides.
*
* @param deckId id of the deck to delete
*/
void deleteDeck(String deckId);
/**
* Asynchronously deletes the deck and all of its slides.
*
* @param deckId id of the deck to delete
* @param callback runs on the UI thread when the deck has been deleted
*/
void deleteDeck(String deckId, Callback<Void> callback);
class CreatePresentationResult {
/**
* A unique ID for the presentation. All methods that deal with live
* presentation data (e.g. the current slide) use this ID.
*/
public String presentationId;
/**
* This is the name of the syncgroup that was created for this
* presentation instance. Audience members must join this syncgroup.
*/
public String syncgroupName;
CreatePresentationResult(String presentationId, String syncgroupName) {
this.presentationId = presentationId;
this.syncgroupName = syncgroupName;
}
}
/**
* Creates a new presentation by creating a syncgroup.
*
* @param deckId the deck to use in the presentation
* @param callback called when the presentation is created
*/
void createPresentation(String deckId, Callback<CreatePresentationResult> callback);
/**
* Joins an existing presentation.
*
* @param syncgroupName the syncgroup to join
* @param callback called when the syncgroup is joined
*/
void joinPresentation(String syncgroupName, Callback<Void> callback);
/**
* Sets the current slide so any audience members can switch to it.
*
* @param deckId the deck being presented
* @param presentationId the instance of the live presentation
* @param slideNum the new slide number
*/
void setCurrentSlide(String deckId, String presentationId, int slideNum);
/**
* Saves notes for the specified slide.
*
* @param deckId the deck being presented
* @param slideNum the current slide number
* @param slideNotes the text of the slide's notes
*/
void setSlideNotes(String deckId, int slideNum, String slideNotes);
interface CurrentSlideListener {
/**
* Called whenever the current slide of a live presentation changes.
*
* @param slideNum the new slide number
*/
void onChange(int slideNum);
}
/**
* Add a listener for changes to the current slide of a live presentation.
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation to watch for changes
* @param listener notified of changes
*/
void addCurrentSlideListener(String deckId, String presentationId,
CurrentSlideListener listener);
/**
* Remove a listener that was previously passed to addCurrentSlideListener().
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation being watched for changes
* @param listener previously passed to addCurrentSlideListener()
*/
void removeCurrentSlideListener(String deckId, String presentationId,
CurrentSlideListener listener);
interface QuestionListener {
/**
* Called whenever the set of questions changes.
*
* @param questions the new, complete set of questions
*/
void onChange(List<Question> questions);
}
/**
* Set the listener for changes to the set of questions for a live
* presentation. There can be only one listener at a time.
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation to watch for changes
* @param listener notified of changes
*/
void setQuestionListener(String deckId, String presentationId,
QuestionListener listener);
/**
* Remove the listener that was previously passed to setQuestionListener().
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation being watched for changes
* @param listener previously passed to setQuestionListener()
*/
void removeQuestionListener(String deckId, String presentationId,
QuestionListener listener);
/**
* Add user to presenter's question queue.
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation identifier
* @param name the user's full name
*/
void askQuestion(String deckId, String presentationId, String name);
/**
* Give control of the presentation to the questioner. Mark the question as answered.
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation identifier
* @param questionId the question being answered
*/
void handoffQuestion(String deckId, String presentationId, String questionId);
/**
* Take back control of the presentation from the questioner.
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation identifier
*/
void resumeControl(String deckId, String presentationId);
interface DriverListener {
/**
* Called whenever the presentation's driver changes.
*
* @param driver the temporary driver of the presentation. null means that the
* original presenter has control.
*/
void onChange(VPerson driver);
}
/**
* Set the listener for changes to the driver of the presentation.
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation identifier
* @param listener notified of changes
*/
void setDriverListener(String deckId, String presentationId, DriverListener listener);
/**
* Remove the listener that was previously passed to setDriverListener().
*
* @param deckId the deck used in the presentation
* @param presentationId the presentation identifier
* @param listener previously passed to setDriverListener()
*/
void removeDriverListener(String deckId, String presentationId, DriverListener listener);
}