/* * Copyright (c) 2013 Andrew Fontaine, James Finlay, Jesse Tucker, Jacob Viau, and * Evan DeGraff * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package ca.cmput301f13t03.adventure_datetime.view; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.*; import android.widget.ImageView.ScaleType; import ca.cmput301f13t03.adventure_datetime.R; import ca.cmput301f13t03.adventure_datetime.model.Choice; import ca.cmput301f13t03.adventure_datetime.model.Image; import ca.cmput301f13t03.adventure_datetime.model.Interfaces.ICurrentFragmentListener; import ca.cmput301f13t03.adventure_datetime.model.StoryFragment; import ca.cmput301f13t03.adventure_datetime.serviceLocator.Locator; import java.util.ArrayList; import java.util.List; /** * View Accessed via MainView > Continue > ~Select Item~ or via MainView > BrowseView > StoryDescription > ~Play / * Continue item ~ * <p/> * Holds Horizontal filmstrip containing illustrations at top of page, story fragment text in the view, and an actions * buttons at the bottom of the page. * * @author James Finlay */ public class FragmentView extends Fragment implements ICurrentFragmentListener { private static final String TAG = "FragmentView"; public static final String FOR_SERVER = "emagherd.server"; private HorizontalScrollView _filmstrip; private TextView _content; private LinearLayout _filmLayout; private Button _choices; private boolean forServerEh; private View _rootView = null; private boolean _isEditing = false; private StoryFragment _fragment; private static final int FILM_STRIP_SIZE = 300; @Override public void OnCurrentFragmentChange(StoryFragment newFragment) { _fragment = newFragment; setUpView(); } public void SetFragment(StoryFragment frag) { _fragment = frag; setUpView(); } @Override public void onResume() { Locator.getPresenter().Subscribe(this); super.onResume(); } @Override public void onPause() { Locator.getPresenter().Unsubscribe(this); super.onPause(); } @Override public void onDestroyView() { Locator.getPresenter().Unsubscribe(this); super.onDestroyView(); } public void SetIsEditing(boolean isEditing) { _isEditing = isEditing; } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { _rootView = inflater.inflate(R.layout.fragment_view, container, false); Locator.getPresenter().Subscribe(this); setUpView(); return _rootView; } public void setUpView() { if (_fragment == null) return; /** Layout items **/ _filmLayout = (LinearLayout) _rootView.findViewById(R.id.filmstrip); _filmstrip = (HorizontalScrollView) _rootView.findViewById(R.id.filmstrip_wrapper); _choices = (Button) _rootView.findViewById(R.id.choices); _content = (TextView) _rootView.findViewById(R.id.content); if (_fragment.getStoryMedia() == null) _fragment.setStoryMedia(new ArrayList<Image>()); /* Run on UI Thread for server stuff */ getActivity().runOnUiThread(new Runnable() { @Override public void run() { /** Programmatically set filmstrip height **/ if (_fragment.getStoryMedia().size() > 0) _filmstrip.getLayoutParams().height = FILM_STRIP_SIZE; else _filmstrip.getLayoutParams().height = 0; _content.setText(_fragment.getStoryText()); _filmLayout.removeAllViews(); // 1) Create new ImageView and add to the LinearLayout // 2) Set appropriate Layout Params to ImageView // 3) Give onClickListener for going to fullscreen LinearLayout.LayoutParams lp; //for (int i = 0; i < _fragment.getStoryMedia().size(); i++) { for (int i = 0; i < _fragment.getStoryMedia().size(); i++) { ImageView li = new ImageView(getActivity()); li.setScaleType(ScaleType.CENTER_INSIDE); li.setImageBitmap(_fragment.getStoryMedia().get(i).decodeBitmap()); _filmLayout.addView(li); lp = (LinearLayout.LayoutParams) li.getLayoutParams(); lp.setMargins(10, 10, 10, 10); lp.width = FILM_STRIP_SIZE; lp.height = FILM_STRIP_SIZE; lp.gravity = Gravity.CENTER_VERTICAL; li.setLayoutParams(lp); li.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), FullScreen_Image.class); intent.putExtra(FullScreen_Image.TAG_AUTHOR, false); startActivity(intent); } }); } if (_fragment.getChoices().size() > 0) { /** Choices **/ final List<String> choices = new ArrayList<String>(); for (Choice choice : _fragment.getChoices()) choices.add(choice.getText()); choices.add("I'm feeling lucky."); _choices.setText("Actions"); _choices.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(v.getContext()) .setTitle("Actions") .setCancelable(true) .setItems(choices.toArray(new String[choices.size()]), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /** You feeling lucky, punk? **/ if (which == _fragment.getChoices().size()) which = (int) (Math.random() * _fragment.getChoices().size()); Choice choice = _fragment.getChoices().get(which); Toast.makeText(FragmentView.this.getActivity(), choice.getText(), Toast.LENGTH_LONG).show(); Locator.getUserController().MakeChoice(choice); } }) .create().show(); } }); } else { /** End of story **/ Locator.getUserController().deleteBookmark(); _choices.setText("The End"); _choices.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(v.getContext()) .setTitle("La Fin") .setCancelable(true) .setPositiveButton("Play Again", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Locator.getUserController().StartStory(_fragment.getStoryID()); } }) .setNegativeButton("Change Adventures", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(!_isEditing) getActivity().onBackPressed(); } }) .create().show(); } }); } }}); } }