diff --git a/.gitignore b/.gitignore index bddd49ae7..974a23566 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Built application files -/build +build/ # Local configuration file (sdk path, etc) local.properties diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 diff --git a/.travis.yml b/.travis.yml index 995218cce..5326f2c0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ android: components: - tools - platform-tools - - build-tools-29.0.2 + - build-tools-29.0.3 - android-29 - extra-android-m2repository - extra-google-m2repository diff --git a/build.gradle b/build.gradle index da54ec554..63f234557 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. + buildscript { repositories { jcenter() - maven { url 'https://plugins.gradle.org/m2/' } - maven { url 'https://maven.google.com' } + maven { url "https://plugins.gradle.org/m2/" } google() } + dependencies { classpath 'com.android.tools.build:gradle:3.6.3' // NOTE: Do not place your application dependencies here; they belong @@ -14,15 +15,13 @@ buildscript { } allprojects { - ext { projectGroupId = 'org.mariotaku.twidere' - projectVersionCode = 508 - projectVersionName = '4.0.9' + projectVersionCode = 509 + projectVersionName = '4.1.0' globalCompileSdkVersion = 29 - globalBuildToolsVersion = '29.0.2' - + globalBuildToolsVersion = "29.0.3" globalMinSdkVersion = 19 globalTargetSdkVersion = 29 @@ -31,24 +30,21 @@ allprojects { repositories { mavenLocal() jcenter() - maven { url 'https://maven.google.com' } - maven { url 'https://jitpack.io' } + maven { url "https://jitpack.io" } google() } - } subprojects { buildscript { ext { - kotlinVersion = '1.3.61' + kotlinVersion = '1.3.72' pluginVersions = [ AndroidSvgDrawable: '3.0.0', PlayServices : '4.3.3', ] libVersions = [ Kotlin : "${kotlinVersion}", - SupportLib : '26.1.0', SupportTest : '1.0.0', MariotakuCommons : '0.9.20', RestFu : '0.9.60', @@ -86,6 +82,7 @@ subprojects { AbstractTask : '0.9.5', Dagger : '2.11', StethoBeanShellREPL : '0.1', + MessageBubbleView : '3.5', ] } diff --git a/build.properties b/build.properties deleted file mode 100644 index e69de29bb..000000000 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index dbae7c0b7..490fda857 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 649149d92..6623300be 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Mon Apr 20 10:36:29 CEST 2020 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4453ccea3..2fe81a7d9 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,16 +44,16 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -109,8 +125,8 @@ 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 +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` @@ -138,35 +154,30 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f9553162f..62bd9b9cc 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/twidere.component.common/.gitignore b/twidere.component.common/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/twidere.component.common/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/twidere.component.common/build.gradle b/twidere.component.common/build.gradle index 4e5a36a3d..8166c626e 100644 --- a/twidere.component.common/build.gradle +++ b/twidere.component.common/build.gradle @@ -43,8 +43,12 @@ buildscript { } } -android { +repositories { + mavenLocal() + jcenter() +} +android { compileSdkVersion globalCompileSdkVersion buildToolsVersion globalBuildToolsVersion @@ -62,26 +66,27 @@ android { } } -repositories { - mavenLocal() - jcenter() -} - dependencies { - annotationProcessor "com.bluelinelabs:logansquare-compiler:${libVersions['LoganSquare']}" - annotationProcessor "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}" - annotationProcessor "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}" - annotationProcessor "com.github.mariotaku.ExportablePreferences:processor:${libVersions['ExportablePreferences']}" - +/** Android support **/ implementation 'androidx.annotation:annotation:1.1.0' + + +/** 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']}" + + +/** 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.hannesdorfmann.parcelableplease:annotation:${libVersions['ParcelablePlease']}" 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']}" } diff --git a/twidere.component.common/proguard-rules.pro b/twidere.component.common/proguard-rules.pro deleted file mode 100644 index ee5b46f04..000000000 --- a/twidere.component.common/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/mariotaku/Tools/android-sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# 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 *; -#} diff --git a/twidere.component.nyan/.gitignore b/twidere.component.nyan/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/twidere.component.nyan/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/twidere.component.nyan/build.gradle b/twidere.component.nyan/build.gradle index 4974e7a57..c6e972da4 100644 --- a/twidere.component.nyan/build.gradle +++ b/twidere.component.nyan/build.gradle @@ -22,21 +22,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion globalCompileSdkVersion buildToolsVersion globalBuildToolsVersion defaultConfig { minSdkVersion globalMinSdkVersion targetSdkVersion globalTargetSdkVersion - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } } } diff --git a/twidere.component.nyan/proguard-rules.pro b/twidere.component.nyan/proguard-rules.pro deleted file mode 100644 index ee5b46f04..000000000 --- a/twidere.component.nyan/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/mariotaku/Tools/android-sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# 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 *; -#} diff --git a/twidere.component.nyan/src/androidTest/java/org/mariotaku/twidere/nyan/ApplicationTest.java b/twidere.component.nyan/src/androidTest/java/org/mariotaku/twidere/nyan/ApplicationTest.java deleted file mode 100644 index 4aa0ea779..000000000 --- a/twidere.component.nyan/src/androidTest/java/org/mariotaku/twidere/nyan/ApplicationTest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.nyan; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/twidere/build.gradle b/twidere/build.gradle index ec64610eb..ee1612385 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -9,7 +9,7 @@ buildscript { enableGoogleVariant = project.file('google-services.json').exists() } repositories { - maven { url 'https://jitpack.io' } + maven { url "https://jitpack.io" } jcenter() if (enableGoogleVariant) { // START Non-FOSS component @@ -21,7 +21,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-android-extensions:${kotlinVersion}" - classpath 'com.github.mariotaku:imgenie-plugin:0.2.5' + classpath 'com.github.mariotaku:imgenie-plugin:0.2.6' if (enableGoogleVariant) { // START Non-FOSS component @@ -31,8 +31,13 @@ buildscript { } } -android { +repositories { + mavenLocal() + maven { url "https://s3.amazonaws.com/repo.commonsware.com" } + flatDir { dirs "$projectDir/lib" } +} +android { compileSdkVersion globalCompileSdkVersion buildToolsVersion globalBuildToolsVersion @@ -50,17 +55,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - aaptOptions { - additionalParameters "--no-version-vectors" - } - flavorDimensions 'channel' - productFlavors { if (enableGoogleVariant) { // START Non-FOSS component @@ -119,6 +114,15 @@ android { it.java.srcDirs += "src/${it.name}/kotlin" } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + aaptOptions { + additionalParameters "--no-version-vectors" + } + testOptions { unitTests.returnDefaultValues = true } @@ -130,13 +134,7 @@ android { } packagingOptions { - exclude 'META-INF/LICENSE' - exclude 'META-INF/NOTICE' - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/README' - exclude 'META-INF/INDEX.LIST' - exclude 'META-INF/maven/**' - exclude 'META-INF/*.kotlin_module' + exclude 'META-INF/*' exclude 'kotlin/**.kotlin_builtins' exclude 'org/osmdroid/**.png' exclude 'javax/annotation/**.java' @@ -150,75 +148,36 @@ android { } -repositories { - mavenLocal() - maven { url 'https://s3.amazonaws.com/repo.commonsware.com' } - flatDir { dirs "$projectDir/lib" } -} - dependencies { -// wearApp project(':twidere.wear') - kapt "com.bluelinelabs:logansquare-compiler:${libVersions['LoganSquare']}" - kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}" - kapt "com.google.dagger:dagger-compiler:${libVersions['Dagger']}" - kapt "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}" - implementation project(':twidere.component.common') implementation project(':twidere.component.nyan') - if (enableGoogleVariant) { - // START Non-FOSS component - googleImplementation "com.google.android.gms:play-services-maps:${libVersions['PlayServices']}" - googleImplementation "com.google.android.gms:play-services-auth:${libVersions['PlayServices']}" - googleImplementation "com.google.android.gms:play-services-ads:${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']}") { - exclude group: 'org.apache.httpcomponents' - } - implementation("com.google.guava:guava:28.2-android") - // END Non-FOSS component - } +/** Kotlin **/ + implementation "org.jetbrains.kotlin:kotlin-stdlib:${libVersions['Kotlin']}" + implementation "nl.komponents.kovenant:kovenant:${libVersions['Kovenant']}" + implementation "nl.komponents.kovenant:kovenant-android:${libVersions['Kovenant']}" + implementation "nl.komponents.kovenant:kovenant-combine:${libVersions['Kovenant']}" + implementation "nl.komponents.kovenant:kovenant-functional:${libVersions['Kovenant']}" - fdroidImplementation "org.osmdroid:osmdroid-android:${libVersions['OSMDroid']}" - fdroidImplementation "ch.acra:acra:${libVersions['ACRA']}" - 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') { - exclude group: 'net.minidev', module: 'json-smart' - } - // Stetho dependency, see https://g.co/androidstudio/app-test-app-conflict - debugImplementation "com.google.code.findbugs:jsr305:3.0.2" - - compileOnly 'javax.annotation:jsr250-api:1.0' - - testImplementation 'junit:junit:4.12' - - androidTestImplementation 'androidx.annotation:annotation:1.1.0' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test:rules:1.2.0' - // https://g.co/androidstudio/app-test-app-conflict - androidTestImplementation "com.google.code.findbugs:jsr305:3.0.2" - - implementation 'androidx.multidex:multidex:2.0.1' +/** Android support **/ implementation 'androidx.annotation:annotation:1.1.0' - implementation 'androidx.core:core:1.2.0' - implementation 'androidx.legacy:legacy-support-core-utils:1.0.0' - implementation 'androidx.legacy:legacy-support-core-ui:1.0.0' - implementation 'androidx.legacy:legacy-support-v13:1.0.0' implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'androidx.palette:palette:1.0.0' - implementation 'androidx.legacy:legacy-preference-v14:1.0.0' implementation 'androidx.browser:browser:1.2.0' - implementation "androidx.drawerlayout:drawerlayout:1.1.0-alpha01" - implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.core:core: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.legacy:legacy-support-core-ui:1.0.0' + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.palette:palette:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + + +/** Third-party dependencies **/ + compileOnly 'javax.annotation:jsr250-api:1.0' implementation "com.twitter:twitter-text:${libVersions['TwitterText']}" implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0' implementation 'com.squareup:otto:1.3.8' @@ -226,7 +185,7 @@ dependencies { implementation 'com.commonsware.cwac:layouts:0.4.3' implementation 'com.rengwuxian.materialedittext:library:2.1.4' implementation 'com.pnikosis:materialish-progress:1.7' - implementation 'com.github.mariotaku:MessageBubbleView:1.6' + implementation "com.github.mariotaku:MessageBubbleView:${libVersions['MessageBubbleView']}" implementation 'com.github.mariotaku:DragSortListView:0.6.1' implementation 'com.github.uucky:ColorPicker-Android:0.9.7@aar' implementation "pl.droidsonroids.gif:android-gif-drawable:${libVersions['AndroidGIFDrawable']}" @@ -235,33 +194,35 @@ dependencies { 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']}" - 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']}" + kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}" implementation "com.squareup.okhttp3:okhttp:${libVersions['OkHttp']}" - implementation("com.squareup.okio:okio:2.4.3") + implementation "com.squareup.okio:okio:2.4.3" 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 "com.google.android.exoplayer:exoplayer:${libVersions['Exoplayer']}" implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}" implementation "com.github.bumptech.glide:glide:${libVersions['Glide']}" - kapt "com.github.bumptech.glide:compiler:${libVersions['Glide']}" implementation "com.github.bumptech.glide:okhttp3-integration:${libVersions['GlideOkHttp3']}@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']}" + +/** Custom dependencies **/ + implementation 'com.github.mariotaku:MessageBubbleView:1.6' + 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']}" @@ -274,14 +235,53 @@ dependencies { 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.Tlaster:Chameleon:${libVersions['Chameleon']}" 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 "org.jetbrains.kotlin:kotlin-stdlib:${libVersions['Kotlin']}" - implementation "nl.komponents.kovenant:kovenant:${libVersions['Kovenant']}" - implementation "nl.komponents.kovenant:kovenant-android:${libVersions['Kovenant']}" - implementation "nl.komponents.kovenant:kovenant-functional:${libVersions['Kovenant']}" - implementation "nl.komponents.kovenant:kovenant-combine:${libVersions['Kovenant']}" + +/** Flavor dependencies **/ + fdroidImplementation "org.osmdroid:osmdroid-android:${libVersions['OSMDroid']}" + fdroidImplementation "ch.acra:acra:${libVersions['ACRA']}" + + 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']}") { + exclude group: 'org.apache.httpcomponents' + } + implementation 'com.google.guava:guava:28.2-android' + // END Non-FOSS component + } + + 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') { + exclude group: 'net.minidev', module: 'json-smart' + } + // Stetho dependency, see https://g.co/androidstudio/app-test-app-conflict + debugImplementation 'com.google.code.findbugs:jsr305:3.0.2' + + +/** Testing **/ + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.annotation:annotation:1.1.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test:rules:1.2.0' + // https://g.co/androidstudio/app-test-app-conflict + androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.2' } if (enableGoogleVariant) { diff --git a/twidere/src/main/AndroidManifest.xml b/twidere/src/main/AndroidManifest.xml index d013ecc65..1d6a171d4 100644 --- a/twidere/src/main/AndroidManifest.xml +++ b/twidere/src/main/AndroidManifest.xml @@ -119,6 +119,7 @@ android:resizeableActivity="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:networkSecurityConfig="@xml/network_security_config" android:theme="@style/Theme.Twidere.NoActionBar" tools:ignore="UnusedAttribute"> T.applyOnShow(action: T.() -> Unit) { } } -fun AlertDialog.Builder.positive(@StringRes textId: Int, action: (dialog: AlertDialog) -> Unit) { +inline fun AlertDialog.Builder.positive(@StringRes textId: Int, crossinline action: (dialog: AlertDialog) -> Unit) { setPositiveButton(textId) { dialog, _ -> action(dialog as AlertDialog) } } -fun AlertDialog.Builder.negative(@StringRes textId: Int, action: (dialog: AlertDialog) -> Unit) { +inline fun AlertDialog.Builder.negative(@StringRes textId: Int, crossinline action: (dialog: AlertDialog) -> Unit) { setNegativeButton(textId) { dialog, _ -> action(dialog as AlertDialog) } } +inline fun AlertDialog.Builder.neutral(@StringRes textId: Int, crossinline action: (dialog: AlertDialog) -> Unit) { + setNeutralButton(textId) { dialog, _ -> + action(dialog as AlertDialog) + } +} + fun T.onShow(action: (dialog: T) -> Unit) { setOnShowListener { dialog -> @Suppress("UNCHECKED_CAST") diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountNotificationSettingsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountNotificationSettingsFragment.kt index e05d2de6f..9c8b16939 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountNotificationSettingsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountNotificationSettingsFragment.kt @@ -20,6 +20,7 @@ package org.mariotaku.twidere.fragment import android.os.Bundle +import androidx.preference.Preference import org.mariotaku.twidere.R import org.mariotaku.twidere.constant.SharedPreferenceConstants.* import org.mariotaku.twidere.preference.notification.AccountNotificationChannelsPreference @@ -38,7 +39,7 @@ class AccountNotificationSettingsFragment : BaseAccountPreferenceFragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) val account = this.account - findPreference(KEY_NOTIFICATION_LIGHT_COLOR)?.let { + findPreference(KEY_NOTIFICATION_LIGHT_COLOR)?.let { if (account != null) { it.setDefaultValue(account.color) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BasePreferenceFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BasePreferenceFragment.kt index 2c6a36bdd..436b240d8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BasePreferenceFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BasePreferenceFragment.kt @@ -93,11 +93,10 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(), IBaseFragmen REQUEST_PICK_RINGTONE -> { if (resultCode == Activity.RESULT_OK && data != null) { val ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) - if (ringtonePreferenceKey != null) { - val ringtonePreference = findPreference(ringtonePreferenceKey) as RingtonePreference? - if (ringtonePreference != null) { - ringtonePreference.value = ringtone?.toString() - } + ringtonePreferenceKey?.let { + findPreference(it) + }?.let { + it.value = ringtone?.toString() } ringtonePreferenceKey = null } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SettingsDetailsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SettingsDetailsFragment.kt index dab9543c9..e98208a9f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SettingsDetailsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SettingsDetailsFragment.kt @@ -22,9 +22,10 @@ package org.mariotaku.twidere.fragment import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Bundle -import androidx.core.view.ViewCompat -import androidx.preference.PreferenceScreen import android.view.View +import androidx.core.view.ViewCompat +import androidx.preference.Preference +import androidx.preference.PreferenceScreen import org.mariotaku.twidere.Constants.* import org.mariotaku.twidere.activity.SettingsActivity import org.mariotaku.twidere.constant.IntentConstants.EXTRA_SHOULD_TERMINATE @@ -76,7 +77,7 @@ class SettingsDetailsFragment : BasePreferenceFragment(), OnSharedPreferenceChan } override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) { - val preference = findPreference(key) ?: return + val preference = findPreference(key) ?: return val currentActivity = activity ?: return val extras = preference.extras if (extras != null) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListFragment.kt index ee81d2262..77b1561c9 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListFragment.kt @@ -54,6 +54,7 @@ import org.mariotaku.twidere.app.TwidereApplication import org.mariotaku.twidere.constant.newDocumentApiKey import org.mariotaku.twidere.extension.applyTheme import org.mariotaku.twidere.extension.model.api.microblog.toParcelable +import org.mariotaku.twidere.extension.neutral import org.mariotaku.twidere.extension.onShow import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback @@ -405,6 +406,10 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener, builder.setTitle(userList.name) builder.setMessage(userList.description) builder.setPositiveButton(android.R.string.ok, null) + builder.neutral(R.string.action_list_creator) { + startActivity(IntentUtils.userProfile(userList.account_key, userList.user_key, + userList.user_screen_name)) + } val dialog = builder.create() dialog.onShow { it.applyTheme() } return dialog diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/statuses/ConversationLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/statuses/ConversationLoader.kt index 4a5d87030..bfd66daea 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/statuses/ConversationLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/statuses/ConversationLoader.kt @@ -154,16 +154,16 @@ class ConversationLoader( if (loadReplies || noSinceMaxId || sinceId != null && sinceSortId > status.sort_id) { // Load replies var repliesLoaded = false - try { - if (details.type == AccountType.TWITTER) { - if (noSinceMaxId) { - statuses.addAll(loadTwitterWebReplies(details, twitter)) - } - repliesLoaded = true - } - } catch (e: MicroBlogException) { - // Ignore - } +// try { +// if (details.type == AccountType.TWITTER) { +// if (noSinceMaxId) { +// statuses.addAll(loadTwitterWebReplies(details, twitter)) +// } +// repliesLoaded = true +// } +// } catch (e: MicroBlogException) { +// // Ignore +// } if (!repliesLoaded) { val query = SearchQuery() query.count(100) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/SaveFileTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/SaveFileTask.kt index 2594a49e3..6429245df 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/SaveFileTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/SaveFileTask.kt @@ -144,18 +144,14 @@ abstract class SaveFileTask( internal fun getFileNameWithExtension(name: String, extension: String?, specialCharacter: Char, suffix: String?): String { val sb = StringBuilder() - var end = name.length if (extension != null) { - if (name.endsWith(extension)) { - for (i in end - extension.length - 1 downTo 0) { - if (name[i] != specialCharacter) { - end = i + 1 - break - } - } - } + sb.append(name + .removeSuffix(extension) + .removeSuffix(".") + .takeLastWhile { it != specialCharacter }) + } else { + sb.append(name) } - sb.append(name, 0, end) if (suffix != null) { sb.append(suffix) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt index 24533843f..b0eaf1d5d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt @@ -168,7 +168,7 @@ class GetMessagesTask( directMessage[DirectMessage::class.java.getDeclaredField("recipient")] = users.firstOrNull { user -> it.messageCreate.target.recipientId == user.id } directMessage[DirectMessage::class.java.getDeclaredField("createdAt")] = Date(it.createdTimestamp.toLong()) } - }.filter { it.sender != null } + }.filter { it.sender != null && it.recipient != null } val insertMessages = arrayListOf() val conversations = hashMapOf() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt index 4dd0721f2..857dc148e 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt @@ -72,7 +72,10 @@ class MessageViewHolder(itemView: View, adapter: MessagesConversationAdapter) : } messageBubble.setOutgoing(message.is_outgoing) - text.setTextColor(ThemeUtils.getColorDependent(messageBubble.bubbleColor.defaultColor)) + val bubbleColor = messageBubble.bubbleColor + if (bubbleColor != null) { + text.setTextColor(ThemeUtils.getColorDependent(bubbleColor.defaultColor)) + } // Loop through text and spans to found non-space char count val hideText = run { @@ -128,7 +131,11 @@ class MessageViewHolder(itemView: View, adapter: MessagesConversationAdapter) : const val layoutResource = R.layout.list_item_message_conversation_text fun MessageBubbleView.setOutgoing(outgoing: Boolean) { - setCaretPosition(if (outgoing) MessageBubbleView.TOP_END else MessageBubbleView.BOTTOM_START) + caretPosition = if (outgoing) { + MessageBubbleView.TOP or MessageBubbleView.END + } else { + MessageBubbleView.BOTTOM or MessageBubbleView.START + } } } } diff --git a/twidere/src/main/res/layout/list_item_message_conversation_text.xml b/twidere/src/main/res/layout/list_item_message_conversation_text.xml index eb1464502..cccf30aed 100644 --- a/twidere/src/main/res/layout/list_item_message_conversation_text.xml +++ b/twidere/src/main/res/layout/list_item_message_conversation_text.xml @@ -62,35 +62,41 @@ app:caretHeight="@dimen/element_spacing_normal" app:caretPosition="bottomStart" app:caretWidth="@dimen/element_spacing_normal" - app:cornerRadius="2dp"> + app:cornerRadius="2dp" + app:wrapContentMaxWidthPercent="85%p"> - + android:layout_marginLeft="@dimen/element_spacing_normal" + android:layout_marginRight="@dimen/element_spacing_normal" + android:layout_marginTop="@dimen/element_spacing_normal" + android:visibility="gone" + tools:visibility="visible"> - + - + - - - + android:layout_height="@dimen/element_spacing_normal" + android:layout_below="@+id/mediaPreview"/> + + - Leave conversation Like + List creator Location Manage in Buffer Mark as read diff --git a/twidere/src/main/res/xml/network_security_config.xml b/twidere/src/main/res/xml/network_security_config.xml new file mode 100644 index 000000000..21083def2 --- /dev/null +++ b/twidere/src/main/res/xml/network_security_config.xml @@ -0,0 +1,6 @@ + + + + fanfou.com + +