Support romaji input

Julien LepillerSat Oct 05 14:17:15+0200 2019

ddd1caa

Support romaji input

app/build.gradle

2323
    implementation 'com.android.support:appcompat-v7:28.0.0'
2424
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
2525
    implementation 'com.android.support:design:28.0.0'
26+
    implementation 'com.andree-surya:moji4j:1.0.0'
27+
    implementation project(path: ':furiganatextview')
2628
    testImplementation 'junit:junit:4.12'
2729
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
2830
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
29-
    implementation project(path: ':furiganatextview')
3031
}

app/src/main/java/eu/lepiller/nani/MainActivity.java

1515
import android.widget.LinearLayout;
1616
import android.widget.TextView;
1717
18+
import com.moji4j.MojiConverter;
19+
import com.moji4j.MojiDetector;
20+
1821
import java.util.ArrayList;
1922
2023
import eu.lepiller.nani.dictionary.DictionaryException;

2831
    private LinearLayout result_view;
2932
    private Button search_button;
3033
    private TextView feedback_text;
34+
    private EditText search_form;
3135
3236
    @Override
3337
    protected void onCreate(Bundle savedInstanceState) {

3943
        search_button = findViewById(R.id.search_button);
4044
        result_view = findViewById(R.id.results_view);
4145
        feedback_text = findViewById(R.id.feedback);
42-
        final EditText search_form = findViewById(R.id.search_form);
46+
        search_form = findViewById(R.id.search_form);
4347
4448
        search_button.setOnClickListener(new View.OnClickListener() {
4549
            @Override

7781
                return new SearchResult(e);
7882
            }
7983
80-
            return new SearchResult(searchResult);
84+
85+
            if(searchResult == null || searchResult.size() == 0) {
86+
                MojiConverter converter = new MojiConverter();
87+
                try {
88+
                    searchResult = DictionaryFactory.search(converter.convertRomajiToHiragana(text));
89+
                } catch (DictionaryException e) {
90+
                    return new SearchResult(e);
91+
                }
92+
93+
                return new SearchResult(searchResult, text, true);
94+
            } else {
95+
                return new SearchResult(searchResult, text, false);
96+
            }
8197
        }
8298
8399
        @Override

101117
            return;
102118
        }
103119
120+
        feedback_text.setText("");
121+
104122
        ArrayList<Result> searchResult = r.getResults();
123+
        MojiDetector detector = new MojiDetector();
124+
        String text = r.getText();
125+
        if(searchResult != null && searchResult.size()>1 && !r.isConverted() && detector.hasLatin(text)) {
126+
            MojiConverter converter = new MojiConverter();
127+
            final String moji = converter.convertRomajiToHiragana(r.getText());
128+
            feedback_text.setText(String.format(getString(R.string.feedback_didyoumean), moji));
129+
130+
            feedback_text.setOnClickListener(new View.OnClickListener() {
131+
                @Override
132+
                public void onClick(View v) {
133+
                    search_form.setText(moji);
134+
                    feedback_text.setOnClickListener(null);
135+
                    search_button.callOnClick();
136+
                }
137+
            });
138+
        }
105139
        showResults(searchResult);
106140
    }
107141

110144
            feedback_text.setText(R.string.feedback_no_result);
111145
            return;
112146
        }
113-
        feedback_text.setText("");
114147
115148
        int num = 0;
116149
        for(Result result: searchResult) {

app/src/main/java/eu/lepiller/nani/SearchResult.java

88
public class SearchResult {
99
    private ArrayList<Result> results;
1010
    private DictionaryException exception;
11+
    private boolean converted;
12+
    private String text;
1113
12-
    SearchResult(ArrayList<Result> results) {
14+
    SearchResult(ArrayList<Result> results, String text, boolean converted) {
1315
        this.results = results;
16+
        this.converted = converted;
17+
        this.text = text;
1418
    }
1519
1620
    SearchResult(DictionaryException e) {

2832
    ArrayList<Result> getResults() {
2933
        return results;
3034
    }
35+
36+
    boolean isConverted() {
37+
        return converted;
38+
    }
39+
40+
    String getText() {
41+
        return text;
42+
    }
3143
}

app/src/main/res/values-fr/strings.xml

2222
    <string name="dictionary_size">Taille r??elle : %d???Mo</string>
2323
    <string name="feedback_no_result">Pas de r??sultat</string>
2424
    <string name="feedback_progress">Recherche???</string>
25+
    <string name="feedback_didyoumean">Vouliez-vous dire ?? %s ?? ?</string>
2526
2627
    <!-- Dictionnary descriptions -->
2728

app/src/main/res/values/strings.xml

1919
    <string name="dictionary_size">Actual size: %dMB</string>
2020
    <string name="feedback_no_result">No result</string>
2121
    <string name="feedback_progress">Searching...</string>
22+
    <string name="feedback_didyoumean">Did you mean "%s"?</string>
2223
2324
    <!-- Dictionnary descriptions -->
2425
    <string name="dico_jmdict_e">Japanese/English dictionary from the Electronic Dictionary Research and Development Group.\n~56 MB, ~180,000 entries.</string>