package com.github.donkirkby.vograbulary; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.animation.Animator; import android.animation.ValueAnimator; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.TextView; import com.github.donkirkby.vograbulary.WordDisplay.WordDisplayListener; import com.github.donkirkby.vograbulary.bacronyms.BacronymsScreen; import com.github.donkirkby.vograbulary.bacronyms.Controller; import com.github.donkirkby.vograbulary.bacronyms.Puzzle; import com.github.donkirkby.vograbulary.ultraghost.WordList; public class BacronymsActivity extends VograbularyActivity implements BacronymsScreen { private Controller controller = new Controller(); private Puzzle puzzle; private State state; private TextView stateText; private List<WordDisplay> wordDisplays; private List<ValueAnimator> animations; private AndroidLetterDisplayFactory displayFactory; private Button nextButton; private boolean isLaidOut; private WordDisplayListener wordListener = new WordDisplayListener() { @Override public void onClick(WordDisplay wordDisplay) { for (int i = 0; i < animations.size(); i++) { ValueAnimator wordAnimation = animations.get(i); wordAnimation.cancel(); if (wordDisplays.get(i) == wordDisplay && Math.abs(wordDisplay.getRotation()) < 0.0001) { wordAnimation.setFloatValues(0, (float)Math.PI); puzzle.setSelectedIndex(i); } else { wordAnimation.setFloatValues( (float)wordDisplays.get(i).getRotation(), 0); } wordAnimation.start(); } } }; private ViewGroup bacronymsLayout; @Override public Puzzle getPuzzle() { return puzzle; } @Override public void setPuzzle(Puzzle puzzle) { this.puzzle = puzzle; displayWords(); } private void displayWords() { for (int i = 0; i < 3; i++) { wordDisplays.get(i).setWord(puzzle.getWord(i)); } isLaidOut = false; bacronymsLayout.invalidate(); } @Override public State getState() { return state; } @Override public void setState(State state) { this.state = state; stateText.setText(state.name()); nextButton.setVisibility( state == State.SOLVED ? View.VISIBLE : View.INVISIBLE); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bacronyms); stateText = (TextView)findViewById(R.id.stateText); nextButton = (Button)findViewById(R.id.nextButton); List<String> puzzleLines; try { puzzleLines = loadTextAsset("bacronyms.txt"); } catch (IOException e) { puzzleLines = Arrays.asList( "Failed to open file. " + e.getMessage()); } WordList wordList = loadWordList(); controller.setScreen(this); controller.setWordList(wordList); controller.loadPuzzles(puzzleLines); nextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { controller.next(); } }); bacronymsLayout = (ViewGroup)findViewById(R.id.bacronymsLayout); displayFactory = new AndroidLetterDisplayFactory(bacronymsLayout); wordDisplays = new ArrayList<>(); animations = new ArrayList<>(); for (int i = 0; i < 3; i++) { final WordDisplay wordDisplay = new WordDisplay(displayFactory); wordDisplay.addListener(wordListener); wordDisplays.add(wordDisplay); ValueAnimator animator = new ValueAnimator().setDuration(1000); animations.add(animator); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { wordDisplay.setRotation((float) animation.getAnimatedValue()); } }); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { controller.solve(); } @Override public void onAnimationCancel(Animator animation) { } }); } bacronymsLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if ( ! isLaidOut) { int left = 0; for (WordDisplay wordDisplay : wordDisplays) { wordDisplay.setLeft(left); wordDisplay.setTop(wordDisplay.getTop()); left += wordDisplay.getWidth() + wordDisplay.getTextSize(); } int layoutWidth = bacronymsLayout.getWidth(); if (layoutWidth * .75 < left && left < layoutWidth) { isLaidOut = true; } else { float textSize = 0; for (WordDisplay wordDisplay : wordDisplays) { if (textSize == 0) { float oldTextSize = wordDisplay.getTextSize(); float correction = layoutWidth * 0.9f / left; textSize = oldTextSize * correction; stateText.setTop((int) (textSize*3)); } wordDisplay.setTextSize(textSize); wordDisplay.setTop((int) textSize); } bacronymsLayout.requestLayout(); } } } }); start(savedInstanceState); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("solvedCount", controller.getSolvedCount()); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); start(savedInstanceState); } private void start(Bundle savedInstanceState) { if (savedInstanceState != null) { int solvedCount = savedInstanceState.getInt("solvedCount", 1); controller.setSolvedCount(solvedCount - 1); } controller.next(); } }