Add radical size preference

Julien LepillerMon May 25 18:09:31+0200 2020

82c293e

Add radical size preference

CHANGELOG.md

44
Changes Since 0.2
55
-----------------
66
7+
### Features
8+
9+
* New settings: radical size
10+
711
### Bug Fixes
812
913
* Show dictionary sizes in appropriate unit, to prevent showing 0MB on

1317
1418
### Translations
1519
16-
* Updat efr translation
20+
* Update fr translation
1721
18-
Changes Since 0.1
22+
Changes In 0.2
1923
-----------------
2024
2125
### Features

app/build.gradle

2121
dependencies {
2222
    implementation fileTree(dir: 'libs', include: ['*.jar'])
2323
    implementation 'androidx.appcompat:appcompat:1.1.0'
24+
    implementation 'androidx.preference:preference:1.1.1'
2425
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
2526
    implementation 'com.google.android.material:material:1.1.0'
2627
    implementation 'com.andree-surya:moji4j:1.0.0'
2728
    implementation 'com.google.android:flexbox:2.0.1'
2829
    implementation project(path: ':furiganatextview')
30+
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
2931
    testImplementation 'junit:junit:4.12'
3032
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
3133
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

app/src/main/AndroidManifest.xml

22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
    package="eu.lepiller.nani">
44
5+
    <uses-permission android:name="android.permission.INTERNET" />
6+
57
    <application
68
        android:allowBackup="true"
79
        android:icon="@mipmap/ic_launcher"

911
        android:roundIcon="@mipmap/ic_launcher_round"
1012
        android:supportsRtl="true"
1113
        android:theme="@style/AppTheme">
12-
        <activity android:name=".DictionaryDownloadActivity"></activity>
14+
        <activity android:name=".SettingsActivity"></activity>
15+
        <activity android:name=".DictionaryDownloadActivity" />
1316
        <activity android:name=".AboutActivity" />
1417
        <activity
1518
            android:name=".DictionaryActivity"

2730
        </activity>
2831
    </application>
2932
30-
    <uses-permission android:name="android.permission.INTERNET" />
31-
3233
</manifest>
3233=
3334=
\ No newline at end of file

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

33
import android.app.NotificationChannel;
44
import android.app.NotificationManager;
55
import android.content.Intent;
6+
import android.content.SharedPreferences;
67
import android.os.AsyncTask;
78
import android.os.Bundle;
89
import com.google.android.material.snackbar.Snackbar;
910
import androidx.appcompat.app.AppCompatActivity;
1011
import androidx.appcompat.widget.Toolbar;
12+
import androidx.preference.PreferenceManager;
13+
1114
import android.view.View;
1215
import android.view.Menu;
1316
import android.view.MenuItem;

2831
import eu.lepiller.nani.result.Result;
2932
import se.fekete.furiganatextview.furiganaview.FuriganaTextView;
3033
31-
public class MainActivity extends AppCompatActivity implements OnTaskCompleted<SearchResult> {
34+
public class MainActivity extends AppCompatActivity implements OnTaskCompleted<SearchResult>, SharedPreferences.OnSharedPreferenceChangeListener {
3235
    private LinearLayout result_view, result_layout;
3336
    private Button search_button;
3437
    private TextView feedback_text;

6063
            manager.createNotificationChannel(channel);
6164
        }
6265
66+
        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
67+
68+
        SharedPreferences sharedPref =
69+
                PreferenceManager.getDefaultSharedPreferences(this);
70+
        sharedPref.registerOnSharedPreferenceChangeListener(this);
71+
        int radSizePref = Integer.parseInt(sharedPref.getString
72+
                (SettingsActivity.KEY_PREF_RAD_SIZE, "122"));
73+
6374
        try {
75+
            radical_selector.setRadSize(radSizePref);
6476
            radical_selector.setDictionary(DictionaryFactory.getRadicalDictionary(getApplicationContext()));
6577
        } catch (NoDictionaryException e) {
6678
            e.printStackTrace();

121133
        }
122134
    }
123135
136+
    @Override
137+
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
138+
        if(key.compareTo(SettingsActivity.KEY_PREF_RAD_SIZE) == 0) {
139+
            int radSizePref = Integer.parseInt(sharedPreferences.getString
140+
                    (SettingsActivity.KEY_PREF_RAD_SIZE, "122"));
141+
            radical_selector.setRadSize(radSizePref);
142+
        }
143+
    }
