package org.theotech.ceaselessandroid.tutorial; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.TranslateAnimation; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupMenu; import android.widget.RelativeLayout; import android.widget.TextView; import com.joanzapata.iconify.widget.IconTextView; import com.makeramen.roundedimageview.RoundedImageView; import com.squareup.picasso.Picasso; import org.theotech.ceaselessandroid.R; import org.theotech.ceaselessandroid.util.Constants; import butterknife.Bind; import butterknife.ButterKnife; /** * created by travis Feb/Mar 2016 */ public class HTFDemoPersonFragment extends Fragment implements HTFDemoFragment { private static final String TAG = HTFDemoPersonFragment.class.getSimpleName(); @Bind(R.id.person_name) TextView personName; @Bind(R.id.person_image) RoundedImageView personImage; @Bind(R.id.tool_tip_overlay) LinearLayout toolTipOverlay; @Bind(R.id.person_image_overlay) View personImageOverlay; @Bind(R.id.favorite_tooltip) RelativeLayout favoriteTooltip; @Bind(R.id.message_tooltip) RelativeLayout messageTooltip; @Bind(R.id.add_note_tooltip) RelativeLayout addNoteTooltip; @Bind(R.id.tool_tip_one) RelativeLayout toolTipOne; @Bind(R.id.tool_tip_two) TextView toolTipTwo; @Bind(R.id.tool_tip_four) LinearLayout toolTipFour; @Bind(R.id.up_arrow) IconTextView upArrow; @Bind(R.id.right_arrow) IconTextView rightArrow; private boolean showToolTip; private int sceneNum = 0; private PopupMenu popup; private View view; private boolean menuItemClicked = false; public HTFDemoPersonFragment() { // Required empty public constructor } public static HTFDemoPersonFragment newInstance(String personName, boolean showToolTip) { HTFDemoPersonFragment fragment = new HTFDemoPersonFragment(); Bundle args = new Bundle(); args.putString(Constants.DEMO_NAME_BUNDLE_ARG, personName); args.putBoolean(Constants.DEMO_TOOLTIP_BUNDLE_ARG, showToolTip); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create view and bind view = inflater.inflate(R.layout.fragment_htfdemo_person, container, false); ButterKnife.bind(this, view); // display person Bundle bundle = getArguments(); String personName = bundle.getString(Constants.DEMO_NAME_BUNDLE_ARG); showToolTip = bundle.getBoolean(Constants.DEMO_TOOLTIP_BUNDLE_ARG); injectPersonIntoView(getActivity(), personName, view); return view; } private void injectPersonIntoView(Activity activity, String name, View view) { // display name and picture personName.setText(name); Picasso.with(activity).load(R.drawable.placeholder_user) .fit().centerInside().into(personImage); // display (empty) notes ListView emptyNotes = (ListView) view.findViewById(R.id.empty_person_notes); emptyNotes.setAdapter(new ArrayAdapter<>(activity, R.layout.list_item_empty_notes, new String[]{getString(R.string.empty_notes)})); } private void setUpToolTip() { toolTipOverlay.setVisibility(View.VISIBLE); personImageOverlay.setVisibility(View.INVISIBLE); toolTipOne.setVisibility(View.VISIBLE); popup = getMenu(); personImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressScene(); } }); toolTipOverlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressScene(); } }); toolTipOverlay.setClickable(false); } private void animate() { final long fadeDuration = 750; final long startFadeTime = 400; LinearInterpolator linInter = new LinearInterpolator(); animateRightArrow(linInter); animateUpArrow(linInter); animateTooltip(fadeDuration, startFadeTime, linInter); } private void animateTooltip(long fadeDuration, long startFadeTime, LinearInterpolator linInter) { AlphaAnimation mAlAnimation = new AlphaAnimation(0, 1); mAlAnimation.setDuration(fadeDuration); mAlAnimation.setStartOffset(startFadeTime); mAlAnimation.setInterpolator(linInter); toolTipOverlay.setAnimation(mAlAnimation); toolTipOne.setAnimation(mAlAnimation); } private void animateUpArrow(LinearInterpolator linInter) { TranslateAnimation mVerAnimation = new TranslateAnimation( 0, 0, -3, 3); mVerAnimation.setDuration(250); mVerAnimation.setStartOffset(20); mVerAnimation.setRepeatCount(-1); mVerAnimation.setRepeatMode(Animation.REVERSE); mVerAnimation.setInterpolator(linInter); upArrow.setAnimation(mVerAnimation); } private void animateRightArrow(LinearInterpolator linInter) { TranslateAnimation mHorAnimation = new TranslateAnimation( -4, 4, 0, 0); mHorAnimation.setDuration(250); mHorAnimation.setStartOffset(20); mHorAnimation.setRepeatCount(-1); mHorAnimation.setRepeatMode(Animation.REVERSE); mHorAnimation.setInterpolator(linInter); rightArrow.setAnimation(mHorAnimation); } private void progressScene() { sceneNum++; Log.d(TAG, "Scene Num = " + sceneNum); switch (sceneNum) { case 1: toolTipOne.setVisibility(View.INVISIBLE); toolTipTwo.setVisibility(View.VISIBLE); personImage.setClickable(false); popup.show(); break; case 2: personImageOverlay.setVisibility(View.VISIBLE); favoriteTooltip.setVisibility(View.VISIBLE); toolTipOverlay.setClickable(true); break; case 3: favoriteTooltip.setVisibility(View.INVISIBLE); messageTooltip.setVisibility(View.VISIBLE); break; case 4: toolTipTwo.setVisibility(View.INVISIBLE); messageTooltip.setVisibility(View.INVISIBLE); addNoteTooltip.setVisibility(View.VISIBLE); toolTipFour.setVisibility(View.VISIBLE); toolTipOverlay.setClickable(false); break; default: break; } } private PopupMenu getMenu() { PopupMenu popup = new PopupMenu(getActivity(), personImage); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { menuItemClicked = true; return true; } }); popup.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu m) { if (!menuItemClicked) { view.playSoundEffect(android.view.SoundEffectConstants.CLICK); } progressScene(); } }); popup.inflate(R.menu.person_menu); return popup; } private void setAllInvisible() { toolTipOverlay.setVisibility(View.INVISIBLE); toolTipOne.setVisibility(View.INVISIBLE); toolTipTwo.setVisibility(View.INVISIBLE); toolTipFour.setVisibility(View.INVISIBLE); favoriteTooltip.setVisibility(View.INVISIBLE); messageTooltip.setVisibility(View.INVISIBLE); addNoteTooltip.setVisibility(View.INVISIBLE); } public void onSelected() { if (showToolTip) { sceneNum = 0; menuItemClicked = false; setAllInvisible(); setUpToolTip(); animate(); } } }