blob: 47ae8fb1bdbdb0cec3d0ec91b4450bff053237a9 [file] [log] [blame]
/*
* Copyright (C) 2013 Fairphone Project
*
* 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 com.fairphone.fplauncher3.oobe;
import android.app.Activity;
import android.app.Notification;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.view.animation.ScaleAnimation;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.VideoView;
import com.fairphone.fplauncher3.R;
import com.fairphone.fplauncher3.oobe.animation.AddFavTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.CameraTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.EdgeGlowTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.EdgeSwipeTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.MoveFavTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.OpenAppTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.RemoveFavTutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.TutorialAnimationHelper;
import com.fairphone.fplauncher3.oobe.animation.TutorialAnimationHelper.TutorialAnimationHelperListener;
import com.fairphone.fplauncher3.oobe.animation.TutorialAnimationHelper.TutorialState;
import com.fairphone.fplauncher3.oobe.utils.KWFontsManager;
import java.util.ArrayList;
import java.util.Locale;
public class OOBEActivity extends Activity implements TutorialAnimationHelperListener {
private View mOOBEGotItButton;
private View mOOBEGotItButton4;
private View mOOBEGotItButton10;
public static enum OOBESteps {
SELECT_LANGUAGE,
SETUP_WIFI,
DEVICE_INTRO,
EDGE_GLOW,
EDGE_SWIPE_APPEAR,
EDGE_SWIPE_SELECTION,
EDIT_INTRO,
EDIT_DRAG_NEW_FAVORITE,
EDIT_DRAG_REMOVE_FAVORITE,
EDIT_DRAG_TRADE_FAVORITE,
CAMERA_BUTTON,
SHUTTER_BUTTON
}
public static final String OOBE_TUTORIAL = "OOBE_Tutorial";
public static final int OOBE_FULL_TUTORIAL = 0;
public static final int OOBE_DEVICE_TUTORIAL = 1;
public static final int OOBE_EDIT_FAVORITES_TUTORIAL = 2;
public static final int OOBE_APP_SWITCHER_TUTORIAL = 3;
private static final int RESULT_WIFI_SETUP = 500;
private static final int RESULT_LANGUAGE_SETUP = 501;
private int mCurrentStep;
private ArrayList<OOBESteps> mAnimationSteps;
private View mOOBETextGroup1;
private View mOOBETextGroup2;
private View mOOBETextGroup3;
private View mOOBETextGroup4;
private View mOOBETextGroup5;
private View mOOBETextGroup6;
private View mOOBETextGroup7;
private View mOOBETextGroup8;
private View mOOBETextGroup9;
private View mOOBETextGroup10;
private ImageButton mSelectLanguageButton;
private ImageButton mSetupWifiButton;
private Button mStartButton;
private Button mSkipButton;
private Button mNextButton;
private Button mBackButton;
private int mTutorialToShow;
private TutorialAnimationHelper mCurAnimHelper;
private TutorialAnimationHelper mNextAnimHelper;
private ViewGroup mAnimationHolder;
private VideoView mVideo;
private Button mSkipVideoButton;
private View mMainBackground;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fp_oobe_activity);
Bundle extra = getIntent() != null ? getIntent().getExtras() : null;
if (extra != null) {
mTutorialToShow = extra.getInt(OOBE_TUTORIAL);
} else {
mTutorialToShow = OOBE_FULL_TUTORIAL;
}
mAnimationSteps = new ArrayList<>();
mCurrentStep = 0;
mCurAnimHelper = null;
mNextAnimHelper = null;
setupLayout();
setupListeners();
setupAnimationStart();
setupFonts();
}
private void setupFonts() {
ViewGroup root = (ViewGroup) ((ViewGroup) getWindow().getDecorView()).getChildAt(0);
KWFontsManager.prepareFonts(this, root);
}
@Override
public void onBackPressed() {
}
private void setupLayout() {
mAnimationHolder = (ViewGroup) findViewById(R.id.tutorialAnimationViewContainer);
mMainBackground = findViewById(R.id.oobe_background);
mStartButton = (Button) findViewById(R.id.startButton);
mSkipButton = (Button) findViewById(R.id.skipButton);
mNextButton = (Button) findViewById(R.id.nextButton);
mBackButton = (Button) findViewById(R.id.backButton);
mOOBETextGroup1 = (View) findViewById(R.id.oobeTextGroup1);
mOOBETextGroup2 = (View) findViewById(R.id.oobeTextGroup2);
mOOBETextGroup3 = (View) findViewById(R.id.oobeTextGroup3);
mOOBETextGroup4 = (View) findViewById(R.id.oobeTextGroup4);
mOOBETextGroup5 = (View) findViewById(R.id.oobeTextGroup5);
mOOBETextGroup6 = (View) findViewById(R.id.oobeTextGroup6);
mOOBETextGroup7 = (View) findViewById(R.id.oobeTextGroup7);
mOOBETextGroup8 = (View) findViewById(R.id.oobeTextGroup8);
mOOBETextGroup9 = (View) findViewById(R.id.oobeTextGroup9);
mOOBETextGroup10 = (View) findViewById(R.id.oobeTextGroup10);
mSelectLanguageButton = (ImageButton) findViewById(R.id.selectLanguageButton);
mSetupWifiButton = (ImageButton) findViewById(R.id.setupWifiButton);
mSkipButton.setVisibility(View.GONE);
mBackButton.setVisibility(View.GONE);
mNextButton.setVisibility(View.GONE);
mSelectLanguageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(new Intent(Settings.ACTION_LOCALE_SETTINGS), RESULT_LANGUAGE_SETUP);
}
});
mSetupWifiButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(new Intent(Settings.ACTION_WIFI_SETTINGS), RESULT_WIFI_SETUP);
}
});
mOOBEGotItButton = findViewById(R.id.got_it_button);
mOOBEGotItButton4 = findViewById(R.id.got_it_button_4);
mOOBEGotItButton10 = findViewById(R.id.got_it_button_10);
}
@Override
protected void onActivityResult(final int requestCode,
final int resultCode, final Intent data) {
switch (requestCode) {
case RESULT_WIFI_SETUP:
jumpToNextSlide();
break;
case RESULT_LANGUAGE_SETUP:
jumpToNextSlide();
break;
}
}
private void setupAnimationStart() {
switch (mTutorialToShow) {
case OOBE_FULL_TUTORIAL: {
setupTheVideo();
setupFullTutorialSteps();
break;
}
case OOBE_DEVICE_TUTORIAL: {
// setupTheVideo();
// setupDefinitionsSteps();
hideVideo();
setupDeviceIntroSteps();
setupEdgeSwipeTutorialSteps();
setupCameraButtonSteps();
//setupEdgeGlowTutorialSteps();
break;
}
case OOBE_EDIT_FAVORITES_TUTORIAL: {
hideVideo();
setupEditFavoritesTutorialSteps();
startTutorialInitialAnimation();
break;
}
default: {
mTutorialToShow = OOBE_FULL_TUTORIAL;
setupTheVideo();
setupFullTutorialSteps();
break;
}
}
startStepAnimation(mAnimationSteps.get(0));
}
private void hideVideo() {
RelativeLayout rl = (RelativeLayout) findViewById(R.id.oobeVideoViewGroup);
rl.setVisibility(View.GONE);
}
private void setupEditFavoritesTutorialSteps() {
mAnimationSteps.add(OOBESteps.EDIT_INTRO);
mAnimationSteps.add(OOBESteps.EDIT_DRAG_NEW_FAVORITE);
mAnimationSteps.add(OOBESteps.EDIT_DRAG_REMOVE_FAVORITE);
mAnimationSteps.add(OOBESteps.EDIT_DRAG_TRADE_FAVORITE);
}
private void setupDefinitionsSteps() {
mAnimationSteps.add(OOBESteps.SELECT_LANGUAGE);
mAnimationSteps.add(OOBESteps.SETUP_WIFI);
}
private void setupDeviceIntroSteps(){
mAnimationSteps.add(OOBESteps.DEVICE_INTRO);
}
private void setupEdgeSwipeTutorialSteps() {
mAnimationSteps.add(OOBESteps.EDGE_SWIPE_APPEAR);
}
private void setupCameraButtonSteps(){
mAnimationSteps.add(OOBESteps.CAMERA_BUTTON);
}
private void setupEdgeGlowTutorialSteps(){
mAnimationSteps.add(OOBESteps.EDGE_GLOW);
}
private void setupTheVideo() {
RelativeLayout rl = (RelativeLayout) findViewById(R.id.oobeVideoViewGroup);
rl.setVisibility(View.VISIBLE);
mVideo = (VideoView) findViewById(R.id.fp_oobe_video);
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.fp_buy_a_phone_start_a_movement);
mVideo.setMediaController(null);
mVideo.requestFocus();
mVideo.setVideoURI(uri);
mVideo.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
mVideo.start();
mVideo.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopIntroVideo();
}
});
// button
mSkipVideoButton = (Button) findViewById(R.id.fp_oobe_video_skip_button);
mSkipVideoButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopIntroVideo();
}
});
}
private void stopIntroVideo() {
mVideo.stopPlayback();
final RelativeLayout rl = (RelativeLayout) findViewById(R.id.oobeVideoViewGroup);
Animation fadeOutAnimation = AnimationUtils.loadAnimation(OOBEActivity.this, R.anim.fade_out_slow);
rl.startAnimation(fadeOutAnimation);
fadeOutAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
rl.setVisibility(View.GONE);
mVideo.setVisibility(View.GONE);
mSkipVideoButton.setVisibility(View.GONE);
}
});
startTutorialInitialAnimation();
}
private void startTutorialInitialAnimation() {
Animation oobeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in_slow);
mMainBackground.startAnimation(oobeAnimation);
}
private void setupFullTutorialSteps() {
setupEdgeSwipeTutorialSteps();
setupEditFavoritesTutorialSteps();
setupCameraButtonSteps();
}
private void jumpToNextSlide() {
// increment the step counter
mCurrentStep++;
if (mCurrentStep < mAnimationSteps.size()) {
startStepAnimation(mAnimationSteps.get(mCurrentStep));
}
}
private void setupListeners() {
mSkipButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCurrentStep < 2 && (mTutorialToShow == OOBE_DEVICE_TUTORIAL)) {
jumpToNextSlide();
} else {
endOOBEActivity();
}
}
});
if(mOOBEGotItButton!=null) {
mOOBEGotItButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCurrentStep < 2 && (mTutorialToShow == OOBE_DEVICE_TUTORIAL)) {
jumpToNextSlide();
} else {
endOOBEActivity();
}
}
});
}
if(mOOBEGotItButton4!=null) {
mOOBEGotItButton4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCurrentStep < 2 && (mTutorialToShow == OOBE_DEVICE_TUTORIAL) && Build.MODEL.equals("FP2")) {
jumpToNextSlide();
} else {
endOOBEActivity();
}
}
});
}
if(mOOBEGotItButton10!=null) {
mOOBEGotItButton10.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCurrentStep < 2 && (mTutorialToShow == OOBE_DEVICE_TUTORIAL)) {
jumpToNextSlide();
} else {
endOOBEActivity();
}
}
});
}
mStartButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
jumpToNextSlide();
}
});
mNextButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// increment the step counter
mCurrentStep++;
if (mCurrentStep < mAnimationSteps.size()) {
startStepAnimation(mAnimationSteps.get(mCurrentStep));
} else {
endOOBEActivity();
}
}
});
mBackButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// decrement the step counter
mCurrentStep--;
if (mCurrentStep >= 0) {
startStepAnimation(mAnimationSteps.get(mCurrentStep));
} else {
endOOBEActivity();
}
}
});
}
private void startStepAnimation(OOBESteps step) {
switch (step) {
case SELECT_LANGUAGE:
startAnimation(null);
setTextView(mOOBETextGroup1);
break;
case SETUP_WIFI:
startAnimation(null);
setTextView(mOOBETextGroup2);
break;
case DEVICE_INTRO:
startAnimation(null);
mMainBackground.setBackgroundResource(android.R.color.transparent);
setTextView(mOOBETextGroup3);
break;
case EDGE_SWIPE_APPEAR:
mMainBackground.setBackgroundResource(R.color.oobe_background);
Animation gotItButtonAnimation = new AlphaAnimation(0.0f, 1.0f);
gotItButtonAnimation.setDuration(200);
gotItButtonAnimation.setStartOffset(6500);
mOOBEGotItButton4.startAnimation(gotItButtonAnimation);
startAnimation(new EdgeSwipeTutorialAnimationHelper());
setTextView(mOOBETextGroup4);
break;
case EDGE_SWIPE_SELECTION:
startAnimation(new OpenAppTutorialAnimationHelper());
setTextView(mOOBETextGroup5);
break;
case EDIT_INTRO:
startAnimation(null);
setTextView(mOOBETextGroup6);
break;
case EDIT_DRAG_NEW_FAVORITE:
startAnimation(new AddFavTutorialAnimationHelper());
setTextView(mOOBETextGroup7);
break;
case EDIT_DRAG_REMOVE_FAVORITE:
startAnimation(new RemoveFavTutorialAnimationHelper());
setTextView(mOOBETextGroup8);
break;
case EDIT_DRAG_TRADE_FAVORITE:
startAnimation(new MoveFavTutorialAnimationHelper());
setTextView(mOOBETextGroup9);
break;
case CAMERA_BUTTON:
mMainBackground.setBackgroundResource(R.color.oobe_background);
Animation gotItButtonAnimation2 = new AlphaAnimation(0.0f, 1.0f);
gotItButtonAnimation2.setDuration(200);
gotItButtonAnimation2.setStartOffset(6500);
mOOBEGotItButton10.startAnimation(gotItButtonAnimation2);
startAnimation(new CameraTutorialAnimationHelper());
setTextView(mOOBETextGroup10);
case EDGE_GLOW:
//mMainBackground.setBackgroundResource(R.color.oobe_background);
//startAnimation(new EdgeGlowTutorialAnimationHelper());
//setTextView(mOOBETextGroup10);
default:
}
setupButtons();
}
private void setupButtons() {
int visibilityNext = View.VISIBLE;
int visibilityBack = View.VISIBLE;
int visibilityStart = View.VISIBLE;
int visibilitySkip = View.VISIBLE;
if (mCurrentStep <= 0) {
if (mTutorialToShow == OOBE_DEVICE_TUTORIAL) {
if (mCurrentStep < 1) {
visibilityBack = View.GONE;
visibilityStart = View.GONE;
visibilityNext = View.GONE;
} else {
visibilityStart = View.GONE;
visibilitySkip = View.GONE;
visibilityNext = View.GONE;
}
} else {
visibilityNext = View.GONE;
visibilityBack = View.GONE;
visibilitySkip = View.GONE;
}
} else if (mCurrentStep >= (mAnimationSteps.size() - 1)) {
mSkipButton.setText(getResources().getString(R.string.oobe_done));
visibilityNext = View.GONE;
visibilityStart = View.GONE;
} else {
mSkipButton.setText(getResources().getString(R.string.oobe_skip));
visibilityStart = View.GONE;
if (mTutorialToShow == OOBE_DEVICE_TUTORIAL) {
if (mCurrentStep < 2) {
visibilityStart = View.GONE;
visibilityNext = View.GONE;
}
if (mCurrentStep < 1) {
visibilityBack = View.GONE;
}
}
}
/* mNextButton.setVisibility(visibilityNext);
mBackButton.setVisibility(visibilityBack);
mStartButton.setVisibility(visibilityStart);
mSkipButton.setVisibility(visibilitySkip);*/
}
private void setTextView(View targetTextView) {
mOOBETextGroup1.setVisibility(targetTextView == mOOBETextGroup1 ? View.VISIBLE : View.GONE);
mOOBETextGroup2.setVisibility(targetTextView == mOOBETextGroup2 ? View.VISIBLE : View.GONE);
mOOBETextGroup3.setVisibility(targetTextView == mOOBETextGroup3 ? View.VISIBLE : View.GONE);
mOOBETextGroup4.setVisibility(targetTextView == mOOBETextGroup4 ? View.VISIBLE : View.GONE);
mOOBETextGroup5.setVisibility(targetTextView == mOOBETextGroup5 ? View.VISIBLE : View.GONE);
mOOBETextGroup6.setVisibility(targetTextView == mOOBETextGroup6 ? View.VISIBLE : View.GONE);
mOOBETextGroup7.setVisibility(targetTextView == mOOBETextGroup7 ? View.VISIBLE : View.GONE);
mOOBETextGroup8.setVisibility(targetTextView == mOOBETextGroup8 ? View.VISIBLE : View.GONE);
mOOBETextGroup9.setVisibility(targetTextView == mOOBETextGroup9 ? View.VISIBLE : View.GONE);
mOOBETextGroup10.setVisibility(targetTextView == mOOBETextGroup10 ? View.VISIBLE : View.GONE);
Animation oobeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in_fast);
targetTextView.startAnimation(oobeAnimation);
targetTextView.setVisibility(View.VISIBLE);
}
private void endOOBEActivity() {
mSkipButton.setVisibility(View.GONE);
mNextButton.setVisibility(View.GONE);
mBackButton.setVisibility(View.GONE);
finish();
}
void startAnimation(TutorialAnimationHelper anim) {
if (anim != null) {
if (mCurAnimHelper == null) {
mCurAnimHelper = anim;
mCurAnimHelper.setTutorialAnimationHelperListener(this);
View animHelperRootView = mCurAnimHelper.setup(getApplicationContext());
mAnimationHolder.addView(animHelperRootView);
mCurAnimHelper.playIntro();
} else {
mCurAnimHelper.playOutro();
mNextAnimHelper = anim;
}
} else {
if (mCurAnimHelper != null) {
mCurAnimHelper.playOutro();
mNextAnimHelper = null;
}
}
}
@Override
public void onTutorialAnimationFinished(TutorialAnimationHelper helper, TutorialState state) {
if (helper == mCurAnimHelper) {
if (state == TutorialState.Outro) {
mAnimationHolder.removeAllViews();
mCurAnimHelper = mNextAnimHelper;
mNextAnimHelper = null;
if (mCurAnimHelper != null) {
View animHelperRootView = mCurAnimHelper.setup(getApplicationContext());
mCurAnimHelper.setTutorialAnimationHelperListener(this);
mAnimationHolder.addView(animHelperRootView);
mCurAnimHelper.playIntro();
}
} else if (state == TutorialState.Intro) {
mCurAnimHelper.playMain();
}
}
}
public static void changeLocale(Locale locale) {
try {
Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative");
Object am = activityManagerNative.getMethod("getDefault").invoke(activityManagerNative);
Object config = am.getClass().getMethod("getConfiguration").invoke(am);
config.getClass().getDeclaredField("locale").set(config, locale);
config.getClass().getDeclaredField("userSetLocale").setBoolean(config, true);
am.getClass().getMethod("updateConfiguration", android.content.res.Configuration.class).invoke(am, config);
// Log.i("", "send change locale request");
} catch (Exception e) {
Log.e("", "change locale error:", e);
}
}
public TutorialAnimationHelper getCurrentAnimationHelper() {
return mCurAnimHelper;
}
}