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 # Built application files
/build build/
# Local configuration file (sdk path, etc) # Local configuration file (sdk path, etc)
local.properties local.properties

0
.gitmodules vendored
View File

View File

@ -9,7 +9,7 @@ android:
components: components:
- tools - tools
- platform-tools - platform-tools
- build-tools-29.0.2 - build-tools-29.0.3
- android-29 - android-29
- extra-android-m2repository - extra-android-m2repository
- extra-google-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. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
maven { url 'https://plugins.gradle.org/m2/' } maven { url "https://plugins.gradle.org/m2/" }
maven { url 'https://maven.google.com' }
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.6.3' classpath 'com.android.tools.build:gradle:3.6.3'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
@ -14,15 +15,13 @@ buildscript {
} }
allprojects { allprojects {
ext { ext {
projectGroupId = 'org.mariotaku.twidere' projectGroupId = 'org.mariotaku.twidere'
projectVersionCode = 508 projectVersionCode = 509
projectVersionName = '4.0.9' projectVersionName = '4.1.0'
globalCompileSdkVersion = 29 globalCompileSdkVersion = 29
globalBuildToolsVersion = '29.0.2' globalBuildToolsVersion = "29.0.3"
globalMinSdkVersion = 19 globalMinSdkVersion = 19
globalTargetSdkVersion = 29 globalTargetSdkVersion = 29
@ -31,24 +30,21 @@ allprojects {
repositories { repositories {
mavenLocal() mavenLocal()
jcenter() jcenter()
maven { url 'https://maven.google.com' } maven { url "https://jitpack.io" }
maven { url 'https://jitpack.io' }
google() google()
} }
} }
subprojects { subprojects {
buildscript { buildscript {
ext { ext {
kotlinVersion = '1.3.61' kotlinVersion = '1.3.72'
pluginVersions = [ pluginVersions = [
AndroidSvgDrawable: '3.0.0', AndroidSvgDrawable: '3.0.0',
PlayServices : '4.3.3', PlayServices : '4.3.3',
] ]
libVersions = [ libVersions = [
Kotlin : "${kotlinVersion}", Kotlin : "${kotlinVersion}",
SupportLib : '26.1.0',
SupportTest : '1.0.0', SupportTest : '1.0.0',
MariotakuCommons : '0.9.20', MariotakuCommons : '0.9.20',
RestFu : '0.9.60', RestFu : '0.9.60',
@ -86,6 +82,7 @@ subprojects {
AbstractTask : '0.9.5', AbstractTask : '0.9.5',
Dagger : '2.11', Dagger : '2.11',
StethoBeanShellREPL : '0.1', 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 distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

51
gradlew vendored
View File

@ -1,5 +1,21 @@
#!/usr/bin/env sh #!/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 ## Gradle start up script for UN*X
@ -28,7 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"` 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. # 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. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD="maximum"
@ -109,8 +125,8 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi fi
# For Cygwin, switch paths to Windows format before running java # For Cygwin or MSYS, switch paths to Windows format before running java
if $cygwin ; then if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"` APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"` JAVACMD=`cygpath --unix "$JAVACMD"`
@ -138,19 +154,19 @@ if $cygwin ; then
else else
eval `echo args$i`="\"$arg\"" eval `echo args$i`="\"$arg\""
fi fi
i=$((i+1)) i=`expr $i + 1`
done done
case $i in case $i in
(0) set -- ;; 0) set -- ;;
(1) set -- "$args0" ;; 1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;; 2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;; 3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;; 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac esac
fi fi
@ -159,14 +175,9 @@ save ( ) {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " " echo " "
} }
APP_ARGS=$(save "$@") APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules # 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" 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" "$@" 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 @if "%DEBUG%" == "" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% 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. @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 @rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome 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 compileSdkVersion globalCompileSdkVersion
buildToolsVersion globalBuildToolsVersion buildToolsVersion globalBuildToolsVersion
@ -62,26 +66,27 @@ android {
} }
} }
repositories {
mavenLocal()
jcenter()
}
dependencies { dependencies {
annotationProcessor "com.bluelinelabs:logansquare-compiler:${libVersions['LoganSquare']}" /** Android support **/
annotationProcessor "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}"
annotationProcessor "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}"
annotationProcessor "com.github.mariotaku.ExportablePreferences:processor:${libVersions['ExportablePreferences']}"
implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.annotation:annotation:1.1.0'
/** Third-party dependencies **/
implementation "com.bluelinelabs:logansquare:${libVersions['LoganSquare']}" 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.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:library:${libVersions['RestFu']}"
implementation "com.github.mariotaku.RestFu:oauth:${libVersions['RestFu']}" implementation "com.github.mariotaku.RestFu:oauth:${libVersions['RestFu']}"
implementation "com.github.mariotaku.RestFu:oauth2:${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']}" implementation "com.github.mariotaku.ObjectCursor:core:${libVersions['ObjectCursor']}"
annotationProcessor "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}"
implementation "com.github.mariotaku.ExportablePreferences:core:${libVersions['ExportablePreferences']}" 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:objectcursor:${libVersions['MariotakuCommons']}"
implementation "com.github.mariotaku.CommonsLibrary:logansquare:${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' apply plugin: 'com.android.library'
android { android {
compileSdkVersion globalCompileSdkVersion compileSdkVersion globalCompileSdkVersion
buildToolsVersion globalBuildToolsVersion buildToolsVersion globalBuildToolsVersion
defaultConfig { defaultConfig {
minSdkVersion globalMinSdkVersion minSdkVersion globalMinSdkVersion
targetSdkVersion globalTargetSdkVersion 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() enableGoogleVariant = project.file('google-services.json').exists()
} }
repositories { repositories {
maven { url 'https://jitpack.io' } maven { url "https://jitpack.io" }
jcenter() jcenter()
if (enableGoogleVariant) { if (enableGoogleVariant) {
// START Non-FOSS component // START Non-FOSS component
@ -21,7 +21,7 @@ buildscript {
dependencies { dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:${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) { if (enableGoogleVariant) {
// START Non-FOSS component // 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 compileSdkVersion globalCompileSdkVersion
buildToolsVersion globalBuildToolsVersion buildToolsVersion globalBuildToolsVersion
@ -50,17 +55,7 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
flavorDimensions 'channel' flavorDimensions 'channel'
productFlavors { productFlavors {
if (enableGoogleVariant) { if (enableGoogleVariant) {
// START Non-FOSS component // START Non-FOSS component
@ -119,6 +114,15 @@ android {
it.java.srcDirs += "src/${it.name}/kotlin" it.java.srcDirs += "src/${it.name}/kotlin"
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
testOptions { testOptions {
unitTests.returnDefaultValues = true unitTests.returnDefaultValues = true
} }
@ -130,13 +134,7 @@ android {
} }
packagingOptions { packagingOptions {
exclude 'META-INF/LICENSE' exclude 'META-INF/*'
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 'kotlin/**.kotlin_builtins' exclude 'kotlin/**.kotlin_builtins'
exclude 'org/osmdroid/**.png' exclude 'org/osmdroid/**.png'
exclude 'javax/annotation/**.java' 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 { 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.common')
implementation project(':twidere.component.nyan') implementation project(':twidere.component.nyan')
if (enableGoogleVariant) { /** Kotlin **/
// START Non-FOSS component implementation "org.jetbrains.kotlin:kotlin-stdlib:${libVersions['Kotlin']}"
googleImplementation "com.google.android.gms:play-services-maps:${libVersions['PlayServices']}" implementation "nl.komponents.kovenant:kovenant:${libVersions['Kovenant']}"
googleImplementation "com.google.android.gms:play-services-auth:${libVersions['PlayServices']}" implementation "nl.komponents.kovenant:kovenant-android:${libVersions['Kovenant']}"
googleImplementation "com.google.android.gms:play-services-ads:${libVersions['PlayServices']}" implementation "nl.komponents.kovenant:kovenant-combine:${libVersions['Kovenant']}"
googleImplementation "com.google.maps.android:android-maps-utils:${libVersions['MapsUtils']}" implementation "nl.komponents.kovenant:kovenant-functional:${libVersions['Kovenant']}"
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
}
fdroidImplementation "org.osmdroid:osmdroid-android:${libVersions['OSMDroid']}"
fdroidImplementation "ch.acra:acra:${libVersions['ACRA']}"
debugImplementation "com.facebook.stetho:stetho:${libVersions['Stetho']}" /** Android support **/
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'
implementation 'androidx.annotation:annotation:1.1.0' 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.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.browser:browser:1.2.0'
implementation "androidx.drawerlayout:drawerlayout:1.1.0-alpha01" implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.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.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.twitter:twitter-text:${libVersions['TwitterText']}"
implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'
implementation 'com.squareup:otto:1.3.8' implementation 'com.squareup:otto:1.3.8'
@ -226,7 +185,7 @@ dependencies {
implementation 'com.commonsware.cwac:layouts:0.4.3' implementation 'com.commonsware.cwac:layouts:0.4.3'
implementation 'com.rengwuxian.materialedittext:library:2.1.4' implementation 'com.rengwuxian.materialedittext:library:2.1.4'
implementation 'com.pnikosis:materialish-progress:1.7' 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.mariotaku:DragSortListView:0.6.1'
implementation 'com.github.uucky:ColorPicker-Android:0.9.7@aar' 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:${libVersions['AndroidGIFDrawable']}"
@ -235,33 +194,35 @@ dependencies {
implementation "org.apache.james:apache-mime4j-core:${libVersions['Mime4J']}" implementation "org.apache.james:apache-mime4j-core:${libVersions['Mime4J']}"
implementation "org.apache.james:apache-mime4j-storage:${libVersions['Mime4J']}" implementation "org.apache.james:apache-mime4j-storage:${libVersions['Mime4J']}"
implementation "com.bluelinelabs:logansquare:${libVersions['LoganSquare']}" 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.fasterxml.jackson.core:jackson-core:2.7.4"
implementation "com.hannesdorfmann.parcelableplease:annotation:${libVersions['ParcelablePlease']}" implementation "com.hannesdorfmann.parcelableplease:annotation:${libVersions['ParcelablePlease']}"
implementation "com.github.mariotaku:PickNCrop:${libVersions['PickNCrop']}" kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}"
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.squareup.okhttp3:okhttp:${libVersions['OkHttp']}" 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.lnikkila:extendedtouchview:0.1.1'
implementation "com.google.dagger:dagger:${libVersions['Dagger']}" implementation "com.google.dagger:dagger:${libVersions['Dagger']}"
kapt "com.google.dagger:dagger-compiler:${libVersions['Dagger']}"
implementation 'org.attoparser:attoparser:2.0.4.RELEASE' implementation 'org.attoparser:attoparser:2.0.4.RELEASE'
implementation 'com.getkeepsafe.taptargetview:taptargetview:1.9.1' implementation 'com.getkeepsafe.taptargetview:taptargetview:1.9.1'
implementation 'net.ypresto.androidtranscoder:android-transcoder:0.2.0' implementation 'net.ypresto.androidtranscoder:android-transcoder:0.2.0'
implementation "com.google.android.exoplayer:exoplayer:${libVersions['Exoplayer']}" implementation "com.google.android.exoplayer:exoplayer:${libVersions['Exoplayer']}"
implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}" implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}"
implementation "com.github.bumptech.glide:glide:${libVersions['Glide']}" 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" 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 "jp.wasabeef:glide-transformations:${libVersions['GlideTransformations']}"
implementation "com.theartofdev.edmodo:android-image-cropper:${libVersions['AndroidImageCropper']}" 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:base:${libVersions['MediaViewerLibrary']}"
implementation "com.github.mariotaku.MediaViewerLibrary:subsample-image-view:${libVersions['MediaViewerLibrary']}" implementation "com.github.mariotaku.MediaViewerLibrary:subsample-image-view:${libVersions['MediaViewerLibrary']}"
implementation "com.github.mariotaku:SQLiteQB:${libVersions['SQLiteQB']}" implementation "com.github.mariotaku:SQLiteQB:${libVersions['SQLiteQB']}"
implementation "com.github.mariotaku.ObjectCursor:core:${libVersions['ObjectCursor']}" 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.ExportablePreferences:core:${libVersions['ExportablePreferences']}"
implementation "com.github.mariotaku:AbstractTask:${libVersions['AbstractTask']}" implementation "com.github.mariotaku:AbstractTask:${libVersions['AbstractTask']}"
implementation "com.github.mariotaku.CommonsLibrary:parcel:${libVersions['MariotakuCommons']}" 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:objectcursor:${libVersions['MariotakuCommons']}"
implementation "com.github.mariotaku.CommonsLibrary:logansquare:${libVersions['MariotakuCommons']}" implementation "com.github.mariotaku.CommonsLibrary:logansquare:${libVersions['MariotakuCommons']}"
implementation "com.github.mariotaku:KPreferences:${libVersions['KPreferences']}" 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.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']}" /** Flavor dependencies **/
implementation "nl.komponents.kovenant:kovenant-android:${libVersions['Kovenant']}" fdroidImplementation "org.osmdroid:osmdroid-android:${libVersions['OSMDroid']}"
implementation "nl.komponents.kovenant:kovenant-functional:${libVersions['Kovenant']}" fdroidImplementation "ch.acra:acra:${libVersions['ACRA']}"
implementation "nl.komponents.kovenant:kovenant-combine:${libVersions['Kovenant']}"
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) { if (enableGoogleVariant) {

View File

@ -119,6 +119,7 @@
android:resizeableActivity="true" android:resizeableActivity="true"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/Theme.Twidere.NoActionBar" android:theme="@style/Theme.Twidere.NoActionBar"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<uses-library <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, _ -> setPositiveButton(textId) { dialog, _ ->
action(dialog as AlertDialog) 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, _ -> setNegativeButton(textId) { dialog, _ ->
action(dialog as AlertDialog) 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) { fun <T : Dialog> T.onShow(action: (dialog: T) -> Unit) {
setOnShowListener { dialog -> setOnShowListener { dialog ->
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")

View File

@ -20,6 +20,7 @@
package org.mariotaku.twidere.fragment package org.mariotaku.twidere.fragment
import android.os.Bundle import android.os.Bundle
import androidx.preference.Preference
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.SharedPreferenceConstants.* import org.mariotaku.twidere.constant.SharedPreferenceConstants.*
import org.mariotaku.twidere.preference.notification.AccountNotificationChannelsPreference import org.mariotaku.twidere.preference.notification.AccountNotificationChannelsPreference
@ -38,7 +39,7 @@ class AccountNotificationSettingsFragment : BaseAccountPreferenceFragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
val account = this.account val account = this.account
findPreference(KEY_NOTIFICATION_LIGHT_COLOR)?.let { findPreference<Preference>(KEY_NOTIFICATION_LIGHT_COLOR)?.let {
if (account != null) { if (account != null) {
it.setDefaultValue(account.color) it.setDefaultValue(account.color)
} }

View File

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

View File

@ -22,9 +22,10 @@ package org.mariotaku.twidere.fragment
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.os.Bundle import android.os.Bundle
import androidx.core.view.ViewCompat
import androidx.preference.PreferenceScreen
import android.view.View 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.Constants.*
import org.mariotaku.twidere.activity.SettingsActivity import org.mariotaku.twidere.activity.SettingsActivity
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_SHOULD_TERMINATE import org.mariotaku.twidere.constant.IntentConstants.EXTRA_SHOULD_TERMINATE
@ -76,7 +77,7 @@ class SettingsDetailsFragment : BasePreferenceFragment(), OnSharedPreferenceChan
} }
override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) { override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) {
val preference = findPreference(key) ?: return val preference = findPreference<Preference>(key) ?: return
val currentActivity = activity ?: return val currentActivity = activity ?: return
val extras = preference.extras val extras = preference.extras
if (extras != null) { 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.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.applyTheme import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.model.api.microblog.toParcelable 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.extension.onShow
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback
@ -405,6 +406,10 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
builder.setTitle(userList.name) builder.setTitle(userList.name)
builder.setMessage(userList.description) builder.setMessage(userList.description)
builder.setPositiveButton(android.R.string.ok, null) 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() val dialog = builder.create()
dialog.onShow { it.applyTheme() } dialog.onShow { it.applyTheme() }
return dialog return dialog

View File

@ -154,16 +154,16 @@ class ConversationLoader(
if (loadReplies || noSinceMaxId || sinceId != null && sinceSortId > status.sort_id) { if (loadReplies || noSinceMaxId || sinceId != null && sinceSortId > status.sort_id) {
// Load replies // Load replies
var repliesLoaded = false var repliesLoaded = false
try { // try {
if (details.type == AccountType.TWITTER) { // if (details.type == AccountType.TWITTER) {
if (noSinceMaxId) { // if (noSinceMaxId) {
statuses.addAll(loadTwitterWebReplies(details, twitter)) // statuses.addAll(loadTwitterWebReplies(details, twitter))
} // }
repliesLoaded = true // repliesLoaded = true
} // }
} catch (e: MicroBlogException) { // } catch (e: MicroBlogException) {
// Ignore // // Ignore
} // }
if (!repliesLoaded) { if (!repliesLoaded) {
val query = SearchQuery() val query = SearchQuery()
query.count(100) query.count(100)

View File

@ -144,18 +144,14 @@ abstract class SaveFileTask(
internal fun getFileNameWithExtension(name: String, extension: String?, internal fun getFileNameWithExtension(name: String, extension: String?,
specialCharacter: Char, suffix: String?): String { specialCharacter: Char, suffix: String?): String {
val sb = StringBuilder() val sb = StringBuilder()
var end = name.length
if (extension != null) { if (extension != null) {
if (name.endsWith(extension)) { sb.append(name
for (i in end - extension.length - 1 downTo 0) { .removeSuffix(extension)
if (name[i] != specialCharacter) { .removeSuffix(".")
end = i + 1 .takeLastWhile { it != specialCharacter })
break } else {
sb.append(name)
} }
}
}
}
sb.append(name, 0, end)
if (suffix != null) { if (suffix != null) {
sb.append(suffix) 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("recipient")] = users.firstOrNull { user -> it.messageCreate.target.recipientId == user.id }
directMessage[DirectMessage::class.java.getDeclaredField("createdAt")] = Date(it.createdTimestamp.toLong()) 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 insertMessages = arrayListOf<ParcelableMessage>()
val conversations = hashMapOf<String, ParcelableMessageConversation>() val conversations = hashMapOf<String, ParcelableMessageConversation>()

View File

@ -72,7 +72,10 @@ class MessageViewHolder(itemView: View, adapter: MessagesConversationAdapter) :
} }
messageBubble.setOutgoing(message.is_outgoing) 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 // Loop through text and spans to found non-space char count
val hideText = run { val hideText = run {
@ -128,7 +131,11 @@ class MessageViewHolder(itemView: View, adapter: MessagesConversationAdapter) :
const val layoutResource = R.layout.list_item_message_conversation_text const val layoutResource = R.layout.list_item_message_conversation_text
fun MessageBubbleView.setOutgoing(outgoing: Boolean) { 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:caretHeight="@dimen/element_spacing_normal"
app:caretPosition="bottomStart" app:caretPosition="bottomStart"
app:caretWidth="@dimen/element_spacing_normal" app:caretWidth="@dimen/element_spacing_normal"
app:cornerRadius="2dp"> app:cornerRadius="2dp"
app:wrapContentMaxWidthPercent="85%p">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mediaPreview"
android:padding="@dimen/element_spacing_normal">
<org.mariotaku.twidere.view.CardMediaContainer <org.mariotaku.twidere.view.CardMediaContainer
android:id="@+id/mediaPreview" android:id="@+id/mediaPreview"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/element_spacing_normal" android:layout_marginLeft="@dimen/element_spacing_normal"
android:visibility="gone"> android:layout_marginRight="@dimen/element_spacing_normal"
android:layout_marginTop="@dimen/element_spacing_normal"
android:visibility="gone"
tools:visibility="visible">
<include layout="@layout/layout_card_media_preview"/> <include layout="@layout/layout_card_media_preview"/>
</org.mariotaku.twidere.view.CardMediaContainer> </org.mariotaku.twidere.view.CardMediaContainer>
<android.widget.Space
android:id="@+id/mediaTextSpace"
android:layout_width="wrap_content"
android:layout_height="@dimen/element_spacing_normal"
android:layout_below="@+id/mediaPreview"/>
<org.mariotaku.twidere.view.TimelineContentTextView <org.mariotaku.twidere.view.TimelineContentTextView
android:id="@+id/text" android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/mediaPreview" 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:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary"
tools:text="@string/sample_status_text"/> tools:text="@string/sample_status_text"/>
</RelativeLayout>
</org.mariotaku.messagebubbleview.library.MessageBubbleView> </org.mariotaku.messagebubbleview.library.MessageBubbleView>
<org.mariotaku.twidere.view.FixedTextView <org.mariotaku.twidere.view.FixedTextView

View File

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