1
0
Fork 0

building improvements: new versioning system and app ID (#30)

* new versioning system based on git

* changed the application ID in compliance with the F-Droid inclusion policy

* updated documentation
This commit is contained in:
Dimo Karaivanov 2022-07-16 12:14:11 +03:00 committed by sspanak
parent f4c93bf22b
commit a250d66bbd
32 changed files with 130 additions and 114 deletions

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.nyanya.android.traditionalt9"
package="io.github.sspanak.traditionalt9"
android:versionCode="4"
android:versionName="git" >
@ -22,7 +22,7 @@
android:label="@string/ime_name"
android:theme="@style/AppTheme" >
<service
android:name="org.nyanya.android.traditionalt9.TraditionalT9"
android:name="io.github.sspanak.traditionalt9.TraditionalT9"
android:permission="android.permission.BIND_INPUT_METHOD" >
<intent-filter>
<action android:name="android.view.InputMethod" />
@ -36,7 +36,7 @@
<service android:name=".DBUpdateService" />
<activity
android:name="org.nyanya.android.traditionalt9.TraditionalT9Settings"
android:name="io.github.sspanak.traditionalt9.TraditionalT9Settings"
android:label="@string/traditionalt9_settings" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -44,7 +44,7 @@
</activity>
<activity
android:theme="@android:style/Theme.Dialog"
android:name="org.nyanya.android.traditionalt9.AddWordAct"
android:name="io.github.sspanak.traditionalt9.AddWordAct"
android:label="@string/title_activity_add_word"
android:excludeFromRecents="true" >
</activity>

View file

@ -1,11 +1,33 @@
# Traditional T9
T9 IME input for Android devices with hardware keypad.
TT9 is an IME (Input Method Editor) for Android devices with hardware keypad. It supports multiple languages and predictive text typing. _NOTE: TT9 is not usable on touchscreen-only devices._
This is a clone of the [original project](https://github.com/Clam-/TraditionalT9) by Clam-.
## About the project
traditional-t9 is an Input Method Editor for Android that implements predictive text using the hardware keypad on the device. **Useless without a hardware numerical keypad.**
## Building
The recommended way of building is using Android Studio. As the of time of writing this, the current version is Android Studio Chipmunk | 2021.2.1 Patch 1.
Original Wiki: [Traditional T9 keypad IME for Android](https://github.com/Clam-/TraditionalT9/wiki/Traditional-T9-keypad-IME-for-Android)
### Building a Debug .apk
If you have not configure Android Studio yet, follow [the official manual](https://developer.android.com/training/basics/firstapp), then follow the simple steps below to get the project running.
- _Import the project in Android Studio._
- _Prevent the "Default Activity not found" issue._ The app does not have a default view or a launcher icon. For this reason, you must configure Android Studio not to launch anything after installing, otherwise it will fail with "Default Activity not found" or a similar message. To do so:
- Open "Edit Configurations..." (Press Shift 3 times and select it from the command list)
- Go to "General" tab.
- Change "Launch Options" to "Nothing"
- Hit "OK"
That's it! Now you should be able to deploy and debug the app on your device.
You can find more info in this [Github issue](https://github.com/android/input-samples/issues/18).
### Building a Release .apk
The project is configured to build an unsigned release variant by default. You just need to select the "release" variant from Android Studio options, then `Build -> Rebuild Project`. After that, just ignore all warnings until you get to the end of the process. You will find the `.apk` in the generated 'build/' folder.
### Building a Signed .apk
- Make sure you have a signing key. If you don't have one, follow the [official manual](https://developer.android.com/studio/publish/app-signing#sign-apk).
- In `build.gradle` find the `signingConfigs` and `buildTypes` sections and uncomment them.
- Set properly the environment variables listed in `signingConfigs.release` _(You may need to restart Android Studio after that)_. Alternatively, you may simply type the actual key path, alias and passwords there. **Just make sure not to commit them!**
- Build the project normally. Android Studio should show you where it has generated the signed `.apk` file. If not, look for it in the `build/` folder.
## Adding a new language
To support a new language one needs to:
@ -28,3 +50,26 @@ To support a new language one needs to:
- Find a suitable dictionary and add it to assets
That should be it? I hope.
## Using the app
TODO: Initial config, loading a dictionary...
#### Configuration Options
TODO...
#### Hotkeys
See [the original manual](https://github.com/Clam-/TraditionalT9/wiki/Hotkeys).
#### Key Remapping
See [the original manual](https://github.com/Clam-/TraditionalT9/wiki/Key-remapping).
## Word Lists
Here is detailed information and licenses about the word lists used:
- [Bulgarian word list](docs/bgWordlistReadme.txt)
- [English word list](docs/enWordlistReadme.txt)
- [French word list](docs/frWordlistReadme.txt)
- [German word list](docs/deWordlistReadme.txt)
- [Russian word list](docs/ruWordlistReadme.txt)
- [Ukrainian word list](docs/ukWordlistReadme.txt)
## License
- The source code, the logo image and the icons are licensed under the conditions described in [LICENSE.txt](LICENSE.txt).
- "Roboto" font is under [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0).
- The word lists / dictionaries are licensed under the licenses provided in the [respective readme files](#word-lists), where applicable.

View file

@ -7,10 +7,10 @@ buildscript {
classpath 'com.android.tools.build:gradle:7.2.1'
}
}
apply plugin: 'android'
apply plugin: 'com.android.application'
dependencies {
implementation "androidx.core:core:1.5.0"
implementation "androidx.core:core:1.6.0"
}
repositories {
@ -33,49 +33,22 @@ def execThing ( String cmdStr ) {
standardOutput = stdout
}
}
return stdout
return stdout.toString().trim()
}
def computeVersionCode = { ->
String commitsCount = execThing("git rev-list --count HEAD")
return Integer.valueOf(commitsCount)
}
def computeVersionName = { ->
String tagsCount = execThing('git tag').split('\n').size() + 1 // initially, versions were 1-based
String lastTag = execThing('git describe --tags --abbrev=0')
String commitsSinceLastTag = execThing("git log $lastTag..HEAD --oneline").split('\n').size() + 1
String currentHash = execThing('git log -1 --format=%h')
String ver = "git-source"
try {
if (execThing(" git status -z").toString().trim().equals("")) {
return "git-" + execThing(' git log -1 --format="%h"').toString().trim()
} else {
return ver
}
} catch (all) {
println "Cannot run git (not in path?), using default versioning"
}
return ver
}
def getProps() {
Properties props = new Properties()
File f = new File("t9build.properties")
if (!f.exists()) {
f.createNewFile()
}
props.load(new FileInputStream(f))
return props
}
def saveProps(Properties props) {
props.store(new FileOutputStream(new File("t9build.properties")), null)
}
// -PincrementBuildNumber assembleRelease
def computeVersionNumber = { ->
Properties props = getProps()
int verNum = Integer.valueOf(props.getProperty("verNum", "0"))
if (project.hasProperty('incrementBuildNumber')) {
verNum++
}
props.setProperty("verNum", String.valueOf(verNum))
saveProps(props)
return verNum
return "$tagsCount.$commitsSinceLastTag ($currentHash)"
}
android {
@ -106,7 +79,7 @@ android {
defaultConfig {
minSdkVersion 19
targetSdk 30
versionCode computeVersionNumber()
versionCode computeVersionCode()
versionName computeVersionName()
}

View file

@ -1,7 +1,5 @@
Bulgarian wordlist by: Miglen Georgiev
Version: f46eff1 (2022-04-26)
Words Count: 234114
Source: https://github.com/miglen/bulgarian-wordlists
Source: https://github.com/miglen/bulgarian-wordlists/blob/master/wordlists/bg-words-validated-cyrillic.txt
License: https://github.com/miglen/bulgarian-wordlists/blob/master/LICENSE
All words validated against a real dictionary.

View file

@ -1,6 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
& source: http://www.winedt.org/Dict/
% file: de_neu.dic (de)
% version: 5 Jan 2005
% version: 5 Jan 2005 / with modifications
% New German spelling wordlist for WinEdt (or compatible) spellcheckers
% wordcount: 532273 words
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -1,4 +1,6 @@
Spell Checking Oriented Word Lists (SCOWL)
// Source for English dictionary: http://wordlist.sourceforge.net/
Spell Checking Oriented Word Lists (SCOWL)
Revision 7.1 (SVN Revision 161)
January 6, 2011
by Kevin Atkinson (kevina@gnu.org)

View file

@ -0,0 +1,3 @@
French wordlist by: Christophe Pallier
Source: http://www.pallier.org/ressources/dicofr/dicofr.html
Words Count: 336531

View file

@ -0,0 +1 @@
Source for Russian dictionary: Various sources from Russian user

View file

@ -9,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:privateImeOptions="org.nyanya.android.traditionalt9.addword=true" >
android:privateImeOptions="io.github.sspanak.traditionalt9.addword=true" >
<requestFocus />
</EditText>

View file

@ -21,5 +21,5 @@
<!-- for the Search Manager. -->
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="org.nyanya.android.traditionalt9.TraditionalT9Settings" >
android:settingsActivity="io.github.sspanak.traditionalt9.TraditionalT9Settings" >
</input-method>

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.app.Dialog;
import android.content.Context;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.app.Activity;
import android.app.AlertDialog;
@ -10,7 +10,7 @@ import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING;
import io.github.sspanak.traditionalt9.T9DB.DBSettings.SETTING;
public class AddWordAct extends Activity {
@ -24,9 +24,9 @@ public class AddWordAct extends Activity {
View v = getLayoutInflater().inflate(R.layout.addwordview, null);
EditText et = (EditText) v.findViewById(R.id.add_word_text);
Intent i = getIntent();
origword = i.getStringExtra("org.nyanya.android.traditionalt9.word");
origword = i.getStringExtra("io.github.sspanak.traditionalt9.word");
lang = i.getIntExtra("org.nyanya.android.traditionalt9.lang", -1);
lang = i.getIntExtra("io.github.sspanak.traditionalt9.lang", -1);
if (lang == -1) {
Log.e("AddWordAct.onCreate", "lang is invalid. How?");
}

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.content.Context;
import android.content.res.Resources;

View file

@ -1,8 +1,8 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.util.Log;
import org.nyanya.android.traditionalt9.LangHelper.LANGUAGE;
import io.github.sspanak.traditionalt9.LangHelper.LANGUAGE;
import java.util.AbstractList;
import java.util.ArrayList;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
public class DBException extends Exception {
private static final long serialVersionUID = 376752656441823823L;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.app.IntentService;
import android.app.Notification;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.view.KeyEvent;
import android.view.View;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.os.Environment;
import android.util.Log;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import java.util.HashMap;
import java.util.Locale;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.content.Context;
import android.view.View;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.content.Context;
import android.view.View;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.content.ContentValues;
import android.content.Context;
@ -14,7 +14,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import org.nyanya.android.traditionalt9.LangHelper.LANGUAGE;
import io.github.sspanak.traditionalt9.LangHelper.LANGUAGE;
import java.util.AbstractList;
import java.util.HashMap;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.content.Intent;
import android.content.res.Resources;
@ -16,8 +16,8 @@ import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.Toast;
import org.nyanya.android.traditionalt9.LangHelper.LANGUAGE;
import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING;
import io.github.sspanak.traditionalt9.LangHelper.LANGUAGE;
import io.github.sspanak.traditionalt9.T9DB.DBSettings.SETTING;
import java.util.AbstractList;
import java.util.ArrayList;
@ -213,8 +213,8 @@ public class TraditionalT9 extends InputMethodService implements
Intent awintent = new Intent(this, AddWordAct.class);
awintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
awintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
awintent.putExtra("org.nyanya.android.traditionalt9.word", template);
awintent.putExtra("org.nyanya.android.traditionalt9.lang", mLang.id);
awintent.putExtra("io.github.sspanak.traditionalt9.word", template);
awintent.putExtra("io.github.sspanak.traditionalt9.lang", mLang.id);
clearState();
currentInputConnection.setComposingText("", 0);
currentInputConnection.finishComposingText();
@ -376,7 +376,7 @@ public class TraditionalT9 extends InputMethodService implements
}
String prevword = null;
if (attribute.privateImeOptions != null
&& attribute.privateImeOptions.equals("org.nyanya.android.traditionalt9.addword=true")) {
&& attribute.privateImeOptions.equals("io.github.sspanak.traditionalt9.addword=true")) {
mAddingWord = true;
// mAddingSkipInput = true;
// Log.d("onStartInput", "ADDING WORD");

View file

@ -1,11 +1,4 @@
package org.nyanya.android.traditionalt9;
/*
Source for English dictionary: http://wordlist.sourceforge.net/
Source for Russian dictionary: Various sources from Russian user
Source for German dictionary: Modified version from http://www.winedt.org/Dict/
Source for French dictionary: http://www.pallier.org/ressources/dicofr/dicofr.html
*/
package io.github.sspanak.traditionalt9;
import android.app.Activity;
import android.app.AlertDialog;
@ -33,11 +26,11 @@ import android.widget.Toast;
import com.stackoverflow.answer.UnicodeBOMInputStream;
import org.nyanya.android.traditionalt9.LangHelper.LANGUAGE;
import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING;
import org.nyanya.android.traditionalt9.settings.CustomInflater;
import org.nyanya.android.traditionalt9.settings.Setting;
import org.nyanya.android.traditionalt9.settings.SettingAdapter;
import io.github.sspanak.traditionalt9.LangHelper.LANGUAGE;
import io.github.sspanak.traditionalt9.T9DB.DBSettings.SETTING;
import io.github.sspanak.traditionalt9.settings.CustomInflater;
import io.github.sspanak.traditionalt9.settings.Setting;
import io.github.sspanak.traditionalt9.settings.SettingAdapter;
import java.io.BufferedReader;
import java.io.BufferedWriter;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9;
package io.github.sspanak.traditionalt9;
import android.text.InputType;
import android.util.Log;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9.settings;
package io.github.sspanak.traditionalt9.settings;
// http://stackoverflow.com/a/8488691
@ -22,7 +22,7 @@ public class CustomInflater {
if (token == XmlPullParser.START_TAG) {
if (!parser.getName().equals("Settings")) {
//prepend package
Class aClass = Class.forName("org.nyanya.android.traditionalt9.settings."+parser.getName());
Class aClass = Class.forName("io.github.sspanak.traditionalt9.settings."+parser.getName());
Class<?>[] params = new Class[]{Context.class, AttributeSet.class, isettings.getClass()};
Constructor<?> constructor = aClass.getConstructor(params);
try {

View file

@ -1,10 +1,10 @@
package org.nyanya.android.traditionalt9.settings;
package io.github.sspanak.traditionalt9.settings;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import org.nyanya.android.traditionalt9.R;
import io.github.sspanak.traditionalt9.R;
public class Setting {
String title;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9.settings;
package io.github.sspanak.traditionalt9.settings;
// https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView
@ -9,7 +9,7 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import org.nyanya.android.traditionalt9.R;
import io.github.sspanak.traditionalt9.R;
import java.util.ArrayList;

View file

@ -1,13 +1,13 @@
package org.nyanya.android.traditionalt9.settings;
package io.github.sspanak.traditionalt9.settings;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;
import org.nyanya.android.traditionalt9.R;
import org.nyanya.android.traditionalt9.T9DB;
import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING;
import io.github.sspanak.traditionalt9.R;
import io.github.sspanak.traditionalt9.T9DB;
import io.github.sspanak.traditionalt9.T9DB.DBSettings.SETTING;
public class SettingCheck extends Setting {
boolean value;

View file

@ -1,13 +1,13 @@
package org.nyanya.android.traditionalt9.settings;
package io.github.sspanak.traditionalt9.settings;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import org.nyanya.android.traditionalt9.R;
import org.nyanya.android.traditionalt9.T9DB;
import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING;
import io.github.sspanak.traditionalt9.R;
import io.github.sspanak.traditionalt9.T9DB;
import io.github.sspanak.traditionalt9.T9DB.DBSettings.SETTING;
public class SettingList extends Setting {
String[] entries;

View file

@ -1,4 +1,4 @@
package org.nyanya.android.traditionalt9.settings;
package io.github.sspanak.traditionalt9.settings;
import android.app.AlertDialog;
import android.content.Context;
@ -6,10 +6,10 @@ import android.content.DialogInterface;
import android.util.AttributeSet;
import android.widget.TextView;
import org.nyanya.android.traditionalt9.LangHelper;
import org.nyanya.android.traditionalt9.R;
import org.nyanya.android.traditionalt9.T9DB;
import org.nyanya.android.traditionalt9.T9DB.DBSettings.SETTING;
import io.github.sspanak.traditionalt9.LangHelper;
import io.github.sspanak.traditionalt9.R;
import io.github.sspanak.traditionalt9.T9DB;
import io.github.sspanak.traditionalt9.T9DB.DBSettings.SETTING;
public class SettingMultiList extends SettingList {
boolean[] selectedEntries = new boolean[0];