Merge branch 'maintenance' into origin/master

This commit is contained in:
Tlaster 2020-04-22 19:12:46 +08:00
commit f1ebcb6894
30 changed files with 262 additions and 279 deletions

2
.gitignore vendored
View File

@ -1,5 +1,5 @@
# Built application files
/build
build/
# Local configuration file (sdk path, etc)
local.properties

0
.gitmodules vendored
View File

View File

@ -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

View File

@ -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',
]
}

View File

Binary file not shown.

View File

@ -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

57
gradlew vendored
View File

@ -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" "$@"

21
gradlew.bat vendored
View File

@ -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

View File

@ -1 +0,0 @@
/build

View File

@ -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']}"
}

View File

@ -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 *;
#}

View File

@ -1 +0,0 @@
/build

View File

@ -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'
}
}
}

View File

@ -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 *;
#}

View File

@ -1,32 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.nyan;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}

View File

@ -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) {

View File

@ -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">
<uses-library

View File

@ -31,18 +31,24 @@ fun <T : Dialog> 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 : Dialog> T.onShow(action: (dialog: T) -> Unit) {
setOnShowListener { dialog ->
@Suppress("UNCHECKED_CAST")

View File

@ -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<Preference>(KEY_NOTIFICATION_LIGHT_COLOR)?.let {
if (account != null) {
it.setDefaultValue(account.color)
}

View File

@ -93,11 +93,10 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(), IBaseFragmen
REQUEST_PICK_RINGTONE -> {
if (resultCode == Activity.RESULT_OK && data != null) {
val ringtone = data.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
if (ringtonePreferenceKey != null) {
val ringtonePreference = findPreference(ringtonePreferenceKey) as RingtonePreference?
if (ringtonePreference != null) {
ringtonePreference.value = ringtone?.toString()
}
ringtonePreferenceKey?.let {
findPreference<RingtonePreference>(it)
}?.let {
it.value = ringtone?.toString()
}
ringtonePreferenceKey = null
}

View File

@ -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<Preference>(key) ?: return
val currentActivity = activity ?: return
val extras = preference.extras
if (extras != null) {

View File

@ -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

View File

@ -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)

View File

@ -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)
}

View File

@ -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<ParcelableMessage>()
val conversations = hashMapOf<String, ParcelableMessageConversation>()

View File

@ -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
}
}
}
}

View File

@ -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">
<RelativeLayout
<org.mariotaku.twidere.view.CardMediaContainer
android:id="@+id/mediaPreview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mediaPreview"
android:padding="@dimen/element_spacing_normal">
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">
<org.mariotaku.twidere.view.CardMediaContainer
android:id="@+id/mediaPreview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/element_spacing_normal"
android:visibility="gone">
<include layout="@layout/layout_card_media_preview"/>
<include layout="@layout/layout_card_media_preview"/>
</org.mariotaku.twidere.view.CardMediaContainer>
</org.mariotaku.twidere.view.CardMediaContainer>
<org.mariotaku.twidere.view.TimelineContentTextView
android:id="@+id/text"
<android.widget.Space
android:id="@+id/mediaTextSpace"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mediaPreview"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
tools:text="@string/sample_status_text"/>
android:layout_height="@dimen/element_spacing_normal"
android:layout_below="@+id/mediaPreview"/>
<org.mariotaku.twidere.view.TimelineContentTextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mediaTextSpace"
android:layout_marginBottom="@dimen/element_spacing_normal"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_marginRight="@dimen/element_spacing_normal"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
tools:text="@string/sample_status_text"/>
</RelativeLayout>
</org.mariotaku.messagebubbleview.library.MessageBubbleView>
<org.mariotaku.twidere.view.FixedTextView

View File

@ -78,6 +78,7 @@
<string name="action_leave_conversation">Leave conversation</string>
<!-- [verb] e.g. An action label on a tweet to like this tweet. Formerly Twitter favorite. -->
<string name="action_like">Like</string>
<string name="action_list_creator">List creator</string>
<string name="action_location">Location</string>
<string name="action_manage_in_buffer">Manage in Buffer</string>
<string name="action_mark_as_read">Mark as read</string>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">fanfou.com</domain>
</domain-config>
</network-security-config>