package com.pluscubed.plustimer.ui.currentsessiontimer;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import com.pluscubed.plustimer.model.PuzzleType;
import com.pluscubed.plustimer.model.ScrambleAndSvg;
import net.gnehzr.tnoodle.scrambles.InvalidScrambleException;
/**
* Retained fragment alongside CurrentSTimerFragment
*/
public class CurrentSessionTimerRetainedFragment extends Fragment {
private static final String STATE_CURRENT_SCRAMBLE = "current_scramble";
private static final String STATE_CURRENT_SVG = "current_svg";
private static final String STATE_NEXT_SCRAMBLE = "next_scramble";
private static final String STATE_NEXT_SVG = "next_svg";
private static final String STATE_SCRAMBLING = "scrambling";
private Handler mScramblerThreadHandler;
private HandlerThread mScramblerThread;
private ScrambleAndSvg mCurrentScrambleAndSvg;
private ScrambleAndSvg mNextScrambleAndSvg;
private boolean mScrambling;
public boolean isScrambling() {
return mScrambling;
}
public void generateNextScramble() {
postToScrambleThread(() -> {
mScrambling = true;
mNextScrambleAndSvg = generateScramble();
mScrambling = false;
});
}
public void postSetScrambleViewsToCurrent() {
postToScrambleThread(() -> {
mCurrentScrambleAndSvg = mNextScrambleAndSvg;
mNextScrambleAndSvg = null;
if (getTargetFragment() != null) {
final CurrentSessionTimerFragment targetFragment =
(CurrentSessionTimerFragment) getTargetFragment();
targetFragment.getUiHandler().post(() -> {
targetFragment.setScrambleTextAndImageToCurrent();
targetFragment.enableMenuItems(true);
});
}
});
}
//Generate scramble image and text
private ScrambleAndSvg generateScramble() {
ScrambleAndSvg scrambleAndSvg = null;
try {
PuzzleType puzzleType = PuzzleType.getCurrent(getActivity()).toBlocking().value();
String scramble = puzzleType.getPuzzle().generateScramble();
String svg = puzzleType.getPuzzle().drawScramble(scramble, null).toString();
scrambleAndSvg = new ScrambleAndSvg(scramble, svg);
} catch (InvalidScrambleException e) {
e.printStackTrace();
}
return scrambleAndSvg;
}
public ScrambleAndSvg getCurrentScrambleAndSvg() {
return mCurrentScrambleAndSvg;
}
private void postToScrambleThread(Runnable r) {
mScramblerThreadHandler.post(r);
}
private void startScramblerThread() {
mScramblerThread = new HandlerThread("ScramblerThread");
mScramblerThread.start();
mScramblerThreadHandler = new Handler(mScramblerThread.getLooper());
}
private void stopScramblerThread() {
if (mScramblerThread != null) {
mScramblerThread.quit();
mScramblerThread = null;
mScramblerThreadHandler = null;
}
}
public void resetScramblerThread() {
stopScramblerThread();
startScramblerThread();
mScrambling = false;
mCurrentScrambleAndSvg = null;
mNextScrambleAndSvg = null;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
startScramblerThread();
if (savedInstanceState != null) {
String current_scramble = savedInstanceState.getString
(STATE_CURRENT_SCRAMBLE);
if (current_scramble != null) {
mCurrentScrambleAndSvg = new ScrambleAndSvg(current_scramble,
savedInstanceState.getString(STATE_CURRENT_SVG));
}
String next_scramble = savedInstanceState.getString
(STATE_NEXT_SCRAMBLE);
if (next_scramble != null) {
mNextScrambleAndSvg = new ScrambleAndSvg(next_scramble,
savedInstanceState.getString(STATE_NEXT_SVG));
}
mScrambling = savedInstanceState.getBoolean(STATE_SCRAMBLING);
if (mScrambling) {
generateNextScramble();
postSetScrambleViewsToCurrent();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
stopScramblerThread();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mCurrentScrambleAndSvg != null) {
outState.putString(STATE_CURRENT_SCRAMBLE, mCurrentScrambleAndSvg
.getScramble());
outState.putString(STATE_CURRENT_SVG, mCurrentScrambleAndSvg
.getSvg());
}
if (mNextScrambleAndSvg != null) {
outState.putString(STATE_NEXT_SCRAMBLE,
mNextScrambleAndSvg.getScramble());
outState.putString(STATE_NEXT_SVG, mNextScrambleAndSvg.getSvg());
}
outState.putBoolean(STATE_SCRAMBLING, mScrambling);
}
}