/* Swisscom Safe Connect Copyright (C) 2014 Swisscom This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.swisscom.safeconnect.activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v4.view.ViewPager.PageTransformer; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.FrameLayout; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.swisscom.safeconnect.R; import com.swisscom.safeconnect.utils.Config; import com.swisscom.safeconnect.view.HideShowImgSet; /** * Created by cianci on 10/15/14. */ public class TutorialActivity extends PipeActivity { public static final String KEY_INVOKED_FROM_MENU = "invoked_from_menu"; private static float BG_STRETCH_FACTOR = 2f; private HorizontalScrollView textureScrollView; private HorizontalScrollView secondPlanScrollView; private HorizontalScrollView firstPlanScrollView; private HideShowImgSet imgSet; private LinearLayout secondPlanImages; private FrameLayout firstPlanImages; private ImageView textureImageView; private ImageView visitor1, visitor2, victim, logo; private ImageView messages; private ViewPager viewPager; private ViewGroup paginator; private Button butSkip; private int currentPage = 0; private int pageIncrement = 1; private boolean landscape = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final boolean invokedFromMenu = getIntent().getBooleanExtra(KEY_INVOKED_FROM_MENU, false); if (!invokedFromMenu && !Config.getInstance().isShowTutorial()) { proceed(); return; } landscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; setContentView(R.layout.tutorial); textureScrollView = (HorizontalScrollView) findViewById(R.id.textureScrollView); secondPlanScrollView = (HorizontalScrollView) findViewById(R.id.secondPlanScrollView); firstPlanScrollView = (HorizontalScrollView) findViewById(R.id.firstPlanScrollView); textureImageView = (ImageView) findViewById(R.id.textureImageView); secondPlanImages = (LinearLayout) findViewById(R.id.imgs_second_plan); firstPlanImages = (FrameLayout) findViewById(R.id.imgs_first_plan); imgSet = (HideShowImgSet) findViewById(R.id.img_set); visitor1 = (ImageView) findViewById(R.id.visitor1); visitor2 = (ImageView) findViewById(R.id.visitor2); messages = (ImageView) findViewById(R.id.msgs); victim = (ImageView) findViewById(R.id.victim); logo = (ImageView) findViewById(R.id.img_logo); viewPager = (ViewPager) findViewById(R.id.viewPager); paginator = (ViewGroup) findViewById(R.id.paginator); butSkip = (Button) findViewById(R.id.but_tutorial); butSkip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // start the main activity if not invoked from menu if (!invokedFromMenu) { Config.getInstance().setShowTutorial(false); proceed(); } else { finish(); } } }); setUpPaginator(); int width = getResources().getDisplayMetrics().widthPixels; int height = getResources().getDisplayMetrics().heightPixels; Size size = setUpTextureImageView(width, height); setUpSecondPlanScrollView(width); setUpFirstPlanScrollView(width, height); setUpViewPagers(size, width); setUpContent(width); } private void proceed() { Intent intent; if (!Config.getInstance().areTermsAccepted()) { intent = new Intent(this, TermsPreviewActivity.class); } else { intent = new Intent(this, RegistrationActivity.class); } startActivity(intent); finish(); } @Override public boolean dispatchTouchEvent(android.view.MotionEvent event) { try { return super.dispatchTouchEvent(event); } catch (IllegalArgumentException e) { return true; } }; protected void setUpPaginator() { activatePageIndicator(currentPage); } // called by paginator public void nextPage(View view) { if(currentPage == 0) pageIncrement = 1; else if(currentPage == viewPager.getChildCount() -1) pageIncrement = -1; activatePageIndicator(currentPage + pageIncrement); viewPager.setCurrentItem(currentPage); } private void activatePageIndicator(int page) { ImageView nextIndicator = (ImageView) paginator.getChildAt(currentPage); nextIndicator.setImageResource(R.drawable.ic_pagination_normal); currentPage = page % paginator.getChildCount(); ImageView currentIndicator = (ImageView) paginator.getChildAt(currentPage); currentIndicator.setImageResource(R.drawable.ic_pagination_active); if (currentPage == viewPager.getChildCount()-1) { butSkip.setText(R.string.btn_continue); } else { butSkip.setText(R.string.btn_skip); } } protected Size getSize(int resourceId) { BitmapFactory.Options dimensions = new BitmapFactory.Options(); dimensions.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), resourceId, dimensions); return new Size(dimensions.outWidth, dimensions.outHeight); } private Size setUpTextureImageView(final int width, int height) { final Size size = getSize(R.drawable.tutorial_background); textureImageView.getLayoutParams().width = (int) (width * BG_STRETCH_FACTOR); size.height = textureImageView.getLayoutParams().height; size.width = textureImageView.getLayoutParams().width; textureScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { textureScrollView.getViewTreeObserver().removeGlobalOnLayoutListener(this); if (currentPage > 0 && textureScrollView.getScrollX() == 0) { textureScrollView.scrollTo(width / (viewPager.getChildCount()-1) * currentPage, 0); } } }); return size; } private void setUpSecondPlanScrollView(final int width) { secondPlanImages.getLayoutParams().width = width * 2; LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width / (landscape? 8 : 4), ViewGroup.LayoutParams.WRAP_CONTENT); params.setMargins(landscape? width/8 : 0, 0, width/2, 0); visitor1.setLayoutParams(params); params = new LinearLayout.LayoutParams(width / (landscape? 8 : 4), ViewGroup.LayoutParams.WRAP_CONTENT); visitor2.setLayoutParams(params); } private void setUpFirstPlanScrollView(int width, int height) { firstPlanImages.getLayoutParams().width = (int) (width * BG_STRETCH_FACTOR); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width / (landscape? 6 : 3), height / 5); params.setMargins(width/2-width/(landscape? 12 : 6), height/5, 0, 0); victim.setLayoutParams(params); params = new FrameLayout.LayoutParams(4*width/(landscape? 10 : 5), height/6); params.setMargins(width/2-width/(landscape? 32 : 16), height/13, 0, 0); messages.setLayoutParams(params); imgSet.addImage(R.drawable.tutorial4, width/(landscape? 4 : 2), height/4, width/2-width/6); int imgWidth, imgHeight; if (getResources().getBoolean(R.bool.isTablet)) { imgHeight = 2 * (landscape? height : width) / 5; imgWidth = 4 * (landscape? height : width) / 5; } else { imgHeight = 2 * height / 5; imgWidth = imgHeight; } imgSet.addImage(R.drawable.android_sc, imgWidth, imgHeight, width/2-imgWidth/2); } protected void setUpViewPagers(final Size size, final int width) { TextLayerPagerAdapter adapter = new TextLayerPagerAdapter(); viewPager.setOffscreenPageLimit(viewPager.getChildCount() - 1); viewPager.setAdapter(adapter); viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int page) { activatePageIndicator(page); } @Override public void onPageScrolled(int position, float offset, int offsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); viewPager.setPageTransformer(true, new PageTransformer() { @Override public void transformPage(View view, float pos) { if (view == viewPager.getChildAt(0)) { textureScrollView.scrollTo(Math.round(-width / (viewPager.getChildCount() - 1) * pos), 0); secondPlanScrollView.scrollTo(Math.round(-width / (viewPager.getChildCount() - 1) * pos*1.8f), 0); firstPlanScrollView.scrollTo(Math.round(-width*1.2f / (viewPager.getChildCount()-1) * pos), 0); visitor1.setAlpha(1 + pos); visitor2.setAlpha(1 + pos); if (-pos <= 1) { messages.setAlpha(-pos); imgSet.moveImg(0, -pos); } else if (-pos >= 1 && -pos <= 2) { messages.setAlpha(2+pos); imgSet.moveImg(0, 2+pos); logo.setAlpha(-pos-1); } else if (-pos > 2 && -pos <= 3) { logo.setAlpha(3+pos); imgSet.moveImg(1, -pos-2); } } } }); viewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); } protected void setUpContent(final int width) { final String[] pageDescriptions = getResources().getStringArray(R.array.tutorial_page_descriptions); for(int i = 0; i < viewPager.getAdapter().getCount(); i++ ) { ViewGroup viewGroup = (ViewGroup) viewPager.getAdapter().instantiateItem(null, i); viewGroup.getLayoutParams().width = width; if (i < pageDescriptions.length) { TextView descriptionTextView = (TextView) viewGroup.findViewById(R.id.descriptionTextView); descriptionTextView.setText(pageDescriptions[i]); } } } private void setLayer1Image(ImageView img, int pos) { switch (pos) { case 0: img.setImageResource(R.drawable.tutorial2); break; case 1: img.setImageResource(R.drawable.tutorial4); break; case 2: img.setImageResource(R.drawable.tutorial5); break; default: break; } } protected static class Size { public int width; public int height; Size(int width, int height) { this.width = width; this.height = height; } } public static float getSp(Context context, float pixel) { float scale = context.getResources().getDisplayMetrics().density; return Math.round(pixel / scale); } protected int getPageCount() { return getResources().getStringArray(R.array.tutorial_page_descriptions).length; } private class TextLayerPagerAdapter extends PagerAdapter { public Object instantiateItem(View collection, int position) { ViewGroup viewGroup = (ViewGroup) TutorialActivity.this.viewPager.getChildAt(position); return viewGroup; } @Override public int getCount() { return TutorialActivity.this.viewPager.getChildCount(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // do nothing } } }