View Javadoc

1   /***
2    *     Aedict - an EDICT browser for Android
3    Copyright (C) 2009 Martin Vysny
4    
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation, either version 3 of the License, or
8    (at your option) any later version.
9    
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14  
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17   */
18  package sk.baka.aedict.jlptquiz;
19  
20  import java.io.Serializable;
21  import java.util.Collection;
22  import java.util.List;
23  
24  import sk.baka.aedict.AedictApp;
25  import sk.baka.aedict.EdictEntryDetailActivity;
26  import sk.baka.aedict.KanjiDetailActivity;
27  import sk.baka.aedict.R;
28  import sk.baka.aedict.dict.DictEntry;
29  import sk.baka.aedict.dict.EdictEntry;
30  import sk.baka.aedict.dict.KanjidicEntry;
31  import sk.baka.aedict.util.ShowRomaji;
32  import sk.baka.autils.DialogUtils;
33  import sk.baka.autils.ListBuilder;
34  import android.app.Activity;
35  import android.content.Intent;
36  import android.os.Bundle;
37  import android.view.Menu;
38  import android.view.View;
39  import android.widget.TextView;
40  
41  /***
42   * Performs the quiz itself.
43   * 
44   * @author Martin Vysny
45   */
46  public class QuizActivity extends Activity {
47  
48  	private static final String INTENTKEY_JLPT_SET = "jlptset";
49  	private static final String INTENTKEY_STATE = "state";
50  
51  	public static class State implements Serializable {
52  		private static final long serialVersionUID = 1L;
53  		public int currentQuestion = 0;
54  		public boolean showsAnswer = false;
55  		public int correctQuestions = 0;
56  
57  		public void correctAnswer() {
58  			correctQuestions++;
59  			showsAnswer = false;
60  			currentQuestion++;
61  		}
62  
63  		public void incorrectAnswer() {
64  			showsAnswer = false;
65  			currentQuestion++;
66  		}
67  	}
68  
69  	public static void launch(final Activity a, final List<? extends DictEntry> questions) {
70  		if (questions.isEmpty()) {
71  			throw new IllegalArgumentException("No questions");
72  		}
73  		final Intent i = new Intent(a, QuizActivity.class);
74  		i.putExtra(INTENTKEY_JLPT_SET, (Serializable) questions);
75  		a.startActivity(i);
76  	}
77  
78  	private List<? extends DictEntry> questions;
79  	private ShowRomaji showRomaji;
80  	private State state;
81  
82  	@Override
83  	protected void onRestoreInstanceState(Bundle savedInstanceState) {
84  		state = (State) savedInstanceState.getSerializable(INTENTKEY_STATE);
85  		showRomaji.loadState(savedInstanceState);
86  	}
87  
88  	@Override
89  	protected void onSaveInstanceState(Bundle outState) {
90  		showRomaji.saveState(outState);
91  		outState.putSerializable(INTENTKEY_STATE, state);
92  	}
93  
94  	@SuppressWarnings("unchecked")
95  	@Override
96  	protected void onCreate(Bundle savedInstanceState) {
97  		super.onCreate(savedInstanceState);
98  		setContentView(R.layout.jlpt_quiz);
99  		state = new State();
100 		showRomaji = new ShowRomaji() {
101 
102 			@Override
103 			protected void show(boolean romaji) {
104 				updateControls();
105 			}
106 		};
107 		findViewById(R.id.yes).setOnClickListener(new View.OnClickListener() {
108 
109 			public void onClick(View v) {
110 				state.correctAnswer();
111 				updateControls();
112 			}
113 		});
114 		findViewById(R.id.no).setOnClickListener(new View.OnClickListener() {
115 
116 			public void onClick(View v) {
117 				state.incorrectAnswer();
118 				updateControls();
119 			}
120 		});
121 		findViewById(R.id.showDetailed).setOnClickListener(new View.OnClickListener() {
122 
123 			public void onClick(View v) {
124 				final DictEntry e = questions.get(state.currentQuestion);
125 				if (e instanceof KanjidicEntry) {
126 					KanjiDetailActivity.launch(QuizActivity.this, (KanjidicEntry) e);
127 				} else if (e instanceof EdictEntry) {
128 					EdictEntryDetailActivity.launch(QuizActivity.this, (EdictEntry) e);
129 				}
130 			}
131 		});
132 		findViewById(R.id.main).setOnClickListener(new View.OnClickListener() {
133 
134 			public void onClick(View v) {
135 				if (!state.showsAnswer) {
136 					state.showsAnswer = true;
137 					updateControls();
138 				}
139 			}
140 		});
141 		questions = (List<? extends DictEntry>) getIntent().getSerializableExtra(INTENTKEY_JLPT_SET);
142 		updateControls();
143 	}
144 
145 	@Override
146 	protected void onResume() {
147 		super.onResume();
148 		showRomaji.onResume();
149 	}
150 
151 	private void updateControls() {
152 		final boolean isFinished = state.currentQuestion >= questions.size();
153 		if (!isFinished) {
154 			final int vis = state.showsAnswer ? View.VISIBLE : View.INVISIBLE;
155 			final DictEntry e = questions.get(state.currentQuestion);
156 			if (e instanceof KanjidicEntry) {
157 				final KanjidicEntry ke = (KanjidicEntry) e;
158 				((TextView) findViewById(R.id.kanji)).setText(e.kanji);
159 				final TextView onyomi = (TextView) findViewById(R.id.onyomi);
160 				onyomi.setText(cs(ke.getOnyomi(), true));
161 				onyomi.setVisibility(vis);
162 				final TextView kunyomi = (TextView) findViewById(R.id.kunyomi);
163 				kunyomi.setText(cs(ke.getKunyomi(), true));
164 				kunyomi.setVisibility(vis);
165 				final TextView namae = (TextView) findViewById(R.id.namae);
166 				namae.setText(cs(ke.getNamae(), true));
167 				namae.setVisibility(vis);
168 				final TextView english = (TextView) findViewById(R.id.english);
169 				english.setText(cs(ke.getEnglish(), false));
170 				english.setVisibility(vis);
171 			} else {
172 				((TextView) findViewById(R.id.kanji)).setText(e.getJapanese());
173 				final TextView onyomi = (TextView) findViewById(R.id.onyomi);
174 				onyomi.setText(showRomaji.romanize(e.reading != null ? e.reading : ""));
175 				onyomi.setVisibility(vis);
176 				final TextView kunyomi = (TextView) findViewById(R.id.kunyomi);
177 				kunyomi.setVisibility(View.INVISIBLE);
178 				final TextView namae = (TextView) findViewById(R.id.namae);
179 				namae.setVisibility(View.INVISIBLE);
180 				final TextView english = (TextView) findViewById(R.id.english);
181 				english.setText(e.english);
182 				english.setVisibility(vis);
183 			}
184 		}
185 		final int vis = !isFinished && state.showsAnswer ? View.VISIBLE : View.INVISIBLE;
186 		findViewById(R.id.yes).setVisibility(vis);
187 		findViewById(R.id.no).setVisibility(vis);
188 		findViewById(R.id.showDetailed).setVisibility(vis);
189 		if (isFinished) {
190 			new DialogUtils(this).showInfoDialog(getString(R.string.results), AedictApp.format(R.string.youScored, state.correctQuestions, questions.size()));
191 		}
192 	}
193 
194 	private String cs(final Collection<String> strings, final boolean isJapanese) {
195 		final ListBuilder b = new ListBuilder(", ");
196 		for (final String s : strings) {
197 			b.add(showRomaji.romanize(s));
198 		}
199 		return b.toString();
200 	}
201 
202 	@Override
203 	public boolean onPrepareOptionsMenu(Menu menu) {
204 		menu.clear();
205 		showRomaji.register(this, menu);
206 		return true;
207 	}
208 }