package com.github.donkirkby.vograbulary;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.github.donkirkby.vograbulary.russian.Controller;
import com.github.donkirkby.vograbulary.russian.Puzzle;
import com.github.donkirkby.vograbulary.russian.PuzzleDisplay;
import com.github.donkirkby.vograbulary.russian.RussianDollsScreen;
import com.github.donkirkby.vograbulary.russian.TargetDisplay;
import com.github.donkirkby.vograbulary.ultraghost.WordList;
public class RussianDollsActivity
extends VograbularyActivity implements RussianDollsScreen {
private TextView puzzleText;
private TargetDisplay targetDisplay1;
private TargetDisplay targetDisplay2;
private TextView scoreDisplay;
private Button nextButton;
private int[] location = new int[2];
private Controller controller = new Controller();
private PuzzleDisplay puzzleDisplay = new PuzzleDisplay();
private AndroidScheduler scheduler = new AndroidScheduler();
private Puzzle puzzle;
private ImageView insertButton;
private ViewGroup russianDollsLayout;
private boolean isLaidOut;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_russian_dolls);
russianDollsLayout = (ViewGroup)findViewById(R.id.russianDollsLayout);
puzzleText = (TextView)findViewById(R.id.clue);
nextButton = (Button)findViewById(R.id.nextButton);
scoreDisplay = (TextView)findViewById(R.id.scoreDisplay);
insertButton = (ImageView)findViewById(R.id.insertImage);
final ImageView dragButton1 = (ImageView)findViewById(R.id.dragImage1);
final ImageView dragButton2 = (ImageView)findViewById(R.id.dragImage2);
insertButton.setOnTouchListener(new InsertTouchListener());
targetDisplay1 = new AndroidTargetDisplay(
dragButton1,
insertButton,
russianDollsLayout);
targetDisplay2 = new AndroidTargetDisplay(
dragButton2,
insertButton,
russianDollsLayout);
targetDisplay1.setOther(targetDisplay2);
List<String> puzzleSource;
List<String> wordSource;
try {
puzzleSource = loadTextAsset("russianDolls.txt");
wordSource = loadTextAsset("wordlist.txt");
} catch (IOException e) {
puzzleSource = Arrays.asList(
"Failed to open file. " + e.getMessage());
wordSource = new ArrayList<String>();
}
WordList wordList = new WordList();
wordList.read(wordSource);
controller.setScreen(this);
controller.setWordList(wordList);
controller.loadPuzzles(puzzleSource);
targetDisplay1.setDragVisible(false);
targetDisplay2.setDragVisible(false);
final int periodMilliseconds = 100;
scheduler.scheduleRepeating(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
String display = "Score: " + controller.adjustScore(
0.001f * periodMilliseconds) + "\nTotal: " +
puzzle.getTotalScoreDisplay();
scoreDisplay.setText(display);
boolean shouldHide =
! targetDisplay1.isDragVisible() &&
! targetDisplay2.isDragVisible() &&
puzzle.getScore().intValue() < 50;
if (shouldHide) {
targetDisplay1.setDragVisible(true);
targetDisplay2.setDragVisible(true);
}
}
});
}
},
periodMilliseconds);
russianDollsLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if ( ! isLaidOut) {
targetDisplay1.setScreenWidth(russianDollsLayout.getWidth());
targetDisplay1.layout();
isLaidOut = true;
}
}
});
start(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("clueIndex", controller.getClueIndex());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
start(savedInstanceState);
}
private void start(Bundle savedInstanceState) {
if (savedInstanceState != null) {
int clueIndex = savedInstanceState.getInt("clueIndex", 0);
controller.setClueIndex(clueIndex-1);
controller.next();
}
}
private class InsertTouchListener implements View.OnTouchListener {
private int _xDelta;
@Override
public boolean onTouch(View view, MotionEvent event) {
final int eventX = (int) event.getRawX();
RelativeLayout.LayoutParams layoutParams =
(RelativeLayout.LayoutParams) view.getLayoutParams();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
_xDelta = eventX - layoutParams.leftMargin;
puzzleDisplay.setTargetPositions(
targetDisplay1.getLettersLeft(),
targetDisplay1.getLettersWidth(),
targetDisplay2.getLettersLeft(),
targetDisplay2.getLettersWidth());
break;
case MotionEvent.ACTION_MOVE:
layoutParams.leftMargin = eventX - _xDelta;
layoutParams.rightMargin = -250;
view.setLayoutParams(layoutParams);
insertButton.getLocationOnScreen(location);
int insertX = location[0] +
insertButton.getWidth()*24/64;
puzzleDisplay.calculateInsertion(insertX);
break;
case MotionEvent.ACTION_UP:
view.performClick();
break;
}
russianDollsLayout.invalidate();
return true;
}
}
public void next(View view) {
Puzzle puzzle = getPuzzle();
if (puzzle.isSolved()) {
controller.next();
}
else {
controller.solve();
if (puzzle.isSolved()) {
nextButton.setText("Next");
isLaidOut = false;
targetDisplay1.setText(puzzle.getCombination());
targetDisplay2.setText("");
}
}
}
public void previous(View view) {
controller.back();
}
@Override
public Puzzle getPuzzle() {
return puzzleDisplay.getPuzzle();
}
@Override
public void setPuzzle(Puzzle puzzle) {
this.puzzle = puzzle;
puzzleText.setText(puzzle.getClue());
isLaidOut = false;
targetDisplay1.setPuzzle(puzzle);
nextButton.setText("Solve");
puzzleDisplay.setPuzzle(puzzle);
}
}