blob: da8d1405dafcfe192fea444991bdc83d113e5ec1 [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.syncslides;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import io.v.syncslides.db.DB;
import io.v.syncslides.model.DynamicList;
import io.v.syncslides.model.ListListener;
import io.v.syncslides.model.Session;
import io.v.syncslides.model.Slide;
import io.v.v23.verror.VException;
public class FullscreenSlideFragment extends Fragment {
private static final String SESSION_ID_KEY = "session_id_key";
private static final String TAG = "FullscreenSlide";
private Session mSession;
private ImageView mFullScreenImage;
private DynamicList<Slide> mSlides;
private int mSlideNum = 0;
private final SlideNumberListener mSlideNumberListener = new SlideNumberListener();
private final ListListener mSlideListListener = new SlideListListener();
public static FullscreenSlideFragment newInstance(String sessionId) {
FullscreenSlideFragment fragment = new FullscreenSlideFragment();
Bundle args = new Bundle();
args.putString(SESSION_ID_KEY, sessionId);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle bundle = savedInstanceState;
if (bundle == null) {
bundle = getArguments();
}
String sessionId = bundle.getString(SESSION_ID_KEY);
try {
mSession = DB.Singleton.get().getSession(sessionId);
} catch (VException e) {
handleFatalError("Failed to fetch Session", e);
}
// 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(
v -> ((PresentationActivity) getActivity()).showNavigation());
return rootView;
}
@Override
public void onStart() {
super.onStart();
mSlides = mSession.getSlides();
mSlides.addListener(mSlideListListener);
mSession.addSlideNumberListener(mSlideNumberListener);
}
@Override
public void onStop() {
super.onStop();
mSession.removeSlideNumberListener(mSlideNumberListener);
mSlides.removeListener(mSlideListListener);
mSlides = null;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SESSION_ID_KEY, mSession.getId());
}
private void updateView() {
if (mSlideNum < 0 || mSlideNum >= mSlides.getItemCount()) {
// Still loading...
return;
}
// TODO(kash): Display the fullsize image instead of the thumbnail.
mFullScreenImage.setImageBitmap(mSlides.get(mSlideNum).getThumb());
}
/**
* Updates the view whenever the list of slides changes.
*/
private class SlideListListener implements ListListener {
@Override
public void notifyDataSetChanged() {
updateView();
}
@Override
public void notifyItemChanged(int position) {
updateView();
}
@Override
public void notifyItemInserted(int position) {
updateView();
}
@Override
public void notifyItemRemoved(int position) {
updateView();
}
@Override
public void onError(Exception e) {
handleFatalError("Error watching slide list", e);
}
}
private class SlideNumberListener implements Session.SlideNumberListener {
@Override
public void onChange(int slideNum) {
Log.i(TAG, "onChange " + slideNum);
mSlideNum = slideNum;
updateView();
}
@Override
public void onError(Exception e) {
handleFatalError("Error listening to slide number changes", e);
}
}
private void handleError(String msg, Throwable throwable) {
Log.e(TAG, msg + ": " + Log.getStackTraceString(throwable));
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
}
private void handleFatalError(String msg, Throwable throwable) {
handleError(msg, throwable);
getActivity().finish();
}
}