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 }