diff --git a/emojicompat/FileEmojiCompatConfig.java b/emojicompat/FileEmojiCompatConfig.java deleted file mode 100644 index 1ec9975d0..000000000 --- a/emojicompat/FileEmojiCompatConfig.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.keylesspalace.tusky; -/* - * Original file (https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java): - * Copyright (C) 2017 The Android Open Source Project - * Modifications Copyright (C) 2018 Constantin A. - * - * 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 - * - * http://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. - */ - -import android.content.Context; -import android.graphics.Typeface; -import android.support.annotation.NonNull; -import android.support.annotation.RequiresApi; -import android.support.text.emoji.EmojiCompat; -import android.support.text.emoji.MetadataRepo; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; - -/** - * A simple implementation of EmojiCompat.Config using typeface files. - * Based on: - * https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java - * Changes are marked with comments. Formatting and other simple changes are not always marked. - */ -public class FileEmojiCompatConfig extends EmojiCompat.Config { - // The class name is obviously changed from the original file - - /** - * Create a new configuration for this EmojiCompat - * @param path The file name/path of the requested font - * @param context Context instance - */ - public FileEmojiCompatConfig(@NonNull Context context, - // NEW - @NonNull String path) { - // This one is obviously new - super(new FileMetadataLoader(context, path)); - } - - /** - * This is the MetadataLoader. Derived from BundledMetadataLoader but with - * the addition of a custom file name. - */ - private static class FileMetadataLoader implements EmojiCompat.MetadataRepoLoader{ - private final Context mContext; - // NEW - private final String fileName; - - private FileMetadataLoader(@NonNull Context context, - // NEW - String fileName) { - this.mContext = context.getApplicationContext(); - // NEW - this.fileName = fileName; - } - - - // Copied from BundledEmojiCompatConfig - @Override - @RequiresApi(19) - public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) { - //Preconditions.checkNotNull(loaderCallback, "loaderCallback cannot be null"); - final InitRunnable runnable = new InitRunnable(mContext, loaderCallback, fileName); - final Thread thread = new Thread(runnable); - thread.setDaemon(false); - thread.start(); - } - } - - @RequiresApi(19) - private static class InitRunnable implements Runnable { - // The font name is assigned in the constructor. - private final String FONT_NAME; - // Slightly different variable names - private final EmojiCompat.MetadataRepoLoaderCallback loaderCallback; - private final Context context; - - private InitRunnable(final Context context, - final EmojiCompat.MetadataRepoLoaderCallback loaderCallback, - // NEW parameter - final String FONT_NAME) { - // This has been changed a bit in order to get some consistency - this.context = context; - this.loaderCallback = loaderCallback; - this.FONT_NAME = FONT_NAME; - } - - // This has been copied from BundledEmojiCompatConfig - @Override - public void run() { - try { - final Typeface typeface = Typeface.createFromFile(FONT_NAME); - final File fontFile = new File(FONT_NAME); - final InputStream stream = new FileInputStream(fontFile); - final MetadataRepo resourceIndex = MetadataRepo.create(typeface, stream); - loaderCallback.onLoaded(resourceIndex); - } catch (Throwable t) { - loaderCallback.onFailed(t); - } - } - } -} diff --git a/emojicompat/FileMojiCompat/README.md b/emojicompat/FileMojiCompat/README.md new file mode 100644 index 000000000..882c69e71 --- /dev/null +++ b/emojicompat/FileMojiCompat/README.md @@ -0,0 +1,72 @@ +# FileMojiCompat +## What is this? +This is a library providing an easy solution to use [EmojiCompat](https://developer.android.com/guide/topics/ui/look-and-feel/emoji-compat) +with fonts that are either stored in the `assets`-folder with another name than `NotoColorEmojiCompat.ttf` or you can use +EmojiCompat fonts which are stored anywhere on the device's local storage. +## How do I get this library? +That's relatively easy: Just add the following line to your module's `build.gradle` inside `dependencies`: +``` +implementation 'de.c1710:filemojicompat:1.0.7' +``` +## How do I use it? +There are two different methods included in this library: +1. ### [`AssetEmojiCompatConfig`](https://github.com/C1710/blobmoji/blob/filemojicompat/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/AssetEmojiCompatConfig.java) + You can use this just like you would usually use [`BundledEmojiCompatConfig`](https://developer.android.com/guide/topics/ui/look-and-feel/emoji-compat#bundled-fonts) + except for the detail that you can choose the font's name as the second parameter. + Example: + ```java + EmojiCompat.Config config = new AssetEmojiCompatConfig(getContext(), "Blobmoji.ttf"); + ``` + This will create a new EmojiCompat configuration using the file provided in `assets/Blobmoji.ttf`. + Anyhow, I don't recommend using `AssetEmojiCompatConfig` anymore as [this](#i-want-to-let-my-users-only-choose-another-font-if-they-dont-like-my-current-one) approach is more flexible and just as easy to use. +2. ### [`FileEmojiCompatConfig`](https://github.com/C1710/blobmoji/blob/filemojicompat/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/FileEmojiCompatConfig.java) + This is the more complex and interesting option. + Instead of providing a short String containing the font's name, you can provide a [`File`](https://developer.android.com/reference/java/io/File) + (or the String containing the full path of it). + This will try to load the font from this path. + In case it gets into any trouble - let's say because of missing permissions or a non-existent file, it will fallback to using no EmojiCompat at all. + (Technically this is wrong as leaving EmojiCompat uninitialized would crash the components using it. There's an explanation below). + Example: + ```java + Context context = getContext(); + File fontFile = new File(context.getExternalFilesDir(null), "emoji/Blobmoji.ttf"); + EmojiCompat.Config config = new FileEmojiCompatConfig(context, fontFile); + ``` + In this example, your app would try to load the font file `Blobmoji.ttf` located at `/storage/emulated/0/Android/data/[your.app.package]/files/Blobmoji.ttf`. + If this file is not available, EmojiCompat won't be visible. + Hint: When accessing a file inside your private directory (i.e. the one used in the example), you _don't_ need storage permissions. + However, if you want to load the font from somewhere else - let's say the `Download` directory, you ***will*** need storage permissions. + But don't worry (too much) - your app won't crash (probably) as this missing file is just being ignored in this case. + +### What happens if I don't provide the font file in `FileEmojiCompatConfig`? +In this case, there won't be a visible difference to not using EmojiCompat. +#### But what does that mean _exactly_? +If you take a look at `EmojiCompat` itself, you'll notice that it isn't build with missing fonts in mind. If anything happens, +`onLoadFailed` is called and EmojiCompat crashes - and so do all components relying on it. +To prevent this case, `FileEmojiCompatConfig` includes a fallback solution - inside the `assets` folder, you'll find a file called [`NoEmojiCompat.ttf`](https://github.com/C1710/blobmoji/blob/filemojicompat/emojicompat/FileMojiCompat/filemojicompat/src/main/assets/NoEmojiCompat.ttf) which +is much smaller than most of the EmojiCompat font files (~40kiB). That's because it only includes 10 characters which are the flags for China, Germany, Spain, France, United Kingdom, Italy, Japan, South Korea, Russia, USA. +These are the flags which where originally included in [Noto Emoji](https://github.com/googlei18n/noto-emoji) and they are only used to _fill_ the font +file with something. +#### Will my users see these flags when the fallback font is used? +Yes, they will. But only if their device either doesn't support these flags (which is basically impossible) or if they use a device which already uses +these assets as their default emojis. They won't replace any existing emojis. +#### But I did `setReplaceAll(true)`?! +This won't change anything as `FileEmojiCompatConfig` will detect if the font file is not valid and it will simply ignore `setReplaceAll(true)`. +## I want to let my users only choose another font if they don't like my current one +This is easily possible with the introduction of `FileMojiCompat 1.0.6`. +In this case you override the fallback font by putting your font into the `assets` folder of your app using the name `NoEmojiCompat.ttf`. +Whenever the fallback font is needed (which is the case if the user doesn't specify another one), this font is being used. +In order to prevent blocking the `setReplaceAll` method, you'll have to call it with `setReplaceAll(true, true)`. +The second argument indicates that you want to ignore this `replaceAll`-prevention (if set to `true`. Setting it to `false` won't change anything). +So here's a short example of using this very flexible, yet easy to use method. +But please be aware that changing the emoji font using this snippet isn't very easy as it needs the user to copy (and potentially rename) some files: +```java + Context context = getContext(); + File fontFile = new File(context.getExternalFilesDir(null), "emoji.ttf"); + EmojiCompat.Config config = new FileEmojiCompatConfig(context, fontFile) + .setReplaceAll(true, true); +``` +In this case, the font specified in `assets/NoEmojiCompat.ttf` will be used until `/storage/emulated/0/Android/[yourpackage]/files/emoji.ttf` exists and includes a valid `EmojiCompat` font. +This method combines the easy approach of `AssetEmojiCompatConfig` and the flexibility of `FileEmojiCompatConfig` with some tradeoffs on the usability side. +If you need a different asset path for your fallback file, you can simply add it as another argument for `FileEmojiCompatConfig`. This feature has been introduced in `1.0.7`. +**_PLEASE use at least this method in your app. It's always better to give the users a choice._** diff --git a/emojicompat/FileMojiCompat/build.gradle b/emojicompat/FileMojiCompat/build.gradle new file mode 100644 index 000000000..3fc3f5158 --- /dev/null +++ b/emojicompat/FileMojiCompat/build.gradle @@ -0,0 +1,28 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/emojicompat/FileMojiCompat/filemojicompat/build.gradle b/emojicompat/FileMojiCompat/filemojicompat/build.gradle new file mode 100644 index 000000000..0dcd5af55 --- /dev/null +++ b/emojicompat/FileMojiCompat/filemojicompat/build.gradle @@ -0,0 +1,55 @@ +apply plugin: 'com.android.library' +buildscript { + repositories { + mavenCentral() + google() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.1.2' + } +} + +ext { + bintrayRepo = 'FileMojiCompat' + bintrayName = 'filemojicompat' + publishedGroupId = 'de.c1710' + libraryName = 'filemojicompat' + artifact = 'filemojicompat' + libraryDescription = 'An EmojiCompat implementation using files from a local file or a file inside your assets directory' + siteUrl = 'https://github.com/c1710/blobmoji' + gitUrl = 'https://github.com/c1710/blobmoji.git' + libraryVersion = '1.0.7' + developerId = 'c1710' + developerName = 'Constantin A.' + developerEmail = 'c1710.apps@outlook.com' + licenseName = 'The Apache Software License, Version 2.0' + licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + allLicenses = ["Apache-2.0"] +} + +android { + compileSdkVersion 27 + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 27 + versionCode 7 + versionName "1.0.7" + } + + + compileOptions { + targetCompatibility 1.8 + sourceCompatibility 1.8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:support-emoji:27.1.1' + +} + +apply from: 'https://raw.githubusercontent.com/numetriclabz/jcenter/master/installv.gradle' +apply from: 'https://raw.githubusercontent.com/numetriclabz/jcenter/master/bintrayv.gradle' + diff --git a/emojicompat/FileMojiCompat/filemojicompat/proguard-rules.pro b/emojicompat/FileMojiCompat/filemojicompat/proguard-rules.pro new file mode 100644 index 000000000..6e7ffa997 --- /dev/null +++ b/emojicompat/FileMojiCompat/filemojicompat/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/emojicompat/FileMojiCompat/filemojicompat/src/main/AndroidManifest.xml b/emojicompat/FileMojiCompat/filemojicompat/src/main/AndroidManifest.xml new file mode 100644 index 000000000..51b79a617 --- /dev/null +++ b/emojicompat/FileMojiCompat/filemojicompat/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/emojicompat/NoEmojiCompat.ttf b/emojicompat/FileMojiCompat/filemojicompat/src/main/assets/NoEmojiCompat.ttf similarity index 100% rename from emojicompat/NoEmojiCompat.ttf rename to emojicompat/FileMojiCompat/filemojicompat/src/main/assets/NoEmojiCompat.ttf diff --git a/emojicompat/AssetEmojiCompatConfig.java b/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/AssetEmojiCompatConfig.java similarity index 99% rename from emojicompat/AssetEmojiCompatConfig.java rename to emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/AssetEmojiCompatConfig.java index dd6fc1ced..ddf85e2b1 100644 --- a/emojicompat/AssetEmojiCompatConfig.java +++ b/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/AssetEmojiCompatConfig.java @@ -1,3 +1,4 @@ +package de.c1710.filemojicompat; /* * Original file (https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java): * Copyright (C) 2017 The Android Open Source Project diff --git a/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/FileEmojiCompatConfig.java b/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/FileEmojiCompatConfig.java new file mode 100644 index 000000000..97b72385a --- /dev/null +++ b/emojicompat/FileMojiCompat/filemojicompat/src/main/java/de/c1710/filemojicompat/FileEmojiCompatConfig.java @@ -0,0 +1,246 @@ +package de.c1710.filemojicompat; +/* + * Adapted from https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java + * Copyright (C) 2017 The Android Open Source Project + * Modifications Copyright (C) 2018 Constantin A. + * + * 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 + * + * http://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. + */ + +import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Typeface; +import android.os.Build; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; +import android.support.text.emoji.EmojiCompat; +import android.support.text.emoji.MetadataRepo; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; + +/** + * A simple implementation of EmojiCompat.Config using typeface files. + * Based on: + * https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java + * Changes are marked with comments. Formatting and other simple changes are not always marked. + */ +public class FileEmojiCompatConfig extends EmojiCompat.Config { + // The class name is obviously changed from the original file + private final static String TAG = "FileEmojiCompatConfig"; + + /** + * This boolean indicates whether the fallback solution is used. + */ + private boolean fallback; + /** + * Indicates whether all emojis should be replaced when the fallback font is used. + */ + private boolean replaceAllOnFallback = false; + /** + * The default name of the fallback font + */ + private static final String FONT_FALLBACK = "NoEmojiCompat.ttf"; + + /** + * Create a new configuration for this EmojiCompat + * @param path The file name/path of the requested font + * @param context Context instance + */ + public FileEmojiCompatConfig(@NonNull Context context, + // NEW + @NonNull String path) { + // This one is obviously new + this(context, path, FONT_FALLBACK); + } + + /** + * Create a new configuration for this EmojiCompat + * @param path The file name/path of the requested font + * @param context Context instance + * @param fallbackFont The asset path of the fallback font + */ + public FileEmojiCompatConfig(@NonNull Context context, + // NEW + @NonNull String path, + @Nullable String fallbackFont) { + // This one is obviously new + this(context, new File(path), fallbackFont); + } + + /** + * Create a new configuration for this EmojiCompat based on a file + * @param context Context instance + * @param fontFile The file containing the EmojiCompat font + */ + public FileEmojiCompatConfig(@NonNull Context context, + // NEW + @Nullable File fontFile) { + this(context, fontFile, FONT_FALLBACK); + } + + /** + * Create a new configuration for this EmojiCompat based on a file + * @param context Context instance + * @param fontFile The file containing the EmojiCompat font + * @param fallbackFont The asset path of the fallback font + */ + public FileEmojiCompatConfig(@NonNull Context context, + // NEW + @Nullable File fontFile, + @Nullable String fallbackFont) { + super(new FileMetadataLoader(context, + fontFile, + fallbackFont != null ? fallbackFont : FONT_FALLBACK)); + if(fontFile != null && fontFile.exists() && fontFile.canRead()) { + try { + // Is it a font? + Typeface typeface = Typeface.createFromFile(fontFile); + // Is it an EmojiCompat font? + /* + Please note that this will possibly cause a race condition. But all in all it's + better to have a chance of detecting such a non-valid font than either having to + wait for a long time or not being able to detect it at all. + However, since this Thread is started immediately, it should be faster than + the initialization process of EmojiCompat itself... + */ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + new Thread(() -> { + try { + MetadataRepo.create(typeface, new FileInputStream(fontFile)); + } catch (Throwable t) { + fallback = true; + setReplaceAll(false); + Log.w(TAG, "FileEmojiCompatConfig: No valid EmojiCompat font provided. Fallback enabled", t); + } + }).start(); + } + } catch (RuntimeException ex) { + fallback = true; + Log.e(TAG, "FileEmojiCompatConfig: Font file corrupt. Fallback enabled", ex); + } + } else { + // The heck, this is not even an actual _file_! + fallback = true; + } + + } + + @Override + public FileEmojiCompatConfig setReplaceAll(boolean replaceAll) { + return setReplaceAll(replaceAll, replaceAllOnFallback); + } + + /** + * Replace all emojis + * @param replaceAll Whether all emojis should be replaced + * @param replaceAllOnFallback true if this is supposed to be the case even when using the fallback font. + * Useful if the NoEmojiCompat.ttf is overridden by a "real" EmojiCompat font. + * @return This EmojiCompat.Config + */ + public FileEmojiCompatConfig setReplaceAll(boolean replaceAll, boolean replaceAllOnFallback) { + this.replaceAllOnFallback = replaceAllOnFallback; + if(!fallback || replaceAllOnFallback) { + super.setReplaceAll(replaceAll); + } + else { + super.setReplaceAll(false); + if(replaceAll) { + // If replaceAll would have been set to false anyway, there's no need for apologizing. + Log.w(TAG, "setReplaceAll: Cannot replace all emojis. Fallback font is active"); + } + } + return this; + } + + /** + * This is the MetadataLoader. Derived from BundledMetadataLoader but with + * the addition of a custom file name. + */ + private static class FileMetadataLoader implements EmojiCompat.MetadataRepoLoader{ + private final Context mContext; + // NEW + private final File fontFile; + private final String fallbackFont; + + private FileMetadataLoader(@NonNull Context context, + // NEW + @Nullable File fontFile, + @NonNull String fallbackFont) { + this.mContext = context.getApplicationContext(); + // NEW + this.fontFile = fontFile; + this.fallbackFont = fallbackFont; + } + + + // Copied from BundledEmojiCompatConfig + @Override + @RequiresApi(19) + public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) { + //Preconditions.checkNotNull(loaderCallback, "loaderCallback cannot be null"); + final InitRunnable runnable = new InitRunnable(mContext, loaderCallback, fontFile, fallbackFont); + final Thread thread = new Thread(runnable); + thread.setDaemon(false); + thread.start(); + } + } + + @RequiresApi(19) + private static class InitRunnable implements Runnable { + // The font names are assigned in the constructor. + private final File FONT_FILE; + private final String FONT_FALLBACK; + // Slightly different variable names + private final EmojiCompat.MetadataRepoLoaderCallback loaderCallback; + private final Context context; + + private InitRunnable(final Context context, + final EmojiCompat.MetadataRepoLoaderCallback loaderCallback, + // NEW parameter + final File FONT_FILE, + final String FONT_FALLBACK) { + // This has been changed a bit in order to get some consistency + this.context = context; + this.loaderCallback = loaderCallback; + this.FONT_FILE = FONT_FILE; + this.FONT_FALLBACK = FONT_FALLBACK; + } + + @Override + public void run() { + try { + // Changed to load a file + final Typeface typeface = Typeface.createFromFile(FONT_FILE); + final InputStream stream = new FileInputStream(FONT_FILE); + MetadataRepo resourceIndex = MetadataRepo.create(typeface, stream); + loaderCallback.onLoaded(resourceIndex); + } + catch (Throwable t) { + // Instead of crashing, this one will first try to load the fallback font + try { + android.util.Log.w(TAG, "Error while loading the font file.", t); + final AssetManager assetManager = context.getAssets(); + final MetadataRepo resourceIndex = + MetadataRepo.create(assetManager, FONT_FALLBACK); + loaderCallback.onLoaded(resourceIndex); + } catch (Throwable t2) { + loaderCallback.onFailed(t); + } + } + } + } +} diff --git a/emojicompat/FileMojiCompat/gradle.properties b/emojicompat/FileMojiCompat/gradle.properties new file mode 100644 index 000000000..9fdc93c10 --- /dev/null +++ b/emojicompat/FileMojiCompat/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1024m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/emojicompat/FileMojiCompat/gradle/wrapper/gradle-wrapper.jar b/emojicompat/FileMojiCompat/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..13372aef5 Binary files /dev/null and b/emojicompat/FileMojiCompat/gradle/wrapper/gradle-wrapper.jar differ diff --git a/emojicompat/FileMojiCompat/gradle/wrapper/gradle-wrapper.properties b/emojicompat/FileMojiCompat/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..870e127a2 --- /dev/null +++ b/emojicompat/FileMojiCompat/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Apr 26 17:31:13 CEST 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/emojicompat/FileMojiCompat/gradlew b/emojicompat/FileMojiCompat/gradlew new file mode 100644 index 000000000..9d82f7891 --- /dev/null +++ b/emojicompat/FileMojiCompat/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# 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 +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# 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 + +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" ] ; 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, switch paths to Windows format before running java +if $cygwin ; 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=$((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 + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/emojicompat/FileMojiCompat/gradlew.bat b/emojicompat/FileMojiCompat/gradlew.bat new file mode 100644 index 000000000..aec99730b --- /dev/null +++ b/emojicompat/FileMojiCompat/gradlew.bat @@ -0,0 +1,90 @@ +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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 init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +: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 %CMD_LINE_ARGS% + +: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 diff --git a/emojicompat/FileMojiCompat/settings.gradle b/emojicompat/FileMojiCompat/settings.gradle new file mode 100644 index 000000000..e91d23c2f --- /dev/null +++ b/emojicompat/FileMojiCompat/settings.gradle @@ -0,0 +1 @@ +include ':filemojicompat' diff --git a/emojicompat/README.md b/emojicompat/README.md index 9a619393d..374bb974e 100644 --- a/emojicompat/README.md +++ b/emojicompat/README.md @@ -1,3 +1,4 @@ +# Please note that all these features (except for the Blobmoji EmojiCompat font itself) are now included in their own library which you can find at [FileMojiCompat](FileMojiCompat). This page (and folder) will be updated soon :sweat_smile: ## You can use this font in [EmojiCompat](https://developer.android.com/guide/topics/ui/look-and-feel/emoji-compat.html)! The most important file for this is `NotoEmojiCompat.ttf`. This is the font you'll need. There are three different ways to use this font in EmojiCompat: @@ -53,4 +54,4 @@ The reason for this is same the reason why I made this fork: Users should always have a choice - and by using this solution you can give the users of your app the choice to choose their favorite emoji set*! Plus they don't rely on you updating your app :smiling_imp: -(*as long as it's available as an EmojiCompat font) \ No newline at end of file +(*as long as it's available as an EmojiCompat font)