diff --git a/.travis.yml b/.travis.yml index 0cde959c3f..e1d2a749e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,14 +30,14 @@ addons: - git - ruby -before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ -cache: - directories: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - - $HOME/.m2/ +# before_cache: +# - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock +# - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ +# cache: +# directories: +# - $HOME/.gradle/caches/ +# - $HOME/.gradle/wrapper/ +# - $HOME/.m2/ before_install: - ./travis/scripts/decode_private_configs.sh diff --git a/README.md b/README.md index 8106d7c71a..c1a28e4d5b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Crowdin](https://d322cqt584bo4o.cloudfront.net/twidere/localized.svg)](https://crowdin.com/project/twidere) [](https://www.patreon.com/bePatron?u=36020799) -Material Design ready and feature rich Twitter/Mastodon/StatusNet/Fanfou app for Android 4.4+. Enjoy Fediverse now! +Material Design ready and feature rich Twitter/Mastodon/StatusNet/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maintained by community and supporter including [Dimension](https://dimension.im/). diff --git a/build.gradle b/build.gradle index 67600ae866..a539ea043a 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -17,13 +17,13 @@ buildscript { allprojects { ext { projectGroupId = 'org.mariotaku.twidere' - projectVersionCode = 512 - projectVersionName = '4.1.3' + projectVersionCode = 513 + projectVersionName = '4.1.4' globalCompileSdkVersion = 29 globalBuildToolsVersion = "29.0.3" - globalMinSdkVersion = 19 + globalMinSdkVersion = 16 globalTargetSdkVersion = 29 } @@ -39,54 +39,18 @@ subprojects { buildscript { ext { kotlinVersion = '1.3.72' - pluginVersions = [ - AndroidSvgDrawable: '3.0.0', - PlayServices : '4.3.3', - ] - libVersions = [ + sharedVersions = [ Kotlin : "${kotlinVersion}", - SupportTest : '1.0.0', - MariotakuCommons : '0.9.20', - RestFu : '0.9.60', - ObjectCursor : '0.9.21', - PlayServices : '17.0.0', - MapsUtils : '0.6.2', - DropboxCoreSdk : '3.1.3', - GoogleDriveApi : 'v3-rev193-1.25.0', - Exoplayer : '2.11.4', - Toro : '2.1.0', + LoganSquare : '1.3.7', - IABv3 : '1.1.0', - Mime4J : '0.7.2', - OkHttp : '3.8.1', - Stetho : '1.5.0', - OSMDroid : '5.6.5', - LeakCanary : '2.1', - TwitterText : '1.14.7', - MediaViewerLibrary : '0.9.23', - MultiValueSwitch : '0.9.8', - PickNCrop : '0.9.27', - AndroidGIFDrawable : '1.2.6', - KPreferences : '0.9.7', - Kovenant : '3.3.0', + Jackson : '2.7.4', ParcelablePlease : '1.0.2', - Chameleon : '0.9.28', - UniqR : '0.9.4', - SQLiteQB : '0.9.15', - Glide : '4.11.0', - GlideOkHttp3 : '4.11.0', - GlideTransformations : '4.1.0', - AndroidImageCropper : '2.4.6', + ExportablePreferences: '0.9.7', - ACRA : '4.9.2', - AbstractTask : '0.9.5', - Dagger : '2.11', - StethoBeanShellREPL : '0.1', - MessageBubbleView : '3.5', + MariotakuCommons : '0.9.20', + ObjectCursor : '0.9.21', + RestFu : '0.9.60', ] - } - } - } diff --git a/gradle.properties b/gradle.properties index 0dc9a03d8b..8f9c28ef89 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ org.gradle.jvmargs=-Xmx3584m #https://github.com/TwidereProject/Twidere-Android/issues/963 -android.enableAapt2=false +# android.enableAapt2=false android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true +android.jetifier.blacklist=android-4.1.1.4.jar \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577..62d4c05355 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6623300beb..21e622da69 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d95..fbd7c51583 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ 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 @@ -129,6 +130,7 @@ fi 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 diff --git a/gradlew.bat b/gradlew.bat index 62bd9b9cce..5093609d51 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -84,6 +84,7 @@ set CMD_LINE_ARGS=%* 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% diff --git a/travis/configs/gradle.properties b/travis/configs/gradle.properties index 4173608deb..39a2875e32 100644 --- a/travis/configs/gradle.properties +++ b/travis/configs/gradle.properties @@ -16,8 +16,6 @@ # limitations under the License. # org.gradle.jvmargs=-Xmx3584m -org.gradle.parallel=false -kotlin.incremental=false -kotlin.compiler.execution.strategy=in-process android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true +android.jetifier.blacklist=android-4.1.1.4.jar \ No newline at end of file diff --git a/twidere.component.common/build.gradle b/twidere.component.common/build.gradle index 8166c626ea..0a025df0e3 100644 --- a/twidere.component.common/build.gradle +++ b/twidere.component.common/build.gradle @@ -38,8 +38,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5' } } @@ -58,12 +58,19 @@ android { versionCode projectVersionCode versionName projectVersionName } + buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + compileOptions { + encoding = 'UTF-8' + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { @@ -72,23 +79,23 @@ dependencies { /** Third-party dependencies **/ - implementation "com.bluelinelabs:logansquare:${libVersions['LoganSquare']}" - annotationProcessor "com.bluelinelabs:logansquare-compiler:${libVersions['LoganSquare']}" - implementation "com.fasterxml.jackson.core:jackson-core:2.7.4" - implementation "com.hannesdorfmann.parcelableplease:annotation:${libVersions['ParcelablePlease']}" - annotationProcessor "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}" + implementation "com.bluelinelabs:logansquare:${sharedVersions['LoganSquare']}" + annotationProcessor "com.bluelinelabs:logansquare-compiler:${sharedVersions['LoganSquare']}" + implementation "com.fasterxml.jackson.core:jackson-core:${sharedVersions['Jackson']}" + implementation "com.hannesdorfmann.parcelableplease:annotation:${sharedVersions['ParcelablePlease']}" + annotationProcessor "com.hannesdorfmann.parcelableplease:processor:${sharedVersions['ParcelablePlease']}" /** Custom dependencies **/ - implementation "com.github.mariotaku.RestFu:library:${libVersions['RestFu']}" - implementation "com.github.mariotaku.RestFu:oauth:${libVersions['RestFu']}" - implementation "com.github.mariotaku.RestFu:oauth2:${libVersions['RestFu']}" - implementation "com.github.mariotaku.ObjectCursor:core:${libVersions['ObjectCursor']}" - annotationProcessor "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}" - implementation "com.github.mariotaku.ExportablePreferences:core:${libVersions['ExportablePreferences']}" - annotationProcessor "com.github.mariotaku.ExportablePreferences:processor:${libVersions['ExportablePreferences']}" - implementation "com.github.mariotaku.CommonsLibrary:objectcursor:${libVersions['MariotakuCommons']}" - implementation "com.github.mariotaku.CommonsLibrary:logansquare:${libVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.ExportablePreferences:core:${sharedVersions['ExportablePreferences']}" + annotationProcessor "com.github.mariotaku.ExportablePreferences:processor:${sharedVersions['ExportablePreferences']}" + implementation "com.github.mariotaku.CommonsLibrary:logansquare:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.CommonsLibrary:objectcursor:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.ObjectCursor:core:${sharedVersions['ObjectCursor']}" + annotationProcessor "com.github.mariotaku.ObjectCursor:processor:${sharedVersions['ObjectCursor']}" + implementation "com.github.mariotaku.RestFu:library:${sharedVersions['RestFu']}" + implementation "com.github.mariotaku.RestFu:oauth:${sharedVersions['RestFu']}" + implementation "com.github.mariotaku.RestFu:oauth2:${sharedVersions['RestFu']}" } install { diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/MicroBlogException.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/MicroBlogException.java index ede08f1802..284a058754 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/MicroBlogException.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/MicroBlogException.java @@ -206,7 +206,7 @@ public int getRetryAfter() { try { final String retryAfterStr = httpResponse.getHeader("Retry-After"); if (retryAfterStr != null) { - retryAfter = Integer.valueOf(retryAfterStr); + retryAfter = Integer.parseInt(retryAfterStr); } } catch (final NumberFormatException ignore) { } diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/model/Attachment.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/model/Attachment.java index de8132687c..2a45b9f9be 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/model/Attachment.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/model/Attachment.java @@ -18,8 +18,11 @@ package org.mariotaku.microblog.library.mastodon.model; +import androidx.annotation.Nullable; + import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease; /** * {@see https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#attachment} @@ -59,6 +62,9 @@ public class Attachment { @JsonField(name = "text_url") String textUrl; + @JsonField(name = "meta") + MetaInfo meta; + public String getId() { return id; } @@ -83,6 +89,51 @@ public String getTextUrl() { return textUrl; } + public MetaInfo getMeta() { + return meta; + } + + @JsonObject + public static class MetaInfo { + + @ParcelableThisPlease + @JsonField(name = "focus") + @Nullable + public FocusInfo focus; + @ParcelableThisPlease + @JsonField(name = "original") + @Nullable + public MetaDataInfo original; + @ParcelableThisPlease + @JsonField(name = "small") + @Nullable + public MetaDataInfo small; + + @JsonObject + public static class FocusInfo { + @ParcelableThisPlease + @JsonField(name = "x") + public float x; + @ParcelableThisPlease + @JsonField(name = "y") + public float y; + } + + @JsonObject + public static class MetaDataInfo { + @ParcelableThisPlease + @JsonField(name = "width") + public long width; + @ParcelableThisPlease + @JsonField(name = "height") + public long height; + @ParcelableThisPlease + @JsonField(name = "aspect") + public float aspect; + } + + + } @Override public String toString() { return "Attachment{" + diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/CardDataMap.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/CardDataMap.java index ab83d32d1e..8853e9a7a6 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/CardDataMap.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/CardDataMap.java @@ -64,7 +64,7 @@ public Object get(@NonNull String key) { @Override public String[] keys() { final Set keySet = map.keySet(); - return keySet.toArray(new String[keySet.size()]); + return keySet.toArray(new String[0]); } @Override diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/IDs$$JsonObjectMapper.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/IDs$$JsonObjectMapper.java index 2d3798f318..5c022bd212 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/IDs$$JsonObjectMapper.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/IDs$$JsonObjectMapper.java @@ -37,7 +37,6 @@ @Keep public class IDs$$JsonObjectMapper extends JsonMapper { - @SuppressWarnings("TryWithIdenticalCatches") @Override public IDs parse(JsonParser jsonParser) throws IOException { IDs instance = new IDs(); diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/ResponseList$$JsonObjectMapper.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/ResponseList$$JsonObjectMapper.java index 93a244b95c..41dc3cff42 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/ResponseList$$JsonObjectMapper.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/ResponseList$$JsonObjectMapper.java @@ -61,11 +61,8 @@ public ResponseList parse(JsonParser jsonParser) throws IOException { @Override public void parseField(ResponseList instance, String fieldName, JsonParser jsonParser) throws IOException { - switch (fieldName) { - case "results": { - instance.addAll(m84ClassJsonMapper.parseList(jsonParser)); - break; - } + if ("results".equals(fieldName)) { + instance.addAll(m84ClassJsonMapper.parseList(jsonParser)); } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/UniversalSearchResult.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/UniversalSearchResult.java index 3eea4da045..8f9f8f38c7 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/UniversalSearchResult.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/UniversalSearchResult.java @@ -250,7 +250,7 @@ public Index[] parse(JsonParser jsonParser) throws IOException { index.end = jsonParser.nextIntValue(-1); list.add(index); } - return list.toArray(new Index[list.size()]); + return list.toArray(new Index[0]); } @Override diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/util/InternalParseUtil.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/util/InternalParseUtil.java index 55581c465b..c816da647d 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/util/InternalParseUtil.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/util/InternalParseUtil.java @@ -52,12 +52,9 @@ public static int toAccessLevel(final HttpResponse res) { accessLevel = TwitterResponse.AccessLevel.READ_WRITE; break; case 25: - // “read-write-directmessages” (Read, Write, & Direct - // Message) - accessLevel = TwitterResponse.AccessLevel.READ_WRITE_DIRECTMESSAGES; - break; case 26: // “read-write-privatemessages” (Read, Write, & Direct + // “read-write-directmessages” (Read, Write, & Direct // Message) accessLevel = TwitterResponse.AccessLevel.READ_WRITE_DIRECTMESSAGES; break; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java index 4c8b08ca49..7989084785 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java @@ -64,8 +64,8 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst String ETAG_MASTODON_APPS_PREFERENCES_NAME = "mastodon_apps"; String ACCOUNT_PREFERENCES_NAME_PREFIX = "account_preferences_"; - String TWITTER_CONSUMER_KEY = "wmtrtTaVOjUnH5pWQp4LDI5Qs"; - String TWITTER_CONSUMER_SECRET = "E9Q9u2yK0COJae2tLcNEdY75OPA3bxqJiGZQztraHaQUtoI2cu"; + String TWITTER_CONSUMER_KEY = "MUUBibXUognm6e9vbzrUIqPkt"; + String TWITTER_CONSUMER_SECRET = "l2uWAgQkoHvDfM2PrRFx2WN4h7QIUIktmxyeTAqRo6TkGCtNKy"; String YANDEX_KEY = "trnsl.1.1.20200513T065609Z.8e72845b632aa04f.fe1297e42c152de9e8773e1bc71162b1e498e2a8"; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/annotation/FilterScope.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/annotation/FilterScope.java index 2d03928314..0e7067f101 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/annotation/FilterScope.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/annotation/FilterScope.java @@ -56,6 +56,5 @@ // Contains all flags int ALL = 0xFFFFFFFF; - @SuppressWarnings("PointlessBitwiseExpression") int DEFAULT = ALL & ~(TARGET_NAME | TARGET_DESCRIPTION); } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java index 022bedf1d5..5cc0c2d2e2 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java @@ -291,6 +291,8 @@ public interface SharedPreferenceConstants { String KEY_AUTO_HIDE_TABS = "auto_hide_tabs"; @ExportablePreference(BOOLEAN) String KEY_HIDE_CARD_NUMBERS = "hide_card_numbers"; + @ExportablePreference(BOOLEAN) + String KEY_SHOW_LINK_PREVIEW = "show_link_preview"; // Internal preferences diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java index 03c1584249..dd63c2c800 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java @@ -40,7 +40,6 @@ @JsonObject @ParcelablePlease public class ParcelableMedia implements Parcelable { - @SuppressWarnings("NullableProblems") @NonNull @JsonField(name = "url") @ParcelableThisPlease diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java index 07d652e6af..4c1ea36bdf 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java @@ -31,7 +31,6 @@ @ParcelablePlease public class ParcelableMediaUpdate implements Parcelable { - @SuppressWarnings("NullableProblems") @NonNull @JsonField(name = "uri") public String uri; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java index 0239de25cc..77a602c9f1 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java @@ -20,11 +20,11 @@ import android.os.Parcel; import android.os.Parcelable; -import androidx.annotation.IntDef; +import android.text.TextUtils; + import androidx.annotation.LongDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import android.text.TextUtils; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; @@ -52,13 +52,7 @@ @ParcelablePlease public class ParcelableStatus implements Parcelable, Comparable, Cloneable { - public static final Comparator REVERSE_COMPARATOR = new Comparator() { - - @Override - public int compare(final ParcelableStatus object1, final ParcelableStatus object2) { - return object2.compareTo(object1); - } - }; + public static final Comparator REVERSE_COMPARATOR = (object1, object2) -> object2.compareTo(object1); public static final Creator CREATOR = new Creator() { @Override public ParcelableStatus createFromParcel(Parcel source) { @@ -75,13 +69,11 @@ public ParcelableStatus[] newArray(int size) { @CursorField(value = Statuses._ID, excludeWrite = true, type = TwidereDataStore.TYPE_PRIMARY_KEY) public long _id; - @SuppressWarnings("NullableProblems") @JsonField(name = "id") @CursorField(Statuses.ID) @NonNull public String id; - @SuppressWarnings("NullableProblems") @JsonField(name = "account_id", typeConverter = UserKeyConverter.class) @CursorField(value = Statuses.ACCOUNT_KEY, converter = UserKeyCursorFieldConverter.class) @NonNull @@ -98,7 +90,6 @@ public ParcelableStatus[] newArray(int size) { @JsonField(name = "timestamp") @CursorField(Statuses.TIMESTAMP) public long timestamp; - @SuppressWarnings("NullableProblems") @JsonField(name = "user_id", typeConverter = UserKeyConverter.class) @CursorField(value = Statuses.USER_KEY, converter = UserKeyCursorFieldConverter.class) @@ -527,6 +518,9 @@ public Extras[] newArray(int size) { @JsonField(name = "external_url") public String external_url; + @JsonField(name = "entities_url") + public String[] entities_url; + @JsonField(name = "quoted_external_url") public String quoted_external_url; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java index 21433334cc..b9d8a54a75 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java @@ -41,7 +41,6 @@ @JsonObject public class ParcelableStatusUpdate implements Parcelable { - @SuppressWarnings("NullableProblems") @JsonField(name = "accounts") @NonNull @ParcelableThisPlease diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableTrend.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableTrend.java index e2581f8491..e46450b86b 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableTrend.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableTrend.java @@ -45,7 +45,6 @@ public class ParcelableTrend implements Parcelable { @CursorField(value = CachedTrends._ID, excludeWrite = true, type = TwidereDataStore.TYPE_PRIMARY_KEY) long _id; - @SuppressWarnings("NullableProblems") @ParcelableThisPlease @JsonField(name = "account_id", typeConverter = UserKeyConverter.class) @CursorField(value = CachedTrends.ACCOUNT_KEY, converter = UserKeyCursorFieldConverter.class) diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/ConversationExtras.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/ConversationExtras.java index 345db02fc3..7f30d1c8cd 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/ConversationExtras.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/ConversationExtras.java @@ -35,10 +35,8 @@ public abstract class ConversationExtras implements Parcelable { public static ConversationExtras parse(@NonNull final String extrasType, @Nullable final String json) throws IOException { if (json == null) return null; - switch (extrasType) { - case ExtrasType.TWITTER_OFFICIAL: { - return LoganSquare.parse(json, TwitterOfficialConversationExtras.class); - } + if (ExtrasType.TWITTER_OFFICIAL.equals(extrasType)) { + return LoganSquare.parse(json, TwitterOfficialConversationExtras.class); } return LoganSquare.parse(json, DefaultConversationExtras.class); } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/util/UserKeysConverter.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/util/UserKeysConverter.java index 2730efd4b8..c70934807e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/util/UserKeysConverter.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/util/UserKeysConverter.java @@ -46,7 +46,7 @@ public UserKey[] parse(JsonParser jsonParser) throws IOException { while (jsonParser.nextToken() != JsonToken.END_ARRAY) { list.add(UserKey.valueOf(jsonParser.getValueAsString())); } - return list.toArray(new UserKey[list.size()]); + return list.toArray(new UserKey[0]); } @Override diff --git a/twidere.component.nyan/build.gradle b/twidere.component.nyan/build.gradle index c6e972da48..afe678fbf7 100644 --- a/twidere.component.nyan/build.gradle +++ b/twidere.component.nyan/build.gradle @@ -29,6 +29,12 @@ android { minSdkVersion globalMinSdkVersion targetSdkVersion globalTargetSdkVersion } + + compileOptions { + encoding = 'UTF-8' + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { diff --git a/twidere.component.nyan/src/main/java/org/mariotaku/twidere/nyan/NyanDrawingHelper.java b/twidere.component.nyan/src/main/java/org/mariotaku/twidere/nyan/NyanDrawingHelper.java index c0357bd887..c0f1de410a 100644 --- a/twidere.component.nyan/src/main/java/org/mariotaku/twidere/nyan/NyanDrawingHelper.java +++ b/twidere.component.nyan/src/main/java/org/mariotaku/twidere/nyan/NyanDrawingHelper.java @@ -314,7 +314,7 @@ public StarsDrawingHelper(final int starRows, final int starCols, final int star public void dispatchOnDraw(final Canvas canvas) { final int w = canvas.getWidth(), h = canvas.getHeight(); if (w <= 0 || h <= 0) return; - for (final Star star : mStars.toArray(new Star[mStars.size()])) { + for (final Star star : mStars.toArray(new Star[0])) { final int col = star.nextColumn(), row = star.nextRow(); final float y = (row + 0.5f) * (h / mStarRows), x = (col + 0.5f) * (w / mStarCols); drawStar(canvas, x, y, star.nextFrame()); diff --git a/twidere/build.gradle b/twidere/build.gradle index 29dd09acb8..9b1c20ebb5 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -25,7 +25,7 @@ buildscript { if (enableGoogleVariant) { // START Non-FOSS component - classpath "com.google.gms:google-services:${pluginVersions['PlayServices']}" + classpath 'com.google.gms:google-services:4.3.3' // END Non-FOSS component } } @@ -91,9 +91,6 @@ android { signingConfig signingConfigs.twidere } - multiDexEnabled true - minifyEnabled false - shrinkResources false resValue("bool", "debug", "true") } release { @@ -101,7 +98,6 @@ android { signingConfig signingConfigs.twidere } - multiDexEnabled true minifyEnabled false shrinkResources false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' @@ -115,6 +111,7 @@ android { } compileOptions { + encoding = 'UTF-8' sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } @@ -145,7 +142,6 @@ android { exclude 'sdk-version.txt' exclude 'build-data.properties' } - } task buildTranslationArray { @@ -153,16 +149,16 @@ task buildTranslationArray { foundLocales.append("new String[]{") fileTree("src/main/res-localized").visit { FileVisitDetails details -> - if(details.file.path.endsWith("strings.xml")){ - def languageCode = details.file.parentFile.name.replaceAll('values-','').replaceAll('-r','-') - languageCode = (languageCode == "values") ? "en" : languageCode; + if (details.file.path.endsWith("strings.xml")) { + def languageCode = details.file.parentFile.name.replaceAll('values-', '').replaceAll('-r', '-') + languageCode = (languageCode == "values") ? "en" : languageCode foundLocales.append("\"").append(languageCode).append("\"").append(",") } } foundLocales.append("}") //Don't forget to remove the trailing comma - def foundLocalesString = foundLocales.toString().replaceAll(',}','}') + def foundLocalesString = foundLocales.toString().replaceAll(',}', '}') android.defaultConfig.buildConfigField "String[]", "TRANSLATION_ARRAY", foundLocalesString } @@ -175,12 +171,25 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { } } +ext { + libVersions = [ + Kovenant : '3.3.0', + Mime4J : '0.7.2', + Dagger : '2.28', + Exoplayer : '2.11.5', + Glide : '4.11.0', + MediaViewerLibrary: '0.9.23', + PlayServices : '17.0.0', + Stetho : '1.5.1', + ] +} + dependencies { implementation project(':twidere.component.common') implementation project(':twidere.component.nyan') /** Kotlin **/ - implementation "org.jetbrains.kotlin:kotlin-stdlib:${libVersions['Kotlin']}" + implementation "org.jetbrains.kotlin:kotlin-stdlib:${sharedVersions['Kotlin']}" implementation "nl.komponents.kovenant:kovenant:${libVersions['Kovenant']}" implementation "nl.komponents.kovenant:kovenant-android:${libVersions['Kovenant']}" implementation "nl.komponents.kovenant:kovenant-combine:${libVersions['Kovenant']}" @@ -189,103 +198,104 @@ dependencies { /** Android support **/ implementation 'androidx.annotation:annotation:1.1.0' - implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.appcompat:appcompat:1.3.0-alpha01' implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.core:core:1.2.0' + implementation 'androidx.core:core-ktx:1.2.0' implementation 'androidx.drawerlayout:drawerlayout:1.1.0-alpha01' - implementation 'androidx.exifinterface:exifinterface:1.1.0' - implementation "androidx.preference:preference:1.1.1" + implementation 'androidx.exifinterface:exifinterface:1.2.0' implementation 'androidx.legacy:legacy-support-core-ui:1.0.0' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.palette:palette:1.0.0' + implementation 'androidx.palette:palette-ktx:1.0.0' + implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.android.material:material:1.1.0' - implementation "androidx.core:core-ktx:1.2.0" /** Third-party dependencies **/ compileOnly 'javax.annotation:jsr250-api:1.0' - implementation "com.twitter:twitter-text:${libVersions['TwitterText']}" + implementation 'com.twitter:twitter-text:1.14.7' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0' implementation 'com.squareup:otto:1.3.8' - implementation 'dnsjava:dnsjava:2.1.8' - implementation 'com.commonsware.cwac:layouts:0.4.3' + implementation 'dnsjava:dnsjava:2.1.9' + implementation 'com.commonsware.cwac:layouts:0.4.5' implementation 'com.rengwuxian.materialedittext:library:2.1.4' implementation 'com.pnikosis:materialish-progress:1.7' implementation 'com.github.uucky:ColorPicker-Android:0.9.7@aar' - implementation "pl.droidsonroids.gif:android-gif-drawable:${libVersions['AndroidGIFDrawable']}" + implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.15' implementation 'com.sprylab.android.texturevideoview:texturevideoview:1.2.1' implementation 'com.squareup:pollexor:2.0.4' + implementation 'org.apache.commons:commons-text:1.8' implementation "org.apache.james:apache-mime4j-core:${libVersions['Mime4J']}" implementation "org.apache.james:apache-mime4j-storage:${libVersions['Mime4J']}" - implementation "com.bluelinelabs:logansquare:${libVersions['LoganSquare']}" - kapt "com.bluelinelabs:logansquare-compiler:${libVersions['LoganSquare']}" - implementation "com.fasterxml.jackson.core:jackson-core:2.7.4" - implementation "com.hannesdorfmann.parcelableplease:annotation:${libVersions['ParcelablePlease']}" - kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}" - implementation "com.squareup.okhttp3:okhttp:${libVersions['OkHttp']}" - implementation "com.squareup.okio:okio:2.4.3" + implementation "com.bluelinelabs:logansquare:${sharedVersions['LoganSquare']}" + kapt "com.bluelinelabs:logansquare-compiler:${sharedVersions['LoganSquare']}" + implementation "com.fasterxml.jackson.core:jackson-core:${sharedVersions['Jackson']}" + implementation "com.hannesdorfmann.parcelableplease:annotation:${sharedVersions['ParcelablePlease']}" + kapt "com.hannesdorfmann.parcelableplease:processor:${sharedVersions['ParcelablePlease']}" + implementation 'com.squareup.okhttp3:okhttp:3.12.12' + implementation 'com.squareup.okio:okio:2.6.0' implementation 'com.lnikkila:extendedtouchview:0.1.1' implementation "com.google.dagger:dagger:${libVersions['Dagger']}" kapt "com.google.dagger:dagger-compiler:${libVersions['Dagger']}" - implementation 'org.attoparser:attoparser:2.0.4.RELEASE' - implementation 'com.getkeepsafe.taptargetview:taptargetview:1.9.1' - implementation 'net.ypresto.androidtranscoder:android-transcoder:0.2.0' + implementation 'org.attoparser:attoparser:2.0.5.RELEASE' + implementation 'com.getkeepsafe.taptargetview:taptargetview:1.13.0' + implementation 'net.ypresto.androidtranscoder:android-transcoder:0.3.0' + implementation 'org.jsoup:jsoup:1.13.1' implementation "com.google.android.exoplayer:exoplayer-core:${libVersions['Exoplayer']}" implementation "com.google.android.exoplayer:exoplayer-ui:${libVersions['Exoplayer']}" implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}" implementation "com.github.bumptech.glide:glide:${libVersions['Glide']}" - implementation "com.github.bumptech.glide:okhttp3-integration:${libVersions['GlideOkHttp3']}@aar" + implementation "com.github.bumptech.glide:okhttp3-integration:${libVersions['Glide']}@aar" kapt "com.github.bumptech.glide:compiler:${libVersions['Glide']}" - implementation "jp.wasabeef:glide-transformations:${libVersions['GlideTransformations']}" - implementation "com.theartofdev.edmodo:android-image-cropper:${libVersions['AndroidImageCropper']}" + implementation 'jp.wasabeef:glide-transformations:4.1.0' + implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' /** Custom dependencies **/ + implementation 'com.github.mariotaku:AbstractTask:0.9.5' implementation 'com.github.mariotaku:DragSortListView:0.6.1' - implementation "com.github.mariotaku:MessageBubbleView:${libVersions['MessageBubbleView']}" - implementation 'com.github.mariotaku:DragSortListView:0.6.1' - implementation "com.github.mariotaku.MediaViewerLibrary:base:${libVersions['MediaViewerLibrary']}" - implementation "com.github.mariotaku.MediaViewerLibrary:subsample-image-view:${libVersions['MediaViewerLibrary']}" - implementation "com.github.mariotaku:SQLiteQB:${libVersions['SQLiteQB']}" - implementation "com.github.mariotaku.ObjectCursor:core:${libVersions['ObjectCursor']}" - kapt "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}" - implementation "com.github.mariotaku.ExportablePreferences:core:${libVersions['ExportablePreferences']}" - implementation "com.github.mariotaku:AbstractTask:${libVersions['AbstractTask']}" - implementation "com.github.mariotaku.CommonsLibrary:parcel:${libVersions['MariotakuCommons']}" - implementation "com.github.mariotaku.CommonsLibrary:io:${libVersions['MariotakuCommons']}" - implementation "com.github.mariotaku.CommonsLibrary:text:${libVersions['MariotakuCommons']}" - implementation "com.github.mariotaku.CommonsLibrary:text-kotlin:${libVersions['MariotakuCommons']}" - implementation("com.github.mariotaku.CommonsLibrary:emojione-android:${libVersions['MariotakuCommons']}") { + implementation "com.github.mariotaku.ExportablePreferences:core:${sharedVersions['ExportablePreferences']}" + implementation("com.github.mariotaku.CommonsLibrary:emojione-android:${sharedVersions['MariotakuCommons']}") { exclude group: 'org.apache.commons', module: 'commons-text' } - implementation "com.github.mariotaku.CommonsLibrary:objectcursor:${libVersions['MariotakuCommons']}" - implementation "com.github.mariotaku.CommonsLibrary:logansquare:${libVersions['MariotakuCommons']}" - implementation "com.github.mariotaku:KPreferences:${libVersions['KPreferences']}" - implementation "com.github.mariotaku.UniqR:android:${libVersions['UniqR']}" - implementation "com.github.mariotaku:PickNCrop:${libVersions['PickNCrop']}" - implementation "com.github.mariotaku.RestFu:library:${libVersions['RestFu']}" - implementation "com.github.mariotaku.RestFu:oauth:${libVersions['RestFu']}" - implementation "com.github.mariotaku.RestFu:oauth2:${libVersions['RestFu']}" - implementation "com.github.mariotaku.RestFu:okhttp3:${libVersions['RestFu']}" - implementation "com.github.mariotaku.RestFu:logansquare:${libVersions['RestFu']}" - implementation "com.github.Tlaster:Chameleon:${libVersions['Chameleon']}" + implementation "com.github.mariotaku.CommonsLibrary:io:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.CommonsLibrary:logansquare:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.CommonsLibrary:objectcursor:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.CommonsLibrary:parcel:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.CommonsLibrary:text:${sharedVersions['MariotakuCommons']}" + implementation "com.github.mariotaku.CommonsLibrary:text-kotlin:${sharedVersions['MariotakuCommons']}" + implementation 'com.github.mariotaku:KPreferences:0.9.8' + implementation "com.github.mariotaku.MediaViewerLibrary:base:${libVersions['MediaViewerLibrary']}" + implementation "com.github.mariotaku.MediaViewerLibrary:subsample-image-view:${libVersions['MediaViewerLibrary']}" + implementation 'com.github.mariotaku:MessageBubbleView:3.5' + implementation "com.github.mariotaku.ObjectCursor:core:${sharedVersions['ObjectCursor']}" + kapt "com.github.mariotaku.ObjectCursor:processor:${sharedVersions['ObjectCursor']}" + implementation 'com.github.mariotaku:PickNCrop:0.9.27' + implementation "com.github.mariotaku.RestFu:library:${sharedVersions['RestFu']}" + implementation "com.github.mariotaku.RestFu:logansquare:${sharedVersions['RestFu']}" + implementation "com.github.mariotaku.RestFu:oauth:${sharedVersions['RestFu']}" + implementation "com.github.mariotaku.RestFu:oauth2:${sharedVersions['RestFu']}" + implementation "com.github.mariotaku.RestFu:okhttp3:${sharedVersions['RestFu']}" + implementation 'com.github.mariotaku:SQLiteQB:0.9.15' + implementation 'com.github.mariotaku.UniqR:android:0.9.4' + implementation 'com.github.Tlaster:Chameleon:0.9.28' /** Flavor dependencies **/ - fdroidImplementation "org.osmdroid:osmdroid-android:${libVersions['OSMDroid']}" - fdroidImplementation "ch.acra:acra:${libVersions['ACRA']}" + fdroidImplementation 'org.osmdroid:osmdroid-android:5.6.5' + fdroidImplementation 'ch.acra:acra:4.11' if (enableGoogleVariant) { // START Non-FOSS component googleImplementation "com.google.android.gms:play-services-ads:${libVersions['PlayServices']}" googleImplementation "com.google.android.gms:play-services-auth:${libVersions['PlayServices']}" googleImplementation "com.google.android.gms:play-services-maps:${libVersions['PlayServices']}" - googleImplementation "com.google.maps.android:android-maps-utils:${libVersions['MapsUtils']}" - googleImplementation "com.anjlab.android.iab.v3:library:${libVersions['IABv3']}" - googleImplementation "com.dropbox.core:dropbox-core-sdk:${libVersions['DropboxCoreSdk']}" - googleImplementation("com.google.apis:google-api-services-drive:${libVersions['GoogleDriveApi']}") { + googleImplementation 'com.google.maps.android:android-maps-utils:0.6.2' + googleImplementation 'com.anjlab.android.iab.v3:library:1.1.0' + googleImplementation 'com.dropbox.core:dropbox-core-sdk:3.1.3' + googleImplementation('com.google.apis:google-api-services-drive:v3-rev195-1.25.0') { exclude group: 'org.apache.httpcomponents' } implementation 'com.google.guava:guava:28.2-android' @@ -294,9 +304,9 @@ dependencies { debugImplementation "com.facebook.stetho:stetho:${libVersions['Stetho']}" debugImplementation "com.facebook.stetho:stetho-okhttp3:${libVersions['Stetho']}" - debugImplementation "com.github.mariotaku:StethoBeanShellREPL:${libVersions['StethoBeanShellREPL']}" - debugImplementation "com.squareup.leakcanary:leakcanary-android:${libVersions['LeakCanary']}" - debugImplementation('com.jayway.jsonpath:json-path:2.2.0') { + debugImplementation 'com.github.mariotaku:StethoBeanShellREPL:0.5' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3' + debugImplementation('com.jayway.jsonpath:json-path:2.4.0') { exclude group: 'net.minidev', module: 'json-smart' } // Stetho dependency, see https://g.co/androidstudio/app-test-app-conflict diff --git a/twidere/src/debug/kotlin/org/mariotaku/twidere/util/stetho/AccountsDumperPlugin.kt b/twidere/src/debug/kotlin/org/mariotaku/twidere/util/stetho/AccountsDumperPlugin.kt index 64cf76b389..1ec8f797d9 100644 --- a/twidere/src/debug/kotlin/org/mariotaku/twidere/util/stetho/AccountsDumperPlugin.kt +++ b/twidere/src/debug/kotlin/org/mariotaku/twidere/util/stetho/AccountsDumperPlugin.kt @@ -316,9 +316,9 @@ class AccountsDumperPlugin(val context: Context) : DumperPlugin { return JsonPath.parse(JsonSerializer.serialize(details), configuration) } - private fun Any.prettyPrint() = when { - this is JSONObject -> toString(4) - this is JSONArray -> toString(4) + private fun Any.prettyPrint() = when (this) { + is JSONObject -> toString(4) + is JSONArray -> toString(4) else -> toString() } diff --git a/twidere/src/main/assets/data/default_api_configs.json b/twidere/src/main/assets/data/default_api_configs.json index 8416dafe11..e5bd5d28d9 100644 --- a/twidere/src/main/assets/data/default_api_configs.json +++ b/twidere/src/main/assets/data/default_api_configs.json @@ -7,8 +7,8 @@ "auth_type": "oauth", "same_oauth_url": true, "no_version_suffix": false, - "consumer_key": "wmtrtTaVOjUnH5pWQp4LDI5Qs", - "consumer_secret": "E9Q9u2yK0COJae2tLcNEdY75OPA3bxqJiGZQztraHaQUtoI2cu", + "consumer_key": "MUUBibXUognm6e9vbzrUIqPkt", + "consumer_secret": "l2uWAgQkoHvDfM2PrRFx2WN4h7QIUIktmxyeTAqRo6TkGCtNKy", "sign_up_url": "https://twitter.com/signup" }, { diff --git a/twidere/src/main/java/org/apache/commons/text/translate/AggregateTranslator.java b/twidere/src/main/java/org/apache/commons/text/translate/AggregateTranslator.java deleted file mode 100644 index 788f8c5e1a..0000000000 --- a/twidere/src/main/java/org/apache/commons/text/translate/AggregateTranslator.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.commons.text.translate; - -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; - -/** - * Executes a sequence of translators one after the other. Execution ends whenever - * the first translator consumes codepoints from the input. - * - * @since 1.0 - */ -public class AggregateTranslator extends CharSequenceTranslator { - - /** - * Translator list. - */ - private final List translators = new ArrayList<>(); - - /** - * Specify the translators to be used at creation time. - * - * @param translators CharSequenceTranslator array to aggregate - */ - public AggregateTranslator(final CharSequenceTranslator... translators) { - if (translators != null) { - for (CharSequenceTranslator translator : translators) { - if (translator != null) { - this.translators.add(translator); - } - } - } - } - - /** - * The first translator to consume codepoints from the input is the 'winner'. - * Execution stops with the number of consumed codepoints being returned. - * {@inheritDoc} - */ - @Override - public int translate(final CharSequence input, final int index, final Writer out) throws IOException { - for (final CharSequenceTranslator translator : translators) { - final int consumed = translator.translate(input, index, out); - if (consumed != 0) { - return consumed; - } - } - return 0; - } - -} diff --git a/twidere/src/main/java/org/apache/commons/text/translate/CharSequenceTranslator.java b/twidere/src/main/java/org/apache/commons/text/translate/CharSequenceTranslator.java deleted file mode 100644 index de6fa2e65f..0000000000 --- a/twidere/src/main/java/org/apache/commons/text/translate/CharSequenceTranslator.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.commons.text.translate; - -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.Locale; - -/** - * An API for translating text. - * Its core use is to escape and unescape text. Because escaping and unescaping - * is completely contextual, the API does not present two separate signatures. - * - * @since 1.0 - */ -public abstract class CharSequenceTranslator { - - /** - * Array containing the hexadecimal alphabet. - */ - static final char[] HEX_DIGITS = new char[]{'0', '1', '2', '3', - '4', '5', '6', '7', - '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F'}; - - /** - * Translate a set of codepoints, represented by an int index into a CharSequence, - * into another set of codepoints. The number of codepoints consumed must be returned, - * and the only IOExceptions thrown must be from interacting with the Writer so that - * the top level API may reliably ignore StringWriter IOExceptions. - * - * @param input CharSequence that is being translated - * @param index int representing the current point of translation - * @param out Writer to translate the text to - * @return int count of codepoints consumed - * @throws IOException if and only if the Writer produces an IOException - */ - public abstract int translate(CharSequence input, int index, Writer out) throws IOException; - - /** - * Helper for non-Writer usage. - * - * @param input CharSequence to be translated - * @return String output of translation - */ - public final String translate(final CharSequence input) { - if (input == null) { - return null; - } - try { - final StringWriter writer = new StringWriter(input.length() * 2); - translate(input, writer); - return writer.toString(); - } catch (final IOException ioe) { - // this should never ever happen while writing to a StringWriter - throw new RuntimeException(ioe); - } - } - - /** - * Translate an input onto a Writer. This is intentionally final as its algorithm is - * tightly coupled with the abstract method of this class. - * - * @param input CharSequence that is being translated - * @param out Writer to translate the text to - * @throws IOException if and only if the Writer produces an IOException - */ - public final void translate(final CharSequence input, final Writer out) throws IOException { - if (out == null) throw new IllegalArgumentException("The Writer must not be null"); - if (input == null) { - return; - } - int pos = 0; - final int len = input.length(); - while (pos < len) { - final int consumed = translate(input, pos, out); - if (consumed == 0) { - // inlined implementation of Character.toChars(Character.codePointAt(input, pos)) - // avoids allocating temp char arrays and duplicate checks - final char c1 = input.charAt(pos); - out.write(c1); - pos++; - if (Character.isHighSurrogate(c1) && pos < len) { - final char c2 = input.charAt(pos); - if (Character.isLowSurrogate(c2)) { - out.write(c2); - pos++; - } - } - continue; - } - // contract with translators is that they have to understand codepoints - // and they just took care of a surrogate pair - for (int pt = 0; pt < consumed; pt++) { - pos += Character.charCount(Character.codePointAt(input, pos)); - } - } - } - - /** - * Helper method to create a merger of this translator with another set of - * translators. Useful in customizing the standard functionality. - * - * @param translators CharSequenceTranslator array of translators to merge with this one - * @return CharSequenceTranslator merging this translator with the others - */ - public final CharSequenceTranslator with(final CharSequenceTranslator... translators) { - final CharSequenceTranslator[] newArray = new CharSequenceTranslator[translators.length + 1]; - newArray[0] = this; - System.arraycopy(translators, 0, newArray, 1, translators.length); - return new AggregateTranslator(newArray); - } - - /** - *

