/*
* Copyright (C) 2014 University of South Florida (sjbarbeau@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.android.ui;
import org.onebusaway.android.R;
import org.onebusaway.android.io.ObaAnalytics;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Html;
import android.text.Spanned;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* TutorialFragment is a general-use fragment that shows a tutorial "wizard"
* using the provided image and string resources. See #335 for details and screenshots.
*
* Example usage:
*
* First, define a string and resource array in the `array.xml`:
* <!-- Resource array for tutorial strings -->
* <array name="report_types_icons_without_open311">
* <item>@drawable/stop_issue_tutorial_0</item>
* <item>@drawable/stop_issue_tutorial_2</item>
* <item>@drawable/stop_issue_tutorial_3</item>
* </array>
*
* <!-- Resource array for tutorial images -->
* <string-array name="preferred_units_options">
* <item>@string/preferences_preferred_units_option_automatic</item>
* <item>@string/preferences_preferred_units_option_metric</item>
* <item>@string/preferences_preferred_units_option_imperial</item>
* </string-array>
*
* Then, pass in these arrays as a bundle into the TutorialFragment when instantiating it:
*
* TutorialFragment tutorialFragment = new TutorialFragment();
* Bundle bundle = new Bundle();
* // Set string resources from arrays
* bundle.putInt(TutorialFragment.STRING_RESOURCE_ID, R.array.report_stop_issue_tutorial_desc);
* // Set image resources from arrays
* bundle.putInt(TutorialFragment.IMAGE_RESOURCE_ID, R.array.report_stop_issue_tutorial_images);
* tutorialFragment.setArguments(bundle);
*/
public class TutorialFragment extends Fragment implements
View.OnClickListener, ViewPager.OnPageChangeListener {
public static final String STRING_RESOURCE_ID = "stringResource";
public static final String IMAGE_RESOURCE_ID = "imageResource";
int[] images;
private Button pagerDone;
private Button pagerPrev;
private Button pagerNext;
private ViewPager viewPager;
int index = 0;
/**
* Array of resources
*/
private int stringArrayResourceId;
private int imageArrayResourceId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
stringArrayResourceId = getArguments().getInt(STRING_RESOURCE_ID, -1);
imageArrayResourceId = getArguments().getInt(IMAGE_RESOURCE_ID, -1);
return inflater.inflate(R.layout.tutorial, null, false);
}
@Override
public void onStart() {
super.onStart();
ObaAnalytics.reportFragmentStart(this);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupViews();
}
private void setupViews() {
TypedArray typedArray = getResources().obtainTypedArray(imageArrayResourceId);
String[] texts = getResources().getStringArray(stringArrayResourceId);
images = new int[typedArray.length()];
for (int i = 0; i < typedArray.length(); i++) {
images[i] = typedArray.getResourceId(i, -1);
}
typedArray.recycle();
updatePagerIndicator(0, images.length);
viewPager = (ViewPager) getActivity().findViewById(R.id.pager);
PagerAdapter adapter = new ImageAdapter(getActivity(), images, texts);
viewPager.setOffscreenPageLimit(3);
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(this);
pagerDone = ((Button) getActivity().findViewById(R.id.pager_button_done));
pagerNext = ((Button) getActivity().findViewById(R.id.pager_button_next));
pagerPrev = ((Button) getActivity().findViewById(R.id.pager_button_prev));
pagerDone.setOnClickListener(this);
pagerPrev.setOnClickListener(this);
pagerNext.setOnClickListener(this);
}
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
index = i;
updatePagerIndicator(i, images.length);
updateNavigationButtons(i, images.length);
if (i == images.length - 1)
pagerDone.setEnabled(true);
}
@Override
public void onPageScrollStateChanged(int i) {
}
@Override
public void onClick(View view) {
if (view == pagerDone) {
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
} else if (view == pagerNext) {
viewPager.setCurrentItem(++index, true);
} else if (view == pagerPrev) {
viewPager.setCurrentItem(--index, true);
}
}
private void updatePagerIndicator(int position, int size) {
LinearLayout linear = (LinearLayout) getActivity().findViewById(R.id.pager_indicator);
linear.removeAllViewsInLayout();
for (int i = 0; i < size; i++) {
ImageView iw = new ImageView(getActivity());
if (position == i) {
iw.setImageResource(R.drawable.pager_dot_hover);
} else {
iw.setImageResource(R.drawable.pager_dot);
}
iw.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) iw.getLayoutParams();
params.setMargins(5, 0, 0, 0);
iw.setLayoutParams(params);
linear.addView(iw);
}
}
private void updateNavigationButtons(int i, int size) {
if (i != size - 1 && i == 0) {
pagerPrev.setVisibility(View.GONE);
pagerDone.setVisibility(View.GONE);
pagerNext.setVisibility(View.VISIBLE);
} else if (i == size - 1) {
pagerPrev.setVisibility(View.VISIBLE);
pagerDone.setVisibility(View.VISIBLE);
pagerNext.setVisibility(View.GONE);
} else {
pagerPrev.setVisibility(View.VISIBLE);
pagerDone.setVisibility(View.GONE);
pagerNext.setVisibility(View.VISIBLE);
}
}
/**
* Image adapter for tutorial images
*/
public class ImageAdapter extends PagerAdapter {
Context context;
int[] images;
String[] texts;
LayoutInflater inflater;
public ImageAdapter(Context context, int[] images, String[] texts) {
this.context = context;
this.images = images;
this.texts = texts;
}
@Override
public int getCount() {
return images.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.tutorial_item, container,
false);
imageView = (ImageView) itemView.findViewById(R.id.ti_imageView);
Spanned html = convertStringToHtml(texts[position]);
((TextView) itemView.findViewById(R.id.ti_textView)).setText(html);
Bitmap btm = BitmapFactory.decodeResource(context.getResources(), images[position]);
imageView.setImageBitmap(btm);
container.addView(itemView);
return itemView;
}
private Spanned convertStringToHtml(String text) {
return Html.fromHtml("<body style=\"text-align:center; \">" + text + "</body>");
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
try {
if (object instanceof View)
container.removeView((View) object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}