package com.wangdaye.mysplash.common.ui.activity; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.os.Message; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.pixelcan.inkpageindicator.InkPageIndicator; import com.wangdaye.mysplash.R; import com.wangdaye.mysplash.common._basic.MysplashActivity; import com.wangdaye.mysplash.common.ui.adapter.MyPagerAdapter; import com.wangdaye.mysplash.common.ui.widget.SwipeBackCoordinatorLayout; import com.wangdaye.mysplash.common.utils.DisplayUtils; import com.wangdaye.mysplash.common.utils.helper.NotificationHelper; import com.wangdaye.mysplash.common.utils.helper.IntentHelper; import com.wangdaye.mysplash.common.utils.manager.ThemeManager; import com.wangdaye.mysplash.common.utils.widget.SafeHandler; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import butterknife.BindView; import butterknife.ButterKnife; /** * Introduce activity. * * This activity is used to show introduce to user. * * */ public class IntroduceActivity extends MysplashActivity implements View.OnClickListener, ViewPager.OnPageChangeListener, SafeHandler.HandlerContainer { @BindView(R.id.activity_introduce_container) CoordinatorLayout container; @BindView(R.id.activity_introduce_viewPager) ViewPager viewPager; @BindView(R.id.activity_introduce_button) Button button; private SafeHandler<IntroduceActivity> handler; private boolean backPressed = false; // mark the first click action. private List<IntroduceModel> introduceModelList; // if the version code > saved version, we need show this activity for user. private static final int VERSION_CODE = 1; private static final int FIRST_VERSION = 0; public static final String PREFERENCE_NAME = "mysplash_introduce"; private static final String KEY_INTRODUCE_VERSION = "introduce_version"; /** * Model of introduce page. * */ private class IntroduceModel { // data. public String title; int imageRes; String description; // life cycle. IntroduceModel(int titleRes, int imageRes, int descriptionRes) { this.title = getString(titleRes); this.imageRes = imageRes; this.description = getString(descriptionRes); } } public static void checkAndStartIntroduce(final MysplashActivity a) { SharedPreferences sharedPreferences = a.getSharedPreferences( PREFERENCE_NAME, Context.MODE_PRIVATE); /* SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt(KEY_INTRODUCE_VERSION, FIRST_VERSION); editor.apply(); */ if (sharedPreferences.getInt(KEY_INTRODUCE_VERSION, FIRST_VERSION) < VERSION_CODE) { IntentHelper.startIntroduceActivity(a); } } public static void watchAllIntroduce(MysplashActivity a) { SharedPreferences.Editor editor = a.getSharedPreferences( PREFERENCE_NAME, Context.MODE_PRIVATE).edit(); editor.putInt(KEY_INTRODUCE_VERSION, FIRST_VERSION); editor.apply(); IntentHelper.startIntroduceActivity(a); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_introduce); } @Override protected void onStart() { super.onStart(); if (!isStarted()) { setStarted(); ButterKnife.bind(this); initData(); initWidget(); } } @Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null); } @Override protected void setTheme() { if (ThemeManager.getInstance(this).isLightTheme()) { setTheme(R.style.MysplashTheme_light_Translucent_Common); } else { setTheme(R.style.MysplashTheme_dark_Translucent_Common); } } @Override public void handleBackPressed() { // double click to exit. if (backPressed) { finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR); } else { backPressed = true; NotificationHelper.showSnackbar( getString(R.string.feedback_click_again_to_exit), Snackbar.LENGTH_SHORT); new Timer().schedule(new TimerTask() { @Override public void run() { handler.obtainMessage(1).sendToTarget(); } }, 2000); } } @Override protected void backToTop() { // do nothing. } @Override public void finishActivity(int dir) { finish(); overridePendingTransition(0, R.anim.activity_slide_out_bottom); } @Override public CoordinatorLayout getSnackbarContainer() { return container; } // init. private void initData() { SharedPreferences sharedPreferences = getSharedPreferences( PREFERENCE_NAME, Context.MODE_PRIVATE); int versionCode = sharedPreferences.getInt(KEY_INTRODUCE_VERSION, FIRST_VERSION); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt(KEY_INTRODUCE_VERSION, VERSION_CODE); editor.apply(); introduceModelList = new ArrayList<>(); switch (versionCode) { case FIRST_VERSION: introduceModelList.add( new IntroduceModel( R.string.introduce_title_back_top, R.drawable.illustration_back_top, R.string.introduce_description_back_top)); break; } } private void initWidget() { this.handler = new SafeHandler<>(this); ImageButton backBtn = ButterKnife.findById(this, R.id.activity_introduce_backBtn); ThemeManager.setImageResource(backBtn, R.drawable.ic_close_light, R.drawable.ic_close_dark); backBtn.setOnClickListener(this); button.setOnClickListener(this); setBottomButtonStyle(0); initPage(); InkPageIndicator indicator = ButterKnife.findById(this, R.id.activity_introduce_indicator); indicator.setViewPager(viewPager); if (introduceModelList.size() <= 1) { indicator.setAlpha(0f); } else { indicator.setAlpha(1f); } } @SuppressLint("InflateParams") private void initPage() { List<View> pageList = new ArrayList<>(); List<String> titleList = new ArrayList<>(); for (int i = 0; i < introduceModelList.size(); i ++) { View v = LayoutInflater.from(this).inflate(R.layout.container_introduce, null); TextView title = ButterKnife.findById(v, R.id.container_introduce_title); title.setText(introduceModelList.get(i).title); ImageView image = ButterKnife.findById(v, R.id.container_introduce_image); Glide.with(this) .load(introduceModelList.get(i).imageRes) .diskCacheStrategy(DiskCacheStrategy.NONE) .into(image); TextView description = ButterKnife.findById(v, R.id.container_introduce_description); description.setText(introduceModelList.get(i).description); DisplayUtils.setTypeface(this, description); setPageButtonStyle(v, i); pageList.add(v); titleList.add(introduceModelList.get(i).title); } MyPagerAdapter adapter = new MyPagerAdapter(pageList, titleList); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(this); } // control. private void setBottomButtonStyle(int page) { if (page == introduceModelList.size() - 1) { button.setText(getString(R.string.enter)); } else { button.setText(getString(R.string.next)); } } private void setPageButtonStyle(View page, int position) { Button b = ButterKnife.findById(page, R.id.container_introduce_button); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { if (ThemeManager.getInstance(this).isLightTheme()) { b.setBackgroundResource(R.color.colorPrimary_dark); } else { b.setBackgroundResource(R.color.colorPrimary_light); } } else { b.setBackgroundResource(R.drawable.button_login); } switch (introduceModelList.get(position).imageRes) { case R.drawable.illustration_back_top: b.setText(getString(R.string.set)); b.setOnClickListener(this); break; default: b.setVisibility(View.GONE); break; } } // interface. // on click listener. @Override public void onClick(View v) { switch (v.getId()) { case R.id.activity_introduce_backBtn: // finish activity. finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR); break; case R.id.activity_introduce_button: if (viewPager.getCurrentItem() == introduceModelList.size() - 1) { // last page --> finish activity. finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR); } else { // jump to next page. viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); } break; case R.id.container_introduce_button: switch (introduceModelList.get(viewPager.getCurrentItem()).imageRes) { case R.drawable.illustration_back_top: Intent s = new Intent(this, SettingsActivity.class); startActivity(s); overridePendingTransition(R.anim.activity_in, 0); break; } break; } } // on page changed listener. @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // do nothing. } @Override public void onPageSelected(int position) { setBottomButtonStyle(position); } @Override public void onPageScrollStateChanged(int state) { // do nothing. } // handler. @Override public void handleMessage(Message message) { switch (message.what) { case 1: backPressed = false; break; } } }