Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b2c7d9337 | ||
|
|
409362ddb4 | ||
|
|
c524caa6f1 | ||
|
|
7caf60c93b | ||
|
|
49a6a30773 | ||
|
|
4a5a125aea | ||
|
|
51a41ec90a | ||
|
|
7e7a5e4425 | ||
|
|
9ff8179d49 | ||
|
|
1af4e45117 | ||
|
|
2db4ae3730 | ||
|
|
2aecbca9ac | ||
|
|
dce7e2b9d9 | ||
|
|
7c12aa610c | ||
|
|
294ebee6f1 | ||
|
|
bd1afd2c3c | ||
|
|
44f6908411 | ||
|
|
df04eae85f | ||
|
|
d7c230e173 | ||
|
|
478d8082f4 | ||
|
|
7af6adcf11 | ||
|
|
dd327cc812 | ||
|
|
d073523125 | ||
|
|
684d5c7b70 | ||
|
|
851d22da6e | ||
|
|
44adb55544 | ||
|
|
15de829138 | ||
|
|
c57d896d8d | ||
|
|
80c6f97767 | ||
|
|
b0cf9a52b5 | ||
|
|
f696452c59 | ||
|
|
70500ba6f8 | ||
|
|
474c693427 | ||
|
|
73060bfc00 | ||
|
|
60134effdc | ||
|
|
838fbc8ef8 | ||
|
|
148bed769a | ||
|
|
3d36ecb34d | ||
|
|
2d164ca64f | ||
|
|
d594242a53 | ||
|
|
bd886a24eb | ||
|
|
7b7202ec1b | ||
|
|
33653a94cb | ||
|
|
5b4345088d | ||
|
|
d5cbcb37e3 | ||
|
|
66b1bdc9c9 | ||
|
|
d771e9d2c7 | ||
|
|
44e2e86f19 | ||
|
|
92a8db5e93 | ||
|
|
687d88f4f7 | ||
|
|
b079e5cf43 | ||
|
|
86038ef512 | ||
|
|
816269aed0 | ||
|
|
234986817f | ||
|
|
f4a995e2bd | ||
|
|
f07fbaff3b | ||
|
|
3530263083 | ||
|
|
9b917e79b1 | ||
|
|
f4c11d99ed | ||
|
|
cf76118548 | ||
|
|
40498e7b4c |
@@ -12,36 +12,37 @@ jobs:
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'zulu' # See 'Supported distributions' for available options
|
||||
java-version: '11'
|
||||
java-version: '17'
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
- name: Cache debug certificate
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: _build/debug.keystore
|
||||
key: debug-keystore
|
||||
- name: Restore debug keystore from github Secrets
|
||||
- name: Restore debug keystore from GitHub Secrets
|
||||
run: |
|
||||
mkdir -p _build
|
||||
cd "_build"
|
||||
# Check if exist and use the secret named DEBUG_KEYSTORE
|
||||
# The contents of the secret can be obtained -
|
||||
# from the debug.keystore.asc from you local _build folder
|
||||
# from the debug.keystore.asc from you local folder (refer to CONTRIBUTING.md#Using the local debug.keystore on the Github CI actions)
|
||||
if [[ ! "${{ secrets.DEBUG_KEYSTORE }}" = "" ]]; then
|
||||
echo "${{ secrets.DEBUG_KEYSTORE }}" > "debug.keystore.asc"
|
||||
if [[ -s "debug.keystore.asc" ]]; then
|
||||
echo "Restoring debug keystore from GitHub secrets"
|
||||
gpg -d --passphrase "debug0" --batch "debug.keystore.asc" > "debug.keystore"
|
||||
fi
|
||||
fi
|
||||
- name: Build
|
||||
run: make
|
||||
- name: Build debug APK
|
||||
uses: gradle/gradle-build-action@v2
|
||||
env:
|
||||
DEBUG_KEYSTORE: "debug.keystore"
|
||||
DEBUG_KEYSTORE_PASSWORD: debug0
|
||||
DEBUG_KEY_ALIAS: debug
|
||||
DEBUG_KEY_PASSWORD: debug0
|
||||
with:
|
||||
arguments: assembleDebug
|
||||
- name: Artifact naming
|
||||
run: |
|
||||
artifact="${{github.repository_owner}} ${{github.ref_name}}"
|
||||
artifact="${artifact//\//-}" # replace slashes
|
||||
echo "artifact=${artifact}" >> $GITHUB_ENV
|
||||
- name: Save debug apk
|
||||
- name: Upload debug APK
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: "${{env.artifact}} debug_apk"
|
||||
path: _build/*.apk
|
||||
path: build/outputs/apk/debug/*.apk
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
*.keystore
|
||||
*.keystore.asc
|
||||
_build
|
||||
/*-keystore.conf
|
||||
*.iml
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea
|
||||
.DS_Store
|
||||
/captures
|
||||
/build
|
||||
# Directory _build is not used anymore
|
||||
/_build
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="36" android:versionName="1.24.0" android:hardwareAccelerated="false">
|
||||
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="33"/>
|
||||
<application android:label="@string/app_name" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="false">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:hardwareAccelerated="false">
|
||||
<application android:label="@string/app_name" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:hardwareAccelerated="false">
|
||||
<service android:name="juloo.keyboard2.Keyboard2" android:label="@string/app_name" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.view.InputMethod"/>
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.view.im" android:resource="@xml/method"/>
|
||||
</service>
|
||||
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@drawable/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@mipmap/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="juloo.keyboard2.LauncherActivity" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<activity android:name="juloo.keyboard2.LauncherActivity" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
|
||||
@@ -4,52 +4,46 @@ Thanks for contributing :)
|
||||
|
||||
## Building the app
|
||||
|
||||
The application doesn't use Gradle and it might be hard to use some features of
|
||||
Android Studio.
|
||||
|
||||
Fortunately, there's not many dependencies:
|
||||
- OpenJDK 8
|
||||
The application uses Gradle and can be used with Android Studio, but using
|
||||
Android Studio is not required. The build dependencies are:
|
||||
- OpenJDK 17
|
||||
- Android SDK: build tools (minimum `28.0.1`), platform `30`
|
||||
- Make sure to have the `$ANDROID_HOME` environment variable set.
|
||||
|
||||
Python 3 is required to update generated files but not to build the app.
|
||||
|
||||
For Android Studio users, no more setup is needed.
|
||||
|
||||
For Nix users, the right environment can be obtained with `nix-shell ./shell.nix`.
|
||||
Instructions to install Nix are [here](https://nixos.wiki/wiki/Nix_Installation_Guide).
|
||||
|
||||
If you don't use Android Studio or Nix, you have to inform Gradle about the
|
||||
location of your Android SDK by either:
|
||||
- Setting the `ANDROID_HOME` environment variable to point to the android sdk or
|
||||
- Creating the file `local.properties` and writing
|
||||
`sdk.dir=<location_of_android_home>` into it.
|
||||
|
||||
Building the debug apk:
|
||||
|
||||
```sh
|
||||
make
|
||||
./gradlew assembleDebug
|
||||
```
|
||||
|
||||
If the build succeed, the debug apk is located in `_build/juloo.keyboard2.debug.apk`.
|
||||
Nix users can call gradle directly: `gradle assembleDebug`.
|
||||
|
||||
## Using the local debug.keystore on the Github CI actions
|
||||
|
||||
It's possible to save the local debug.keystore into a github secret, so the same keystore is utilized to build the debug apk in the CI github actions.
|
||||
Doing this, they wil have the same signature, thus the debug apk can be updated without having to uninstall it first.
|
||||
|
||||
After you sucessfully run `make`, (thus a debug.keystore exists) you can use this second command to generate a base64 stringified version of it
|
||||
|
||||
```sh
|
||||
cd _build
|
||||
gpg -c --armor --pinentry-mode loopback --passphrase debug0 --yes "debug.keystore"
|
||||
```
|
||||
|
||||
A file will be generated inside the local `_build/` folder, called `debug.keystore.asc`
|
||||
|
||||
You can copy the content of this file, and with that, paste it into a new github secret in your repo settings.
|
||||
|
||||
The secret must be named `DEBUG_KEYSTORE`
|
||||
If the build succeeds, the debug apk is located in `build/outputs/apk/debug/app-debug.apk`.
|
||||
|
||||
## Debugging on your phone
|
||||
|
||||
First [Enable adb debugging on your device](https://developer.android.com/studio/command-line/adb#Enabling).
|
||||
Then connect your phone to your computer using an USB cable or wireless
|
||||
Then connect your phone to your computer using an USB cable or via wireless
|
||||
debugging.
|
||||
|
||||
If you use Android Studio, this process will be automatic and you don't have to
|
||||
follow this guide anymore.
|
||||
|
||||
And finally, install the application with:
|
||||
```sh
|
||||
make installd
|
||||
./gradlew installDebug
|
||||
```
|
||||
|
||||
The released version of the application won't be removed, both versions will
|
||||
@@ -57,11 +51,13 @@ be installed at the same time.
|
||||
|
||||
## Debugging the application: INSTALL_FAILED_UPDATE_INCOMPATIBLE
|
||||
|
||||
`make installd` can fail with the following error message:
|
||||
`./gradlew installDebug` can fail with the following error message:
|
||||
|
||||
```
|
||||
adb: failed to install _build/juloo.keyboard2.debug.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package juloo.keyboard2.debug signatures do not match previously installed version; ignoring!]
|
||||
make: *** [Makefile:20: installd] Error 1
|
||||
FAILURE: Build failed with an exception.
|
||||
* What went wrong:
|
||||
Execution failed for task ':installDebug'.
|
||||
> java.util.concurrent.ExecutionException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package juloo.keyboard2.debug signatures do not match newer version; ignoring!
|
||||
```
|
||||
|
||||
The application can't be "updated" because the temporary certificate has been
|
||||
@@ -70,9 +66,24 @@ The application must be enabled again in the settings.
|
||||
|
||||
```sh
|
||||
adb uninstall juloo.keyboard2.debug
|
||||
make installd
|
||||
./gradlew installDebug
|
||||
```
|
||||
|
||||
## Specifying a debug signing certificate on Github Actions
|
||||
|
||||
It's possible to specify the signing certificate that the automated build
|
||||
should use.
|
||||
After you successfully run `./gradlew asssembleDebug`, (thus a debug.keystore
|
||||
exists) you can use this second command to generate a base64 stringified
|
||||
version of it:
|
||||
|
||||
```sh
|
||||
gpg -c --armor --pinentry-mode loopback --passphrase debug0 --yes "debug.keystore"
|
||||
```
|
||||
|
||||
This will create the file `debug.keystore.asc`, paste its content into a new
|
||||
Github secret named `DEBUG_KEYSTORE`.
|
||||
|
||||
## Guidelines
|
||||
|
||||
### Adding a layout
|
||||
@@ -89,17 +100,18 @@ The layout file must be placed in the `res/xml/` directory and named according t
|
||||
- layout name (eg. the name of a standard)
|
||||
- country code (or language code if more adequate)
|
||||
|
||||
Then, run `make gen_layouts` to add the layout to the app.
|
||||
Then, run `./gradlew genLayoutsList` to add the layout to the app.
|
||||
|
||||
The last step will update the file `res/values/layouts.xml`, that you should
|
||||
not edit directly.
|
||||
|
||||
Run `make check_layouts` to check some properties about your layout. This will
|
||||
change the file `check_layout.output`, which you should commit.
|
||||
Run `./gradlew checkKeyboardLayouts` to check some properties about your
|
||||
layout. This will change the file `check_layout.output`, which you should
|
||||
commit.
|
||||
|
||||
#### Adding a programming layout
|
||||
|
||||
A programming layout must contains every ASCII characters.
|
||||
A programming layout must contain all ASCII characters.
|
||||
The current programming layouts are: QWERTY, Dvorak and Colemak.
|
||||
|
||||
See for example, Dvorak, added in https://github.com/Julow/Unexpected-Keyboard/pull/16
|
||||
@@ -133,26 +145,42 @@ and other extra keys to show.
|
||||
|
||||
The list of language tags (generally two letters)
|
||||
and locales (generally of the form `xx_XX`)
|
||||
can be found in this stackoverflow answer: https://stackoverflow.com/a/7989085
|
||||
can be found in this [stackoverflow answer](https://stackoverflow.com/a/7989085)
|
||||
|
||||
### Translations
|
||||
### Updating translations
|
||||
|
||||
Translations are always welcome !
|
||||
The text used in the app is written in `res/values-<language_tag>/strings.xml`.
|
||||
|
||||
See for example: 1723288 (Latvian), baf867a (French).
|
||||
The app can be translated by writing `res/values-<language code>/strings.xml`
|
||||
(for example `values-fr`, `values-lv`), based on the default:
|
||||
`res/values/strings.xml` (English).
|
||||
The list of language tags can be found in this
|
||||
[stackoverflow answer](https://stackoverflow.com/a/7989085)
|
||||
|
||||
The first part before the `_` is used, for example,
|
||||
`res/values-fr/strings.xml` for French,
|
||||
`res/values-lv/strings.xml` for Latvian.
|
||||
|
||||
Commented-out lines indicate missing translations:
|
||||
|
||||
```xml
|
||||
<!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
|
||||
```
|
||||
|
||||
Remove the `<!--` and `-->` parts and change the text.
|
||||
|
||||
### Adding a translation
|
||||
|
||||
The `res/values-<language_tag>/strings.xml` file must be created by copying the
|
||||
default translation in `res/values/strings.xml`, which contain the structure of
|
||||
the file and the English strings.
|
||||
|
||||
To check that `strings.xml` is formatted correctly, run
|
||||
`python sync_translations.py`. This will modify your files.
|
||||
`./gradlew syncTranslations`. This will modify your files.
|
||||
|
||||
The store description is found in `metadata/android/<locale>/`,
|
||||
`short_description.txt` and `full_description.txt`.
|
||||
The short description must not exceed 80 characters.
|
||||
Translating changelogs is not useful.
|
||||
|
||||
The app name might be partially translated, the "unexpected" word should remain
|
||||
The app name might be partially translated, the "Unexpected" word should remain
|
||||
untranslated.
|
||||
|
||||
As translations need to be updated regularly, you can subscribe to this issue
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
# Configuration
|
||||
|
||||
PACKAGE_NAME = juloo.keyboard2
|
||||
|
||||
ANDROID_PLATFORM_VERSION = android-30
|
||||
JAVA_VERSION = 1.7
|
||||
|
||||
SRC_DIR = srcs
|
||||
RES_DIR = res
|
||||
|
||||
EXTRA_JARS =
|
||||
|
||||
# /
|
||||
|
||||
debug: _build/$(PACKAGE_NAME).debug.apk
|
||||
release: _build/$(PACKAGE_NAME).apk
|
||||
|
||||
installd: _build/$(PACKAGE_NAME).debug.apk
|
||||
adb install -r "$<"
|
||||
|
||||
clean:
|
||||
rm -rf _build/*.dex _build/class _build/gen _build/*.apk _build/*.unsigned-apk \
|
||||
_build/*.idsig _build/assets
|
||||
|
||||
rebuild_special_font: _build/special_font.ttf
|
||||
cp "$<" srcs/special_font/result.ttf
|
||||
|
||||
sync_translations:
|
||||
python sync_translations.py
|
||||
|
||||
check_layouts:
|
||||
python check_layout.py $(wildcard res/xml/*.xml) > check_layout.output
|
||||
|
||||
gen_layouts:
|
||||
python gen_layouts.py
|
||||
|
||||
# Will modify the source tree.
|
||||
runtest: rebuild_special_font sync_translations check_layouts gen_layouts
|
||||
|
||||
.PHONY: release debug installd clean rebuild_special_font check_layouts \
|
||||
sync_translations runtest gen_layouts
|
||||
|
||||
$(shell mkdir -p _build)
|
||||
|
||||
ifndef ANDROID_HOME
|
||||
$(error ANDROID_HOME not set)
|
||||
endif
|
||||
|
||||
ANDROID_BUILD_TOOLS = $(lastword $(sort $(wildcard $(ANDROID_HOME)/build-tools/*)))
|
||||
ANDROID_PLATFORM = $(ANDROID_HOME)/platforms/$(ANDROID_PLATFORM_VERSION)
|
||||
|
||||
ifeq ($(shell [ -d "$(ANDROID_PLATFORM)" ] && echo ok),)
|
||||
$(error Android platform not found. Want $(ANDROID_PLATFORM_VERSION), \
|
||||
found $(notdir $(wildcard $(ANDROID_HOME)/platforms/*)))
|
||||
endif
|
||||
|
||||
JAVAC_FLAGS = -source $(JAVA_VERSION) -target $(JAVA_VERSION) -encoding utf8
|
||||
|
||||
# Source files
|
||||
|
||||
MANIFEST_FILE = AndroidManifest.xml
|
||||
JAVA_FILES = $(shell find $(SRC_DIR) -name '*.java')
|
||||
RES_FILES = $(shell find $(RES_DIR) -type f)
|
||||
|
||||
# Debug signing
|
||||
|
||||
DEBUG_KEYSTORE = _build/debug.keystore
|
||||
DEBUG_PASSWD = debug0
|
||||
|
||||
$(DEBUG_KEYSTORE):
|
||||
echo y | keytool -genkeypair -dname "cn=d, ou=e, o=b, c=ug" \
|
||||
-alias debug -keypass $(DEBUG_PASSWD) -keystore "$@" \
|
||||
-keyalg rsa -storepass $(DEBUG_PASSWD) -validity 10000
|
||||
|
||||
_build/%.debug.apk: _build/%.debug.unsigned-apk $(DEBUG_KEYSTORE)
|
||||
$(ANDROID_BUILD_TOOLS)/apksigner sign --in "$<" --out "$@" \
|
||||
--ks $(DEBUG_KEYSTORE) --ks-key-alias debug --ks-pass "pass:$(DEBUG_PASSWD)"
|
||||
|
||||
# Debug apk
|
||||
|
||||
_build/$(PACKAGE_NAME).debug.unsigned-apk: AAPT_PACKAGE_FLAGS+=--rename-manifest-package $(PACKAGE_NAME).debug --product debug
|
||||
|
||||
# Release signing
|
||||
|
||||
# %-keystore.conf should declare KEYSTORE, KEYNAME and KEYSTOREPASS
|
||||
# it is interpreted as a shell script
|
||||
_build/%.apk: _build/%.unsigned-apk %-keystore.conf
|
||||
eval `cat $(word 2,$^)` && \
|
||||
$(ANDROID_BUILD_TOOLS)/apksigner sign --in "$<" --out "$@" \
|
||||
--ks "$$KEYSTORE" --ks-key-alias "$$KEYNAME" --ks-pass "pass:$$KEYSTOREPASS"
|
||||
|
||||
# Package
|
||||
|
||||
_build/%.unsigned-apk: _build/%.unaligned-apk
|
||||
$(ANDROID_BUILD_TOOLS)/zipalign -fp 4 "$<" "$@"
|
||||
|
||||
APK_EXTRA_FILES = classes.dex assets/special_font.ttf
|
||||
|
||||
_build/%.unaligned-apk: $(addprefix _build/,$(APK_EXTRA_FILES)) $(MANIFEST_FILE)
|
||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -M $(MANIFEST_FILE) -S $(RES_DIR) \
|
||||
-I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS)
|
||||
cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) $(APK_EXTRA_FILES)
|
||||
|
||||
# Copy the special font file into _build because aapt requires relative paths
|
||||
_build/assets/special_font.ttf: srcs/special_font/result.ttf
|
||||
mkdir -p $(@D)
|
||||
cp "$<" "$@"
|
||||
|
||||
# R.java
|
||||
|
||||
GEN_DIR = _build/gen
|
||||
R_FILE = $(GEN_DIR)/$(subst .,/,$(PACKAGE_NAME))/R.java
|
||||
|
||||
$(R_FILE): $(RES_FILES) $(MANIFEST_FILE)
|
||||
mkdir -p "$(@D)"
|
||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(RES_DIR) -J $(GEN_DIR) \
|
||||
-M $(MANIFEST_FILE) -I $(ANDROID_PLATFORM)/android.jar
|
||||
|
||||
# Compile java classes and build classes.dex
|
||||
|
||||
OBJ_DIR = _build/class
|
||||
# A$B.class files are ignored
|
||||
# CLASS_FILES = $(JAVA_FILES:$(SRC_DIR)/%.java=$(OBJ_DIR)/%.class) \
|
||||
# $(R_FILE:$(GEN_DIR)/%.java=$(OBJ_DIR)/%.class)
|
||||
|
||||
_build/classes.dex: $(JAVA_FILES) $(R_FILE)
|
||||
mkdir -p $(OBJ_DIR)
|
||||
javac -d $(OBJ_DIR) $(JAVAC_FLAGS) \
|
||||
-classpath $(ANDROID_PLATFORM)/android.jar:$(EXTRA_JARS) \
|
||||
-sourcepath $(SRC_DIR):$(GEN_DIR) \
|
||||
$^
|
||||
$(ANDROID_BUILD_TOOLS)/d8 --output $(@D) $(OBJ_DIR)/*/*/* $(subst :, ,$(EXTRA_JARS))
|
||||
|
||||
# Font file
|
||||
|
||||
FONT_GLYPHS = $(wildcard srcs/special_font/*.svg)
|
||||
|
||||
_build/special_font.ttf: srcs/special_font/build.pe $(FONT_GLYPHS)
|
||||
fontforge -lang=ff -script $< "$@" $(FONT_GLYPHS)
|
||||
@@ -9,9 +9,7 @@
|
||||
|
||||
Lightweight and privacy-conscious virtual keyboard for Android.
|
||||
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
|
||||
| --- | --- | --- |
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
|
||||
https://github.com/Julow/Unexpected-Keyboard/assets/2310568/28f8f6fe-ac13-46f3-8c5e-d62443e16d0d
|
||||
|
||||
The main feature is that you can type more characters by swiping the keys towards the corners.
|
||||
|
||||
@@ -20,6 +18,10 @@ Now perfect for everyday use.
|
||||
|
||||
This application contains no ads, doesn't make any network requests and is Open Source.
|
||||
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
|
||||
| --- | --- | --- |
|
||||
| <img src="/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
|
||||
|
||||
## Similar apps
|
||||
* [Calculator++](https://github.com/Bubu/android-calculatorpp) - Calculator with a similar UX, swipe to corners for advanced math symbols and operators. Works up to Android 13 but maybe unmaintained.
|
||||
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
plugins {
|
||||
id 'com.android.application' version '8.1.1'
|
||||
}
|
||||
|
||||
android {
|
||||
namespace 'juloo.keyboard2'
|
||||
compileSdk 33
|
||||
|
||||
defaultConfig {
|
||||
applicationId "juloo.keyboard2"
|
||||
minSdk 4
|
||||
targetSdkVersion 33
|
||||
versionCode 37
|
||||
versionName "1.25.0"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
manifest.srcFile 'AndroidManifest.xml'
|
||||
java.srcDirs = ['srcs']
|
||||
res.srcDirs = ['res', 'build/generated-resources']
|
||||
assets.srcDirs = ['assets']
|
||||
}
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
// Debug builds will always be signed. If no environment variables are set, a default
|
||||
// keystore will be initialized by the task initDebugKeystore and used. This keystore
|
||||
// can be uploaded to GitHub secrets by following instructions in CONTRIBUTING.md
|
||||
// in order to always receive correctly signed debug APKs from the CI.
|
||||
debug {
|
||||
storeFile(System.env.DEBUG_KEYSTORE ? file(System.env.DEBUG_KEYSTORE) : file("debug.keystore"))
|
||||
storePassword(System.env.DEBUG_KEYSTORE_PASSWORD ? "$System.env.DEBUG_KEYSTORE_PASSWORD" : "debug0")
|
||||
keyAlias(System.env.DEBUG_KEY_ALIAS ? "$System.env.DEBUG_KEY_ALIAS" : "debug")
|
||||
keyPassword(System.env.DEBUG_KEY_PASSWORD ? "$System.env.DEBUG_KEY_PASSWORD" : "debug0")
|
||||
}
|
||||
// Release builds will only be signed with a dedicated key if specified. This key has to be
|
||||
// created manually.
|
||||
release {
|
||||
if (System.env.RELEASE_KEYSTORE) {
|
||||
storeFile file(System.env.RELEASE_KEYSTORE)
|
||||
storePassword "$System.env.RELEASE_KEYSTORE_PASSWORD"
|
||||
keyAlias "$System.env.RELEASE_KEY_ALIAS"
|
||||
keyPassword "$System.env.RELEASE_KEY_PASSWORD"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled true
|
||||
shrinkResources true
|
||||
debuggable false
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
|
||||
resValue "string", "app_name", "@string/app_name_release"
|
||||
if (System.env.RELEASE_KEYSTORE) {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
debug {
|
||||
minifyEnabled false
|
||||
shrinkResources false
|
||||
debuggable true
|
||||
applicationIdSuffix ".debug"
|
||||
resValue "string", "app_name", "@string/app_name_debug"
|
||||
resValue "bool", "debug_logs", "true"
|
||||
signingConfig signingConfigs.debug
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
}
|
||||
|
||||
tasks.register('buildKeyboardFont') {
|
||||
println "\nBuilding assets/special_font.ttf"
|
||||
mkdir "$buildDir"
|
||||
exec {
|
||||
workingDir "$projectDir/srcs/special_font"
|
||||
def svgFiles = workingDir.listFiles().findAll {
|
||||
it.isFile() && it.name.endsWith(".svg")
|
||||
}
|
||||
commandLine("fontforge", "-lang=ff", "-script", "build.pe", "$buildDir/special_font.ttf", *svgFiles)
|
||||
}
|
||||
copy {
|
||||
from "$buildDir/special_font.ttf"
|
||||
into "assets"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType(Test).configureEach {
|
||||
dependsOn 'genLayoutsList'
|
||||
dependsOn 'checkKeyboardLayouts'
|
||||
dependsOn 'syncTranslations'
|
||||
}
|
||||
|
||||
tasks.register('genLayoutsList') {
|
||||
println "\nGenerating res/values/layouts.xml"
|
||||
exec {
|
||||
workingDir = projectDir
|
||||
commandLine "python", "gen_layouts.py"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('checkKeyboardLayouts') {
|
||||
println "\nChecking layouts"
|
||||
new ByteArrayOutputStream().withStream { bos ->
|
||||
exec {
|
||||
def layouts = new File(projectDir, "res/xml").listFiles().findAll {
|
||||
it.isFile() && it.name.endsWith(".xml")
|
||||
}
|
||||
workingDir = projectDir
|
||||
commandLine("python", "check_layout.py", *layouts)
|
||||
standardOutput = bos
|
||||
}
|
||||
|
||||
new File(projectDir, "check_layout.output").write(bos.toString())
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('syncTranslations') {
|
||||
println "\nUpdating translations"
|
||||
exec {
|
||||
workingDir = projectDir
|
||||
commandLine "python", "sync_translations.py"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("preBuild") {
|
||||
dependsOn += "initDebugKeystore"
|
||||
dependsOn += "copyRawQwertyUS"
|
||||
}
|
||||
|
||||
tasks.register('initDebugKeystore') {
|
||||
if (!file("debug.keystore").exists()) {
|
||||
println "Initializing default debug keystore"
|
||||
exec {
|
||||
// A shell script might be needed if this line requires input from the user
|
||||
commandLine "keytool", "-genkeypair", "-dname", "cn=d, ou=e, o=b, c=ug", "-alias", "debug", "-keypass", "debug0", "-keystore", "debug.keystore", "-keyalg", "rsa", "-storepass", "debug0", "-validity", "10000"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// latn_qwerty_us is used as a raw resource by the custom layout option.
|
||||
tasks.register('copyRawQwertyUS')
|
||||
{
|
||||
copy {
|
||||
from "res/xml/latn_qwerty_us.xml"
|
||||
into "build/generated-resources/raw"
|
||||
}
|
||||
}
|
||||
@@ -1,116 +1,122 @@
|
||||
# res/xml/arab_alt.xml
|
||||
# arab_alt
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# res/xml/arab_pc_ckb.xml
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', +, ,, ., :, ;, <, =, >, ?, `, |, ~
|
||||
1 warnings
|
||||
# res/xml/arab_pc_ir.xml
|
||||
Duplicate keys: (, )
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
|
||||
2 warnings
|
||||
# res/xml/arab_pc.xml
|
||||
# arab_pc
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||
1 warnings
|
||||
# res/xml/beng_national.xml
|
||||
# arab_pc_ckb
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', +, ,, ., :, ;, <, =, >, ?, `, |, ~
|
||||
1 warnings
|
||||
# arab_pc_hindu
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||
1 warnings
|
||||
# arab_pc_ir
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
|
||||
1 warnings
|
||||
# armenian_ph_am
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# beng_national
|
||||
Layout includes some ASCII punctuation but not all, missing: $
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
Layout doesn't specify a script.
|
||||
3 warnings
|
||||
# res/xml/beng_provat.xml
|
||||
2 warnings
|
||||
# beng_provat
|
||||
Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, }
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
Layout doesn't specify a script.
|
||||
3 warnings
|
||||
# res/xml/cyrl_jcuken_ru.xml
|
||||
2 warnings
|
||||
# cyrl_jcuken_ru
|
||||
0 warnings
|
||||
# res/xml/cyrl_jcuken_uk.xml
|
||||
# cyrl_jcuken_uk
|
||||
0 warnings
|
||||
# res/xml/cyrl_yaverti.xml
|
||||
# cyrl_ueishsht
|
||||
0 warnings
|
||||
# cyrl_yaverti
|
||||
Layout includes some ASCII punctuation but not all, missing: ~
|
||||
1 warnings
|
||||
# res/xml/deva_alt.xml
|
||||
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), *, +, ., /, :, <, =, >, @, [, \, ], ^, _, `, {, |, }, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
# deva_alt
|
||||
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
2 warnings
|
||||
# res/xml/deva_inscript.xml
|
||||
# deva_inscript
|
||||
Duplicate keys: , ।
|
||||
Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, |
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
3 warnings
|
||||
# res/xml/grek_qwerty.xml
|
||||
# grek_qwerty
|
||||
Duplicate keys: ;
|
||||
1 warnings
|
||||
# res/xml/hang_dubeolsik_kr.xml
|
||||
# hang_dubeolsik_kr
|
||||
0 warnings
|
||||
# res/xml/hebr_1_il.xml
|
||||
# hebr_1_il
|
||||
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
|
||||
1 warnings
|
||||
# res/xml/hebr_2_il.xml
|
||||
# hebr_2_il
|
||||
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
|
||||
1 warnings
|
||||
# res/xml/latn_azerty_fr.xml
|
||||
# latn_azerty_fr
|
||||
0 warnings
|
||||
# res/xml/latn_bepo_fr.xml
|
||||
# latn_bepo_fr
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# res/xml/latn_bone.xml
|
||||
# latn_bone
|
||||
Layout includes some ASCII punctuation but not all, missing: $
|
||||
Layout redefines the bottom row but some important keys are missing, missing: switch_backward
|
||||
2 warnings
|
||||
# res/xml/latn_colemak.xml
|
||||
# latn_colemak
|
||||
0 warnings
|
||||
# res/xml/latn_dvorak.xml
|
||||
# latn_dvorak
|
||||
0 warnings
|
||||
# res/xml/latn_neo2.xml
|
||||
Duplicate keys: -
|
||||
Layout redefines the bottom row but some important keys are missing, missing: switch_forward
|
||||
2 warnings
|
||||
# res/xml/latn_qwerty_br.xml
|
||||
# latn_neo2
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_es.xml
|
||||
# latn_qwerty_br
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_hu.xml
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_lv.xml
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_no.xml
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_pl.xml
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_ro.xml
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_se.xml
|
||||
Duplicate keys: !, ', ,, -, ., ?
|
||||
1 warnings
|
||||
# res/xml/latn_qwerty_tr.xml
|
||||
# latn_qwerty_cz
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# res/xml/latn_qwerty_us.xml
|
||||
# latn_qwerty_es
|
||||
0 warnings
|
||||
# res/xml/latn_qwerty_vi.xml
|
||||
# latn_qwerty_hu
|
||||
0 warnings
|
||||
# latn_qwerty_lv
|
||||
0 warnings
|
||||
# latn_qwerty_no
|
||||
0 warnings
|
||||
# latn_qwerty_pl
|
||||
0 warnings
|
||||
# latn_qwerty_ro
|
||||
0 warnings
|
||||
# latn_qwerty_se
|
||||
Duplicate keys: !, ', ,, -, ., ?
|
||||
1 warnings
|
||||
# latn_qwerty_tr
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwerty_us
|
||||
0 warnings
|
||||
# latn_qwerty_vi
|
||||
Layout includes some ASCII punctuation but not all, missing: \
|
||||
1 warnings
|
||||
# res/xml/latn_qwertz_cz_multifunctional.xml
|
||||
# latn_qwertz
|
||||
0 warnings
|
||||
# latn_qwertz_cz
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwertz_cz_multifunctional
|
||||
Layout includes some ASCII punctuation but not all, missing: `
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# res/xml/latn_qwertz_cz.xml
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# res/xml/latn_qwertz_de.xml
|
||||
# latn_qwertz_de
|
||||
0 warnings
|
||||
# res/xml/latn_qwertz_fr_ch.xml
|
||||
# latn_qwertz_fr_ch
|
||||
0 warnings
|
||||
# res/xml/latn_qwertz_hu.xml
|
||||
# latn_qwertz_hu
|
||||
0 warnings
|
||||
# res/xml/latn_qwertz_sk.xml
|
||||
# latn_qwertz_sk
|
||||
Layout includes some ASCII punctuation but not all, missing: \, `
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# res/xml/latn_qwertz.xml
|
||||
0 warnings
|
||||
# res/xml/urdu_phonetic_ur.xml
|
||||
# urdu_phonetic_ur
|
||||
Duplicate keys:
|
||||
Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import xml.etree.ElementTree as ET
|
||||
import sys
|
||||
import sys, os
|
||||
|
||||
warning_count = 0
|
||||
|
||||
KNOWN_NOT_LAYOUT = set([
|
||||
"res/xml/number_row.xml", "res/xml/numpad.xml", "res/xml/pin.xml",
|
||||
"res/xml/bottom_row.xml", "res/xml/settings.xml", "res/xml/method.xml",
|
||||
"res/xml/greekmath.xml", "res/xml/numeric.xml" ])
|
||||
"number_row", "numpad", "pin",
|
||||
"bottom_row", "settings", "method",
|
||||
"greekmath", "numeric", "emoji_bottom_row" ])
|
||||
|
||||
def warn(msg):
|
||||
global warning_count
|
||||
@@ -60,8 +60,7 @@ def check_layout(layout):
|
||||
"Layout doesn't define some important keys")
|
||||
unexpected_keys(keys,
|
||||
["copy", "paste", "cut", "selectAll", "shareText",
|
||||
"pasteAsPlainText", "undo", "redo", "replaceText",
|
||||
"textAssist", "autofill" ],
|
||||
"pasteAsPlainText", "undo", "redo" ],
|
||||
"Layout contains editing keys")
|
||||
unexpected_keys(keys,
|
||||
[ "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
|
||||
@@ -84,14 +83,15 @@ def check_layout(layout):
|
||||
if root.get("script") == None:
|
||||
warn("Layout doesn't specify a script.")
|
||||
|
||||
for fname in sys.argv[1:]:
|
||||
if fname in KNOWN_NOT_LAYOUT:
|
||||
for fname in sorted(sys.argv[1:]):
|
||||
layout_id, _ = os.path.splitext(os.path.basename(fname))
|
||||
if layout_id in KNOWN_NOT_LAYOUT:
|
||||
continue
|
||||
layout = parse_layout(fname)
|
||||
if layout == None:
|
||||
print("Not a layout file: %s" % fname)
|
||||
print("Not a layout file: %s" % layout_id)
|
||||
else:
|
||||
print("# %s" % fname)
|
||||
print("# %s" % layout_id)
|
||||
warning_count = 0
|
||||
check_layout(layout)
|
||||
print("%d warnings" % warning_count)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
org.gradle.jvmargs=-Dfile.encoding=UTF-8
|
||||
android.useAndroidX=false
|
||||
android.nonTransitiveRClass=true
|
||||
@@ -0,0 +1,6 @@
|
||||
#Mon Aug 21 18:13:41 CEST 2023
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=`save "$@"`
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
@@ -0,0 +1,89 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@@ -0,0 +1,8 @@
|
||||
Improved custom layout option.
|
||||
Allow selecting voice typing app with a long press.
|
||||
The numpad can work with other numeral systems.
|
||||
New and updated layouts.
|
||||
New themes.
|
||||
Many small improvements.
|
||||
|
||||
Thanks to the contributors: @pharook, @syskill, @ojas-bhagavath, @lrvideckis, @lyubomirv, @matthiakl, @deftkHD, @V6lhost, @RZHSSNZDH, @RetrogisusDEV, @rafasaurus, @krtsgnr7230, @eandersons, @ChasmSolacer, @Validbit, @polyctena
|
||||
@@ -0,0 +1 @@
|
||||
https://www.youtube.com/watch?v=rwGvWesPFX8
|
||||
@@ -0,0 +1,6 @@
|
||||
Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.
|
||||
|
||||
Bu uygulama aslında Termux kullanıcıları için geliştirildi.
|
||||
Artık gündelik kullanım için de uygun.
|
||||
|
||||
Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz.
|
||||
@@ -0,0 +1 @@
|
||||
Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması.
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#ff101010"/>
|
||||
</shape>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="1100.0dip" android:width="1100.0dip" android:viewportWidth="1100.0" android:viewportHeight="1100.0">
|
||||
<path android:fillColor="#fc2a2a2a" android:pathData="M549.19,211.58L838.49,211.58A66.72 66.72 0 0 1 905.21,278.30L905.21,731.23A66.72 66.72 0 0 1 838.49,797.95L549.19,797.95A66.72 66.72 0 0 1 482.47,731.23L482.47,278.30A66.72 66.72 0 0 1 549.19,211.58zM38.60,272.97L38.60,725.90A66.72 66.72 0 0 0 105.32,792.62L394.62,792.62A66.72 66.72 0 0 0 461.34,725.90L461.34,272.97A66.72 66.72 0 0 0 394.62,206.25L105.32,206.25A66.72 66.72 0 0 0 38.60,272.97z" android:strokeLineCap="round" android:strokeLineJoin="round" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#ffffffff" android:pathData="M662.14,510.10L662.14,648.69" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="square" android:strokeLineJoin="miter" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M662.14,531.42C778.39,456.79,778.39,659.35,662.14,595.39" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="miter" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M852.37,264.89C869.88,264.89,884.07,286.37,884.07,312.86C884.07,339.36,869.88,360.84,852.37,360.84C834.86,360.84,820.66,339.36,820.66,312.86C820.66,286.37,834.86,264.89,852.37,264.89z" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="miter" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M514.18,659.35Q545.88,712.66,514.18,776.63" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="miter" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M254.75,520.69C281.29,520.69,302.81,542.19,302.81,568.70C302.81,595.21,281.29,616.71,254.75,616.71C228.21,616.71,206.69,595.21,206.69,568.70C206.69,542.19,228.21,520.69,254.75,520.69z" android:strokeColor="#fffdfdfd" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="miter" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M403.36,265.80C417.87,265.80,429.63,277.53,429.63,292.00C429.63,306.46,417.87,318.19,403.36,318.19C388.86,318.19,377.09,306.46,377.09,292.00C377.09,277.53,388.86,265.80,403.36,265.80z" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="miter" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#fc2a2a2a" android:pathData="M337.82,845.92L627.12,845.92A66.72 66.72 0 0 1 693.84,912.64L693.84,1365.58A66.72 66.72 0 0 1 627.12,1432.29L337.82,1432.29A66.72 66.72 0 0 1 271.11,1365.58L271.11,912.64A66.72 66.72 0 0 1 337.82,845.92zM-183.33,901.98L-183.33,1354.91A66.72 66.72 0 0 0 -116.62,1421.63L172.69,1421.63A66.72 66.72 0 0 0 239.40,1354.91L239.40,901.98A66.72 66.72 0 0 0 172.69,835.26L-116.62,835.26A66.72 66.72 0 0 0 -183.33,901.98zM-183.33,901.98L-183.33,1354.91A66.72 66.72 0 0 0 -116.62,1421.63L172.69,1421.63A66.72 66.72 0 0 0 239.40,1354.91L239.40,901.98A66.72 66.72 0 0 0 172.69,835.26L-116.62,835.26A66.72 66.72 0 0 0 -183.33,901.98z" android:strokeLineCap="round" android:strokeLineJoin="round" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M397.93,360.84L429.63,296.87" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="round" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M651.57,883.24L651.57,968.53" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="round" android:fillType="nonZero"/>
|
||||
<path android:fillColor="#00ffffff" android:pathData="M197.13,883.24Q207.70,883.24,207.70,893.90L207.70,936.54Q218.26,947.21,207.70,957.87L207.70,968.53" android:strokeColor="#ffffffff" android:strokeWidth="20.380417" android:strokeLineCap="round" android:strokeLineJoin="round" android:fillType="nonZero"/>
|
||||
</vector>
|
||||
@@ -3,9 +3,6 @@
|
||||
<juloo.keyboard2.EmojiGroupButtonsBar android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
||||
<juloo.keyboard2.EmojiGridView android:id="@+id/emoji_grid" android:layout_width="fill_parent" android:layout_height="@dimen/emoji_grid_height" android:orientation="vertical" android:numColumns="auto_fit" android:columnWidth="45sp" android:background="?attr/colorKeyboard"/>
|
||||
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<juloo.keyboard2.EmojiKeyButton style="@style/emojiKeyButton" key="switch_back_emoji"/>
|
||||
<juloo.keyboard2.EmojiKeyButton style="@style/emojiKeyButton" android:layout_weight="4" key="space"/>
|
||||
<juloo.keyboard2.EmojiKeyButton style="@style/emojiKeyButton" key="backspace"/>
|
||||
<juloo.keyboard2.EmojiKeyButton style="@style/emojiKeyButton" key="enter"/>
|
||||
<juloo.keyboard2.EmojiBottomRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/emoji_key_bg"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_description"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imesettings" android:onClick="launch_imesettings" android:layout_width="wrap_content"/>
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_sourcecode"/>
|
||||
<TextView style="@style/paragraph" android:text="https://github.com/Julow/Unexpected-Keyboard" android:autoLink="web" android:linksClickable="true"/>
|
||||
<TextView android:id="@+id/launcher_tryhere_text" style="@style/paragraph" android:text="@string/launcher_tryhere"/>
|
||||
<EditText android:id="@+id/launcher_tryhere_area" style="@style/paragraph" android:inputType="text"/>
|
||||
</LinearLayout>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true">
|
||||
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_description"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imesettings" android:onClick="launch_imesettings" android:layout_width="wrap_content"/>
|
||||
<Button style="@style/paragraph" android:text="@string/launcher_button_imepicker" android:onClick="launch_imepicker" android:layout_width="wrap_content"/>
|
||||
<VideoView android:id="@+id/launcher_intro_video" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center"/>
|
||||
<TextView android:id="@+id/launcher_tryhere_text" style="@style/paragraph" android:text="@string/launcher_tryhere"/>
|
||||
<EditText android:id="@+id/launcher_tryhere_area" style="@style/paragraph" android:inputType="text"/>
|
||||
<TextView style="@style/paragraph" android:text="@string/launcher_sourcecode"/>
|
||||
<TextView style="@style/paragraph" android:text="https://github.com/Julow/Unexpected-Keyboard" android:autoLink="web" android:linksClickable="true"/>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Klávesnice Unexpected (pro ladění)</string>
|
||||
<string name="app_name" product="default">Klávesnice Unexpected</string>
|
||||
<string name="app_name_release">Klávesnice Unexpected</string>
|
||||
<string name="app_name_debug">Klávesnice Unexpected (pro ladění)</string>
|
||||
<string name="settings_activity_label">Nastavení Klávesnice Unexpected</string>
|
||||
<string name="pref_portrait">V režimu na výšku</string>
|
||||
<string name="pref_landscape">V režimu na šířku</string>
|
||||
@@ -14,8 +14,8 @@
|
||||
<string name="pref_layout_e_custom">Vlastní rozvržení</string>
|
||||
<string name="pref_layouts_add">Přidat alternativní rozložení</string>
|
||||
<string name="pref_layouts_item">Rozložení %1$d: %2$s</string>
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_custom_layout_title">Vlastní rozvržení</string>
|
||||
<string name="pref_layouts_remove_custom">Odebrat rozložení</string>
|
||||
<string name="pref_custom_layout_title">Vlastní rozložení</string>
|
||||
<string name="pref_show_numpad_title">Zobrazit NumPad</string>
|
||||
<string name="pref_show_numpad_never">Nikdy</string>
|
||||
<string name="pref_show_numpad_landscape">Pouze v režimu na šířku</string>
|
||||
@@ -36,7 +36,7 @@
|
||||
<string name="pref_long_timeout_title">Časová prodleva opakování znaků</string>
|
||||
<string name="pref_long_interval_title">Interval opakování znaků</string>
|
||||
<string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string>
|
||||
<string name="pref_lock_double_tap_summary">Dvojklik namísto držení modifikačních kláves po nějakou dobu</string>
|
||||
<string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podržení</string>
|
||||
<string name="pref_category_behavior">Chování</string>
|
||||
<string name="pref_autocapitalisation_title">Automatická kapitalizace</string>
|
||||
<string name="pref_autocapitalisation_summary">Stiskne Shift na začátku věty</string>
|
||||
@@ -45,7 +45,7 @@
|
||||
<string name="pref_vibrate_title">Vibrace</string>
|
||||
<string name="pref_vibrate_summary">Preference intenzity vibrací při stisku klávesy</string>
|
||||
<string name="pref_pin_entry_enabled_title">Rozvržení zadávání PIN kódu</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Při psaní čísel, datumů a telefonních čísel</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Automaticky při psaní čísel, datumů a telefonních čísel</string>
|
||||
<string name="pref_category_style">Styl</string>
|
||||
<string name="pref_margin_bottom_title">Spodní odsazení</string>
|
||||
<string name="pref_keyboard_height_title">Výška klávesnice</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Černý (alternativní)</string>
|
||||
<string name="pref_theme_e_white">Bílý</string>
|
||||
<string name="pref_theme_e_epaper">ePapír</string>
|
||||
<string name="pref_theme_e_desert">Poušťě</string>
|
||||
<string name="pref_theme_e_jungle">Džungle</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
|
||||
<string name="pref_swipe_dist_e_short">Krátká</string>
|
||||
<string name="pref_swipe_dist_e_default">Běžná</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Hledat</string>
|
||||
<string name="key_action_send">Odeslat</string>
|
||||
<string name="launcher_button_imesettings">Aktivovat klávesnici</string>
|
||||
<string name="launcher_button_imepicker">Vybrat klávesnici</string>
|
||||
<string name="launcher_description">Tato aplikace je pouhou virtuální klávesnicí. Přejděte do systémového nastavení, kliknutím na tlačítko níže a aktivujte ji.</string>
|
||||
<string name="launcher_sourcecode">Toto je volná, open-source aplikace. Její zdrojový kód, či hlášení chyb, naleznete na Githubu.</string>
|
||||
<string name="launcher_tryhere">Po aktivaci můžete klávesnici rovnou vyzkoušet zde:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<string name="key_descr_pasteAsPlainText">Vložit jako prostý text</string>
|
||||
<string name="key_descr_undo">Zpět</string>
|
||||
<string name="key_descr_redo">Znovu</string>
|
||||
<string name="key_descr_replaceText">Nahradit</string>
|
||||
<string name="key_descr_textAssist">Asistovat</string>
|
||||
<string name="key_descr_autofill">Předvyplnit</string>
|
||||
<string name="key_descr_ª">Indikátor řadové číslovky</string>
|
||||
<string name="key_descr_º">Indikátor řadové číslovky</string>
|
||||
<string name="key_descr_superscript">Horní index</string>
|
||||
<string name="key_descr_subscript">Dolní index</string>
|
||||
<string name="key_descr_page_up">Page Up</string>
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="pref_category_advanced">Pokročilé</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (Debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string>
|
||||
<string name="pref_portrait">Im Hochformatmodus</string>
|
||||
<string name="pref_landscape">Im Querformatmodus</string>
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="pref_layout_e_custom">Eigenes Layout</string>
|
||||
<string name="pref_layouts_add">Alternatives Layout hinzufügen</string>
|
||||
<string name="pref_layouts_item">Layout %1$d: %2$s</string>
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_layouts_remove_custom">Layout entfernen</string>
|
||||
<string name="pref_custom_layout_title">Eigenes Layout</string>
|
||||
<string name="pref_show_numpad_title">Ziffernblock anzeigen</string>
|
||||
<string name="pref_show_numpad_never">Nie</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Alternatives Schwarz</string>
|
||||
<string name="pref_theme_e_white">Weiß</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Wüste</string>
|
||||
<string name="pref_theme_e_jungle">Dschungel</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
|
||||
<string name="pref_swipe_dist_e_short">Kurz</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Suchen</string>
|
||||
<string name="key_action_send">Senden</string>
|
||||
<string name="launcher_button_imesettings">Tastatur aktivieren</string>
|
||||
<string name="launcher_button_imepicker">Tastatur auswählen</string>
|
||||
<string name="launcher_description">Diese App ist eine virtuelle Tastatur. Tippe auf den Button unten und aktivere Unexpected Keyboard in den Systemeinstellungen.</string>
|
||||
<string name="launcher_sourcecode">Dies ist eine freie und quelloffene App. Du findest den Quellcode auf Github. Dort können auch Bugs gemeldet werden.</string>
|
||||
<string name="launcher_tryhere">Nach Aktivierung kannst du die Tastatur hier ausprobieren:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<string name="key_descr_pasteAsPlainText">Unformatiert einfügen</string>
|
||||
<string name="key_descr_undo">Rückgängig</string>
|
||||
<string name="key_descr_redo">Wiederholen</string>
|
||||
<string name="key_descr_replaceText">Ersetzen</string>
|
||||
<string name="key_descr_textAssist">Assistieren</string>
|
||||
<string name="key_descr_autofill">Automatische Vervollständigung</string>
|
||||
<string name="key_descr_ª">Ordinalzeichen</string>
|
||||
<string name="key_descr_º">Ordinalzeichen</string>
|
||||
<string name="key_descr_superscript">Hochgestellt</string>
|
||||
<string name="key_descr_subscript">Tiefgestellt</string>
|
||||
<string name="key_descr_page_up">Bild auf</string>
|
||||
<string name="key_descr_page_down">Bild ab</string>
|
||||
<string name="key_descr_home">Pos1</string>
|
||||
<string name="key_descr_end">Ende</string>
|
||||
<string name="pref_category_advanced">Erweitert</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="settings_activity_label">Ajustes de Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">En modo retrato</string>
|
||||
<string name="pref_landscape">En modo paisaje</string>
|
||||
<string name="pref_category_layout">Formato</string>
|
||||
<string name="pref_portrait">En modo vertical</string>
|
||||
<string name="pref_landscape">En modo horizontal</string>
|
||||
<string name="pref_category_layout">Distribución</string>
|
||||
<string name="pref_label_brightness">Ajustar brillo de etiqueta</string>
|
||||
<string name="pref_keyboard_opacity">Ajustar opacidad del fondo del teclado</string>
|
||||
<string name="pref_key_opacity">Ajustar opacidad de teclas</string>
|
||||
<string name="pref_key_activated_opacity">Ajustar opacidad de teclas apretadas</string>
|
||||
<string name="pref_layout_e_system">Ajustes del sistema</string>
|
||||
<string name="pref_layout_e_custom">Formato personalizado</string>
|
||||
<!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
|
||||
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_custom_layout_title">Formato personalizado</string>
|
||||
<string name="pref_show_numpad_title">Mostrar pad numérico</string>
|
||||
<string name="pref_key_activated_opacity">Ajustar opacidad de teclas presionadas</string>
|
||||
<string name="pref_layout_e_system">Igual al sistema</string>
|
||||
<string name="pref_layout_e_custom">Diseño personalizado</string>
|
||||
<string name="pref_layouts_add">Añadir distribución alterna</string>
|
||||
<string name="pref_layouts_item">Diseño %1$d: %2$s</string>
|
||||
<string name="pref_layouts_remove_custom">Quitar diseño</string>
|
||||
<string name="pref_custom_layout_title">Diseño personalizado</string>
|
||||
<string name="pref_show_numpad_title">Mostrar teclado numérico</string>
|
||||
<string name="pref_show_numpad_never">Nunca</string>
|
||||
<string name="pref_show_numpad_landscape">Solo en modo paisaje</string>
|
||||
<string name="pref_show_numpad_landscape">Solo en modo horizontal</string>
|
||||
<string name="pref_show_numpad_always">Siempre</string>
|
||||
<string name="pref_number_row_title">Mostrar fila númerica</string>
|
||||
<string name="pref_number_row_summary">Agrega una fila de numeros en la cima del teclado mientras el pad numérico esté oculto</string>
|
||||
<string name="pref_numpad_layout">Formato del pad numérico</string>
|
||||
<string name="pref_number_row_title">Mostrar fila de números</string>
|
||||
<string name="pref_number_row_summary">Agrega la fila numérica a la parte superior del teclado si el teclado numérico está oculto</string>
|
||||
<string name="pref_numpad_layout">Diseño del teclado numérico</string>
|
||||
<string name="pref_numpad_layout_e_high_first">Dígitos descendientes</string>
|
||||
<string name="pref_numpad_layout_e_low_first">Dígitos ascendientes</string>
|
||||
<string name="pref_extra_keys_title">Agregar teclas</string>
|
||||
@@ -31,44 +31,46 @@
|
||||
<string name="pref_second_layout_title">Formato secundario</string>
|
||||
<string name="pref_second_layout_none">Ninguno</string>
|
||||
<string name="pref_category_typing">Escritura</string>
|
||||
<string name="pref_swipe_dist_title">Distancia para deslizar</string>
|
||||
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las letras (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tiempo de espera de repetición de tecla</string>
|
||||
<string name="pref_swipe_dist_title">Distancia de deslizamiento</string>
|
||||
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tiempo de espera para repetir tecla</string>
|
||||
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
|
||||
<string name="pref_lock_double_tap_title">Doble toque al Shift para bloquear las mayúsculas</string>
|
||||
<string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo apretado</string>
|
||||
<string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string>
|
||||
<string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string>
|
||||
<string name="pref_category_behavior">Comportamiento</string>
|
||||
<string name="pref_autocapitalisation_title">Capitalización automática</string>
|
||||
<string name="pref_autocapitalisation_summary">Apretar Shift al principio de una oración</string>
|
||||
<string name="pref_autocapitalisation_title">Mayúsculas automáticas</string>
|
||||
<string name="pref_autocapitalisation_summary">Presionar Mayús al principio de una oración</string>
|
||||
<string name="pref_switch_input_immediate_title">Cambiar al último teclado usado</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportamiento de la tecla para cambiar formatos</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportamiento de la tecla para cambiar diseño</string>
|
||||
<string name="pref_vibrate_title">Vibración</string>
|
||||
<string name="pref_vibrate_summary">Habilitar/deshabilitar vibración al presionar una tecla</string>
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Diseño de introducción de PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Para escribir cifras, fechas y números telefónicos</string>
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
<string name="pref_margin_bottom_title">Margen del pie</string>
|
||||
<string name="pref_margin_bottom_title">Margen inferior</string>
|
||||
<string name="pref_keyboard_height_title">Altura del teclado</string>
|
||||
<string name="pref_horizontal_margin_title">Margen horizontal</string>
|
||||
<string name="pref_character_size_title">Tamaño de etiqueta</string>
|
||||
<string name="pref_character_size_summary">Tamaño de caracteres mostrados en el teclado (%.2fx)</string>
|
||||
<string name="pref_theme">Tema</string>
|
||||
<string name="pref_theme_e_system">Ajustes de sistema</string>
|
||||
<string name="pref_theme_e_system">Igual al sistema</string>
|
||||
<string name="pref_theme_e_dark">Oscuro</string>
|
||||
<string name="pref_theme_e_light">Claro</string>
|
||||
<string name="pref_theme_e_black">Negro</string>
|
||||
<string name="pref_theme_e_altblack">Negro Alternativo</string>
|
||||
<string name="pref_theme_e_white">Blanco</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Muy corta</string>
|
||||
<string name="pref_swipe_dist_e_short">Corta</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
<string name="pref_swipe_dist_e_far">Lejana</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Muy lejana</string>
|
||||
<string name="pref_swipe_dist_e_far">Larga</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Muy larga</string>
|
||||
<string name="pref_key_horizontal_space">Espaciado horizontal entre las teclas</string>
|
||||
<string name="pref_key_vertical_space">Espaciado vertical entre las teclas</string>
|
||||
<string name="pref_vibration_e_disabled">Deshabilitada</string>
|
||||
<string name="pref_vibration_e_system">Sistema</string>
|
||||
<string name="pref_vibration_e_system">Igual al sistema</string>
|
||||
<string name="pref_vibration_e_strong">Fuerte</string>
|
||||
<string name="pref_vibration_e_medium">Media</string>
|
||||
<string name="pref_vibration_e_light">Suave</string>
|
||||
@@ -79,26 +81,28 @@
|
||||
<string name="key_action_search">Buscar</string>
|
||||
<string name="key_action_send">Enviar</string>
|
||||
<string name="launcher_button_imesettings">Habilitar teclado</string>
|
||||
<string name="launcher_description">Esta aplicación es un teclado virtual. Apretar el botón de abajo te facilitará habilitarlo.</string>
|
||||
<string name="launcher_sourcecode">Esta es una aplicación gratuita, libre y de fuente abierta. EL código fuente se puede encontrar también para reportar errores en Github.</string>
|
||||
<string name="launcher_tryhere">Tras habilitar, debajo se puede probar el teclado:</string>
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
<!-- <string name="key_descr_cut">Cut</string> -->
|
||||
<!-- <string name="key_descr_selectAll">Select all</string> -->
|
||||
<!-- <string name="key_descr_shareText">Share text</string> -->
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">Esta aplicación es un teclado virtual. Presiona el botón de abajo para ir a Ajustes y habilitar Unexpected Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Esta es una aplicación gratuita, libre y de código abierto. Puedes encontrar el código fuente o reportar errores en Github.</string>
|
||||
<string name="launcher_tryhere">Tras habilitarlo, puedes probar el teclado en este campo:</string>
|
||||
<string name="key_descr_capslock">Bloq Mayús</string>
|
||||
<string name="key_descr_switch_greekmath">Símb. griegos y matemáticos</string>
|
||||
<string name="key_descr_voice_typing">Dictado por voz</string>
|
||||
<string name="key_descr_copy">Copiar</string>
|
||||
<string name="key_descr_paste">Pegar</string>
|
||||
<string name="key_descr_cut">Cortar</string>
|
||||
<string name="key_descr_selectAll">Seleccionar todo</string>
|
||||
<string name="key_descr_shareText">Compartir texto</string>
|
||||
<string name="key_descr_pasteAsPlainText">Pegar como texto sin formato</string>
|
||||
<string name="key_descr_undo">Deshacer</string>
|
||||
<string name="key_descr_redo">Rehacer</string>
|
||||
<string name="key_descr_ª">Indicador de ordinal</string>
|
||||
<string name="key_descr_º">Indicador de ordinal</string>
|
||||
<string name="key_descr_superscript">Superíndice</string>
|
||||
<string name="key_descr_subscript">Subíndice</string>
|
||||
<string name="key_descr_page_up">Av Pág</string>
|
||||
<string name="key_descr_page_down">Re Pág</string>
|
||||
<string name="key_descr_home">Inicio</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="pref_category_advanced">Avanzado</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">صفحه کلید غیرمنتظره</string>
|
||||
<string name="app_name" product="default">صفحه کلید غیرمنتظره</string>
|
||||
<string name="app_name_release">صفحه کلید غیرمنتظره</string>
|
||||
<string name="app_name_debug">صفحه کلید غیرمنتظره</string>
|
||||
<string name="settings_activity_label">تنظیمات صفحه کلید غیرمنتظره</string>
|
||||
<string name="pref_portrait">در حالت عمودی</string>
|
||||
<string name="pref_landscape">در حالت افقی</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">سیاه مشابه</string>
|
||||
<string name="pref_theme_e_white">سفید</string>
|
||||
<string name="pref_theme_e_epaper">ای-پیپر</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string>
|
||||
<string name="pref_swipe_dist_e_short">کوتاه</string>
|
||||
<string name="pref_swipe_dist_e_default">عادی</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">جستجو</string>
|
||||
<string name="key_action_send">ارسال</string>
|
||||
<string name="launcher_button_imesettings">فعال کردن صفحه کلید</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">این برنامه یک صفحه کلید مجازی است. با کلیک روی گزینه زیر به تنظیمات سامانه بروید و صفحه کلید غیرمنتظره را فعال کنید.</string>
|
||||
<string name="launcher_sourcecode">این یک برنامه متن باز و آزاد است. شما میتوانید کد منبع را در گیتهاب پیدا کرده و نیز باگها را گزارش کنید.</string>
|
||||
<string name="launcher_tryhere">بعد از فعالسازی، صفحه کلید را اینجا امتحان کنید:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">پیشرفته</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Paramètres</string>
|
||||
<string name="pref_portrait">En mode portrait</string>
|
||||
<string name="pref_landscape">En mode landscape</string>
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="pref_layout_e_custom">Disposition personnalisée</string>
|
||||
<string name="pref_layouts_add">Ajouter un clavier alternatif</string>
|
||||
<string name="pref_layouts_item">Disposition %1$d: %2$s</string>
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_layouts_remove_custom">Supprimer</string>
|
||||
<string name="pref_custom_layout_title">Disposition personnalisée</string>
|
||||
<string name="pref_show_numpad_title">Afficher le pavé numérique</string>
|
||||
<string name="pref_show_numpad_never">Jamais</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Noir 2</string>
|
||||
<string name="pref_theme_e_white">Blanc</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Desert</string>
|
||||
<string name="pref_theme_e_jungle">Jungle</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Très courte</string>
|
||||
<string name="pref_swipe_dist_e_short">Courte</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@@ -79,26 +81,28 @@
|
||||
<string name="key_action_search">Chercher</string>
|
||||
<string name="key_action_send">Envoyer</string>
|
||||
<string name="launcher_button_imesettings">Activer le clavier</string>
|
||||
<string name="launcher_button_imepicker">Selectionner le keyboard</string>
|
||||
<string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string>
|
||||
<string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string>
|
||||
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
|
||||
<string name="key_descr_capslock">Verrouillage majuscules</string>
|
||||
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
|
||||
<string name="key_descr_voice_typing">Saisie vocale</string>
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
<!-- <string name="key_descr_cut">Cut</string> -->
|
||||
<!-- <string name="key_descr_selectAll">Select all</string> -->
|
||||
<!-- <string name="key_descr_shareText">Share text</string> -->
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<string name="key_descr_copy">Copier</string>
|
||||
<string name="key_descr_paste">Coller</string>
|
||||
<string name="key_descr_cut">Couper</string>
|
||||
<string name="key_descr_selectAll">Sel. tout</string>
|
||||
<string name="key_descr_shareText">Partager</string>
|
||||
<string name="key_descr_pasteAsPlainText">Copier en texte brut</string>
|
||||
<string name="key_descr_undo">Undo</string>
|
||||
<string name="key_descr_redo">Redo</string>
|
||||
<string name="key_descr_ª">Ordinal</string>
|
||||
<string name="key_descr_º">Ordinal</string>
|
||||
<string name="key_descr_superscript">Exposant</string>
|
||||
<string name="key_descr_subscript">Souscrit</string>
|
||||
<string name="key_descr_page_up">Page précédente</string>
|
||||
<string name="key_descr_page_down">Page suivante</string>
|
||||
<string name="key_descr_home">Début</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="pref_category_advanced">Avancé</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="settings_activity_label">Impostazioni di Unexpected Keyboard</string>
|
||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||
@@ -60,6 +60,8 @@
|
||||
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
|
||||
<!-- <string name="pref_theme_e_white">White</string> -->
|
||||
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Veramente breve</string>
|
||||
<string name="pref_swipe_dist_e_short">Breve</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Cerca</string>
|
||||
<string name="key_action_send">Invia</string>
|
||||
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
|
||||
<!-- <string name="launcher_sourcecode">This is an free and open source application. You can find the source code or report bugs on Github.</string> -->
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- <string name="app_name" product="debug">Unexpected Keyboard (debug)</string> -->
|
||||
<!-- <string name="app_name" product="default">Unexpected Keyboard</string> -->
|
||||
<!-- <string name="app_name_release">Unexpected Keyboard</string> -->
|
||||
<!-- <string name="app_name_debug">Unexpected Keyboard (Debug)</string> -->
|
||||
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
|
||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||
@@ -60,6 +60,8 @@
|
||||
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
|
||||
<!-- <string name="pref_theme_e_white">White</string> -->
|
||||
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">매우 짧음</string>
|
||||
<string name="pref_swipe_dist_e_short">짧음</string>
|
||||
<string name="pref_swipe_dist_e_default">보통</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">검색</string>
|
||||
<string name="key_action_send">보내기</string>
|
||||
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
|
||||
<!-- <string name="launcher_sourcecode">This is an free and open source application. You can find the source code or report bugs on Github.</string> -->
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (atkļūdošana)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (atkļūdošana)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
|
||||
<string name="pref_portrait">Stateniski</string>
|
||||
<string name="pref_landscape">Guleniski</string>
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="pref_layout_e_custom">Pielāgots izkārtojums</string>
|
||||
<string name="pref_layouts_add">Pievienot aizstājējizkārtojumu</string>
|
||||
<string name="pref_layouts_item">Izkārtojums %1$d: %2$s</string>
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_layouts_remove_custom">Noņemt izkārtojumu</string>
|
||||
<string name="pref_custom_layout_title">Pielāgots izkārtojums</string>
|
||||
<string name="pref_show_numpad_title">Rādīt ciparnīcu</string>
|
||||
<string name="pref_show_numpad_never">Nekad</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Citādi melns</string>
|
||||
<string name="pref_theme_e_white">Balts</string>
|
||||
<string name="pref_theme_e_epaper">ePapīrs</string>
|
||||
<string name="pref_theme_e_desert">Tuksnesis</string>
|
||||
<string name="pref_theme_e_jungle">Džungļi</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
|
||||
<string name="pref_swipe_dist_e_short">Tuvs</string>
|
||||
<string name="pref_swipe_dist_e_default">Vidējs</string>
|
||||
@@ -79,10 +81,11 @@
|
||||
<string name="key_action_search">Meklēt</string>
|
||||
<string name="key_action_send">Sūtīt</string>
|
||||
<string name="launcher_button_imesettings">Iespējot tastatūru</string>
|
||||
<string name="launcher_button_imepicker">Izvēlēties tastatūru</string>
|
||||
<string name="launcher_description">Šī lietotne ir virtuālā tastatūra.
|
||||
Ar zemāk esošo pogu var atvērt sistēmas iestatījumus un iespējot Unexpected Keyboard.</string>
|
||||
Ar zemāk esošo pogu var atvērt sistēmas iestatījumus un iespējot Unexpected Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Šī ir bezmaksas un atvērtā pirmkoda lietotne.
|
||||
GitHub var atrast pirmkodu un ziņot par nepilnībām.</string>
|
||||
GitHub var atrast pirmkodu un ziņot par nepilnībām.</string>
|
||||
<string name="launcher_tryhere">Pēc iespējošanas šeit var izmēģināt tastatūru:</string>
|
||||
<string name="key_descr_capslock">Burtslēgs</string>
|
||||
<string name="key_descr_switch_greekmath">Grieķu un matemātikas rakstzīmes</string>
|
||||
@@ -95,12 +98,13 @@
|
||||
<string name="key_descr_pasteAsPlainText">Ielīmēt kā vienkāršu tekstu</string>
|
||||
<string name="key_descr_undo">Atsaukt</string>
|
||||
<string name="key_descr_redo">Atatsaukt</string>
|
||||
<string name="key_descr_replaceText">Aizvietot</string>
|
||||
<string name="key_descr_textAssist">Palīgs</string>
|
||||
<string name="key_descr_autofill">Automātiskā aizpilde</string>
|
||||
<string name="key_descr_ª">Kārtas rādītājs</string>
|
||||
<string name="key_descr_º">Kārtas rādītājs</string>
|
||||
<string name="key_descr_superscript">Augšraksts</string>
|
||||
<string name="key_descr_subscript">Apakšraksts</string>
|
||||
<string name="key_descr_page_up">Augšupšķirt</string>
|
||||
<string name="key_descr_page_down">Lejupšķirt</string>
|
||||
<string name="key_descr_home">Sākums</string>
|
||||
<string name="key_descr_end">Beigas</string>
|
||||
<string name="pref_category_advanced">Papildu</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="settings_activity_label">Ustawienia Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">W widoku pionowym</string>
|
||||
<string name="pref_landscape">W widoku poziomym</string>
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="pref_layout_e_custom">Własny układ</string>
|
||||
<string name="pref_layouts_add">Dodaj dodatkowy układ</string>
|
||||
<string name="pref_layouts_item">Układ %1$d: %2$s</string>
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<string name="pref_layouts_remove_custom">Usuń układ</string>
|
||||
<string name="pref_custom_layout_title">Własny układ</string>
|
||||
<string name="pref_show_numpad_title">Pokaż klawiaturę numeryczną</string>
|
||||
<string name="pref_show_numpad_never">Nigdy</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Alternatywny Czarny</string>
|
||||
<string name="pref_theme_e_white">Biały</string>
|
||||
<string name="pref_theme_e_epaper">e-paper</string>
|
||||
<string name="pref_theme_e_desert">Pustynny</string>
|
||||
<string name="pref_theme_e_jungle">Dżunglowy</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
|
||||
<string name="pref_swipe_dist_e_short">Mała</string>
|
||||
<string name="pref_swipe_dist_e_default">Normalna</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Szukaj</string>
|
||||
<string name="key_action_send">Wyślij</string>
|
||||
<string name="launcher_button_imesettings">Włącz klawiaturę</string>
|
||||
<string name="launcher_button_imepicker">Wybierz klawiaturę</string>
|
||||
<string name="launcher_description">Ta aplikacja jest klawiaturą ekranową. Naciśnij poniższy przycisk, aby przejść do ustawień systemu i włącz Unexpected-Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Jest to darmowa aplikacja o otwartym kodzie źródłowym. Możesz zobaczyć kod źródłowy oraz zgłosić błedy na Githubie.</string>
|
||||
<string name="launcher_tryhere">Po jej włączeniu, możesz wypróbować klawiaturę tutaj:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<string name="key_descr_pasteAsPlainText">Wklej sam tekst</string>
|
||||
<string name="key_descr_undo">Cofnij</string>
|
||||
<string name="key_descr_redo">Ponów</string>
|
||||
<string name="key_descr_replaceText">Zamień</string>
|
||||
<string name="key_descr_textAssist">Asystent</string>
|
||||
<string name="key_descr_autofill">Autouzupełnianie</string>
|
||||
<string name="key_descr_ª">Wskaźnik porządkowy (żeński)</string>
|
||||
<string name="key_descr_º">Wskaźnik porządkowy (męski)</string>
|
||||
<string name="key_descr_superscript">Indeks górny</string>
|
||||
<string name="key_descr_subscript">Indeks dolny</string>
|
||||
<string name="key_descr_page_up">Page Up</string>
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="pref_category_advanced">Zaawansowane</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Teclado Unexpected</string>
|
||||
<string name="app_name" product="default">Teclado Unexpected</string>
|
||||
<string name="app_name_release">Teclado Unexpected</string>
|
||||
<string name="app_name_debug">Teclado Unexpected</string>
|
||||
<string name="settings_activity_label">Configurações</string>
|
||||
<string name="pref_portrait">No modo retrato</string>
|
||||
<string name="pref_landscape">No modo paisagem</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Preto Alternativo</string>
|
||||
<string name="pref_theme_e_white">Branco</string>
|
||||
<string name="pref_theme_e_epaper">Papel Eletrônico</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Muito curto</string>
|
||||
<string name="pref_swipe_dist_e_short">Curto</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Buscar</string>
|
||||
<string name="key_action_send">Enviar</string>
|
||||
<string name="launcher_button_imesettings">Ativar teclado</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">Este app é um teclado virtual. Vá para as configurações do sistema clicando no botão abaixo e ative o Teclado Unexpected.</string>
|
||||
<string name="launcher_sourcecode">Este app é gratuito é de código aberto. Você pode consultar o código ou fazer sugestões em Github.</string>
|
||||
<string name="launcher_tryhere">Após ativar, experimente aqui:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<string name="key_descr_pasteAsPlainText">Colar texto não formatado</string>
|
||||
<string name="key_descr_undo">Desfazer</string>
|
||||
<string name="key_descr_redo">Refazer</string>
|
||||
<string name="key_descr_replaceText">Substituir</string>
|
||||
<string name="key_descr_textAssist">Assistente</string>
|
||||
<string name="key_descr_autofill">Autopreenchimento</string>
|
||||
<string name="key_descr_ª">Indicador Ordinal</string>
|
||||
<string name="key_descr_º">Indicador Ordinal</string>
|
||||
<string name="key_descr_superscript">Sobrescrito</string>
|
||||
<string name="key_descr_subscript">Subscrito</string>
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Avançado</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Tastatură Unexpected (depanare)</string>
|
||||
<string name="app_name" product="default">Tastatură Unexpected</string>
|
||||
<string name="app_name_release">Tastatură Unexpected</string>
|
||||
<string name="app_name_debug">Tastatură Unexpected (depanare)</string>
|
||||
<string name="settings_activity_label">Setări Tastatură Unexpected</string>
|
||||
<string name="pref_portrait">În mod portret</string>
|
||||
<string name="pref_landscape">În mod panoramă</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Negru Alternativ</string>
|
||||
<string name="pref_theme_e_white">Albă</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
|
||||
<string name="pref_swipe_dist_e_short">Apropiată</string>
|
||||
<string name="pref_swipe_dist_e_default">Normală</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Caută</string>
|
||||
<string name="key_action_send">Trimite</string>
|
||||
<string name="launcher_button_imesettings">Activează tastatura</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">Această aplicație este o tastatură virtuală. Accesați setările sistemului făcând clic pe butonul de mai jos și activați tastatura Unexpected.</string>
|
||||
<string name="launcher_sourcecode">Aceasta este o aplicație gratuită și open source. Puteți găsi codul sursă sau raporta erori folosind link-ul Github.</string>
|
||||
<string name="launcher_tryhere">După activare, puteți să încercați tastatura aici:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Setări avansate</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (отладка)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (отладка)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Настройки</string>
|
||||
<string name="pref_portrait">В портретном режиме</string>
|
||||
<string name="pref_landscape">В ландшафтном режиме</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Альтернативный черный</string>
|
||||
<string name="pref_theme_e_white">Белая</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Очень близко</string>
|
||||
<string name="pref_swipe_dist_e_short">Близко</string>
|
||||
<string name="pref_swipe_dist_e_default">Нормально</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Поиск</string>
|
||||
<string name="key_action_send">Отправить</string>
|
||||
<string name="launcher_button_imesettings">Включить клавиатуру</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">Данное приложение является виртуальной клавиатурой. Зайдите в настройки, нажав кнопку внизу и активируйте Unexpected-Keyboard.</string>
|
||||
<string name="launcher_sourcecode">Это бесплатное приложение с открытым исходным кодом. Вы можете изучить код или сообщить об ошибках по ссылке Github.</string>
|
||||
<string name="launcher_tryhere">После активации вы можете попробовать клавиатуру прямо здесь:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Расширенные настройки</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,65 +1,67 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
|
||||
<!-- <string name="pref_portrait">In portrait mode</string> -->
|
||||
<!-- <string name="pref_landscape">In landscape mode</string> -->
|
||||
<string name="pref_category_layout">Düzen</string>
|
||||
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_e_system">Sistem Ayarları</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</string> -->
|
||||
<!-- <string name="pref_layouts_add">Add an alternate layout</string> -->
|
||||
<!-- <string name="pref_layouts_item">Layout %1$d: %2$s</string> -->
|
||||
<!-- <string name="pref_layouts_remove_custom">Remove layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_show_numpad_title">Show NumPad</string> -->
|
||||
<!-- <string name="pref_show_numpad_never">Never</string> -->
|
||||
<!-- <string name="pref_show_numpad_landscape">Only in landscape mode</string> -->
|
||||
<!-- <string name="pref_show_numpad_always">Always</string> -->
|
||||
<!-- <string name="pref_number_row_title">Show number row</string> -->
|
||||
<!-- <string name="pref_number_row_summary">Add a number row at the top of the keyboard when the numpad is hidden</string> -->
|
||||
<!-- <string name="pref_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
|
||||
<!-- <string name="pref_extra_keys_title">Add keys to the keyboard</string> -->
|
||||
<!-- <string name="pref_extra_keys_custom">Add custom keys</string> -->
|
||||
<!-- <string name="pref_extra_keys_internal">Select keys to add to the keyboard</string> -->
|
||||
<!-- <string name="pref_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_portrait">Portre modunda</string>
|
||||
<string name="pref_landscape">Manzara modunda</string>
|
||||
<string name="pref_category_layout">Tuş düzeni</string>
|
||||
<string name="pref_label_brightness">Adjust label brightness</string>
|
||||
<string name="pref_keyboard_opacity">Klavye arkaplanı opaklığını ayarla</string>
|
||||
<string name="pref_key_opacity">Tuş opaklığını ayarla</string>
|
||||
<string name="pref_key_activated_opacity">Tuşa basıldığındaki opaklığı ayarla</string>
|
||||
<string name="pref_layout_e_system">Sistem ayarlarını kullan</string>
|
||||
<string name="pref_layout_e_custom">Özel tuş düeni</string>
|
||||
<string name="pref_layouts_add">Alternatif bir tuş düzeni ekle</string>
|
||||
<string name="pref_layouts_item">Tuş düzeni %1$d: %2$s</string>
|
||||
<string name="pref_layouts_remove_custom">Tuş düzenini kaldır</string>
|
||||
<string name="pref_custom_layout_title">Özel tuş düzeni</string>
|
||||
<string name="pref_show_numpad_title">NumPadi göster</string>
|
||||
<string name="pref_show_numpad_never">Asla</string>
|
||||
<string name="pref_show_numpad_landscape">Sadece manzara modunda</string>
|
||||
<string name="pref_show_numpad_always">Her zaman</string>
|
||||
<string name="pref_number_row_title">Rakam satırını göster</string>
|
||||
<string name="pref_number_row_summary">NumPad gizlendiğinde klavyenin üstüne rakam satırı ekle</string>
|
||||
<string name="pref_numpad_layout">NumPad düzeni</string>
|
||||
<string name="pref_numpad_layout_e_high_first">9dan 1e</string>
|
||||
<string name="pref_numpad_layout_e_low_first">1den 9a</string>
|
||||
<string name="pref_extra_keys_title">Tuş ekle</string>
|
||||
<string name="pref_extra_keys_custom">Özel tuş ekle</string>
|
||||
<string name="pref_extra_keys_internal">Klavyeye eklenecek tuşları seçin</string>
|
||||
<string name="pref_second_layout_title">İklncil tuş düzeni</string>
|
||||
<string name="pref_second_layout_none">Hiçbiri</string>
|
||||
<string name="pref_category_typing">Yazma</string>
|
||||
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
|
||||
<string name="pref_swipe_dist_summary">Tuşların köşelerindeki karakterlerin uzaklıkları (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tuş tekrarlama beklemesi</string>
|
||||
<string name="pref_long_interval_title">Tuş tekrarlama aralığı</string>
|
||||
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> -->
|
||||
<!-- <string name="pref_category_behavior">Behavior</string> -->
|
||||
<!-- <string name="pref_autocapitalisation_title">Automatic capitalisation</string> -->
|
||||
<!-- <string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_title">Switch to the last used keyboard</string> -->
|
||||
<!-- <string name="pref_switch_input_immediate_summary">Behavior of the keyboard-switching key</string> -->
|
||||
<string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string>
|
||||
<string name="pref_long_timeout_title">Tuşların tekrarlaması için geçmesi gereken süre</string>
|
||||
<string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string>
|
||||
<string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string>
|
||||
<string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string>
|
||||
<string name="pref_category_behavior">Klavye davranışı</string>
|
||||
<string name="pref_autocapitalisation_title">Otomatik büyük harf</string>
|
||||
<string name="pref_autocapitalisation_summary">Noktadan sonra ve her cümlenin başında büyük harf yapar</string>
|
||||
<string name="pref_switch_input_immediate_title">Son kullanılan klavyeye geç</string>
|
||||
<string name="pref_switch_input_immediate_summary">Klavye değistirme tuşunun davranışını belirler</string>
|
||||
<string name="pref_vibrate_title">Titreşim</string>
|
||||
<string name="pref_vibrate_summary">Tuşa basıldığında titreşimi etkinleştir</string>
|
||||
<!-- <string name="pref_pin_entry_enabled_title">Pin entry layout</string> -->
|
||||
<!-- <string name="pref_pin_entry_enabled_summary">When typing numbers, dates and phone numbers</string> -->
|
||||
<string name="pref_category_style">Stil</string>
|
||||
<string name="pref_vibrate_summary">Tuşlara basılınca titremeyi aç/kapat</string>
|
||||
<string name="pref_pin_entry_enabled_title">NumPad</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Sayıları, tarihleri ve telefon numaralarını yazarken</string>
|
||||
<string name="pref_category_style">Tarz</string>
|
||||
<string name="pref_margin_bottom_title">Alt boşluk</string>
|
||||
<string name="pref_keyboard_height_title">Klavye yüksekliği</string>
|
||||
<string name="pref_horizontal_margin_title">Yatay boşluk</string>
|
||||
<string name="pref_character_size_title">Etiket boyutu</string>
|
||||
<string name="pref_character_size_summary">Klavye üzerinde gösterilecek karakter boyutu (%.2fx)</string>
|
||||
<string name="pref_character_size_summary">Klavye üzerindeki karakterlerin boyutu (%.2fx)</string>
|
||||
<string name="pref_theme">Tema</string>
|
||||
<string name="pref_theme_e_system">Sistem Ayarları</string>
|
||||
<string name="pref_theme_e_system">Sistem Temasını Kullan</string>
|
||||
<string name="pref_theme_e_dark">Koyu</string>
|
||||
<string name="pref_theme_e_light">Açık</string>
|
||||
<string name="pref_theme_e_light">Aydınlık</string>
|
||||
<string name="pref_theme_e_black">Siyah</string>
|
||||
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
|
||||
<!-- <string name="pref_theme_e_white">White</string> -->
|
||||
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
|
||||
<string name="pref_theme_e_altblack">Alternatif Siyah</string>
|
||||
<string name="pref_theme_e_white">Beyaz</string>
|
||||
<string name="pref_theme_e_epaper">E-Kağıt</string>
|
||||
<string name="pref_theme_e_desert">Çöl</string>
|
||||
<string name="pref_theme_e_jungle">Orman</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Çok kısa</string>
|
||||
<string name="pref_swipe_dist_e_short">Kısa</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -67,38 +69,40 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Çok uzun</string>
|
||||
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
|
||||
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
|
||||
<!-- <string name="pref_vibration_e_disabled">Disabled</string> -->
|
||||
<!-- <string name="pref_vibration_e_system">System</string> -->
|
||||
<!-- <string name="pref_vibration_e_strong">Strong</string> -->
|
||||
<!-- <string name="pref_vibration_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_vibration_e_light">Light</string> -->
|
||||
<string name="key_action_next">İleri</string>
|
||||
<string name="key_action_done">Bitti</string>
|
||||
<string name="key_action_go">İlerle</string>
|
||||
<string name="key_action_prev">Geri</string>
|
||||
<string name="pref_vibration_e_disabled">Aktif değil</string>
|
||||
<string name="pref_vibration_e_system">Sistem</string>
|
||||
<string name="pref_vibration_e_strong">Şiddetli</string>
|
||||
<string name="pref_vibration_e_medium">Orta</string>
|
||||
<string name="pref_vibration_e_light">Hafif</string>
|
||||
<string name="key_action_next">Sonraki</string>
|
||||
<string name="key_action_done">Tamam</string>
|
||||
<string name="key_action_go">ileri</string>
|
||||
<string name="key_action_prev">Önceki</string>
|
||||
<string name="key_action_search">Ara</string>
|
||||
<string name="key_action_send">Gönder</string>
|
||||
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
|
||||
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
|
||||
<!-- <string name="launcher_sourcecode">This is an free and open source application. You can find the source code or report bugs on Github.</string> -->
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
<!-- <string name="key_descr_capslock">Caps lock</string> -->
|
||||
<!-- <string name="key_descr_switch_greekmath">Greek & math symbols</string> -->
|
||||
<!-- <string name="key_descr_voice_typing">Voice typing</string> -->
|
||||
<!-- <string name="key_descr_copy">Copy</string> -->
|
||||
<!-- <string name="key_descr_paste">Paste</string> -->
|
||||
<!-- <string name="key_descr_cut">Cut</string> -->
|
||||
<!-- <string name="key_descr_selectAll">Select all</string> -->
|
||||
<!-- <string name="key_descr_shareText">Share text</string> -->
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
<string name="launcher_button_imesettings">Ayarlarda aktif et</string>
|
||||
<string name="launcher_button_imepicker">Klavye Seç</string>
|
||||
<string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string>
|
||||
<string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub</string>
|
||||
<string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
|
||||
<string name="key_descr_capslock">CapsLock</string>
|
||||
<string name="key_descr_switch_greekmath">Greek & math sembolleri</string>
|
||||
<string name="key_descr_voice_typing">Sesle yazma</string>
|
||||
<string name="key_descr_copy">Kopyala</string>
|
||||
<string name="key_descr_paste">Yapıştır</string>
|
||||
<string name="key_descr_cut">Kes</string>
|
||||
<string name="key_descr_selectAll">Tümünü seç</string>
|
||||
<string name="key_descr_shareText">Metni paylaş</string>
|
||||
<string name="key_descr_pasteAsPlainText">Düz metin olarak yapıştır</string>
|
||||
<string name="key_descr_undo">Geri al</string>
|
||||
<string name="key_descr_redo">İleri al</string>
|
||||
<string name="key_descr_ª">Sıralı göstergesi</string>
|
||||
<string name="key_descr_º">Sıralı göstergesi</string>
|
||||
<string name="key_descr_superscript">Süperscript</string>
|
||||
<string name="key_descr_subscript">Anascript</string>
|
||||
<string name="key_descr_page_up">Yukarı</string>
|
||||
<string name="key_descr_page_down">Aşağı</string>
|
||||
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
|
||||
<string name="key_descr_end">SON(Sağ yön tuşu)</string>
|
||||
<string name="pref_category_advanced">Gelişmiş</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (gỡ lỗi)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (gỡ lỗi)</string>
|
||||
<string name="settings_activity_label">Cài đặt Unexpected Keyboard</string>
|
||||
<string name="pref_portrait">Trong chế độ chân dung</string>
|
||||
<string name="pref_landscape">Trong chế độ phong cảnh</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<!-- <string name="pref_theme_e_altblack">Alternative Black</string> -->
|
||||
<string name="pref_theme_e_white">Trắng</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Rất gần</string>
|
||||
<string name="pref_swipe_dist_e_short">Gần</string>
|
||||
<string name="pref_swipe_dist_e_default">Trungbình</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Tìm</string>
|
||||
<string name="key_action_send">Gửi</string>
|
||||
<!-- <string name="launcher_button_imesettings">Enable keyboard</string> -->
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<!-- <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> -->
|
||||
<!-- <string name="launcher_sourcecode">This is an free and open source application. You can find the source code or report bugs on Github.</string> -->
|
||||
<!-- <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> -->
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">Nâng cao</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard 设置</string>
|
||||
<string name="pref_portrait">在竖屏模式下</string>
|
||||
<string name="pref_landscape">在横屏模式下</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">黑色带边框</string>
|
||||
<string name="pref_theme_e_white">白色</string>
|
||||
<string name="pref_theme_e_epaper">白色带边框</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">非常短</string>
|
||||
<string name="pref_swipe_dist_e_short">短</string>
|
||||
<string name="pref_swipe_dist_e_default">中(默认)</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">搜索</string>
|
||||
<string name="key_action_send">发送</string>
|
||||
<string name="launcher_button_imesettings">启用键盘</string>
|
||||
<!-- <string name="launcher_button_imepicker">Select keyboard</string> -->
|
||||
<string name="launcher_description">这是一个虚拟键盘软件。点击按钮进入系统设置,然后启用 Unexpected-Keyboard 即可使用。</string>
|
||||
<string name="launcher_sourcecode">这是一个免费且开源的软件。你可以在 Github 上找到源代码或者反馈 bug。</string>
|
||||
<string name="launcher_tryhere">启用键盘后,可以在这里测试效果:</string>
|
||||
@@ -93,12 +96,13 @@
|
||||
<!-- <string name="key_descr_pasteAsPlainText">Paste as plain text</string> -->
|
||||
<!-- <string name="key_descr_undo">Undo</string> -->
|
||||
<!-- <string name="key_descr_redo">Redo</string> -->
|
||||
<!-- <string name="key_descr_replaceText">Replace</string> -->
|
||||
<!-- <string name="key_descr_textAssist">Assist</string> -->
|
||||
<!-- <string name="key_descr_autofill">Autofill</string> -->
|
||||
<!-- <string name="key_descr_ª">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_º">Ordinal Indicator</string> -->
|
||||
<!-- <string name="key_descr_superscript">Superscript</string> -->
|
||||
<!-- <string name="key_descr_subscript">Subscript</string> -->
|
||||
<!-- <string name="key_descr_page_up">Page Up</string> -->
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<string name="pref_category_advanced">高级设置</string>
|
||||
</resources>
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
<item>@string/pref_theme_e_altblack</item>
|
||||
<item>@string/pref_theme_e_white</item>
|
||||
<item>@string/pref_theme_e_epaper</item>
|
||||
<item>@string/pref_theme_e_desert</item>
|
||||
<item>@string/pref_theme_e_jungle</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_values">
|
||||
<item>system</item>
|
||||
@@ -35,6 +37,8 @@
|
||||
<item>altblack</item>
|
||||
<item>white</item>
|
||||
<item>epaper</item>
|
||||
<item>desert</item>
|
||||
<item>jungle</item>
|
||||
</string-array>
|
||||
<string-array name="pref_swipe_dist_entries">
|
||||
<item>@string/pref_swipe_dist_e_very_short</item>
|
||||
|
||||
@@ -9,11 +9,14 @@
|
||||
<item>arab_alt</item>
|
||||
<item>arab_pc</item>
|
||||
<item>arab_pc_ckb</item>
|
||||
<item>arab_pc_hindu</item>
|
||||
<item>arab_pc_ir</item>
|
||||
<item>armenian_ph_am</item>
|
||||
<item>beng_national</item>
|
||||
<item>beng_provat</item>
|
||||
<item>cyrl_jcuken_ru</item>
|
||||
<item>cyrl_jcuken_uk</item>
|
||||
<item>cyrl_ueishsht</item>
|
||||
<item>cyrl_yaverti</item>
|
||||
<item>deva_alt</item>
|
||||
<item>deva_inscript</item>
|
||||
@@ -26,6 +29,7 @@
|
||||
<item>latn_bone</item>
|
||||
<item>latn_neo2</item>
|
||||
<item>latn_qwerty_br</item>
|
||||
<item>latn_qwerty_cz</item>
|
||||
<item>latn_qwerty_es</item>
|
||||
<item>latn_qwerty_hu</item>
|
||||
<item>latn_qwerty_lv</item>
|
||||
@@ -53,11 +57,14 @@
|
||||
<item>Arabic Alt</item>
|
||||
<item>Arabic PC</item>
|
||||
<item>Kurdish (کوردی)</item>
|
||||
<item>Arabic PC (Hindu numerals)</item>
|
||||
<item>Persian PC</item>
|
||||
<item>Armenian</item>
|
||||
<item>বাংলা (জাতীয়)</item>
|
||||
<item>বাংলা (প্রভাত)</item>
|
||||
<item>ЙЦУКЕН (Русский)</item>
|
||||
<item>ЙЦУКЕН (Українська)</item>
|
||||
<item>УЕИШЩ (Български, БДС)</item>
|
||||
<item>ЯВЕРТЪ</item>
|
||||
<item>देवनागरी (हिंदी)-2</item>
|
||||
<item>देवनागरी (हिंदी)-1</item>
|
||||
@@ -70,6 +77,7 @@
|
||||
<item>Bone</item>
|
||||
<item>Neo 2</item>
|
||||
<item>QWERTY (Brasileiro)</item>
|
||||
<item>QWERTY (Czech)</item>
|
||||
<item>QWERTY (Español)</item>
|
||||
<item>QWERTY (Magyar)</item>
|
||||
<item>QWERTY (Latvian)</item>
|
||||
@@ -97,11 +105,14 @@
|
||||
<item>@xml/arab_alt</item>
|
||||
<item>@xml/arab_pc</item>
|
||||
<item>@xml/arab_pc_ckb</item>
|
||||
<item>@xml/arab_pc_hindu</item>
|
||||
<item>@xml/arab_pc_ir</item>
|
||||
<item>@xml/armenian_ph_am</item>
|
||||
<item>@xml/beng_national</item>
|
||||
<item>@xml/beng_provat</item>
|
||||
<item>@xml/cyrl_jcuken_ru</item>
|
||||
<item>@xml/cyrl_jcuken_uk</item>
|
||||
<item>@xml/cyrl_ueishsht</item>
|
||||
<item>@xml/cyrl_yaverti</item>
|
||||
<item>@xml/deva_alt</item>
|
||||
<item>@xml/deva_inscript</item>
|
||||
@@ -114,6 +125,7 @@
|
||||
<item>@xml/latn_bone</item>
|
||||
<item>@xml/latn_neo2</item>
|
||||
<item>@xml/latn_qwerty_br</item>
|
||||
<item>@xml/latn_qwerty_cz</item>
|
||||
<item>@xml/latn_qwerty_es</item>
|
||||
<item>@xml/latn_qwerty_hu</item>
|
||||
<item>@xml/latn_qwerty_lv</item>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="app_name_release">Unexpected Keyboard</string>
|
||||
<string name="app_name_debug">Unexpected Keyboard (Debug)</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Settings</string>
|
||||
<string name="pref_portrait">In portrait mode</string>
|
||||
<string name="pref_landscape">In landscape mode</string>
|
||||
@@ -60,6 +60,8 @@
|
||||
<string name="pref_theme_e_altblack">Alternative Black</string>
|
||||
<string name="pref_theme_e_white">White</string>
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Desert</string>
|
||||
<string name="pref_theme_e_jungle">Jungle</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Very short</string>
|
||||
<string name="pref_swipe_dist_e_short">Short</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -79,6 +81,7 @@
|
||||
<string name="key_action_search">Search</string>
|
||||
<string name="key_action_send">Send</string>
|
||||
<string name="launcher_button_imesettings">Enable keyboard</string>
|
||||
<string name="launcher_button_imepicker">Select keyboard</string>
|
||||
<string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string>
|
||||
<string name="launcher_sourcecode">This is an free and open source application. You can find the source code or report bugs on Github.</string>
|
||||
<string name="launcher_tryhere">After enabling, you can try the keyboard here:</string>
|
||||
@@ -93,13 +96,14 @@
|
||||
<string name="key_descr_pasteAsPlainText">Paste as plain text</string>
|
||||
<string name="key_descr_undo">Undo</string>
|
||||
<string name="key_descr_redo">Redo</string>
|
||||
<string name="key_descr_replaceText">Replace</string>
|
||||
<string name="key_descr_textAssist">Assist</string>
|
||||
<string name="key_descr_autofill">Autofill</string>
|
||||
<string name="key_descr_ª">Ordinal Indicator</string>
|
||||
<string name="key_descr_º">Ordinal Indicator</string>
|
||||
<string name="key_descr_superscript">Superscript</string>
|
||||
<string name="key_descr_subscript">Subscript</string>
|
||||
<string name="key_descr_page_up">Page Up</string>
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<!-- Unused -->
|
||||
<string name="pref_category_advanced">Advanced</string>
|
||||
</resources>
|
||||
|
||||
@@ -8,15 +8,6 @@
|
||||
<item name="android:textColor">?attr/emoji_key_text</item>
|
||||
<item name="android:textSize">18dp</item>
|
||||
</style>
|
||||
<style name="emojiKeyButton">
|
||||
<item name="android:layout_width">0px</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:padding">0px</item>
|
||||
<item name="android:background">?attr/emoji_key_bg</item>
|
||||
<item name="android:textColor">?attr/emoji_key_text</item>
|
||||
<item name="android:textSize">18dp</item>
|
||||
</style>
|
||||
<style name="emojiGridButton">
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:layout_height">fill_parent</item>
|
||||
|
||||
@@ -137,4 +137,42 @@
|
||||
<item name="emoji_button_bg">#ffffff</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
<style name="Desert" parent="@style/BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
<item name="colorKeyboard">#ffe0b2</item>
|
||||
<item name="colorKey">#fff3e0</item>
|
||||
<item name="colorKeyActivated">#ffcc80</item>
|
||||
<item name="colorLabel">#000000</item>
|
||||
<item name="colorLabelActivated">#ffffff</item>
|
||||
<item name="colorLabelLocked">#e65100</item>
|
||||
<item name="secondaryLightOffset">0.1</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="keyBorderWidth">0.0dip</item>
|
||||
<item name="keyBorderWidthActivated">0.0dip</item>
|
||||
<item name="keyBorderColorLeft">#000000</item>
|
||||
<item name="keyBorderColorTop">#000000</item>
|
||||
<item name="keyBorderColorRight">#000000</item>
|
||||
<item name="keyBorderColorBottom">#000000</item>
|
||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
<style name="Jungle" parent="@style/BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
<item name="colorKeyboard">#4db6ac</item>
|
||||
<item name="colorKey">#e0f2f1</item>
|
||||
<item name="colorKeyActivated">#00695c</item>
|
||||
<item name="colorLabel">#000000</item>
|
||||
<item name="colorLabelActivated">#ffffff</item>
|
||||
<item name="colorLabelLocked">#64ffda</item>
|
||||
<item name="secondaryLightOffset">0.0</item>
|
||||
<item name="colorSubLabel">#004d40</item>
|
||||
<item name="keyBorderWidth">0.0dip</item>
|
||||
<item name="keyBorderWidthActivated">0.0dip</item>
|
||||
<item name="keyBorderColorLeft">#00f0f0f0</item>
|
||||
<item name="keyBorderColorTop">#00f0f0f0</item>
|
||||
<item name="keyBorderColorRight">#00eeeeee</item>
|
||||
<item name="keyBorderColorBottom">#00eeeeee</item>
|
||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
||||
@@ -6,6 +6,5 @@
|
||||
<dimen name="emoji_grid_height">250dp</dimen>
|
||||
<dimen name="emoji_text_size">28dp</dimen>
|
||||
<dimen name="pref_button_size">28dp</dimen>
|
||||
<bool name="debug_logs" product="debug">true</bool>
|
||||
<bool name="debug_logs" product="default">false</bool>
|
||||
<bool name="debug_logs">false</bool> <!-- Will be overwritten automatically by Gradle for the debug build variant -->
|
||||
</resources>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Arabic Alt" script="arabic">
|
||||
<keyboard name="Arabic Alt" script="arabic" numpad_script="hindu-arabic">
|
||||
<row>
|
||||
<key key0="ض" key2="١" key3="`" key4="esc"/>
|
||||
<key key0="ص" key2="٢" key3="\@"/>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Arabic PC" script="arabic">
|
||||
<row>
|
||||
<key key0="ض" key1="َ" key2="١" key3="`" key4="esc"/>
|
||||
<key key0="ص" key1="ً" key2="٢" key3="\@"/>
|
||||
<key key0="ث" key1="ُ" key2="٣" key3="\#" key4="loc €"/>
|
||||
<key key0="ق" key1="ٌ" key2="٤" key3="$" key4="loc £"/>
|
||||
<key key0="ف" key1="لإ" key2="٥" key3="%"/>
|
||||
<key key0="غ" key1="إ" key2="٦" key3="^"/>
|
||||
<key key0="ع" key1="‘" key2="٧" key3="&"/>
|
||||
<key key0="ه" key1="÷" key2="٨" key3="*"/>
|
||||
<key key0="خ" key1="×" key2="٩" key3="("/>
|
||||
<key key0="ح" key1="؛" key2="٠" key3=")"/>
|
||||
<key key0="ض" key1="َ" key2="1" key3="`" key4="esc"/>
|
||||
<key key0="ص" key1="ً" key2="2" key3="\@"/>
|
||||
<key key0="ث" key1="ُ" key2="3" key3="\#" key4="loc €"/>
|
||||
<key key0="ق" key1="ٌ" key2="4" key3="$" key4="loc £"/>
|
||||
<key key0="ف" key1="لإ" key2="5" key3="%"/>
|
||||
<key key0="غ" key1="إ" key2="6" key3="^"/>
|
||||
<key key0="ع" key1="‘" key2="7" key3="&"/>
|
||||
<key key0="ه" key1="÷" key2="8" key3="*"/>
|
||||
<key key0="خ" key1="×" key2="9" key3="("/>
|
||||
<key key0="ح" key1="؛" key2="0" key3=")"/>
|
||||
<key key0="ج" key1=">" key2="-" key3="_" key4="f11_placeholder"/>
|
||||
<key key0="د" key1="<" key2="=" key3="ذ" key4="f12_placeholder"/>
|
||||
<!-- <key key0="ذ" key1="ّ" key3="\\" key4="|"/> -->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Kurdish (کوردی)" script="arabic">
|
||||
<keyboard name="Kurdish (کوردی)" script="arabic" numpad_script="hindu-arabic">
|
||||
<row>
|
||||
<key key0="ق" key1="ٯ" key2="١" key3="esc"/>
|
||||
<key key0="و" key1="وو" key2="٢" key3="\@"/>
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Arabic PC (Hindu numerals)" script="arabic" numpad_script="hindu-arabic">
|
||||
<row>
|
||||
<key key0="ض" key1="َ" key2="١" key3="`" key4="esc"/>
|
||||
<key key0="ص" key1="ً" key2="٢" key3="\@"/>
|
||||
<key key0="ث" key1="ُ" key2="٣" key3="\#" key4="loc €"/>
|
||||
<key key0="ق" key1="ٌ" key2="٤" key3="$" key4="loc £"/>
|
||||
<key key0="ف" key1="لإ" key2="٥" key3="%"/>
|
||||
<key key0="غ" key1="إ" key2="٦" key3="^"/>
|
||||
<key key0="ع" key1="‘" key2="٧" key3="&"/>
|
||||
<key key0="ه" key1="÷" key2="٨" key3="*"/>
|
||||
<key key0="خ" key1="×" key2="٩" key3="("/>
|
||||
<key key0="ح" key1="؛" key2="٠" key3=")"/>
|
||||
<key key0="ج" key1=">" key2="-" key3="_" key4="f11_placeholder"/>
|
||||
<key key0="د" key1="<" key2="=" key3="ذ" key4="f12_placeholder"/>
|
||||
<!-- <key key0="ذ" key1="ّ" key3="\\" key4="|"/> -->
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ش" key1="ِ" key4="tab"/>
|
||||
<key key0="س" key1="ٍ"/>
|
||||
<key key0="ي" key1="["/>
|
||||
<key key0="ب" key1="]"/>
|
||||
<key key0="ل" key1="لأ"/>
|
||||
<key key0="ا" key1="أ"/>
|
||||
<key key0="ت" key1="ـ"/>
|
||||
<key key0="ن" key1="،"/>
|
||||
<key key0="م" key1="/"/>
|
||||
<key key0="ك" key1=":"/>
|
||||
<key key0="ط" key1="""/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ئ" key1="~"/>
|
||||
<key key0="ء" key1="ْ"/>
|
||||
<key key0="ؤ" key1="{"/>
|
||||
<key key0="ر" key1="}"/>
|
||||
<key key0="لا" key1="لآ"/>
|
||||
<key key0="ى" key1="آ"/>
|
||||
<key key0="ة" key1="’"/>
|
||||
<key key0="و" key1=","/>
|
||||
<key key0="ز" key1="."/>
|
||||
<key key0="ظ" key1="؟"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -21,8 +21,8 @@
|
||||
<key key0="ل"/>
|
||||
<key key0="ا" key1="آ" key4="ء" key2="-" key3="_"/>
|
||||
<key key0="ت" key1="‌" key2="+"/>
|
||||
<key key0="ن" key1="("/>
|
||||
<key key0="م" key1=")"/>
|
||||
<key key0="ن"/>
|
||||
<key key0="م"/>
|
||||
<key key0="ک"/>
|
||||
<key key0="گ"/>
|
||||
</row>
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<keyboard name="Armenian" script="armenian">
|
||||
<row>
|
||||
<key key0="է" key2="1"/>
|
||||
<key key0="թ" key2="2" key1="~" key3="\@"/>
|
||||
<key key0="փ" key2="3" key1="!" key3="\#"/>
|
||||
<key key0="ձ" key2="4" key3="$"/>
|
||||
<key key0="ջ" key2="5" key3="%"/>
|
||||
<key key0="ր" key2="6" key3="^"/>
|
||||
<key key0="չ" key2="7" key3="&"/>
|
||||
<key key0="ճ" key2="8" key3="*"/>
|
||||
<key key0="ժ" key2="9" key3="(" key4=")"/>
|
||||
<key key0="ծ" key2="0"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ք" key4="esc"/>
|
||||
<key key0="ո"/>
|
||||
<key key0="ե" key1="և"/>
|
||||
<key key0="ռ"/>
|
||||
<key key0="տ"/>
|
||||
<key key0="ը"/>
|
||||
<key key0="ւ"/>
|
||||
<key key0="ի"/>
|
||||
<key key0="օ"/>
|
||||
<key key0="պ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ա" key1="tab" key2="`"/>
|
||||
<key key0="ս"/>
|
||||
<key key0="դ"/>
|
||||
<key key0="ֆ"/>
|
||||
<key key0="գ"/>
|
||||
<key key0="հ" key3="_" key2="-"/>
|
||||
<key key0="յ" key3="+" key2="="/>
|
||||
<key key0="կ" key3="{" key4="}"/>
|
||||
<key key0="լ" key3="[" key4="]"/>
|
||||
<key key0="խ" key3="\\" key2="|"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="shift" key2="loc capslock"/>
|
||||
<key key0="զ"/>
|
||||
<key key0="ղ"/>
|
||||
<key key0="ց"/>
|
||||
<key key0="վ" key4="." key2="<"/>
|
||||
<key key0="բ" key4="," key2=">"/>
|
||||
<key key0="ն" key4="/" key2="\?"/>
|
||||
<key key0="մ" key4=";" key2=":"/>
|
||||
<key key0="շ" key4="'" key2="""/>
|
||||
<key key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="বাংলা (জাতীয়)">
|
||||
<keyboard name="বাংলা (জাতীয়)" script="bengali">
|
||||
<row>
|
||||
<key key0="ঙ" key2="ং" key3="esc" key4="১"/>
|
||||
<key key0="য" key2="য়" key3="¶" key4="২"/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<keyboard name="বাংলা (প্রভাত)">
|
||||
<keyboard name="বাংলা (প্রভাত)" script="bengali">
|
||||
<row>
|
||||
<key key0="দ" key1="ধ" key2="১" key3="!" key5="esc" />
|
||||
<key key0="ূ" key1="ঊ" key2="২" key3="\@" />
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.1" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.1" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key width="1.1" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
|
||||
<key width="1.7" key0="enter" key1="loc voice_typing" key2="action"/>
|
||||
</row>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<key key0="п"/>
|
||||
<key key0="р"/>
|
||||
<key key0="о"/>
|
||||
<key key0="л"/>
|
||||
<key key0="л" key1="₽"/>
|
||||
<key key0="д" key2="-" key3="_"/>
|
||||
<key key0="ж" key2="=" key3="+"/>
|
||||
<key key0="э" key2="|" key3="\\"/>
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="УЕИШЩ (Български, БДС)" script="cyrillic">
|
||||
<row>
|
||||
<key key0="у" key2="1" key4="esc"/>
|
||||
<key key0="е" key1="~" key2="2" key3="\@"/>
|
||||
<key key0="и" key1="!" key2="3" key3="\#" key4="ѝ"/>
|
||||
<key key0="ш" key2="4" key3="$"/>
|
||||
<key key0="щ" key2="5" key3="%"/>
|
||||
<key key0="к" key2="6" key3="^"/>
|
||||
<key key0="с" key2="7" key3="&" key4="§"/>
|
||||
<key key0="д" key2="8" key3="*" key4="№"/>
|
||||
<key key0="з" key2="9" key3="(" key4=")"/>
|
||||
<key key0="ц" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="б" key2="€"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ь" key1="tab" key2="`"/>
|
||||
<key key0="я"/>
|
||||
<key key0="а"/>
|
||||
<key key0="о" key2="-" key3="_"/>
|
||||
<key key0="ж" key2="=" key3="+"/>
|
||||
<key key0="г" key4="}" key3="{"/>
|
||||
<key key0="т" key3="[" key4="]"/>
|
||||
<key key0="н" key2="|" key3="\\"/>
|
||||
<key key0="в"/>
|
||||
<key key0="м"/>
|
||||
<key key0="ч" key1="„" key2="“"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="ю"/>
|
||||
<key key0="й"/>
|
||||
<key key0="ъ" key1="loc accent_cedille" key2="<" key4=">"/>
|
||||
<key key0="ф" key2="\?" key3="/"/>
|
||||
<key key0="х" key2=":" key3=";"/>
|
||||
<key key0="п" key2=""" key3="'"/>
|
||||
<key key0="р" key3=","/>
|
||||
<key key0="л" key3="."/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -19,7 +19,7 @@
|
||||
<key width="0.9" key0="ो" key1="ओ" key2="औ" key4="ौ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="्" key2="tab" key4="esc"/>
|
||||
<key key0="्" key2="*" key4="\@"/>
|
||||
<key key0="ँ" key1="₹" key2="॑" key3="ॖ" key4="॓"/>
|
||||
<key key0="ं" key1="ॐ" key2="ऽ" key3="ः" key4="""/>
|
||||
<key key0="।" key1="," key2=";" key3="!" key4="\?"/>
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- The bottom row used in the emoji pane. -->
|
||||
<keyboard bottom_row="false">
|
||||
<row height="0.95">
|
||||
<key key0="switch_back_emoji"/>
|
||||
<key width="4" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key key0="backspace"/>
|
||||
<key key0="enter"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -2,37 +2,37 @@
|
||||
<keyboard bottom_row="false">
|
||||
<row>
|
||||
<key key0="θ" key2="^"/>
|
||||
<key key0="δ" key1="⌊" key2="∨" key3="↔" key4="⊂"/>
|
||||
<key key0="ϛ" key1="⌋" key2="∧" key3="↑" key4="⊃"/>
|
||||
<key key0="α" key1="⌈" key2="⊥" key3="↕" key4="∀"/>
|
||||
<key key0="ξ" key1="⌉" key2="∡" key4="⊷"/>
|
||||
<key key0="π" key1="∥" key3="≪" key4="7"/>
|
||||
<key key0="ψ" key1="⌀" key2="⟨" key3="≡" key4="8"/>
|
||||
<key key0="λ" key1="∞" key2="⟩" key3="≫" key4="9"/>
|
||||
<key key0="μ" key1="∝" key3="□" key4="f11_placeholder"/>
|
||||
<key key0="ω" key1="∅" key3="∘" key4="f12_placeholder"/>
|
||||
<key key0="ω" key1="⌊" key2="∨" key3="↔" key4="⊂"/>
|
||||
<key key0="ε" key1="⌋" key2="∧" key3="↑" key4="⊃"/>
|
||||
<key key0="ρ" key1="⌈" key2="⊥" key3="↕" key4="∀"/>
|
||||
<key key0="τ" key1="⌉" key2="∡" key4="⊷"/>
|
||||
<key key0="ψ" key1="∥" key3="≪" key4="7"/>
|
||||
<key key0="υ" key1="⌀" key2="⟨" key3="≡" key4="8"/>
|
||||
<key key0="ι" key1="∞" key2="⟩" key3="≫" key4="9"/>
|
||||
<key key0="ο" key1="∝" key3="□" key4="f11_placeholder"/>
|
||||
<key key0="π" key1="∅" key3="∘" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="χ" key4="ℂ"/>
|
||||
<key key0="τ" key3="←" key4="∂"/>
|
||||
<key key0="ι" key3="↓" key4="∫"/>
|
||||
<key key0="ε" key3="→" key4="∃"/>
|
||||
<key key0="ο" key4="∈"/>
|
||||
<key key0="β" key1="⊕" key4="4"/>
|
||||
<key key0="ν" key1="⊖" key3="ℕ" key4="5"/>
|
||||
<key key0="ρ" key1="⊙" key3="ℝ" key4="6"/>
|
||||
<key key0="σ" key1="⊗"/>
|
||||
<key key0="γ" key1="⌀"/>
|
||||
<key key0="α" key4="ℂ"/>
|
||||
<key key0="σ" key3="←" key4="∂"/>
|
||||
<key key0="δ" key3="↓" key4="∫"/>
|
||||
<key key0="φ" key3="→" key4="∃"/>
|
||||
<key key0="γ" key4="∈"/>
|
||||
<key key0="η" key1="⊕" key4="4"/>
|
||||
<key key0="ξ" key1="⊖" key3="ℕ" key4="5"/>
|
||||
<key key0="κ" key1="⊙" key3="ℝ" key4="6"/>
|
||||
<key key0="λ" key1="⊗"/>
|
||||
<key key0="ϡ" key1="⌀"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="φ" key3="⇌" key4="√"/>
|
||||
<key key0="η" key3="accent_arrow_right" key4="∪"/>
|
||||
<key key0="ϡ" key4="∩"/>
|
||||
<key key0="υ" key3="∇" key4="ℵ"/>
|
||||
<key key0="ζ" key1="≤" key3="ℤ" key4="1"/>
|
||||
<key key0="Ϟ" key1="≠" key3="ℚ" key4="2"/>
|
||||
<key key0="κ" key1="≥" key3="×" key4="3"/>
|
||||
<key key0="ζ" key3="⇌" key4="√"/>
|
||||
<key key0="χ" key3="accent_arrow_right" key4="∪"/>
|
||||
<key key0="ϛ" key4="∩"/>
|
||||
<key key0="ϟ" key3="∇" key4="ℵ"/>
|
||||
<key key0="β" key1="≤" key3="ℤ" key4="1"/>
|
||||
<key key0="ν" key1="≠" key3="ℚ" key4="2"/>
|
||||
<key key0="μ" key1="≥" key3="×" key4="3"/>
|
||||
<key width="1.5" key0="backspace" key3="delete"/>
|
||||
</row>
|
||||
<row height="0.95">
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<key key0="g" key2="8" key4=">"/>
|
||||
<key key0="f" key2="9" key3="f11_placeholder" key4="="/>
|
||||
<key key0="q" key2="0" key3="f12_placeholder" key4="&"/>
|
||||
<key key0="ß" key1="-"/>
|
||||
<key key0="ß" key1="—"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="u" key1="tab" key4="\\"/>
|
||||
@@ -40,11 +40,11 @@
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.8" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key7="switch_second" key8="switch_backward"/>
|
||||
<key width="4.0" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.2" key7="up" key6="right" key5="left" key8="down"/>
|
||||
<key key0="j" key4=";"/>
|
||||
<key width="1.8" key0="enter" key2="action"/>
|
||||
<key width="1.8" key0="enter" key1="loc voice_typing" key2="action"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<keyboard script="latin" name="QWERTY (Czech)">
|
||||
<row>
|
||||
<key key0="q" key1="1" key2="esc" key4="~"/>
|
||||
<key key0="w" key1="2" key2="+" key3="|" key4="\\"/>
|
||||
<key key0="e" key1="3" key2="é" key3="^" key4="ě"/>
|
||||
<key key0="r" key1="4" key4="ř"/>
|
||||
<key key0="t" key1="5" key3="°" key4="ť"/>
|
||||
<key key0="y" key1="6" key2="ý"/>
|
||||
<key key0="u" key1="7" key2="ú" key3="`" key4="ů"/>
|
||||
<key key0="i" key1="8" key2="í" key3="(" key4=")"/>
|
||||
<key key0="o" key1="9" key2="ó" key3="/" key4="%"/>
|
||||
<key key0="p" key1="0" key3="="/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="á" key3=";"/>
|
||||
<key key0="s" key1="loc §" key4="š"/>
|
||||
<key key0="d" key4="ď"/>
|
||||
<key key0="f" key3="["/>
|
||||
<key key0="g" key3="]"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j"/>
|
||||
<key key0="k"/>
|
||||
<key key0="l" key1=""" key2="'" key3="$" key4="!"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z" key4="ž"/>
|
||||
<key key0="x" key1="loc †" key3="\#"/>
|
||||
<key key0="c" key3="&" key4="č"/>
|
||||
<key key0="v" key3="\@"/>
|
||||
<key key0="b" key1="<" key2=">" key3="{" key4="}"/>
|
||||
<key key0="n" key1="\?" key2="." key3="," key4="ň"/>
|
||||
<key key0="m" key1=":" key2="*" key3="-" key4="_"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
@@ -1,8 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="juloo.keyboard2.SettingsActivity" android:supportsSwitchingToNextInputMethod="true">
|
||||
<subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_ibm"/>
|
||||
<subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_pc_hindu"/>
|
||||
<subtype android:label="%s" android:languageTag="ar" android:imeSubtypeLocale="ar_TN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=arabic,default_layout=arab_pc"/>
|
||||
<subtype android:label="%s" android:languageTag="ay" android:imeSubtypeLocale="ay_AM" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=armenian,default_layout=armenian_ph_am"/>
|
||||
<subtype android:label="%s" android:languageTag="be" android:imeSubtypeLocale="be_BY" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_ru,extra_keys=ґ|є|і|ї|ў"/>
|
||||
<subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_yaverti,extra_keys=€"/>
|
||||
<subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_ueishsht,extra_keys=€"/>
|
||||
<subtype android:label="%s" android:languageTag="bn" android:imeSubtypeLocale="bn_BD" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=৳"/>
|
||||
<subtype android:label="%s" android:languageTag="cs" android:imeSubtypeLocale="cs_CZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_cz,extra_keys=accent_aigu:á:é:í:ó:ú:ý|accent_ring:ů|accent_caron:č:ě:ň:ř:š:ž:ď:ť"/>
|
||||
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü|ß|€"/>
|
||||
@@ -12,7 +14,7 @@
|
||||
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú|accent_tilde:ñ|accent_grave|accent_trema|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fa" android:imeSubtypeLocale="fa_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_pc_ir"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-CH" android:imeSubtypeLocale="fr_CH" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_fr_ch,extra_keys=accent_grave:à:è:ù|accent_aigu:é|accent_circonflexe:â:ê:ô|accent_cedille:ç|accent_trema:ë:ï:ü:ÿ|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-FR" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù|accent_aigu:é|accent_circonflexe:â:ê:ô|accent_cedille:ç|accent_trema:ë:ï:ü:ÿ|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-FR" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù@a|accent_aigu:é@e|accent_circonflexe:â:ê:ô@e|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@l|€"/>
|
||||
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪|€"/>
|
||||
<subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
|
||||
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú|accent_trema:ö:ü|accent_ogonek|accent_double_aigu:ő:ű|€"/>
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
dependencyResolutionManagement {
|
||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "Unexpected-Keyboard"
|
||||
@@ -1,19 +1,33 @@
|
||||
{ pkgs ? import <nixpkgs> {
|
||||
config.android_sdk.accept_license = true;
|
||||
config.allowUnfree = true;
|
||||
} }:
|
||||
config.android_sdk.accept_license = true;
|
||||
config.allowUnfree = true;
|
||||
} }:
|
||||
|
||||
let
|
||||
jdk = pkgs.openjdk8;
|
||||
jdk = pkgs.openjdk17;
|
||||
build_tools_version = "33.0.1";
|
||||
|
||||
android = pkgs.androidenv.composeAndroidPackages {
|
||||
buildToolsVersions = [ "30.0.3" ];
|
||||
platformVersions = [ "30" ];
|
||||
buildToolsVersions = [ build_tools_version ];
|
||||
platformVersions = [ "33" ];
|
||||
abiVersions = [ "armeabi-v7a" ];
|
||||
};
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
buildInputs = [ pkgs.findutils jdk android.androidsdk pkgs.fontforge ];
|
||||
ANDROID_HOME = "${android.androidsdk}/libexec/android-sdk";
|
||||
ANDROID_SDK_ROOT = "${android.androidsdk}/libexec/android-sdk";
|
||||
|
||||
# Without this option, aapt2 fails to run with a permissions error.
|
||||
gradle_wrapped = pkgs.runCommandLocal "gradle-wrapped" {
|
||||
nativeBuildInputs = with pkgs; [ makeBinaryWrapper ];
|
||||
} ''
|
||||
mkdir -p $out/bin
|
||||
ln -s ${pkgs.gradle}/bin/gradle $out/bin/gradle
|
||||
wrapProgram $out/bin/gradle \
|
||||
--add-flags "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${build_tools_version}/aapt2"
|
||||
'';
|
||||
|
||||
in pkgs.mkShell {
|
||||
buildInputs =
|
||||
[ pkgs.findutils pkgs.fontforge jdk android.androidsdk gradle_wrapped ];
|
||||
JAVA_HOME = jdk.home;
|
||||
inherit ANDROID_SDK_ROOT;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,8 @@ final class Autocapitalisation
|
||||
}
|
||||
_enabled = true;
|
||||
_should_enable_shift = (info.initialCapsMode != 0);
|
||||
_callback.update_shift_state(_should_enable_shift, true);
|
||||
_should_update_caps_mode = started_should_update_state(info.inputType);
|
||||
callback_now(true);
|
||||
}
|
||||
|
||||
public void typed(CharSequence c)
|
||||
@@ -77,6 +78,13 @@ final class Autocapitalisation
|
||||
callback(true);
|
||||
}
|
||||
|
||||
public void stop()
|
||||
{
|
||||
_should_enable_shift = false;
|
||||
_should_update_caps_mode = false;
|
||||
callback_now(true);
|
||||
}
|
||||
|
||||
public static interface Callback
|
||||
{
|
||||
public void update_shift_state(boolean should_enable, boolean should_disable);
|
||||
@@ -112,7 +120,11 @@ final class Autocapitalisation
|
||||
}
|
||||
};
|
||||
|
||||
void callback(final boolean might_disable)
|
||||
/** Update the shift state if [_should_update_caps_mode] is true, then call
|
||||
[_callback.update_shift_state]. This is done after a short delay to wait
|
||||
for the editor to handle the events, as this might be called before the
|
||||
corresponding event is sent. */
|
||||
void callback(boolean might_disable)
|
||||
{
|
||||
_should_disable_shift = might_disable;
|
||||
// The callback must be delayed because [getCursorCapsMode] would sometimes
|
||||
@@ -120,6 +132,13 @@ final class Autocapitalisation
|
||||
_handler.postDelayed(delayed_callback, 1);
|
||||
}
|
||||
|
||||
/** Like [callback] but runs immediately. */
|
||||
void callback_now(boolean might_disable)
|
||||
{
|
||||
_should_disable_shift = might_disable;
|
||||
delayed_callback.run();
|
||||
}
|
||||
|
||||
void type_one_char(char c)
|
||||
{
|
||||
_cursor++;
|
||||
@@ -139,4 +158,26 @@ final class Autocapitalisation
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Whether the caps state should be updated when input starts. [inputType]
|
||||
is the field from the editor info object. */
|
||||
boolean started_should_update_state(int inputType)
|
||||
{
|
||||
int class_ = inputType & InputType.TYPE_MASK_CLASS;
|
||||
int variation = inputType & InputType.TYPE_MASK_VARIATION;
|
||||
if (class_ != InputType.TYPE_CLASS_TEXT)
|
||||
return false;
|
||||
switch (variation)
|
||||
{
|
||||
case InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE:
|
||||
case InputType.TYPE_TEXT_VARIATION_NORMAL:
|
||||
case InputType.TYPE_TEXT_VARIATION_PERSON_NAME:
|
||||
case InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE:
|
||||
case InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT:
|
||||
case InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,10 @@ import android.util.TypedValue;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
final class Config
|
||||
@@ -59,11 +61,15 @@ final class Config
|
||||
public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
|
||||
public boolean swapEnterActionKey; // Swap the "enter" and "action" keys
|
||||
public ExtraKeys extra_keys_subtype;
|
||||
public Set<KeyValue> extra_keys_param;
|
||||
public List<KeyValue> extra_keys_custom;
|
||||
public Map<KeyValue, KeyboardData.PreferredPos> extra_keys_param;
|
||||
public Map<KeyValue, KeyboardData.PreferredPos> extra_keys_custom;
|
||||
|
||||
public final IKeyEventHandler handler;
|
||||
public boolean orientation_landscape = false;
|
||||
/** Index in 'layouts' of the currently used layout. See
|
||||
[get_current_layout()] and [set_current_layout()]. */
|
||||
int current_layout_portrait;
|
||||
int current_layout_landscape;
|
||||
|
||||
private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h)
|
||||
{
|
||||
@@ -152,6 +158,26 @@ final class Config
|
||||
extra_keys_param = ExtraKeysPreference.get_extra_keys(_prefs);
|
||||
extra_keys_custom = CustomExtraKeysPreference.get(_prefs);
|
||||
pin_entry_enabled = _prefs.getBoolean("pin_entry_enabled", true);
|
||||
current_layout_portrait = _prefs.getInt("current_layout_portrait", 0);
|
||||
current_layout_landscape = _prefs.getInt("current_layout_landscape", 0);
|
||||
}
|
||||
|
||||
public int get_current_layout()
|
||||
{
|
||||
return (orientation_landscape)
|
||||
? current_layout_landscape : current_layout_portrait;
|
||||
}
|
||||
|
||||
public void set_current_layout(int l)
|
||||
{
|
||||
if (orientation_landscape)
|
||||
current_layout_landscape = l;
|
||||
else
|
||||
current_layout_portrait = l;
|
||||
SharedPreferences.Editor e = _prefs.edit();
|
||||
e.putInt("current_layout_portrait", current_layout_portrait);
|
||||
e.putInt("current_layout_landscape", current_layout_landscape);
|
||||
e.apply();
|
||||
}
|
||||
|
||||
KeyValue action_key()
|
||||
@@ -174,26 +200,26 @@ final class Config
|
||||
final KeyValue action_key = action_key();
|
||||
// Extra keys are removed from the set as they are encountered during the
|
||||
// first iteration then automatically added.
|
||||
final Set<KeyValue> extra_keys = new HashSet<KeyValue>();
|
||||
final Map<KeyValue, KeyboardData.PreferredPos> extra_keys = new HashMap<KeyValue, KeyboardData.PreferredPos>();
|
||||
final Set<KeyValue> remove_keys = new HashSet<KeyValue>();
|
||||
extra_keys.addAll(extra_keys_param);
|
||||
extra_keys.addAll(extra_keys_custom);
|
||||
extra_keys.putAll(extra_keys_param);
|
||||
extra_keys.putAll(extra_keys_custom);
|
||||
if (extra_keys_subtype != null)
|
||||
{
|
||||
Set<KeyValue> present = new HashSet<KeyValue>();
|
||||
kw.getKeys(present);
|
||||
present.addAll(extra_keys_param);
|
||||
present.addAll(extra_keys_custom);
|
||||
present.addAll(kw.getKeys().keySet());
|
||||
present.addAll(extra_keys_param.keySet());
|
||||
present.addAll(extra_keys_custom.keySet());
|
||||
extra_keys_subtype.compute(extra_keys,
|
||||
new ExtraKeys.Query(kw.script, present));
|
||||
}
|
||||
boolean number_row = this.number_row && !show_numpad;
|
||||
if (number_row)
|
||||
KeyboardData.number_row.getKeys(remove_keys);
|
||||
remove_keys.addAll(KeyboardData.number_row.getKeys(0).keySet());
|
||||
kw = kw.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
boolean is_extra_key = extra_keys.contains(key);
|
||||
boolean is_extra_key = extra_keys.containsKey(key);
|
||||
if (is_extra_key)
|
||||
extra_keys.remove(key);
|
||||
if (localized && !is_extra_key)
|
||||
@@ -219,6 +245,7 @@ final class Config
|
||||
case SWITCH_BACKWARD:
|
||||
return (layouts.size() > 2) ? key : null;
|
||||
case SWITCH_VOICE_TYPING:
|
||||
case SWITCH_VOICE_TYPING_CHOOSER:
|
||||
return shouldOfferVoiceTyping ? key : null;
|
||||
}
|
||||
break;
|
||||
@@ -242,20 +269,20 @@ final class Config
|
||||
}
|
||||
});
|
||||
if (show_numpad)
|
||||
kw = kw.addNumPad();
|
||||
kw = kw.addNumPad(modify_numpad(KeyboardData.num_pad, kw));
|
||||
if (number_row)
|
||||
kw = kw.addNumberRow();
|
||||
if (extra_keys.size() > 0)
|
||||
kw = kw.addExtraKeys(extra_keys.iterator());
|
||||
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
|
||||
return kw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the numpad layout.
|
||||
*/
|
||||
public KeyboardData modify_numpad(KeyboardData kw)
|
||||
/** Handle the numpad layout. The [main_kw] is used to adapt the numpad to
|
||||
the main layout's script. */
|
||||
public KeyboardData modify_numpad(KeyboardData kw, KeyboardData main_kw)
|
||||
{
|
||||
final KeyValue action_key = action_key();
|
||||
final KeyModifier.Map_char map_digit = KeyModifier.modify_numpad_script(main_kw.numpad_script);
|
||||
return kw.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
@@ -277,11 +304,15 @@ final class Config
|
||||
}
|
||||
break;
|
||||
case Char:
|
||||
char a = key.getChar(), b = a;
|
||||
char prev_c = key.getChar();
|
||||
char c = prev_c;
|
||||
if (inverse_numpad)
|
||||
b = inverse_numpad_char(a);
|
||||
if (a != b)
|
||||
return key.withChar(b);
|
||||
c = inverse_numpad_char(c);
|
||||
String modified = map_digit.apply(c);
|
||||
if (modified != null) // Was modified by script
|
||||
return key.withSymbol(modified);
|
||||
if (prev_c != c) // Was inverted
|
||||
return key.withChar(c);
|
||||
break;
|
||||
}
|
||||
return key;
|
||||
@@ -317,6 +348,8 @@ final class Config
|
||||
case "dark": return R.style.Dark;
|
||||
case "white": return R.style.White;
|
||||
case "epaper": return R.style.ePaper;
|
||||
case "desert": return R.style.Desert;
|
||||
case "jungle": return R.style.Jungle;
|
||||
default:
|
||||
case "system":
|
||||
if (Build.VERSION.SDK_INT >= 8)
|
||||
@@ -357,8 +390,14 @@ final class Config
|
||||
return _globalConfig;
|
||||
}
|
||||
|
||||
public static SharedPreferences globalPrefs()
|
||||
{
|
||||
return _globalConfig._prefs;
|
||||
}
|
||||
|
||||
public static interface IKeyEventHandler
|
||||
{
|
||||
public void key_down(KeyValue value, boolean is_swipe);
|
||||
public void key_up(KeyValue value, Pointers.Modifiers flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,9 @@ import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
@@ -30,14 +31,15 @@ public class CustomExtraKeysPreference extends ListGroupPreference<String>
|
||||
setKey(KEY);
|
||||
}
|
||||
|
||||
public static List<KeyValue> get(SharedPreferences prefs)
|
||||
public static Map<KeyValue, KeyboardData.PreferredPos> get(SharedPreferences prefs)
|
||||
{
|
||||
List<KeyValue> kvs = new ArrayList<KeyValue>();
|
||||
Map<KeyValue, KeyboardData.PreferredPos> kvs =
|
||||
new HashMap<KeyValue, KeyboardData.PreferredPos>();
|
||||
List<String> key_names = load_from_preferences(KEY, prefs, null, SERIALIZER);
|
||||
if (key_names != null)
|
||||
{
|
||||
for (String key_name : key_names)
|
||||
kvs.add(KeyValue.makeStringKey(key_name));
|
||||
kvs.put(KeyValue.makeStringKey(key_name), KeyboardData.PreferredPos.DEFAULT);
|
||||
}
|
||||
return kvs;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Handler;
|
||||
import android.text.InputType;
|
||||
import android.text.Layout;
|
||||
import android.widget.EditText;
|
||||
|
||||
public class CustomLayoutEditDialog
|
||||
{
|
||||
/** Dialog for specifying a custom layout. [initial_text] is the layout
|
||||
description when modifying a layout. */
|
||||
public static void show(Context ctx, String initial_text,
|
||||
boolean allow_remove, final Callback callback)
|
||||
{
|
||||
final LayoutEntryEditText input = new LayoutEntryEditText(ctx);
|
||||
input.setText(initial_text);
|
||||
AlertDialog.Builder dialog = new AlertDialog.Builder(ctx)
|
||||
.setView(input)
|
||||
.setTitle(R.string.pref_custom_layout_title)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int _which)
|
||||
{
|
||||
callback.select(input.getText().toString());
|
||||
}
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null);
|
||||
// Might be true when modifying an existing layout
|
||||
if (allow_remove)
|
||||
dialog.setNeutralButton(R.string.pref_layouts_remove_custom, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int _which)
|
||||
{
|
||||
callback.select(null);
|
||||
}
|
||||
});
|
||||
input.set_on_text_change(new LayoutEntryEditText.OnChangeListener()
|
||||
{
|
||||
public void on_change()
|
||||
{
|
||||
String error = callback.validate(input.getText().toString());
|
||||
input.setError(error);
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
public interface Callback
|
||||
{
|
||||
/** The entered text when the user clicks "OK", [null] when the user
|
||||
cancels editing. */
|
||||
public void select(String text);
|
||||
|
||||
/** Return a human readable error string if the [text] contains an error.
|
||||
Return [null] otherwise. The error string will be displayed atop the
|
||||
input box. This method is called everytime the text changes. */
|
||||
public String validate(String text);
|
||||
}
|
||||
|
||||
/** An editable text view that shows line numbers. */
|
||||
static class LayoutEntryEditText extends EditText
|
||||
{
|
||||
/** Used to draw line numbers. */
|
||||
Paint _ln_paint;
|
||||
OnChangeListener _on_change_listener = null;
|
||||
|
||||
/** Delay validation to when user stops typing for a second. */
|
||||
Handler _on_change_throttler;
|
||||
Runnable _on_change_delayed = new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
OnChangeListener l = LayoutEntryEditText.this._on_change_listener;
|
||||
if (l != null)
|
||||
l.on_change();
|
||||
}
|
||||
};
|
||||
|
||||
public LayoutEntryEditText(Context ctx)
|
||||
{
|
||||
super(ctx);
|
||||
_ln_paint = new Paint(getPaint());
|
||||
_ln_paint.setTextSize(_ln_paint.getTextSize() * 0.8f);
|
||||
setHorizontallyScrolling(true);
|
||||
setInputType(InputType.TYPE_CLASS_TEXT
|
||||
| InputType.TYPE_TEXT_FLAG_MULTI_LINE);
|
||||
_on_change_throttler = new Handler(ctx.getMainLooper());
|
||||
}
|
||||
|
||||
public void set_on_text_change(OnChangeListener l)
|
||||
{
|
||||
_on_change_listener = l;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas)
|
||||
{
|
||||
float digit_width = _ln_paint.measureText("0");
|
||||
int line_count = getLineCount();
|
||||
// Extra '+ 1' serves as padding.
|
||||
setPadding((int)(((int)Math.log10(line_count) + 1 + 1) * digit_width), 0, 0, 0);
|
||||
super.onDraw(canvas);
|
||||
_ln_paint.setColor(getPaint().getColor());
|
||||
Rect clip_bounds = canvas.getClipBounds();
|
||||
Layout layout = getLayout();
|
||||
int offset = clip_bounds.left + (int)(digit_width / 2.f);
|
||||
int line = layout.getLineForVertical(clip_bounds.top);
|
||||
int skipped = line;
|
||||
while (line < line_count)
|
||||
{
|
||||
int baseline = getLineBounds(line, null);
|
||||
canvas.drawText(String.valueOf(line), offset, baseline, _ln_paint);
|
||||
line++;
|
||||
if (baseline >= clip_bounds.bottom)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int _start, int _lengthBefore, int _lengthAfter)
|
||||
{
|
||||
if (_on_change_throttler != null)
|
||||
{
|
||||
_on_change_throttler.removeCallbacks(_on_change_delayed);
|
||||
_on_change_throttler.postDelayed(_on_change_delayed, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
public static interface OnChangeListener
|
||||
{
|
||||
public void on_change();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class EmojiBottomRow extends Keyboard2View
|
||||
{
|
||||
public EmojiBottomRow(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
KeyboardData kw = KeyboardData.load(getResources(), R.xml.emoji_bottom_row);
|
||||
setKeyboard(kw);
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
public class EmojiKeyButton extends Button
|
||||
implements View.OnClickListener
|
||||
{
|
||||
KeyValue _key;
|
||||
|
||||
public EmojiKeyButton(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
setOnClickListener(this);
|
||||
String key_name = attrs.getAttributeValue(null, "key");
|
||||
_key = (key_name == null) ? null : KeyValue.getKeyByName(key_name);
|
||||
setText(_key.getString());
|
||||
if (_key.hasFlags(KeyValue.FLAG_KEY_FONT))
|
||||
setTypeface(Theme.getKeyFont(context));
|
||||
}
|
||||
|
||||
public void onClick(View v)
|
||||
{
|
||||
Config config = Config.globalConfig();
|
||||
config.handler.key_up(_key, Pointers.Modifiers.EMPTY);
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ class ExtraKeys
|
||||
|
||||
/** Add the keys that should be added to the keyboard into [dst]. Keys
|
||||
already added to [dst] might have an impact, see [ExtraKey.compute]. */
|
||||
public void compute(Set<KeyValue> dst, Query q)
|
||||
public void compute(Map<KeyValue, KeyboardData.PreferredPos> dst, Query q)
|
||||
{
|
||||
for (ExtraKey k : _ks)
|
||||
k.compute(dst, q);
|
||||
@@ -63,16 +63,19 @@ class ExtraKeys
|
||||
/** The key will not be added to layout that already contain all the
|
||||
alternatives. */
|
||||
final List<KeyValue> alternatives;
|
||||
/** The key next to which to add. Might be [null]. */
|
||||
final KeyValue next_to;
|
||||
|
||||
ExtraKey(KeyValue kv_, String script_, List<KeyValue> alts_)
|
||||
ExtraKey(KeyValue kv_, String script_, List<KeyValue> alts_, KeyValue next_to_)
|
||||
{
|
||||
kv = kv_;
|
||||
script = script_;
|
||||
alternatives = alts_;
|
||||
next_to = next_to_;
|
||||
}
|
||||
|
||||
/** Whether the key should be added to the keyboard. */
|
||||
public void compute(Set<KeyValue> dst, Query q)
|
||||
public void compute(Map<KeyValue, KeyboardData.PreferredPos> dst, Query q)
|
||||
{
|
||||
// Add the alternative if it's the only one. The list of alternatives is
|
||||
// enforced to be complete by the merging step. The same [kv] will not
|
||||
@@ -80,11 +83,20 @@ class ExtraKeys
|
||||
// alternatives.
|
||||
// Selecting the dead key in the "Add key to the keyboard" option would
|
||||
// disable this behavior for a key.
|
||||
boolean use_alternative = (alternatives.size() == 1 && !dst.contains(kv));
|
||||
boolean use_alternative = (alternatives.size() == 1 && !dst.containsKey(kv));
|
||||
if
|
||||
((q.script == null || script == null || q.script.equals(script))
|
||||
&& (alternatives.size() == 0 || !q.present.containsAll(alternatives)))
|
||||
dst.add(use_alternative ? alternatives.get(0) : kv);
|
||||
{
|
||||
KeyValue kv_ = use_alternative ? alternatives.get(0) : kv;
|
||||
KeyboardData.PreferredPos pos = KeyboardData.PreferredPos.DEFAULT;
|
||||
if (next_to != null)
|
||||
{
|
||||
pos = new KeyboardData.PreferredPos(pos);
|
||||
pos.next_to = next_to;
|
||||
}
|
||||
dst.put(kv_, pos);
|
||||
}
|
||||
}
|
||||
|
||||
/** Return a new key from two. [kv] are expected to be equal. [script] is
|
||||
@@ -92,23 +104,33 @@ class ExtraKeys
|
||||
*/
|
||||
public ExtraKey merge_with(ExtraKey k2)
|
||||
{
|
||||
String script_ =
|
||||
(script != null && k2.script != null && script.equals(k2.script))
|
||||
? script : null;
|
||||
String script_ = one_or_none(script, k2.script);
|
||||
List<KeyValue> alts = new ArrayList<KeyValue>(alternatives);
|
||||
KeyValue next_to_ = one_or_none(next_to, k2.next_to);
|
||||
alts.addAll(k2.alternatives);
|
||||
return new ExtraKey(kv, script_, alts);
|
||||
return new ExtraKey(kv, script_, alts, next_to_);
|
||||
}
|
||||
|
||||
/** Extra keys are of the form "key name" or "key name:alt 1:alt 2". */
|
||||
/** If one of [a] or [b] is null, return the other. If [a] and [b] are
|
||||
equal, return [a]. Otherwise, return null. */
|
||||
<E> E one_or_none(E a, E b)
|
||||
{
|
||||
return (a == null) ? b : (b == null || a.equals(b)) ? a : null;
|
||||
}
|
||||
|
||||
/** Extra keys are of the form "key name" or "key name:alt1:alt2@next_to". */
|
||||
public static ExtraKey parse(String str, String script)
|
||||
{
|
||||
String[] strs = str.split(":");
|
||||
KeyValue kv = KeyValue.getKeyByName(strs[0]);
|
||||
KeyValue[] alts = new KeyValue[strs.length-1];
|
||||
for (int i = 1; i < strs.length; i++)
|
||||
alts[i-1] = KeyValue.getKeyByName(strs[i]);
|
||||
return new ExtraKey(kv, script, Arrays.asList(alts));
|
||||
String[] split_on_at = str.split("@", 2);
|
||||
String[] key_names = split_on_at[0].split(":");
|
||||
KeyValue kv = KeyValue.getKeyByName(key_names[0]);
|
||||
KeyValue[] alts = new KeyValue[key_names.length-1];
|
||||
for (int i = 1; i < key_names.length; i++)
|
||||
alts[i-1] = KeyValue.getKeyByName(key_names[i]);
|
||||
KeyValue next_to = null;
|
||||
if (split_on_at.length > 1)
|
||||
next_to = KeyValue.getKeyByName(split_on_at[1]);
|
||||
return new ExtraKey(kv, script, Arrays.asList(alts), next_to);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@ import android.preference.PreferenceCategory;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import java.util.HashSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/** This class implements the "extra keys" preference but also defines the
|
||||
@@ -46,6 +47,10 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"†",
|
||||
"ª",
|
||||
"º",
|
||||
"page_up",
|
||||
"page_down",
|
||||
"home",
|
||||
"end",
|
||||
"switch_greekmath",
|
||||
"capslock",
|
||||
"copy",
|
||||
@@ -56,9 +61,6 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"pasteAsPlainText",
|
||||
"undo",
|
||||
"redo",
|
||||
"replaceText",
|
||||
"textAssist",
|
||||
"autofill",
|
||||
"superscript",
|
||||
"subscript",
|
||||
};
|
||||
@@ -92,12 +94,14 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
case "pasteAsPlainText": id = R.string.key_descr_pasteAsPlainText; break;
|
||||
case "undo": id = R.string.key_descr_undo; break;
|
||||
case "redo": id = R.string.key_descr_redo; break;
|
||||
case "textAssist": id = R.string.key_descr_textAssist; break;
|
||||
case "autofill": id = R.string.key_descr_autofill; break;
|
||||
case "ª": id = R.string.key_descr_ª; break;
|
||||
case "º": id = R.string.key_descr_º; break;
|
||||
case "superscript": id = R.string.key_descr_superscript; break;
|
||||
case "subscript": id = R.string.key_descr_subscript; break;
|
||||
case "page_up": id = R.string.key_descr_page_up; break;
|
||||
case "page_down": id = R.string.key_descr_page_down; break;
|
||||
case "home": id = R.string.key_descr_home; break;
|
||||
case "end": id = R.string.key_descr_end; break;
|
||||
}
|
||||
if (id == 0)
|
||||
return null;
|
||||
@@ -105,14 +109,15 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
}
|
||||
|
||||
/** Get the set of enabled extra keys. */
|
||||
public static Set<KeyValue> get_extra_keys(SharedPreferences prefs)
|
||||
public static Map<KeyValue, KeyboardData.PreferredPos> get_extra_keys(SharedPreferences prefs)
|
||||
{
|
||||
HashSet<KeyValue> ks = new HashSet<KeyValue>();
|
||||
Map<KeyValue, KeyboardData.PreferredPos> ks =
|
||||
new HashMap<KeyValue, KeyboardData.PreferredPos>();
|
||||
for (String key_name : extra_keys)
|
||||
{
|
||||
if (prefs.getBoolean(pref_key_of_key_name(key_name),
|
||||
default_checked(key_name)))
|
||||
ks.add(KeyValue.getKeyByName(key_name));
|
||||
ks.put(KeyValue.getKeyByName(key_name), KeyboardData.PreferredPos.DEFAULT);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,29 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
_autocap.selection_updated(oldSelStart, newSelStart);
|
||||
}
|
||||
|
||||
/** A key is being pressed. There will not necessarily be a corresponding
|
||||
[key_up] event. */
|
||||
public void key_down(KeyValue key, boolean isSwipe)
|
||||
{
|
||||
if (key == null)
|
||||
return;
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Modifier:
|
||||
// Stop auto capitalisation when activating a system modifier
|
||||
switch (key.getModifier())
|
||||
{
|
||||
case CTRL:
|
||||
case ALT:
|
||||
case META:
|
||||
_autocap.stop();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
/** A key has been released. */
|
||||
public void key_up(KeyValue key, Pointers.Modifiers mods)
|
||||
{
|
||||
@@ -160,14 +183,20 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
}
|
||||
|
||||
/** Move the cursor right or left, if possible without sending key events.
|
||||
Unlike arrow keys, the selection is not removed even if shift is not on. */
|
||||
Unlike arrow keys, the selection is not removed even if shift is not on.
|
||||
Falls back to sending arrow keys events if the editor do not support
|
||||
moving the cursor or a modifier other than shift is pressed. */
|
||||
void move_cursor(int d, Pointers.Modifiers mods)
|
||||
{
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
ExtractedText et = get_cursor_pos(conn);
|
||||
if (et == null) // Editor doesn't support moving the cursor
|
||||
// Fallback to sending key events
|
||||
if (et == null
|
||||
|| mods.has(KeyValue.Modifier.CTRL)
|
||||
|| mods.has(KeyValue.Modifier.ALT)
|
||||
|| mods.has(KeyValue.Modifier.META))
|
||||
{
|
||||
move_cursor_fallback(d, mods);
|
||||
return;
|
||||
|
||||
@@ -20,6 +20,7 @@ final class KeyValue
|
||||
SWITCH_GREEKMATH,
|
||||
CAPS_LOCK,
|
||||
SWITCH_VOICE_TYPING,
|
||||
SWITCH_VOICE_TYPING_CHOOSER,
|
||||
}
|
||||
|
||||
// Must be evaluated in the reverse order of their values.
|
||||
@@ -182,11 +183,6 @@ final class KeyValue
|
||||
return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withString(String s)
|
||||
{
|
||||
return new KeyValue(s, Kind.String, 0, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withSymbol(String s)
|
||||
{
|
||||
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags());
|
||||
@@ -302,13 +298,19 @@ final class KeyValue
|
||||
return new KeyValue("", Kind.Placeholder, id.ordinal(), 0);
|
||||
}
|
||||
|
||||
/** Make a key that types a string. */
|
||||
public static KeyValue makeStringKey(String str)
|
||||
{
|
||||
return makeStringKey(str, 0);
|
||||
}
|
||||
|
||||
/** Make a key that types a string. A char key is returned for a string of
|
||||
length 1. */
|
||||
public static KeyValue makeStringKey(String str, int flags)
|
||||
{
|
||||
if (str.length() == 1)
|
||||
return new KeyValue(str, Kind.Char, str.charAt(0), 0);
|
||||
return new KeyValue(str, Kind.Char, str.charAt(0), flags);
|
||||
else
|
||||
return new KeyValue(str, Kind.String, 0, FLAG_SMALLER_FONT);
|
||||
return new KeyValue(str, Kind.String, 0, flags | FLAG_SMALLER_FONT);
|
||||
}
|
||||
|
||||
public static KeyValue getKeyByName(String name)
|
||||
@@ -368,6 +370,7 @@ final class KeyValue
|
||||
case "action": return eventKey("Action", Event.ACTION, FLAG_SMALLER_FONT); // Will always be replaced
|
||||
case "capslock": return eventKey(0xE012, Event.CAPS_LOCK, 0);
|
||||
case "voice_typing": return eventKey(0xE015, Event.SWITCH_VOICE_TYPING, FLAG_SMALLER_FONT);
|
||||
case "voice_typing_chooser": return eventKey(0xE015, Event.SWITCH_VOICE_TYPING_CHOOSER, FLAG_SMALLER_FONT);
|
||||
|
||||
/* Key events */
|
||||
case "esc": return keyeventKey("Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
|
||||
@@ -454,11 +457,12 @@ final class KeyValue
|
||||
case "pasteAsPlainText": return editingKey(0xE035, Editing.PASTE_PLAIN);
|
||||
case "undo": return editingKey(0xE036, Editing.UNDO);
|
||||
case "redo": return editingKey(0xE037, Editing.REDO);
|
||||
case "cursor_left": return editingKey(0xE008, Editing.CURSOR_LEFT);
|
||||
case "cursor_right": return editingKey(0xE006, Editing.CURSOR_RIGHT);
|
||||
// These keys are not used
|
||||
case "replaceText": return editingKey("repl", Editing.REPLACE);
|
||||
case "textAssist": return editingKey(0xE038, Editing.ASSIST);
|
||||
case "autofill": return editingKey("auto", Editing.AUTOFILL);
|
||||
case "cursor_left": return editingKey(0xE008, Editing.CURSOR_LEFT);
|
||||
case "cursor_right": return editingKey(0xE006, Editing.CURSOR_RIGHT);
|
||||
|
||||
/* Placeholder keys */
|
||||
case "removed": return placeholderKey(Placeholder.REMOVED);
|
||||
|
||||
@@ -29,37 +29,42 @@ public class Keyboard2 extends InputMethodService
|
||||
{
|
||||
private Keyboard2View _keyboardView;
|
||||
private KeyEventHandler _keyeventhandler;
|
||||
// If not 'null', the layout to use instead of [_currentTextLayout].
|
||||
/** If not 'null', the layout to use instead of [_config.current_layout]. */
|
||||
private KeyboardData _currentSpecialLayout;
|
||||
/** Current layout index in [Config.layouts]. */
|
||||
private int _currentTextLayout;
|
||||
// Layout associated with the currently selected locale. Not 'null'.
|
||||
/** Layout associated with the currently selected locale. Not 'null'. */
|
||||
private KeyboardData _localeTextLayout;
|
||||
private ViewGroup _emojiPane = null;
|
||||
public int actionId; // Action performed by the Action key.
|
||||
|
||||
private Config _config;
|
||||
|
||||
/** Layout currently visible before it has been modified. */
|
||||
KeyboardData current_layout_unmodified()
|
||||
{
|
||||
if (_currentSpecialLayout != null)
|
||||
return _currentSpecialLayout;
|
||||
KeyboardData layout = null;
|
||||
int layout_i = _config.get_current_layout();
|
||||
if (layout_i >= _config.layouts.size())
|
||||
layout_i = 0;
|
||||
if (layout_i < _config.layouts.size())
|
||||
layout = _config.layouts.get(layout_i);
|
||||
if (layout == null)
|
||||
layout = _localeTextLayout;
|
||||
return layout;
|
||||
}
|
||||
|
||||
/** Layout currently visible. */
|
||||
KeyboardData current_layout()
|
||||
{
|
||||
if (_currentSpecialLayout != null)
|
||||
return _currentSpecialLayout;
|
||||
KeyboardData layout = null;
|
||||
if (_currentTextLayout >= _config.layouts.size())
|
||||
_currentTextLayout = 0;
|
||||
if (_currentTextLayout < _config.layouts.size())
|
||||
layout = _config.layouts.get(_currentTextLayout);
|
||||
if (layout == null)
|
||||
layout = _localeTextLayout;
|
||||
return _config.modify_layout(layout);
|
||||
return _config.modify_layout(current_layout_unmodified());
|
||||
}
|
||||
|
||||
void setTextLayout(int l)
|
||||
{
|
||||
if (l == _currentTextLayout)
|
||||
return;
|
||||
_currentTextLayout = l;
|
||||
_config.set_current_layout(l);
|
||||
_currentSpecialLayout = null;
|
||||
_keyboardView.setKeyboard(current_layout());
|
||||
}
|
||||
@@ -67,7 +72,7 @@ public class Keyboard2 extends InputMethodService
|
||||
void incrTextLayout(int delta)
|
||||
{
|
||||
int s = _config.layouts.size();
|
||||
setTextLayout((_currentTextLayout + delta + s) % s);
|
||||
setTextLayout((_config.get_current_layout() + delta + s) % s);
|
||||
}
|
||||
|
||||
void setSpecialLayout(KeyboardData l)
|
||||
@@ -84,7 +89,8 @@ public class Keyboard2 extends InputMethodService
|
||||
/** Load a layout that contains a numpad (eg. the pin entry). */
|
||||
KeyboardData loadNumpad(int layout_id)
|
||||
{
|
||||
return _config.modify_numpad(KeyboardData.load(getResources(), layout_id));
|
||||
return _config.modify_numpad(KeyboardData.load(getResources(), layout_id),
|
||||
current_layout_unmodified());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -145,7 +151,7 @@ public class Keyboard2 extends InputMethodService
|
||||
_config.shouldOfferSwitchingToNextInputMethod = true;
|
||||
else
|
||||
_config.shouldOfferSwitchingToNextInputMethod = shouldOfferSwitchingToNextInputMethod();
|
||||
_config.shouldOfferVoiceTyping = (get_voice_typing_im(imm) != null);
|
||||
_config.shouldOfferVoiceTyping = true;
|
||||
KeyboardData default_layout = null;
|
||||
_config.extra_keys_subtype = null;
|
||||
if (VERSION.SDK_INT >= 12)
|
||||
@@ -218,20 +224,6 @@ public class Keyboard2 extends InputMethodService
|
||||
_keyboardView.reset();
|
||||
}
|
||||
|
||||
/** Returns the id and subtype of the voice typing IM. Returns [null] if none
|
||||
is installed or if the feature is unsupported. */
|
||||
SimpleEntry<String, InputMethodSubtype> get_voice_typing_im(InputMethodManager imm)
|
||||
{
|
||||
if (VERSION.SDK_INT < 11) // Due to InputMethodSubtype
|
||||
return null;
|
||||
for (InputMethodInfo im : imm.getEnabledInputMethodList())
|
||||
for (InputMethodSubtype imst : imm.getEnabledInputMethodSubtypeList(im, true))
|
||||
// Switch to the first IM that has a subtype of this mode
|
||||
if (imst.getMode().equals("voice"))
|
||||
return new SimpleEntry(im.getId(), imst);
|
||||
return null;
|
||||
}
|
||||
|
||||
private KeyboardData refresh_special_layout(EditorInfo info)
|
||||
{
|
||||
switch (info.inputType & InputType.TYPE_MASK_CLASS)
|
||||
@@ -427,14 +419,14 @@ public class Keyboard2 extends InputMethodService
|
||||
break;
|
||||
|
||||
case SWITCH_VOICE_TYPING:
|
||||
SimpleEntry<String, InputMethodSubtype> im = get_voice_typing_im(get_imm());
|
||||
if (im == null)
|
||||
return;
|
||||
// Best-effort. Good enough for triggering Google's voice typing.
|
||||
if (VERSION.SDK_INT < 28)
|
||||
switchInputMethod(im.getKey());
|
||||
else
|
||||
switchInputMethod(im.getKey(), im.getValue());
|
||||
if (!VoiceImeSwitcher.switch_to_voice_ime(Keyboard2.this, get_imm(),
|
||||
Config.globalPrefs()))
|
||||
_config.shouldOfferVoiceTyping = false;
|
||||
break;
|
||||
|
||||
case SWITCH_VOICE_TYPING_CHOOSER:
|
||||
VoiceImeSwitcher.choose_voice_ime(Keyboard2.this, get_imm(),
|
||||
Config.globalPrefs());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,9 @@ public class Keyboard2View extends View
|
||||
implements View.OnTouchListener, Pointers.IPointerEventHandler
|
||||
{
|
||||
private KeyboardData _keyboard;
|
||||
|
||||
/** The key holding the shift key is used to set shift state from
|
||||
autocapitalisation. */
|
||||
private KeyValue _shift_kv;
|
||||
private KeyboardData.Key _shift_key;
|
||||
|
||||
@@ -113,7 +116,7 @@ public class Keyboard2View extends View
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_FAKE_PTR) != 0)
|
||||
if ((flags & KeyValue.FLAG_FAKE_PTR) == 0)
|
||||
return; // Don't remove locked pointers
|
||||
_pointers.remove_fake_pointer(_shift_kv, _shift_key);
|
||||
}
|
||||
@@ -134,8 +137,9 @@ public class Keyboard2View extends View
|
||||
return KeyModifier.modify(k, mods);
|
||||
}
|
||||
|
||||
public void onPointerDown(boolean isSwipe)
|
||||
public void onPointerDown(KeyValue k, boolean isSwipe)
|
||||
{
|
||||
_config.handler.key_down(k, isSwipe);
|
||||
invalidate();
|
||||
vibrate();
|
||||
}
|
||||
|
||||
@@ -25,36 +25,89 @@ class KeyboardData
|
||||
public final Modmap modmap;
|
||||
/** Might be null. */
|
||||
public final String script;
|
||||
/** Might be different from [script]. Might be null. */
|
||||
public final String numpad_script;
|
||||
/** Position of every keys on the layout, see [getKeys()]. */
|
||||
private Map<KeyValue, KeyPos> _key_pos = null;
|
||||
|
||||
public KeyboardData mapKeys(MapKey f)
|
||||
{
|
||||
ArrayList<Row> rows_ = new ArrayList<Row>();
|
||||
for (Row r : rows)
|
||||
rows_.add(r.mapKeys(f));
|
||||
return new KeyboardData(rows_, keysWidth, modmap, script);
|
||||
return new KeyboardData(this, rows_);
|
||||
}
|
||||
|
||||
/** Add keys from the given iterator into the keyboard. Extra keys are added
|
||||
* on the empty key4 corner of the second row, from right to left. If there's
|
||||
* not enough room, key3 of the second row is tried then key2 and key1 of the
|
||||
* third row. */
|
||||
public KeyboardData addExtraKeys(Iterator<KeyValue> k)
|
||||
/** Add keys from the given iterator into the keyboard. Preferred position is
|
||||
specified via [PreferredPos]. */
|
||||
public KeyboardData addExtraKeys(Iterator<Map.Entry<KeyValue, PreferredPos>> extra_keys)
|
||||
{
|
||||
/* Keys that couldn't be placed at their preferred position. */
|
||||
ArrayList<KeyValue> unplaced_keys = new ArrayList<KeyValue>();
|
||||
ArrayList<Row> rows = new ArrayList<Row>(this.rows);
|
||||
addExtraKeys_to_row(rows, k, 1, 4);
|
||||
addExtraKeys_to_row(rows, k, 1, 3);
|
||||
addExtraKeys_to_row(rows, k, 2, 2);
|
||||
addExtraKeys_to_row(rows, k, 2, 1);
|
||||
if (k.hasNext())
|
||||
while (extra_keys.hasNext())
|
||||
{
|
||||
for (int r = 0; r < rows.size(); r++)
|
||||
for (int c = 1; c <= 4; c++)
|
||||
addExtraKeys_to_row(rows, k, r, c);
|
||||
Map.Entry<KeyValue, PreferredPos> kp = extra_keys.next();
|
||||
if (!add_key_to_preferred_pos(rows, kp.getKey(), kp.getValue()))
|
||||
unplaced_keys.add(kp.getKey());
|
||||
}
|
||||
return new KeyboardData(rows, keysWidth, modmap, script);
|
||||
for (KeyValue kv : unplaced_keys)
|
||||
add_key_to_preferred_pos(rows, kv, PreferredPos.ANYWHERE);
|
||||
return new KeyboardData(this, rows);
|
||||
}
|
||||
|
||||
public KeyboardData addNumPad()
|
||||
/** Place a key on the keyboard according to its preferred position. Mutates
|
||||
[rows]. Returns [false] if it couldn't be placed. */
|
||||
boolean add_key_to_preferred_pos(List<Row> rows, KeyValue kv, PreferredPos pos)
|
||||
{
|
||||
if (pos.next_to != null)
|
||||
{
|
||||
KeyPos next_to_pos = getKeys().get(pos.next_to);
|
||||
if (next_to_pos != null
|
||||
&& add_key_to_pos(rows, kv, next_to_pos.with_dir(-1)))
|
||||
return true;
|
||||
}
|
||||
for (KeyPos p : pos.positions)
|
||||
if (add_key_to_pos(rows, kv, p))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Place a key on the keyboard. A value of [-1] in one of the coordinate
|
||||
means that the key can be placed anywhere in that coordinate, see
|
||||
[PreferredPos]. Mutates [rows]. Returns [false] if it couldn't be placed.
|
||||
*/
|
||||
boolean add_key_to_pos(List<Row> rows, KeyValue kv, KeyPos p)
|
||||
{
|
||||
int i_row = p.row;
|
||||
int i_row_end = p.row;
|
||||
if (p.row == -1) { i_row = 0; i_row_end = rows.size() - 1; }
|
||||
for (; i_row <= i_row_end; i_row++)
|
||||
{
|
||||
Row row = rows.get(i_row);
|
||||
int i_col = p.col;
|
||||
int i_col_end = p.col;
|
||||
if (p.col == -1) { i_col = 0; i_col_end = row.keys.size() - 1; }
|
||||
for (; i_col <= i_col_end; i_col++)
|
||||
{
|
||||
Key col = row.keys.get(i_col);
|
||||
int i_dir = p.dir;
|
||||
int i_dir_end = p.dir;
|
||||
if (p.dir == -1) { i_dir = 1; i_dir_end = 4; }
|
||||
for (; i_dir <= i_dir_end; i_dir++)
|
||||
{
|
||||
if (col.getKeyValue(i_dir) == null)
|
||||
{
|
||||
row.keys.set(i_col, col.withKeyValue(i_dir, kv));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public KeyboardData addNumPad(KeyboardData num_pad)
|
||||
{
|
||||
ArrayList<Row> extendedRows = new ArrayList<Row>();
|
||||
Iterator<Row> iterNumPadRows = num_pad.rows.iterator();
|
||||
@@ -74,46 +127,34 @@ class KeyboardData
|
||||
}
|
||||
extendedRows.add(new Row(keys, row.height, row.shift));
|
||||
}
|
||||
return new
|
||||
KeyboardData(extendedRows, compute_max_width(extendedRows), modmap, script);
|
||||
return new KeyboardData(this, extendedRows);
|
||||
}
|
||||
|
||||
public KeyboardData addNumberRow()
|
||||
{
|
||||
ArrayList<Row> rows_ = new ArrayList<Row>(this.rows);
|
||||
rows_.add(0, number_row.updateWidth(keysWidth));
|
||||
return new KeyboardData(rows_, keysWidth, modmap, script);
|
||||
return new KeyboardData(this, rows_);
|
||||
}
|
||||
|
||||
public Key findKeyWithValue(KeyValue kv)
|
||||
{
|
||||
for (Row r : rows)
|
||||
KeyPos pos = getKeys().get(kv);
|
||||
if (pos == null || pos.row >= rows.size())
|
||||
return null;
|
||||
return rows.get(pos.row).get_key_at_pos(pos);
|
||||
}
|
||||
|
||||
/** This is computed once and cached. */
|
||||
public Map<KeyValue, KeyPos> getKeys()
|
||||
{
|
||||
if (_key_pos == null)
|
||||
{
|
||||
Key k = r.findKeyWithValue(kv);
|
||||
if (k != null)
|
||||
return k;
|
||||
_key_pos = new HashMap<KeyValue, KeyPos>();
|
||||
for (int r = 0; r < rows.size(); r++)
|
||||
rows.get(r).getKeys(_key_pos, r);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void getKeys(Set<KeyValue> dst)
|
||||
{
|
||||
for (Row r : rows)
|
||||
r.getKeys(dst);
|
||||
}
|
||||
|
||||
private static void addExtraKeys_to_row(ArrayList<Row> rows, final Iterator<KeyValue> extra_keys, int row_i, final int d)
|
||||
{
|
||||
if (!extra_keys.hasNext() || row_i >= rows.size())
|
||||
return;
|
||||
rows.set(row_i, rows.get(row_i).mapKeys(new MapKey(){
|
||||
public Key apply(Key k) {
|
||||
if (k.getKeyValue(d) == null && extra_keys.hasNext())
|
||||
return k.withKeyValue(d, extra_keys.next());
|
||||
else
|
||||
return k;
|
||||
}
|
||||
}));
|
||||
return _key_pos;
|
||||
}
|
||||
|
||||
public static Row bottom_row;
|
||||
@@ -161,9 +202,7 @@ class KeyboardData
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlPullParser parser = Xml.newPullParser();
|
||||
parser.setInput(new StringReader(src));
|
||||
return parse_keyboard(parser);
|
||||
return load_string_exn(src);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -171,13 +210,25 @@ class KeyboardData
|
||||
}
|
||||
}
|
||||
|
||||
/** Like [load_string] but throws an exception on error and do not return
|
||||
[null]. */
|
||||
public static KeyboardData load_string_exn(String src) throws Exception
|
||||
{
|
||||
XmlPullParser parser = Xml.newPullParser();
|
||||
parser.setInput(new StringReader(src));
|
||||
return parse_keyboard(parser);
|
||||
}
|
||||
|
||||
private static KeyboardData parse_keyboard(XmlPullParser parser) throws Exception
|
||||
{
|
||||
if (!expect_tag(parser, "keyboard"))
|
||||
throw new Exception("Empty layout file");
|
||||
throw error(parser, "Expected tag <keyboard>");
|
||||
boolean add_bottom_row = attribute_bool(parser, "bottom_row", true);
|
||||
float specified_kw = attribute_float(parser, "width", 0f);
|
||||
String script = parser.getAttributeValue(null, "script");
|
||||
String numpad_script = parser.getAttributeValue(null, "numpad_script");
|
||||
if (numpad_script == null)
|
||||
numpad_script = script;
|
||||
ArrayList<Row> rows = new ArrayList<Row>();
|
||||
Modmap modmap = null;
|
||||
while (next_tag(parser))
|
||||
@@ -191,13 +242,13 @@ class KeyboardData
|
||||
modmap = Modmap.parse(parser);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Unknown tag: " + parser.getName());
|
||||
throw error(parser, "Expecting tag <row>, got <" + parser.getName() + ">");
|
||||
}
|
||||
}
|
||||
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
|
||||
if (add_bottom_row)
|
||||
rows.add(bottom_row.updateWidth(kw));
|
||||
return new KeyboardData(rows, kw, modmap, script);
|
||||
return new KeyboardData(rows, kw, modmap, script, numpad_script);
|
||||
}
|
||||
|
||||
private static float compute_max_width(List<Row> rows)
|
||||
@@ -211,11 +262,11 @@ class KeyboardData
|
||||
private static Row parse_row(XmlPullParser parser) throws Exception
|
||||
{
|
||||
if (!expect_tag(parser, "row"))
|
||||
throw new Exception("Failed to parse row");
|
||||
throw error(parser, "Expected tag <row>");
|
||||
return Row.parse(parser);
|
||||
}
|
||||
|
||||
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc)
|
||||
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc, String npsc)
|
||||
{
|
||||
float kh = 0.f;
|
||||
for (Row r : rows_)
|
||||
@@ -223,10 +274,17 @@ class KeyboardData
|
||||
rows = rows_;
|
||||
modmap = mm;
|
||||
script = sc;
|
||||
numpad_script = npsc;
|
||||
keysWidth = kw;
|
||||
keysHeight = kh;
|
||||
}
|
||||
|
||||
/** Copies the fields of an other keyboard, with rows changed. */
|
||||
protected KeyboardData(KeyboardData src, List<Row> rows)
|
||||
{
|
||||
this(rows, compute_max_width(rows), src.modmap, src.script, src.numpad_script);
|
||||
}
|
||||
|
||||
public static class Row
|
||||
{
|
||||
public final List<Key> keys;
|
||||
@@ -258,10 +316,22 @@ class KeyboardData
|
||||
return new Row(keys, h, shift);
|
||||
}
|
||||
|
||||
public void getKeys(Set<KeyValue> dst)
|
||||
public Row copy()
|
||||
{
|
||||
for (Key k : keys)
|
||||
k.getKeys(dst);
|
||||
return new Row(new ArrayList<Key>(keys), height, shift);
|
||||
}
|
||||
|
||||
public void getKeys(Map<KeyValue, KeyPos> dst, int row)
|
||||
{
|
||||
for (int c = 0; c < keys.size(); c++)
|
||||
keys.get(c).getKeys(dst, row, c);
|
||||
}
|
||||
|
||||
public Map<KeyValue, KeyPos> getKeys(int row)
|
||||
{
|
||||
Map<KeyValue, KeyPos> dst = new HashMap<KeyValue, KeyPos>();
|
||||
getKeys(dst, row);
|
||||
return dst;
|
||||
}
|
||||
|
||||
public Row mapKeys(MapKey f)
|
||||
@@ -281,12 +351,11 @@ class KeyboardData
|
||||
});
|
||||
}
|
||||
|
||||
public Key findKeyWithValue(KeyValue kv)
|
||||
public Key get_key_at_pos(KeyPos pos)
|
||||
{
|
||||
for (Key k : keys)
|
||||
if (k.hasValue(kv))
|
||||
return k;
|
||||
return null;
|
||||
if (pos.col >= keys.size())
|
||||
return null;
|
||||
return keys.get(pos.col);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,11 +453,11 @@ class KeyboardData
|
||||
return new Key(keys, keysflags, width * s, shift, slider, indication);
|
||||
}
|
||||
|
||||
public void getKeys(Set<KeyValue> dst)
|
||||
public void getKeys(Map<KeyValue, KeyPos> dst, int row, int col)
|
||||
{
|
||||
for (int i = 0; i < keys.length; i++)
|
||||
if (keys[i] != null)
|
||||
dst.add(keys[i]);
|
||||
dst.put(keys[i], new KeyPos(row, col, i));
|
||||
}
|
||||
|
||||
public KeyValue getKeyValue(int i)
|
||||
@@ -464,6 +533,66 @@ class KeyboardData
|
||||
}
|
||||
}
|
||||
|
||||
/** Position of a key on the layout. */
|
||||
public final static class KeyPos
|
||||
{
|
||||
public final int row;
|
||||
public final int col;
|
||||
public final int dir;
|
||||
|
||||
public KeyPos(int r, int c, int d)
|
||||
{
|
||||
row = r;
|
||||
col = c;
|
||||
dir = d;
|
||||
}
|
||||
|
||||
public KeyPos with_dir(int d)
|
||||
{
|
||||
return new KeyPos(row, col, d);
|
||||
}
|
||||
}
|
||||
|
||||
/** See [addExtraKeys()]. */
|
||||
public final static class PreferredPos
|
||||
{
|
||||
public static final PreferredPos DEFAULT;
|
||||
public static final PreferredPos ANYWHERE;
|
||||
|
||||
/** Prefer the free position on the same keyboard key as the specified key.
|
||||
Considered before [positions]. Might be [null]. */
|
||||
public KeyValue next_to = null;
|
||||
|
||||
/** Array of positions to try in order. The special value [-1] as [row],
|
||||
[col] or [dir] means that the field is unspecified. Every possible
|
||||
values are tried for unspecified fields. Unspecified fields are
|
||||
searched in this order: [dir], [col], [row]. */
|
||||
public KeyPos[] positions = ANYWHERE_POSITIONS;
|
||||
|
||||
public PreferredPos() {}
|
||||
|
||||
public PreferredPos(PreferredPos src)
|
||||
{
|
||||
next_to = src.next_to;
|
||||
positions = src.positions;
|
||||
}
|
||||
|
||||
static final KeyPos[] ANYWHERE_POSITIONS =
|
||||
new KeyPos[]{ new KeyPos(-1, -1, -1) };
|
||||
|
||||
static
|
||||
{
|
||||
DEFAULT = new PreferredPos();
|
||||
DEFAULT.positions = new KeyPos[]{
|
||||
new KeyPos(1, -1, 4),
|
||||
new KeyPos(1, -1, 3),
|
||||
new KeyPos(2, -1, 2),
|
||||
new KeyPos(2, -1, 1)
|
||||
};
|
||||
ANYWHERE = new PreferredPos();
|
||||
}
|
||||
}
|
||||
|
||||
/** Parsing utils */
|
||||
|
||||
/** Returns [false] on [END_DOCUMENT] or [END_TAG], [true] otherwise. */
|
||||
@@ -486,7 +615,8 @@ class KeyboardData
|
||||
if (!next_tag(parser))
|
||||
return false;
|
||||
if (!parser.getName().equals(name))
|
||||
throw new Exception("Unknown tag: " + parser.getName());
|
||||
throw error(parser, "Expecting tag <" + name + ">, got <" +
|
||||
parser.getName() + ">");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -505,4 +635,10 @@ class KeyboardData
|
||||
return default_val;
|
||||
return Float.parseFloat(val);
|
||||
}
|
||||
|
||||
/** Construct a parsing error. */
|
||||
private static Exception error(XmlPullParser parser, String message)
|
||||
{
|
||||
return new Exception(message + " " + parser.getPositionDescription());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,17 +2,23 @@ package juloo.keyboard2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Build.VERSION;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.VideoView;
|
||||
|
||||
public class LauncherActivity extends Activity
|
||||
{
|
||||
/** Text is replaced when receiving key events. */
|
||||
VideoView _intro_video;
|
||||
TextView _tryhere_text;
|
||||
EditText _tryhere_area;
|
||||
|
||||
@@ -21,11 +27,13 @@ public class LauncherActivity extends Activity
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.launcher_activity);
|
||||
_intro_video = (VideoView)findViewById(R.id.launcher_intro_video);
|
||||
_tryhere_text = (TextView)findViewById(R.id.launcher_tryhere_text);
|
||||
_tryhere_area = (EditText)findViewById(R.id.launcher_tryhere_area);
|
||||
if (VERSION.SDK_INT > 28)
|
||||
_tryhere_area.addOnUnhandledKeyEventListener(
|
||||
this.new Tryhere_OnUnhandledKeyEventListener());
|
||||
setup_intro_video(_intro_video);
|
||||
}
|
||||
|
||||
public void launch_imesettings(View _btn)
|
||||
@@ -33,6 +41,40 @@ public class LauncherActivity extends Activity
|
||||
startActivity(new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS));
|
||||
}
|
||||
|
||||
public void launch_imepicker(View v)
|
||||
{
|
||||
InputMethodManager imm =
|
||||
(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
|
||||
imm.showInputMethodPicker();
|
||||
}
|
||||
|
||||
static void setup_intro_video(final VideoView v)
|
||||
{
|
||||
if (VERSION.SDK_INT >= 26)
|
||||
v.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
|
||||
v.setVideoURI(Uri.parse("android.resource://" +
|
||||
v.getContext().getPackageName() + "/" + R.raw.intro_video));
|
||||
v.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
|
||||
{
|
||||
@Override
|
||||
public void onPrepared(MediaPlayer mp)
|
||||
{
|
||||
mp.setLooping(true);
|
||||
}
|
||||
});
|
||||
v.setOnErrorListener(new MediaPlayer.OnErrorListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onError(MediaPlayer mp, int what, int extra)
|
||||
{
|
||||
v.stopPlayback();
|
||||
v.setVisibility(View.GONE);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
v.start();
|
||||
}
|
||||
|
||||
final class Tryhere_OnUnhandledKeyEventListener implements View.OnUnhandledKeyEventListener
|
||||
{
|
||||
public boolean onUnhandledKeyEvent(View v, KeyEvent ev)
|
||||
|
||||
@@ -8,7 +8,6 @@ import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.EditText;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
@@ -152,7 +151,7 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
callback.select(new SystemLayout());
|
||||
break;
|
||||
case "custom":
|
||||
select_custom(callback, "");
|
||||
select_custom(callback, read_initial_custom_layout());
|
||||
break;
|
||||
default:
|
||||
callback.select(new NamedLayout(name));
|
||||
@@ -167,27 +166,31 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
description when modifying a layout. */
|
||||
void select_custom(final SelectionCallback callback, String initial_text)
|
||||
{
|
||||
final EditText input = new EditText(getContext());
|
||||
input.setText(initial_text);
|
||||
AlertDialog.Builder dialog = new AlertDialog.Builder(getContext())
|
||||
.setView(input)
|
||||
.setTitle(R.string.pref_custom_layout_title)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int _which)
|
||||
boolean allow_remove = callback.allow_remove() && _values.size() > 1;
|
||||
CustomLayoutEditDialog.show(getContext(), initial_text, allow_remove,
|
||||
new CustomLayoutEditDialog.Callback()
|
||||
{
|
||||
callback.select(new CustomLayout(input.getText().toString()));
|
||||
}
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null);
|
||||
// Might be true when modifying an existing layout
|
||||
if (callback.allow_remove() && _values.size() > 1)
|
||||
dialog.setNeutralButton(R.string.pref_layouts_remove_custom, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int _which)
|
||||
{
|
||||
callback.select(null);
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
public void select(String text)
|
||||
{
|
||||
if (text == null)
|
||||
callback.select(null);
|
||||
else
|
||||
callback.select(new CustomLayout(text));
|
||||
}
|
||||
|
||||
public String validate(String text)
|
||||
{
|
||||
try
|
||||
{
|
||||
KeyboardData.load_string_exn(text);
|
||||
return null; // Validation passed
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return e.getMessage();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Called when modifying a layout. Custom layouts behave differently. */
|
||||
@@ -200,6 +203,21 @@ public class LayoutsPreference extends ListGroupPreference<LayoutsPreference.Lay
|
||||
select(callback);
|
||||
}
|
||||
|
||||
/** The initial text for the custom layout entry box. The qwerty_us layout is
|
||||
a good default and contains a bit of documentation. */
|
||||
String read_initial_custom_layout()
|
||||
{
|
||||
try
|
||||
{
|
||||
Resources res = getContext().getResources();
|
||||
return Utils.read_all_utf8(res.openRawResource(R.raw.latn_qwerty_us));
|
||||
}
|
||||
catch (Exception _e)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
class LayoutsAddButton extends AddButton
|
||||
{
|
||||
public LayoutsAddButton(Context ctx)
|
||||
|
||||
@@ -172,7 +172,7 @@ public final class Pointers implements Handler.Callback
|
||||
Pointer ptr = new Pointer(pointerId, key, value, x, y, mods);
|
||||
_ptrs.add(ptr);
|
||||
startKeyRepeat(ptr);
|
||||
_handler.onPointerDown(false);
|
||||
_handler.onPointerDown(value, false);
|
||||
}
|
||||
|
||||
static final int[] DIRECTION_TO_INDEX = new int[]{
|
||||
@@ -263,7 +263,7 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
startSliding(ptr, dy);
|
||||
}
|
||||
_handler.onPointerDown(true);
|
||||
_handler.onPointerDown(newValue, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -383,7 +383,7 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
ptr.value = kv;
|
||||
ptr.flags = kv.getFlags();
|
||||
_handler.onPointerDown(true);
|
||||
_handler.onPointerDown(kv, true);
|
||||
return true;
|
||||
}
|
||||
// Stop repeating: Special keys
|
||||
@@ -522,8 +522,9 @@ public final class Pointers implements Handler.Callback
|
||||
public KeyValue modifyKey(KeyValue k, Modifiers flags);
|
||||
|
||||
/** A key is pressed. [getModifiers()] is uptodate. Might be called after a
|
||||
press or a swipe to a different value. */
|
||||
public void onPointerDown(boolean isSwipe);
|
||||
press or a swipe to a different value. Down events are not paired with
|
||||
up events. */
|
||||
public void onPointerDown(KeyValue k, boolean isSwipe);
|
||||
|
||||
/** Key is released. [k] is the key that was returned by
|
||||
[modifySelectedKey] or [modifySelectedKey]. */
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.os.IBinder;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
class Utils
|
||||
{
|
||||
/** Turn the first letter of a string uppercase. */
|
||||
public static String capitalize_string(String s)
|
||||
{
|
||||
// Make sure not to cut a code point in half
|
||||
int i = s.offsetByCodePoints(0, 1);
|
||||
return s.substring(0, i).toUpperCase() + s.substring(i);
|
||||
}
|
||||
|
||||
/** Like [dialog.show()] but properly configure layout params when called
|
||||
from an IME. [token] is the input view's [getWindowToken()]. */
|
||||
public static void show_dialog_on_ime(AlertDialog dialog, IBinder token)
|
||||
{
|
||||
Window win = dialog.getWindow();
|
||||
WindowManager.LayoutParams lp = win.getAttributes();
|
||||
lp.token = token;
|
||||
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
|
||||
win.setAttributes(lp);
|
||||
win.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
public static String read_all_utf8(InputStream inp) throws Exception
|
||||
{
|
||||
InputStreamReader reader = new InputStreamReader(inp, "UTF-8");
|
||||
StringBuilder out = new StringBuilder();
|
||||
int buff_length = 8000;
|
||||
char[] buff = new char[buff_length];
|
||||
int l;
|
||||
while ((l = reader.read(buff, 0, buff_length)) != -1)
|
||||
out.append(buff, 0, l);
|
||||
return out.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Build.VERSION;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.view.inputmethod.InputMethodSubtype;
|
||||
import android.widget.ArrayAdapter;
|
||||
import java.util.AbstractMap.SimpleEntry;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
class VoiceImeSwitcher
|
||||
{
|
||||
static final String PREF_LAST_USED = "voice_ime_last_used";
|
||||
static final String PREF_KNOWN_IMES = "voice_ime_known";
|
||||
|
||||
/** Switch to the voice ime. This might open a chooser popup. Preferences are
|
||||
used to store the last selected voice ime and to detect whether the
|
||||
chooser popup must be shown. Returns [false] if the detection failed and
|
||||
is unlikely to succeed. */
|
||||
public static boolean switch_to_voice_ime(InputMethodService ims,
|
||||
InputMethodManager imm, SharedPreferences prefs)
|
||||
{
|
||||
if (VERSION.SDK_INT < 11) // Due to InputMethodSubtype
|
||||
return false;
|
||||
List<IME> imes = get_voice_ime_list(imm);
|
||||
String last_used = prefs.getString(PREF_LAST_USED, null);
|
||||
String last_known_imes = prefs.getString(PREF_KNOWN_IMES, null);
|
||||
IME last_used_ime = get_ime_by_id(imes, last_used);
|
||||
if (imes.size() == 0)
|
||||
return false;
|
||||
if (last_used == null || last_known_imes == null || last_used_ime == null
|
||||
|| !last_known_imes.equals(serialize_ime_ids(imes)))
|
||||
choose_voice_ime_and_update_prefs(ims, prefs, imes);
|
||||
else
|
||||
switch_input_method(ims, last_used_ime);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean choose_voice_ime(InputMethodService ims,
|
||||
InputMethodManager imm, SharedPreferences prefs)
|
||||
{
|
||||
if (VERSION.SDK_INT < 11) // Due to InputMethodSubtype
|
||||
return false;
|
||||
List<IME> imes = get_voice_ime_list(imm);
|
||||
choose_voice_ime_and_update_prefs(ims, prefs, imes);
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Show the voice IME chooser popup and switch to the selected IME.
|
||||
Preferences are updated so that future calls to [switch_to_voice_ime]
|
||||
switch to the newly selected IME. */
|
||||
static void choose_voice_ime_and_update_prefs(final InputMethodService ims,
|
||||
final SharedPreferences prefs, final List<IME> imes)
|
||||
{
|
||||
List<String> ime_display_names = get_ime_display_names(ims, imes);
|
||||
ArrayAdapter layouts = new ArrayAdapter(ims, android.R.layout.simple_list_item_1, ime_display_names);
|
||||
AlertDialog dialog = new AlertDialog.Builder(ims)
|
||||
.setAdapter(layouts, new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int which)
|
||||
{
|
||||
IME selected = imes.get(which);
|
||||
prefs.edit()
|
||||
.putString(PREF_LAST_USED, selected.get_id())
|
||||
.putString(PREF_KNOWN_IMES, serialize_ime_ids(imes))
|
||||
.commit();
|
||||
switch_input_method(ims, selected);
|
||||
}
|
||||
})
|
||||
.create();
|
||||
Utils.show_dialog_on_ime(dialog, ims.getWindow().getWindow().getDecorView().getWindowToken());
|
||||
}
|
||||
|
||||
static void switch_input_method(InputMethodService ims, IME ime)
|
||||
{
|
||||
if (VERSION.SDK_INT < 28)
|
||||
ims.switchInputMethod(ime.get_id());
|
||||
else
|
||||
ims.switchInputMethod(ime.get_id(), ime.subtype);
|
||||
}
|
||||
|
||||
static IME get_ime_by_id(List<IME> imes, String id)
|
||||
{
|
||||
if (id != null)
|
||||
for (IME ime : imes)
|
||||
if (ime.get_id().equals(id))
|
||||
return ime;
|
||||
return null;
|
||||
}
|
||||
|
||||
static List<String> get_ime_display_names(InputMethodService ims, List<IME> imes)
|
||||
{
|
||||
List<String> names = new ArrayList<String>();
|
||||
for (IME ime : imes)
|
||||
names.add(ime.get_display_name(ims));
|
||||
return names;
|
||||
}
|
||||
|
||||
static List<IME> get_voice_ime_list(InputMethodManager imm)
|
||||
{
|
||||
List<IME> imes = new ArrayList<IME>();
|
||||
for (InputMethodInfo im : imm.getEnabledInputMethodList())
|
||||
for (InputMethodSubtype imst : imm.getEnabledInputMethodSubtypeList(im, true))
|
||||
if (imst.getMode().equals("voice"))
|
||||
imes.add(new IME(im, imst));
|
||||
return imes;
|
||||
}
|
||||
|
||||
/** The chooser popup is shown whether this string changes. */
|
||||
static String serialize_ime_ids(List<IME> imes)
|
||||
{
|
||||
StringBuilder b = new StringBuilder();
|
||||
for (IME ime : imes)
|
||||
{
|
||||
b.append(ime.get_id());
|
||||
b.append(',');
|
||||
}
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
static class IME
|
||||
{
|
||||
public final InputMethodInfo im;
|
||||
public final InputMethodSubtype subtype;
|
||||
|
||||
IME(InputMethodInfo im_, InputMethodSubtype st)
|
||||
{
|
||||
im = im_;
|
||||
subtype = st;
|
||||
}
|
||||
|
||||
String get_id() { return im.getId(); }
|
||||
|
||||
/** Localised display name. */
|
||||
String get_display_name(Context ctx)
|
||||
{
|
||||
String subtype_name = "";
|
||||
if (VERSION.SDK_INT >= 14)
|
||||
{
|
||||
subtype_name = subtype.getDisplayName(ctx, im.getPackageName(), null).toString();
|
||||
if (!subtype_name.equals(""))
|
||||
subtype_name = " - " + subtype_name;
|
||||
}
|
||||
return im.loadLabel(ctx.getPackageManager()).toString() + subtype_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,6 @@
|
||||
<!-- IcoMoon-Free 227-smile2 CC BY 4.0 -->
|
||||
<!-- Generated by IcoMoon.io -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="#000000" d="M8 0c-4.418 0-8 3.582-8 8s3.582 8 8 8 8-3.582 8-8-3.582-8-8-8zM11 4c0.552 0 1 0.448 1 1s-0.448 1-1 1-1-0.448-1-1 0.448-1 1-1zM5 4c0.552 0 1 0.448 1 1s-0.448 1-1 1-1-0.448-1-1 0.448-1 1-1zM8 13c-1.82 0-3.413-0.973-4.288-2.427l1.286-0.772c0.612 1.018 1.727 1.699 3.002 1.699s2.389-0.681 3.002-1.699l1.286 0.772c-0.874 1.454-2.467 2.427-4.288 2.427z"></path>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 742 B After Width: | Height: | Size: 699 B |
@@ -2,7 +2,7 @@
|
||||
<!-- IcoMoon-Free 327-move-up CC BY 4.0 -->
|
||||
<!-- Generated by IcoMoon.io -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="#000000" d="M11 8v6h1v-6h2.5l-3-3-3 3z"></path>
|
||||
<path fill="#000000" d="M1 3h1.5v1h-1.5v-1z"></path>
|
||||
<path fill="#000000" d="M3 3h1.5v1h-1.5v-1z"></path>
|
||||
|
||||
|
Before Width: | Height: | Size: 921 B After Width: | Height: | Size: 878 B |
@@ -2,7 +2,7 @@
|
||||
<!-- IcoMoon-Free 328-move-down CC BY 4.0 -->
|
||||
<!-- Generated by IcoMoon.io -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="#000000" d="M12 11v-6h-1v6h-2.5l3 3 3-3z"></path>
|
||||
<path fill="#000000" d="M5 4v3h-3v-3h3zM6 3h-5v5h5v-5z"></path>
|
||||
<path fill="#000000" d="M1 10h1.5v1h-1.5v-1z"></path>
|
||||
|
||||
|
Before Width: | Height: | Size: 931 B After Width: | Height: | Size: 888 B |
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- materialdesignicons.com arrow-up-bold -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M15,20H9V12H4.16L12,4.16L19.84,12H15V20Z" /></svg>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M15,20H9V12H4.16L12,4.16L19.84,12H15V20Z" /></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 384 B After Width: | Height: | Size: 342 B |
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- materialdesignicons.com arrow-right-bold -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M4,15V9H12V4.16L19.84,12L12,19.84V15H4Z" /></svg>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M4,15V9H12V4.16L19.84,12L12,19.84V15H4Z" /></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 386 B After Width: | Height: | Size: 344 B |
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- materialdesignicons.com arrow-down-bold -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M9,4H15V12H19.84L12,19.84L4.16,12H9V4Z" /></svg>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M9,4H15V12H19.84L12,19.84L4.16,12H9V4Z" /></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 384 B After Width: | Height: | Size: 342 B |
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- materialdesignicons.com arrow-left-bold -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M20,9V15H12V19.84L4.16,12L12,4.16V9H20Z" /></svg>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M20,9V15H12V19.84L4.16,12L12,4.16V9H20Z" /></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 385 B After Width: | Height: | Size: 343 B |
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generated by IcoMoon.io -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="#000000" d="M10.5 14h-5c-0.276 0-0.5-0.224-0.5-0.5v-5.5h-2c-0.202 0-0.385-0.122-0.462-0.309s-0.035-0.402 0.108-0.545l5-5c0.195-0.195 0.512-0.195 0.707 0l5 5c0.143 0.143 0.186 0.358 0.108 0.545s-0.26 0.309-0.462 0.309h-2v5.5c0 0.276-0.224 0.5-0.5 0.5zM6 13h4v-5.5c0-0.276 0.224-0.5 0.5-0.5h1.293l-3.793-3.793-3.793 3.793h1.293c0.276 0 0.5 0.224 0.5 0.5v5.5z"></path>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 697 B After Width: | Height: | Size: 654 B |
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-10 0 870 1000">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="-10 0 870 1000">
|
||||
<g transform="matrix(1 0 0 -1 0 850)">
|
||||
<path fill="currentColor"
|
||||
d="M200 390h510v240h140v-280q0 -42 -30 -71t-70 -29h-550v-100l-200 170l200 170v-100z" />
|
||||
|
||||
|
Before Width: | Height: | Size: 434 B After Width: | Height: | Size: 391 B |
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generated by IcoMoon.io -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="#000000" d="M15 0h1v8h-1v-8z"></path>
|
||||
<path fill="#000000" d="M0 8h1v8h-1v-8z"></path>
|
||||
<path fill="#000000" d="M5 11h11v2h-11v2.5l-3.5-3.5 3.5-3.5v2.5z"></path>
|
||||
|
||||
|
Before Width: | Height: | Size: 563 B After Width: | Height: | Size: 520 B |