/*
* Copyright 2015 Daniel Dittmar
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package dan.dit.whatsthat.system;
import android.app.Fragment;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;
import dan.dit.whatsthat.R;
import dan.dit.whatsthat.image.Image;
import dan.dit.whatsthat.image.ImageManager;
import dan.dit.whatsthat.preferences.Language;
import dan.dit.whatsthat.preferences.Tongue;
import dan.dit.whatsthat.riddle.RiddleInitializer;
import dan.dit.whatsthat.testsubject.TestSubject;
import dan.dit.whatsthat.testsubject.intro.Intro;
import dan.dit.whatsthat.util.general.PercentProgressListener;
import dan.dit.whatsthat.util.ui.LinearLayoutProgressBar;
/**
* Created by daniel on 10.04.15.
*/
public class InitializationFragment extends Fragment implements ImageManager.SynchronizationListener, RiddleInitializer.InitProgressListener {
private static final int STATE_NONE = 0;
private static final int STATE_DATA_INITIALIZED = 1;
private static final int STATE_MANDATORY_INTRO_DONE = 2;
private static final int STATE_READY = 3;
private int mRiddleProgress;
private int mIntroProgress;
private int mImageProgress;
private LinearLayoutProgressBar mProgressBar;
private int mState = STATE_NONE;
private Button mInitSkip;
private View mIntroContainer;
private ImageButton mTongueSelect;
private Intro mIntro;
private void startIntro() {
checkDataState();
mIntro = TestSubject.getInstance().makeIntro(mIntroContainer);
View.OnTouchListener nextTextListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
mIntro.nextEpisode();
checkDataState();
return true;
}
return false;
}
};
mIntro.setOnInteractionListener(new Intro.OnInteractionListener() {
@Override
public void onIntroInteraction(int actionCode) {
if (actionCode == Intro.INTERACTION_QUESTION_ANSWERED) {
checkDataState();
}
}
});
mIntroContainer.setOnTouchListener(nextTextListener);
checkDataState();
}
private synchronized void checkDataState() {
boolean mandatoryIntroDone = mIntro != null && !mIntro.isMandatoryEpisodeMissing();
if (!RiddleInitializer.INSTANCE.isInitializing() && !ImageManager.isSyncing() && TestSubject.isInitialized()
&& mandatoryIntroDone) {
if (mState != STATE_READY) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Context context = getActivity();
if (context != null) {
Animation anim = AnimationUtils.loadAnimation(context, R.anim.shake);
mProgressBar.startAnimation(anim);
}
}
}, 1500);
}
mState = STATE_READY;
mInitSkip.setText(R.string.init_skip_state_ready);
mInitSkip.setEnabled(true);
mProgressBar.onProgressUpdate(0);
} else if (mandatoryIntroDone) {
mIntroProgress = PROGRESS_COMPLETE;
updateProgressBar();
mState = STATE_MANDATORY_INTRO_DONE;
mInitSkip.setText(R.string.init_skip_state_init_missing);
mInitSkip.setEnabled(false);
} else {
mState = STATE_DATA_INITIALIZED;
mInitSkip.setText(R.string.init_skip_state_mandatory_intro_missing);
mInitSkip.setEnabled(false);
}
}
private void initProgressBar() {
mRiddleProgress = 0;
mImageProgress = 0;
mIntroProgress = 0;
}
private void updateProgressBar() {
mProgressBar.onProgressUpdate((mImageProgress + mRiddleProgress + mIntroProgress) / 3);
}
private void startSyncing() {
if (!ImageManager.isSynced()) {
ImageManager.sync(getActivity().getApplicationContext(), this); // loads all images available
}
}
@Override
public void onSyncProgress(int progress) {
mImageProgress = progress;
updateProgressBar();
}
@Override
public void onSyncComplete() {
mImageProgress = PercentProgressListener.PROGRESS_COMPLETE;
updateProgressBar();
Log.d("HomeStuff", "Sync complete");
checkDataState();
}
@Override
public boolean isSyncCancelled() {
return false;
}
@Override
public void onProgressUpdate(int progress) {
mRiddleProgress = progress;
updateProgressBar();
}
@Override
public void onInitComplete() {
mRiddleProgress = PercentProgressListener.PROGRESS_COMPLETE;
updateProgressBar();
checkDataState();
Log.d("HomeStuff", "Init complete");
}
private void startRiddleInit() {
if (RiddleInitializer.INSTANCE.isNotInitialized()) {
RiddleInitializer.INSTANCE.init(getActivity().getApplicationContext(), this);
} else {
onInitComplete();
}
}
private void initLanguage() {
SharedPreferences prefs = getActivity().getSharedPreferences(Image.SHAREDPREFERENCES_FILENAME, Context.MODE_PRIVATE);
Tongue preferredTongue = Language.getTonguePreference(prefs);
if (preferredTongue != null) {
Language.makeInstance(preferredTongue);
}
updateTongueButton();
}
private void initTestSubject() {
if (!TestSubject.isInitialized()) {
new AsyncTask<Void, Void, Void>() {
@Override
public Void doInBackground(Void... nothing) {
TestSubject.initialize(getActivity().getApplicationContext());
return null;
}
@Override
public void onPostExecute(Void nothing) {
TestSubject.getInstance().initToasts(); // has to run on ui thread since toasts will be displayed there
mIntroProgress = 50;
updateProgressBar();
startIntro();
}
}.execute();
} else {
startIntro();
}
}
@Override
public void onStart() {
super.onStart();
mState = STATE_NONE;
mInitSkip.setText(R.string.init_skip_state_none);
mInitSkip.setEnabled(false);
initProgressBar();
initTestSubject();
startRiddleInit();
startSyncing();
checkDataState();
}
@Override
public void onStop() {
super.onStop();
ImageManager.unregisterSynchronizationListener();
RiddleInitializer.INSTANCE.unregisterInitProgressListener(this);
Log.d("HomeStuff", "OnStop of SyncingFragment, init running=" + RiddleInitializer.INSTANCE.isInitializing() + " sync running=" + ImageManager.isSyncing());
RiddleInitializer.INSTANCE.cancelInit();
if (TestSubject.isInitialized()) {
TestSubject.getInstance().saveIntro(mIntro);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.initialization_base, null);
}
private void updateTongueButton() {
mTongueSelect.setImageResource(Language.getInstance().getTongueIcon());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mInitSkip = (Button) getView().findViewById(R.id.init_skip);
mIntroContainer = getView().findViewById(R.id.init_intro);
mProgressBar = (LinearLayoutProgressBar) getView().findViewById(R.id.progress_bar);
mTongueSelect = (ImageButton) getView().findViewById(R.id.tongue_select);
mTongueSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Tongue nextTongue = Tongue.nextTongue(Language.getInstance().getTongue());
if (nextTongue != null) {
Language.makeInstance(nextTongue);
SharedPreferences prefs = getActivity().getSharedPreferences(Image.SHAREDPREFERENCES_FILENAME, Context.MODE_PRIVATE);
Language.getInstance().saveAsPreference(prefs);
updateTongueButton();
}
}
});
mTongueSelect.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
Toast.makeText(getActivity(),
getResources().getString(R.string.tongue_select_explanation, Language.getInstance().getTongue().getLocalizedName()),
Toast.LENGTH_SHORT
).show();
return true;
}
});
mInitSkip.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mState >= STATE_READY) {
mInitSkip.clearAnimation();
mIntroContainer.setVisibility(View.GONE);
((OnInitClosingCallback) getActivity()).onSkipInit();
}
}
});
initLanguage();
}
public interface OnInitClosingCallback {
void onSkipInit();
}
}