144+
124145
    private static class SearchTask extends AsyncTask<String, Integer, SearchResult> {
125146
        OnTaskCompleted<SearchResult> callback;
126147
        SearchTask(OnTaskCompleted<SearchResult> callback) {

274295
275296
        //noinspection SimplifiableIfStatement
276297
        if (id == R.id.action_settings) {
298+
            Intent intent = new Intent(this, SettingsActivity.class);
299+
            startActivity(intent);
277300
            return true;
278301
        } else if (id == R.id.action_dictionaries) {
279302
            Intent intent = new Intent(this, DictionaryActivity.class);

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

11
package eu.lepiller.nani;
22
33
import android.content.Context;
4+
import android.content.SharedPreferences;
45
import android.os.AsyncTask;
56
import android.os.Build;
67
import android.util.AttributeSet;

3233
    final List<String> selected = new ArrayList<>();
3334
    View.OnClickListener kanjiSelectionListener;
3435
    RadicalDict dictionary;
36+
    private int radSize = 122;
3537
3638
    public RadicalSelectorView(Context context) {
3739
        this(context, null, 0);

6365
        new DictionaryUpdateTask(this).execute(dict);
6466
    }
6567
68+
    public void setRadSize(int size) {
69+
        radSize = size;
70+
        resizeRadicals();
71+
    }
72+
73+
    public float getRadFontSize() {
74+
        return radSize / 8;
75+
    }
76+
6677
    @Override
6778
    public void onTaskCompleted(Map<Integer, List<String>> radicals) {
6879
        if(radicals == null)

8293
                radicalButton.setTextOff(radical);
8394
                radicalButton.setTextOn(radical);
8495
                radicalButton.setText(radical);
85-
                radicalButton.setLayoutParams(new FlexboxLayout.LayoutParams(122, 122));
96+
                radicalButton.setTextSize(getRadFontSize());
97+
                radicalButton.setLayoutParams(new FlexboxLayout.LayoutParams(radSize, radSize));
8698
8799
                radicalButton.setOnClickListener(new OnClickListener() {
88100
                    @Override

210222
                Button kanji_button = new Button(getContext());
211223
                kanji_button.setText(k);
212224
                kanji_button.setOnClickListener(kanjiSelectionListener);
213-
                kanji_button.setLayoutParams(new LayoutParams(122, 122));
225+
                kanji_button.setLayoutParams(new LayoutParams(radSize, radSize));
226+
                kanji_button.setTextSize(getRadFontSize());
214227
                row.addView(kanji_button);
215228
216229
                if (number > total / 2)

233246
            }
234247
        }
235248
    }
249+
250+
    private void resizeRadicals() {
251+
        for(int row=0; row < radical_table.getChildCount(); row++) {
252+
            View r = radical_table.getChildAt(row);
253+
            if(r instanceof FlexboxLayout) {
254+
                for(int col = 0; col < ((FlexboxLayout) r).getChildCount(); col++) {
255+
                    View child = ((FlexboxLayout) r).getChildAt(col);
256+
                    if(child instanceof ToggleButton) {
257+
                        child.setLayoutParams(new FlexboxLayout.LayoutParams(radSize, radSize));
258+
                        ((ToggleButton)child).setTextSize(getRadFontSize());
259+
                    }
260+
                }
261+
            }
262+
        }
263+
        for(int kanji = 0; kanji < kanji_row1.getChildCount(); kanji++) {
264+
            View k = kanji_row1.getChildAt(kanji);
265+
            if(k instanceof Button) {
266+
                ((Button) k).setTextSize(getRadFontSize());
267+
                k.setLayoutParams(new LayoutParams(radSize, radSize));
268+
            }
269+
        }
270+
        for(int kanji = 0; kanji < kanji_row2.getChildCount(); kanji++) {
271+
            View k = kanji_row2.getChildAt(kanji);
272+
            if(k instanceof Button) {
273+
                ((Button) k).setTextSize(getRadFontSize());
274+
                k.setLayoutParams(new LayoutParams(radSize, radSize));
275+
            }
276+
        }
277+
    }
236278
}

app/src/main/java/eu/lepiller/nani/SettingsActivity.java unknown status 1

1+
package eu.lepiller.nani;
2+
3+
import androidx.appcompat.app.AppCompatActivity;
4+
5+
import android.os.Bundle;
6+
7+
public class SettingsActivity extends AppCompatActivity {
8+
    public static final String KEY_PREF_RAD_SIZE = "rad_size";
9+
10+
    @Override
11+
    protected void onCreate(Bundle savedInstanceState) {
12+
        super.onCreate(savedInstanceState);
13+
        getSupportFragmentManager().beginTransaction()
14+
                .replace(android.R.id.content, new SettingsFragment())
15+
                .commit();
16+
    }
17+
}

app/src/main/java/eu/lepiller/nani/SettingsFragment.java unknown status 1

1+
package eu.lepiller.nani;
2+
3+
import android.os.Bundle;
4+
5+
import androidx.fragment.app.Fragment;
6+
import androidx.preference.PreferenceFragmentCompat;
7+
8+
import android.view.LayoutInflater;
9+
import android.view.View;
10+
import android.view.ViewGroup;
11+
import android.widget.TextView;
12+
13+
/**
14+
 * A simple {@link Fragment} subclass.
15+
 */
16+
public class SettingsFragment extends PreferenceFragmentCompat {
17+
    @Override
18+
    public void onCreatePreferences(Bundle savedInstanceState,
19+
                                    String rootKey) {
20+
        setPreferencesFromResource(R.xml.preferences, rootKey);
21+
    }
22+
}

app/src/main/res/drawable/ic_rad.xml unknown status 1

1+
<vector android:height="32dp" android:viewportHeight="14"
2+
    android:viewportWidth="14" android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
3+
    <path android:fillColor="#e6e6e6"
4+
        android:pathData="M7,7m-7,0a7,7 0,1 1,14 0a7,7 0,1 1,-14 0" android:strokeWidth="0.26458332"/>
5+
    <path android:fillAlpha="1" android:fillColor="#1a1a1a"
6+
        android:pathData="m4.2555,2.9731c0.7303,0.3704 1.6616,0.9419 2.1272,1.3335l0.4974,-0.6456c-0.4868,-0.381 -1.4393,-0.9208 -2.1484,-1.2488zM3.3453,5.8094c0.7726,0.3281 1.778,0.8572 2.286,1.2277l0.4551,-0.6668c-0.5186,-0.381 -1.5452,-0.8678 -2.2966,-1.1536zM4.0544,11.2492 L4.7105,11.9054c0.7937,-1.0477 1.7463,-2.4448 2.4871,-3.6195l-0.5503,-0.6244c-0.8149,1.2806 -1.8838,2.7517 -2.5929,3.5877z"
7+
        android:strokeColor="#00000000" android:strokeWidth="0.26458332"/>
8+
</vector>

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

3030
    <string name="feedback_progress">Recherche???</string>
3131
    <string name="feedback_didyoumean">Vouliez-vous dire ?? %s ?? ?</string>
3232
33+
    <!-- Preferences -->
34+
    <string name="pref_rad_size">Taille des radicaux</string>
35+
    <string-array name="pref_rad_size_choice">
36+
        <item>plus gros</item>
37+
        <item>normale</item>
38+
        <item>plus petit</item>
39+
    </string-array>
40+
3341
    <!-- Dictionnary descriptions -->
3442
3543
    <string name="dico_jmdict_e">Dictionnaire japonais/anglais de l???Electronic Dictionary Research and Development Group.\n~56???Mo, ~180???000 entr??es.</string>

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

2626
    <string name="feedback_progress">Searching???</string>
2727
    <string name="feedback_didyoumean">Did you mean "%s"?</string>
2828
29+
    <!-- Preferences -->
30+
    <string name="pref_rad_size">Radicals Size</string>
31+
    <string-array name="pref_rad_size_choice">
32+
        <item>bigger</item>
33+
        <item>normal</item>
34+
        <item>smaller</item>
35+
    </string-array>
36+
    <string-array name="pref_rad_size_values" translatable="false">
37+
        <item>158</item>
38+
        <item>122</item>
39+
        <item>96</item>
40+
    </string-array>
41+
2942
    <!-- Dictionnary descriptions -->
3043
    <string name="dico_jmdict_e">Japanese/English dictionary from the Electronic Dictionary Research and Development Group.\n~56 MB, ~180,000 entries.</string>
3144
    <string name="dico_jmdict_dut">Japanese/Dutch dictionary from the Electronic Dictionary Research and Development Group.\n~19 MB, ~35,000 entries.</string>

7992
        </string>
8093
    <string name="data_licenses">Data Licenses</string>
8194
    <string name="data_intro">Nani? uses data from third party distributed under different licenses.</string>
82-
    
95+
8396
    <string name="erdrg_title">Electronic Dictionary Research and Development Group</string>
8497
    <string name="erdrg_descr">The Electronic Dictionary Research and Development Group was
8598
        established in 2000 within the Faculty of Information Technology, Monash University.

105118
        covers the 13,108 kanji in three main Japanese standards.
106119
    </string>
107120
    <string name="kanjidic_license">This source is licensed under Creative Commons Share-Alike.</string>
121+
122+
    <!-- TODO: Remove or change this placeholder text -->
123+
    <string name="hello_blank_fragment">Hello blank fragment</string>
108124
</resources>

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

66
        <item name="colorPrimary">@color/colorPrimary</item>
77
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
88
        <item name="colorAccent">@color/colorAccent</item>
9+
        <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
910
    </style>
1011
1112
    <style name="AppTheme.NoActionBar">

app/src/main/res/xml/preferences.xml unknown status 1

1+
<?xml version="1.0" encoding="utf-8"?>
2+
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
3+
    <ListPreference
4+
        android:entries="@array/pref_rad_size_choice"
5+
        android:entryValues="@array/pref_rad_size_values"
6+
        android:key="rad_size"
7+
        android:title="@string/pref_rad_size"
8+
        android:defaultValue="66"
9+
        android:icon="@drawable/ic_rad"/>
10+
</PreferenceScreen>
10<
011<
\ No newline at end of file