blob: db213236fefbce29b5652fddbf49b36dbca4d6f8 [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.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.List;
import io.v.android.apps.syncslides.db.DB;
import io.v.android.apps.syncslides.model.Role;
import io.v.android.apps.syncslides.model.Slide;
public class FullscreenSlideFragment extends Fragment {
private static final String DECK_ID_KEY = "deck_id";
private static final String PRESENTATION_ID_KEY = "presentation_id";
private static final String SLIDE_NUM_KEY = "slide_num";
private static final String ROLE_KEY = "role";
// TODO(afergan): Move state variables to activity.
private String mDeckId;
private String mPresentationId;
private int mSlideNum;
/**
* While mSlides is loading, we can't validate any slide numbers coming from DB.
* We hold them here until mSlides finishes loading.
*/
private int mLoadingSlideNum;
private Role mRole;
private List<Slide> mSlides;
private ImageView mFullScreenImage;
private DB.CurrentSlideListener mCurrentSlideListener;
public static FullscreenSlideFragment newInstance(String deckId, String presentationId,
int slideNum, Role role) {
FullscreenSlideFragment fragment = new FullscreenSlideFragment();
Bundle args = new Bundle();
args.putString(DECK_ID_KEY, deckId);
args.putString(PRESENTATION_ID_KEY, presentationId);
args.putInt(SLIDE_NUM_KEY, slideNum);
args.putSerializable(ROLE_KEY, role);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle args = savedInstanceState;
if (args == null) {
args = getArguments();
}
mDeckId = args.getString(DECK_ID_KEY);
mPresentationId = args.getString(PRESENTATION_ID_KEY);
mSlideNum = args.getInt(SLIDE_NUM_KEY);
mLoadingSlideNum = -1;
mRole = (Role) args.get(ROLE_KEY);
DB db = DB.Singleton.get(getActivity().getApplicationContext());
db.getSlides(mDeckId, new DB.Callback<List<Slide>>() {
@Override
public void done(List<Slide> slides) {
mSlides = slides;
// The CurrentSlideListener could have been notified while we were waiting for
// the slides to load.
if (mLoadingSlideNum != -1) {
currentSlideChanged(mLoadingSlideNum);
} else {
currentSlideChanged(mSlideNum);
}
}
});
// See comment at the top of fragment_slide_list.xml.
((PresentationActivity) getActivity()).setUiImmersive(true);
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_fullscreen_slide, container, false);
mFullScreenImage = (ImageView) rootView.findViewById(R.id.fullscreen_slide_image);
mFullScreenImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((PresentationActivity)getActivity()).showNavigateFragment(mSlideNum);
}
});
return rootView;
}
@Override
public void onStart() {
super.onStart();
if (mRole == Role.AUDIENCE && ((PresentationActivity) getActivity()).getSynced()) {
mCurrentSlideListener = new DB.CurrentSlideListener() {
@Override
public void onChange(int slideNum) {
currentSlideChanged(slideNum);
}
};
DB.Singleton.get(getActivity().getApplicationContext())
.addCurrentSlideListener(mDeckId, mPresentationId, mCurrentSlideListener);
}
}
@Override
public void onStop() {
super.onStop();
if (mRole == Role.AUDIENCE) {
DB.Singleton.get(getActivity().getApplicationContext())
.removeCurrentSlideListener(mDeckId, mPresentationId, mCurrentSlideListener);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(DECK_ID_KEY, mDeckId);
outState.putString(PRESENTATION_ID_KEY, mPresentationId);
outState.putInt(SLIDE_NUM_KEY, mSlideNum);
outState.putSerializable(ROLE_KEY, mRole);
}
private void currentSlideChanged(int slideNum) {
if (mSlides == null) {
// We can't validate that slideNum is within the bounds of mSlides. Hold it off
// to the side until mSlides finishes loading.
mLoadingSlideNum = slideNum;
return;
}
if (slideNum < 0 || slideNum >= mSlides.size()) {
((PresentationActivity)getActivity()).showNavigateFragment(0);
}
mSlideNum = slideNum;
mFullScreenImage.setImageBitmap(mSlides.get(mSlideNum).getImage());
}
}