Java tutorial
// 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(); } }