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.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()); } }