Returns an upper case hexadecimal String for the given - * character.

- * - * @param codepoint The codepoint to convert. - * @return An upper case hexadecimal String - */ - public static String hex(final int codepoint) { - return Integer.toHexString(codepoint).toUpperCase(Locale.ENGLISH); - } - -} diff --git a/twidere/src/main/java/org/apache/commons/text/translate/CodePointTranslator.java b/twidere/src/main/java/org/apache/commons/text/translate/CodePointTranslator.java deleted file mode 100644 index 71828be069..0000000000 --- a/twidere/src/main/java/org/apache/commons/text/translate/CodePointTranslator.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.commons.text.translate; - -import java.io.IOException; -import java.io.Writer; - -/** - * Helper subclass to CharSequenceTranslator to allow for translations that - * will replace up to one character at a time. - * - * @since 1.0 - */ -public abstract class CodePointTranslator extends CharSequenceTranslator { - - /** - * Implementation of translate that maps onto the abstract translate(int, Writer) method. - * {@inheritDoc} - */ - @Override - public final int translate(final CharSequence input, final int index, final Writer out) throws IOException { - final int codepoint = Character.codePointAt(input, index); - final boolean consumed = translate(codepoint, out); - return consumed ? 1 : 0; - } - - /** - * Translate the specified codepoint into another. - * - * @param codepoint int character input to translate - * @param out Writer to optionally push the translated output to - * @return boolean as to whether translation occurred or not - * @throws IOException if and only if the Writer produces an IOException - */ - public abstract boolean translate(int codepoint, Writer out) throws IOException; - -} diff --git a/twidere/src/main/java/org/apache/commons/text/translate/LookupTranslator.java b/twidere/src/main/java/org/apache/commons/text/translate/LookupTranslator.java deleted file mode 100644 index c4d5e2ee66..0000000000 --- a/twidere/src/main/java/org/apache/commons/text/translate/LookupTranslator.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.commons.text.translate; - -import java.io.IOException; -import java.io.Writer; -import java.security.InvalidParameterException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; - -/** - * Translates a value using a lookup table. - * - * @since 1.0 - */ -public class LookupTranslator extends CharSequenceTranslator { - - /** The mapping to be used in translation. */ - private final Map lookupMap; - /** The first character of each key in the lookupMap. */ - private final HashSet prefixSet; - /** The length of the shortest key in the lookupMap. */ - private final int shortest; - /** The length of the longest key in the lookupMap. */ - private final int longest; - - /** - * Define the lookup table to be used in translation - * - * Note that, as of Lang 3.1 (the orgin of this code), the key to the lookup - * table is converted to a java.lang.String. This is because we need the key - * to support hashCode and equals(Object), allowing it to be the key for a - * HashMap. See LANG-882. - * - * @param lookupMap Map<CharSequence, CharSequence> table of translator - * mappings - */ - public LookupTranslator(final Map lookupMap) { - if (lookupMap == null) { - throw new InvalidParameterException("lookupMap cannot be null"); - } - this.lookupMap = new HashMap<>(); - this.prefixSet = new HashSet<>(); - int currentShortest = Integer.MAX_VALUE; - int currentLongest = 0; - Iterator> it = lookupMap.entrySet().iterator(); - - while (it.hasNext()) { - Map.Entry pair = it.next(); - this.lookupMap.put(pair.getKey().toString(), pair.getValue().toString()); - this.prefixSet.add(pair.getKey().charAt(0)); - final int sz = pair.getKey().length(); - if (sz < currentShortest) { - currentShortest = sz; - } - if (sz > currentLongest) { - currentLongest = sz; - } - } - this.shortest = currentShortest; - this.longest = currentLongest; - } - - /** - * {@inheritDoc} - */ - @Override - public int translate(final CharSequence input, final int index, final Writer out) throws IOException { - // check if translation exists for the input at position index - if (prefixSet.contains(input.charAt(index))) { - int max = longest; - if (index + longest > input.length()) { - max = input.length() - index; - } - // implement greedy algorithm by trying maximum match first - for (int i = max; i >= shortest; i--) { - final CharSequence subSeq = input.subSequence(index, index + i); - final String result = lookupMap.get(subSeq.toString()); - - if (result != null) { - out.write(result); - return i; - } - } - } - return 0; - } -} diff --git a/twidere/src/main/java/org/apache/commons/text/translate/NumericEntityUnescaper.java b/twidere/src/main/java/org/apache/commons/text/translate/NumericEntityUnescaper.java deleted file mode 100644 index 66704dd1a5..0000000000 --- a/twidere/src/main/java/org/apache/commons/text/translate/NumericEntityUnescaper.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.commons.text.translate; - -import java.io.IOException; -import java.io.Writer; -import java.util.Arrays; -import java.util.EnumSet; - -/** - * Translate XML numeric entities of the form &#[xX]?\d+;? to - * the specific codepoint. - * - * Note that the semi-colon is optional. - * - * @since 1.0 - */ -public class NumericEntityUnescaper extends CharSequenceTranslator { - - /** NumericEntityUnescaper option enum. */ - public enum OPTION { semiColonRequired, semiColonOptional, errorIfNoSemiColon } - - /** EnumSet of OPTIONS, given from the constructor. */ - private final EnumSet