Bug fixes, improvements, and significant changes to the conversation menu & info

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2019-10-20 01:54:28 +02:00
parent 59030fe9a5
commit bf3d5c2c65
28 changed files with 932 additions and 463 deletions

View File

@ -23,285 +23,305 @@ apply plugin: 'findbugs'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
def taskRequest = getGradle().getStartParameter().getTaskRequests().toString()
if (taskRequest.contains("Gplay") || taskRequest.contains("findbugs") || taskRequest.contains("lint")) {
apply from: 'gplay.gradle'
if (taskRequest.contains("Gplay") || taskRequest.contains("findbugs") ||
taskRequest.contains("lint")) {
apply from: 'gplay.gradle'
}
android {
compileSdkVersion 29
buildToolsVersion '29.0.2'
defaultConfig {
applicationId "com.nextcloud.talk2"
versionName version
minSdkVersion 21
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
compileSdkVersion 29
buildToolsVersion '29.0.2'
defaultConfig {
applicationId "com.nextcloud.talk2"
versionName version
minSdkVersion 21
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
versionCode 119
versionName "7.0.5"
versionCode 120
versionName "8.0.0alpha1"
flavorDimensions "default"
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
flavorDimensions "default"
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
productFlavors {
dev {
resConfigs "en", "xxxhdpi"
}
// used for f-droid
generic
gplay
}
// Enabling multidex support.
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
lintOptions {
disable 'InvalidPackage'
disable 'MissingTranslation'
disable "ValidController"
disable "ValidControllerChangeHandler"
}
javaCompileOptions {
annotationProcessorOptions {
arguments = [
parcelerStacktrace: "true"
]
}
}
dataBinding {
enabled = true
}
productFlavors {
dev {
resConfigs "en", "xxxhdpi"
}
// used for f-droid
generic
gplay
}
dexOptions {
javaMaxHeapSize "4g"
}
// Enabling multidex support.
multiDexEnabled true
buildTypes {
debug {
applicationIdSuffix '.debug'
splits.abi.enable = false
splits.density.enable = false
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/rxjava.properties'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
vectorDrawables.useSupportLibrary = true
lintOptions {
abortOnError false
htmlReport true
htmlOutput file("$project.buildDir/reports/lint/lint.html")
disable 'MissingTranslation'
disable 'InvalidPackage'
disable 'MissingTranslation'
disable "ValidController"
disable "ValidControllerChangeHandler"
}
task findbugs(type: FindBugs) {
ignoreFailures = false
effort = "max"
reportLevel = "medium"
classes = fileTree("$project.buildDir/intermediates/classes/gplay/debug/com/nextcloud")
excludeFilter = file("${project.rootDir}/findbugs-filter.xml")
source = fileTree('src/main/java')
pluginClasspath = project.configurations.findbugsPlugins
classpath = files()
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
html {
destination = file("$project.buildDir/reports/findbugs/findbugs.html")
}
}
javaCompileOptions {
annotationProcessorOptions {
arguments = [
parcelerStacktrace: "true"
]
}
}
dataBinding {
enabled = true
}
}
dexOptions {
javaMaxHeapSize "4g"
}
buildTypes {
debug {
applicationIdSuffix '.debug'
splits.abi.enable = false
splits.density.enable = false
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/rxjava.properties'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
abortOnError false
htmlReport true
htmlOutput file("$project.buildDir/reports/lint/lint.html")
disable 'MissingTranslation'
}
task findbugs(type: FindBugs) {
ignoreFailures = false
effort = "max"
reportLevel = "medium"
classes = fileTree("$project.buildDir/intermediates/classes/gplay/debug/com/nextcloud")
excludeFilter = file("${project.rootDir}/findbugs-filter.xml")
source = fileTree('src/main/java')
pluginClasspath = project.configurations.findbugsPlugins
classpath = files()
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
html {
destination = file("$project.buildDir/reports/findbugs/findbugs.html")
}
}
}
}
ext {
work_version = "1.0.1"
koin_version = "2.1.0-alpha-1"
lifecycle_version = "2.1.0"
coil_version = "0.7.0"
work_version = "2.3.0-alpha02"
koin_version = "2.1.0-alpha-1"
lifecycle_version = "2.2.0-beta01"
coil_version = "0.7.0"
room_version = "2.2.0"
}
configurations.all {
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
}
dependencies {
implementation fileTree(include: ['*'], dir: 'libs')
implementation fileTree(include: ['*'], dir: 'libs')
// Koin for Android
implementation "org.koin:koin-android:$koin_version"
// Koin AndroidX Scope features
implementation "org.koin:koin-androidx-scope:$koin_version"
// Koin AndroidX ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
// Koin AndroidX Experimental features
implementation "org.koin:koin-androidx-ext:$koin_version"
// Koin for Android
implementation "org.koin:koin-android:$koin_version"
// Koin AndroidX Scope features
implementation "org.koin:koin-androidx-scope:$koin_version"
// Koin AndroidX ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
// Koin AndroidX Experimental features
implementation "org.koin:koin-androidx-ext:$koin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2'
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2'
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation "com.github.stateless4j:stateless4j:2.6.0"
implementation "com.github.stateless4j:stateless4j:2.6.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
// ViewModel and LiveData
implementation "androidx.core:core-ktx:1.1.0"
implementation "androidx.sqlite:sqlite-ktx:2.0.1"
implementation "androidx.collection:collection-ktx:1.1.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-beta01"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-beta01"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-beta01"
// optional - ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version" // For Kotlin use lifecycle-reactivestreams-ktx
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'com.github.vanniktech:Emoji:0.6.0'
implementation group: 'androidx.emoji', name: 'emoji-bundled', version: '1.0.0'
implementation 'org.michaelevans.colorart:library:0.0.3'
implementation "android.arch.work:work-runtime:${work_version}"
implementation "android.arch.work:work-rxjava2:${work_version}"
implementation 'com.google.android:flexbox:1.1.0'
androidTestImplementation "android.arch.work:work-testing:${work_version}"
implementation 'com.gitlab.bitfireAT:dav4jvm:ee66e8e5'
implementation 'org.conscrypt:conscrypt-android:2.2.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation 'androidx.biometric:biometric:1.0.0-rc01'
implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "io.reactivex.rxjava2:rxjava:2.2.11"
implementation 'com.bluelinelabs:conductor:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-support:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-archlifecycle:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-rxlifecycle2:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-autodispose:3.0.0-rc2'
implementation "com.github.miquelbeltran:conductor-viewmodel:1.0.3"
implementation 'com.squareup.okhttp3:okhttp:3.14.4'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.4'
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.4'
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.2'
implementation 'com.github.aurae.retrofit2:converter-logansquare:1.4.1'
implementation group: 'joda-time', name: 'joda-time', version: '2.10.3'
implementation 'com.bluelinelabs:logansquare:1.3.7'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.0.pr1'
kapt 'com.bluelinelabs:logansquare-compiler:1.3.7'
implementation 'com.google.dagger:dagger:2.24'
kapt 'com.google.dagger:dagger-compiler:2.24'
implementation 'com.github.lukaspili.autodagger2:autodagger2:1.1'
kapt 'com.github.lukaspili.autodagger2:autodagger2-compiler:1.1'
compileOnly 'javax.annotation:jsr250-api:1.0'
// Android only
implementation 'org.greenrobot:eventbus:3.1.1'
implementation 'io.requery:requery:1.5.1'
implementation 'io.requery:requery-android:1.5.1'
implementation 'net.zetetic:android-database-sqlcipher:3.5.9'
kapt 'io.requery:requery-processor:1.5.1'
implementation 'net.orange-box.storebox:storebox-lib:1.4.0'
compileOnly 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
kapt "org.projectlombok:lombok:1.18.10"
implementation 'com.jakewharton:butterknife:10.2.0'
kapt 'com.jakewharton:butterknife-compiler:10.2.0'
implementation 'com.github.HITGIF:TextFieldBoxes:1.4.5'
implementation 'eu.davidea:flexible-adapter:5.1.0'
implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
implementation 'eu.davidea:flexible-adapter-livedata:1.0.0-b3'
implementation 'org.webrtc:google-webrtc:1.0.23295'
implementation 'com.yarolegovich:lovely-dialog:1.1.0'
implementation 'com.yarolegovich:lovelyinput:1.0.9'
implementation 'com.yarolegovich:mp:1.0.9'
implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
implementation 'org.apache.commons:commons-lang3:3.9'
implementation 'com.github.wooplr:Spotlight:1.3'
implementation('com.github.mario:chatkit:a183142049', {
exclude group: 'com.facebook.fresco'
})
implementation 'com.github.mario.fresco:fresco:111'
implementation 'com.github.mario.fresco:animated-webp:111'
implementation 'com.github.mario.fresco:webpsupport:111'
implementation 'com.github.mario.fresco:animated-gif:111'
implementation 'com.github.mario.fresco:imagepipeline-okhttp3:111'
implementation "io.coil-kt:coil:${coil_version}"
implementation "io.coil-kt:coil-gif:${coil_version}"
implementation "io.coil-kt:coil-svg:${coil_version}"
implementation 'com.github.natario1:Autocomplete:v1.1.0'
implementation 'com.github.cotechde.hwsecurity:hwsecurity-fido:2.4.5'
implementation 'com.novoda:merlin:1.2.1'
implementation 'com.github.Kennyc1012:BottomSheet:2.4.1'
implementation 'com.github.mario:PopupBubble:a365177d96'
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
implementation 'eu.medsea.mimeutil:mime-util:2.1.3'
implementation 'com.afollestad.material-dialogs:core:3.1.0'
implementation 'com.afollestad.material-dialogs:datetime:3.1.0'
implementation 'com.afollestad.material-dialogs:bottomsheets:3.1.0'
implementation 'com.afollestad.material-dialogs:lifecycle:3.1.0'
implementation 'org.parceler:parceler-api:1.1.12'
kapt 'org.parceler:parceler:1.1.12'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:3.0.0'
testImplementation 'org.powermock:powermock-core:2.0.2'
testImplementation 'org.powermock:powermock-module-junit4:2.0.2'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
androidTestImplementation ('androidx.test.espresso:espresso-core:3.3.0-alpha02', {
exclude group: 'com.android.support', module: 'support-annotations'
})
findbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.9.0'
findbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.6'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
// optional - ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version"
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:2.1.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of
// annotationProcessor
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
//implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
implementation "androidx.work:work-runtime-ktx:$work_version"
implementation "androidx.work:work-rxjava2:$work_version"
androidTestImplementation "androidx.work:work-testing:$work_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'com.github.vanniktech:Emoji:0.6.0'
implementation group: 'androidx.emoji', name: 'emoji-bundled', version: '1.0.0'
implementation 'org.michaelevans.colorart:library:0.0.3'
implementation 'com.google.android:flexbox:1.1.0'
implementation 'com.gitlab.bitfireAT:dav4jvm:ee66e8e5'
implementation 'org.conscrypt:conscrypt-android:2.2.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation 'androidx.biometric:biometric:1.0.0-rc01'
implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "io.reactivex.rxjava2:rxjava:2.2.11"
implementation 'com.bluelinelabs:conductor:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-support:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-archlifecycle:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-rxlifecycle2:3.0.0-rc2'
implementation 'com.bluelinelabs:conductor-autodispose:3.0.0-rc2'
implementation "com.github.miquelbeltran:conductor-viewmodel:1.0.3"
implementation 'com.squareup.okhttp3:okhttp:3.14.4'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.4'
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.4'
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.2'
implementation 'com.github.aurae.retrofit2:converter-logansquare:1.4.1'
implementation group: 'joda-time', name: 'joda-time', version: '2.10.3'
implementation 'com.bluelinelabs:logansquare:1.3.7'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.0.pr1'
kapt 'com.bluelinelabs:logansquare-compiler:1.3.7'
implementation 'com.google.dagger:dagger:2.24'
kapt 'com.google.dagger:dagger-compiler:2.24'
kapt 'com.google.dagger:dagger-android-processor:2.24'
implementation 'com.github.lukaspili.autodagger2:autodagger2:1.1'
kapt 'com.github.lukaspili.autodagger2:autodagger2-compiler:1.1'
compileOnly 'javax.annotation:jsr250-api:1.0'
// Android only
implementation 'org.greenrobot:eventbus:3.1.1'
implementation 'io.requery:requery:1.5.1'
implementation 'io.requery:requery-android:1.5.1'
implementation 'net.zetetic:android-database-sqlcipher:3.5.9'
kapt 'io.requery:requery-processor:1.5.1'
implementation 'net.orange-box.storebox:storebox-lib:1.4.0'
compileOnly 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
kapt "org.projectlombok:lombok:1.18.10"
implementation 'com.jakewharton:butterknife:10.2.0'
kapt 'com.jakewharton:butterknife-compiler:10.2.0'
implementation 'com.github.HITGIF:TextFieldBoxes:1.4.5'
implementation 'eu.davidea:flexible-adapter:5.1.0'
implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
implementation 'eu.davidea:flexible-adapter-livedata:1.0.0-b3'
implementation 'org.webrtc:google-webrtc:1.0.23295'
implementation 'com.yarolegovich:lovely-dialog:1.1.0'
implementation 'com.yarolegovich:lovelyinput:1.0.9'
implementation 'com.yarolegovich:mp:1.0.9'
implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
implementation 'org.apache.commons:commons-lang3:3.9'
implementation 'com.github.wooplr:Spotlight:1.3'
implementation('com.github.mario:chatkit:c6a6176729', {
exclude group: 'com.facebook.fresco'
})
implementation 'com.github.mario.fresco:fresco:111'
implementation 'com.github.mario.fresco:animated-webp:111'
implementation 'com.github.mario.fresco:webpsupport:111'
implementation 'com.github.mario.fresco:animated-gif:111'
implementation 'com.github.mario.fresco:imagepipeline-okhttp3:111'
implementation "io.coil-kt:coil:${coil_version}"
implementation "io.coil-kt:coil-gif:${coil_version}"
implementation "io.coil-kt:coil-svg:${coil_version}"
implementation 'com.github.natario1:Autocomplete:v1.1.0'
implementation 'com.github.cotechde.hwsecurity:hwsecurity-fido:2.4.5'
implementation 'com.novoda:merlin:1.2.1'
implementation 'com.github.mario:PopupBubble:a365177d96'
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
implementation 'eu.medsea.mimeutil:mime-util:2.1.3'
implementation 'com.afollestad.material-dialogs:core:3.1.0'
implementation 'com.afollestad.material-dialogs:datetime:3.1.0'
implementation 'com.afollestad.material-dialogs:bottomsheets:3.1.0'
implementation 'com.afollestad.material-dialogs:lifecycle:3.1.0'
implementation 'org.parceler:parceler-api:1.1.12'
kapt 'org.parceler:parceler:1.1.12'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:3.0.0'
testImplementation 'org.powermock:powermock-core:2.0.2'
testImplementation 'org.powermock:powermock-module-junit4:2.0.2'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'
androidTestImplementation('androidx.test.espresso:espresso-core:3.3.0-alpha02', {
exclude group: 'com.android.support', module: 'support-annotations'
})
findbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.9.0'
findbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.6'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
implementation 'com.github.Kennyc1012:BottomSheet:2.4.1'
}

View File

@ -19,5 +19,6 @@
*/
dependencies {
implementation "androidx.work:work-gcm:$work_version"
implementation "com.google.firebase:firebase-messaging:20.0.0"
}

View File

@ -0,0 +1,29 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<!-- drawable/link_variant.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="#000000"
android:pathData="M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z" />
</vector>

View File

@ -20,6 +20,7 @@
package com.nextcloud.talk.controllers
import android.content.Intent
import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.os.Bundle
@ -48,6 +49,7 @@ import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.view.SimpleDraweeView
import com.nextcloud.talk.R
import com.nextcloud.talk.R.string
import com.nextcloud.talk.adapters.items.UserItem
import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication
@ -55,24 +57,30 @@ import com.nextcloud.talk.controllers.base.BaseController
import com.nextcloud.talk.controllers.bottomsheet.items.BasicListItemWithImage
import com.nextcloud.talk.controllers.bottomsheet.items.listItemsWithImage
import com.nextcloud.talk.events.EventStatus
import com.nextcloud.talk.interfaces.ConversationInfoInterface
import com.nextcloud.talk.jobs.DeleteConversationWorker
import com.nextcloud.talk.jobs.LeaveConversationWorker
import com.nextcloud.talk.models.database.UserEntity
import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.ROOM_PUBLIC_CALL
import com.nextcloud.talk.models.json.conversations.RoomOverall
import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter
import com.nextcloud.talk.models.json.generic.GenericOverall
import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.models.json.participants.ParticipantsOverall
import com.nextcloud.talk.newarch.utils.getCredentials
import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.DateUtils
import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.ShareUtils
import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.database.user.UserUtils
import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule
import com.nextcloud.talk.utils.ui.MaterialPreferenceCategoryWithRightLink
import com.yarolegovich.lovelydialog.LovelySaveStateHandler
import com.yarolegovich.lovelydialog.LovelyStandardDialog
import com.yarolegovich.mp.MaterialChoicePreference
import com.yarolegovich.mp.MaterialEditTextPreference
import com.yarolegovich.mp.MaterialPreferenceCategory
import com.yarolegovich.mp.MaterialPreferenceScreen
import com.yarolegovich.mp.MaterialStandardPreference
@ -92,7 +100,24 @@ import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class)
class ConversationInfoController(args: Bundle) : BaseController(),
FlexibleAdapter.OnItemClickListener {
FlexibleAdapter.OnItemClickListener, ConversationInfoInterface {
override fun conversationNameSet(name: String?) {
conversationDisplayName.post {
conversationDisplayName.text = name
}
}
override fun passwordSet(isCleared: Boolean) {
passwordAction.post {
if (!isCleared) {
passwordAction.setSummary(context.getString(string.nc_password_redacted))
} else {
passwordAction.setSummary(context.getString(string.nc_manual))
}
}
}
@BindView(R.id.notification_settings)
lateinit var notificationsPreferenceScreen: MaterialPreferenceScreen
@BindView(R.id.progressBar)
@ -125,9 +150,23 @@ class ConversationInfoController(args: Bundle) : BaseController(),
lateinit var muteCalls: MaterialSwitchPreference
@BindView(R.id.mpc_action)
lateinit var actionTextView: TextView
@BindView(R.id.generalConversationOptions)
lateinit var generalConversationOptions: MaterialPreferenceScreen
@BindView(R.id.changeConversationName)
lateinit var changeConversationName: MaterialEditTextPreference
@BindView(R.id.favoriteConversationAction)
lateinit var favoriteConversationAction: MaterialSwitchPreference
@BindView(R.id.allowGuestsAction)
lateinit var allowGuestsAction: MaterialSwitchPreference
@BindView(R.id.passwordAction)
lateinit var passwordAction: MaterialEditTextPreference
@BindView(R.id.shareAction)
lateinit var shareAction: MaterialStandardPreference
@set:Inject
lateinit var ncApi: NcApi
@set:Inject
lateinit var userUtils: UserUtils
private val conversationToken: String?
private val conversationUser: UserEntity?
@ -189,13 +228,6 @@ class ConversationInfoController(args: Bundle) : BaseController(),
super.onAttach(view)
eventBus.register(this)
if (databaseStorageModule == null) {
databaseStorageModule = DatabaseStorageModule(conversationUser!!, conversationToken)
}
notificationsPreferenceScreen.setStorageModule(databaseStorageModule)
conversationInfoWebinar.setStorageModule(databaseStorageModule)
fetchRoomInfo()
}
@ -206,6 +238,15 @@ class ConversationInfoController(args: Bundle) : BaseController(),
saveStateHandler = LovelySaveStateHandler()
}
if (databaseStorageModule == null) {
databaseStorageModule = DatabaseStorageModule(
conversationUser, conversationToken, this)
}
notificationsPreferenceScreen.setStorageModule(databaseStorageModule)
conversationInfoWebinar.setStorageModule(databaseStorageModule)
generalConversationOptions.setStorageModule(databaseStorageModule)
actionTextView.visibility = View.GONE
}
@ -280,6 +321,91 @@ class ConversationInfoController(args: Bundle) : BaseController(),
}
}
fun submitGuestChange() {
if (databaseStorageModule != null && conversationUser != null && conversation != null) {
if ((allowGuestsAction.findViewById<View>(R.id.mp_checkable) as SwitchCompat).isChecked) {
ncApi.makeRoomPublic(conversationUser.getCredentials(), ApiUtils.getUrlForRoomVisibility
(conversationUser.baseUrl, conversation!!.token))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: GenericOverall) {
}
override fun onError(e: Throwable) {
}
})
} else {
ncApi.makeRoomPrivate(conversationUser.getCredentials(), ApiUtils.getUrlForRoomVisibility
(conversationUser.baseUrl, conversation!!.token))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: GenericOverall) {
}
override fun onError(e: Throwable) {
}
})
}
}
}
fun submitFavoriteChange() {
if (databaseStorageModule != null && conversationUser != null && conversation != null) {
if ((favoriteConversationAction.findViewById<View>(R.id.mp_checkable) as SwitchCompat).isChecked) {
ncApi.addConversationToFavorites(conversationUser.getCredentials(), ApiUtils
.getUrlForConversationFavorites(conversationUser.baseUrl, conversation!!.token))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: GenericOverall) {
}
override fun onError(e: Throwable) {
}
})
} else {
ncApi.removeConversationFromFavorites(conversationUser.getCredentials(), ApiUtils
.getUrlForConversationFavorites(conversationUser.baseUrl, conversation!!.token))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<GenericOverall> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: GenericOverall) {
}
override fun onError(e: Throwable) {
}
})
}
}
}
fun submitLobbyChanges() {
val state = if ((conversationInfoLobby.findViewById<View>(
R.id
@ -518,15 +644,17 @@ class ConversationInfoController(args: Bundle) : BaseController(),
val conversationCopy = conversation
if (conversationCopy!!.canModerate(conversationUser)) {
actionTextView.visibility = View.VISIBLE
} else {
actionTextView.visibility = View.GONE
}
if (isAttached && (!isBeingDestroyed || !isDestroyed)) {
if (conversationCopy!!.canModerate(conversationUser)) {
actionTextView.visibility = View.VISIBLE
} else {
actionTextView.visibility = View.GONE
}
ownOptionsCategory.visibility = View.VISIBLE
setupGeneralSettings()
setupWebinaryView()
if (!conversation!!.canLeave(conversationUser)) {
@ -571,6 +699,83 @@ class ConversationInfoController(args: Bundle) : BaseController(),
})
}
private fun setupGeneralSettings() {
if (conversation != null) {
changeConversationName.value = conversation!!.displayName
if (conversation!!.isNameEditable(conversationUser)) {
changeConversationName.visibility = View.VISIBLE
} else {
changeConversationName.visibility = View.GONE
}
favoriteConversationAction.value = conversation!!.isFavorite
allowGuestsAction.value = conversation!!.type == ROOM_PUBLIC_CALL
(allowGuestsAction.findViewById<View>(R.id.mp_checkable) as SwitchCompat)
.isChecked = allowGuestsAction.value
(favoriteConversationAction.findViewById<View>(R.id.mp_checkable) as SwitchCompat)
.isChecked = favoriteConversationAction.value
(favoriteConversationAction.findViewById<View>(R.id.mp_checkable) as SwitchCompat).setOnCheckedChangeListener { buttonView, isChecked ->
submitFavoriteChange()
}
(allowGuestsAction.findViewById<View>(R.id.mp_checkable) as SwitchCompat).setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked) {
passwordAction.visibility = View.VISIBLE
shareAction.visibility = View.VISIBLE
} else {
passwordAction.visibility = View.GONE
shareAction.visibility = View.GONE
}
submitGuestChange()
}
shareAction.setOnClickListener {
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(
Intent.EXTRA_SUBJECT,
String.format(
context.getString(R.string.nc_share_subject),
context.getString(R.string.nc_app_name)
)
)
putExtra(
Intent.EXTRA_TEXT, ShareUtils.getStringForIntent(
context, conversation!!.password,
userUtils, conversation
)
)
type = "text/plain"
}
val intent = Intent.createChooser(sendIntent, context.getString(string.nc_share_link))
startActivity(intent)
}
if (allowGuestsAction.value) {
passwordAction.visibility = View.VISIBLE
shareAction.visibility = View.VISIBLE
passwordAction.value = conversation!!.hasPassword.toString()
if (conversation!!.hasPassword) {
passwordAction.setSummary(context.getString(string.nc_password_redacted))
} else {
passwordAction.setSummary(context.getString(string.nc_manual))
}
} else {
passwordAction.visibility = View.GONE
shareAction.visibility = View.GONE
}
}
}
private fun adjustNotificationLevelUI() {
if (conversation != null) {
if (conversationUser != null && conversationUser.hasSpreedFeatureCapability(

View File

@ -0,0 +1,26 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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 com.nextcloud.talk.interfaces;
public interface ConversationInfoInterface {
void conversationNameSet(String name);
void passwordSet(boolean isCleared);
}

View File

@ -27,6 +27,7 @@ import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.media.AudioAttributes;
import android.media.MediaPlayer;
import android.net.Uri;

View File

@ -345,7 +345,7 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
drawable.ic_star_black_24dp -> {
viewModel.changeFavoriteValueForConversation(conversation, true)
}
drawable.ic_link_grey600_24px -> {
drawable.ic_share_black_24dp -> {
startActivity(viewModel.getShareIntentForConversation(conversation))
}
drawable.ic_exit_to_app_black_24dp -> {

View File

@ -276,7 +276,7 @@ class ConversationsListViewModel constructor(
items.add(
(BasicListItemWithImage(
drawable
.ic_link_grey600_24px, context.getString(string.nc_share_link)
.ic_share_black_24dp, context.getString(string.nc_share_link)
))
)
}

View File

@ -60,32 +60,30 @@ class PackageReplacedReceiver : BroadcastReceiver() {
.NOTIFICATION_SERVICE
) as NotificationManager
if (notificationManager != null) {
if (!appPreferences.isNotificationChannelUpgradedToV2) {
for (notificationChannelGroup in notificationManager
.notificationChannelGroups) {
notificationManager.deleteNotificationChannelGroup(notificationChannelGroup.id)
}
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_CALLS
)
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_MESSAGES
)
appPreferences.setNotificationChannelIsUpgradedToV2(true)
if (!appPreferences.isNotificationChannelUpgradedToV2) {
for (notificationChannelGroup in notificationManager
.notificationChannelGroups) {
notificationManager.deleteNotificationChannelGroup(notificationChannelGroup.id)
}
if (!appPreferences.isNotificationChannelUpgradedToV3 && packageInfo.versionCode > 51) {
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_MESSAGES_V2
)
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_CALLS_V2
)
appPreferences.setNotificationChannelIsUpgradedToV3(true)
}
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_CALLS
)
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_MESSAGES
)
appPreferences.setNotificationChannelIsUpgradedToV2(true)
}
if (!appPreferences.isNotificationChannelUpgradedToV3 && packageInfo.versionCode > 51) {
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_MESSAGES_V2
)
notificationManager.deleteNotificationChannel(
NotificationUtils.NOTIFICATION_CHANNEL_CALLS_V2
)
appPreferences.setNotificationChannelIsUpgradedToV3(true)
}
}

View File

@ -17,27 +17,17 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Part of the code in ShareUtils was inspired by BottomSheet under the Apache licence
* located here: https://github.com/Kennyc1012/BottomSheet/blob/master/library/src/main/java/com/kennyc/bottomsheet/BottomSheet.java#L425
*/
package com.nextcloud.talk.utils;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.kennyc.bottomsheet.adapters.AppAdapter;
import com.nextcloud.talk.R;
import com.nextcloud.talk.models.database.UserEntity;
import com.nextcloud.talk.models.json.conversations.Conversation;
import com.nextcloud.talk.utils.database.user.UserUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ShareUtils {
@ -58,47 +48,4 @@ public class ShareUtils {
return shareString;
}
public static List<AppAdapter.AppInfo> getShareApps(Context context, Intent intent,
@Nullable Set<String> appsFilter, @Nullable Set<String> toExclude) {
if (context == null || intent == null) return null;
PackageManager manager = context.getPackageManager();
List<ResolveInfo> apps = manager.queryIntentActivities(intent, 0);
if (apps != null && !apps.isEmpty()) {
List<AppAdapter.AppInfo> appResources = new ArrayList<>(apps.size());
boolean shouldCheckPackages = appsFilter != null && !appsFilter.isEmpty();
for (ResolveInfo resolveInfo : apps) {
String packageName = resolveInfo.activityInfo.packageName;
if (shouldCheckPackages && !appsFilter.contains(packageName)) {
continue;
}
String title = resolveInfo.loadLabel(manager).toString();
String name = resolveInfo.activityInfo.name;
Drawable drawable = resolveInfo.loadIcon(manager);
appResources.add(new AppAdapter.AppInfo(title, packageName, name, drawable));
}
if (toExclude != null && !toExclude.isEmpty()) {
List<AppAdapter.AppInfo> toRemove = new ArrayList<>();
for (AppAdapter.AppInfo appInfo : appResources) {
if (toExclude.contains(appInfo.packageName)) {
toRemove.add(appInfo);
}
}
if (!toRemove.isEmpty()) appResources.removeAll(toRemove);
}
return appResources;
}
return null;
}
}

View File

@ -21,20 +21,24 @@
package com.nextcloud.talk.utils.preferences.preferencestorage;
import android.content.Context;
import com.nextcloud.talk.interfaces.ConversationInfoInterface;
import com.nextcloud.talk.models.database.UserEntity;
import com.yarolegovich.mp.io.StorageModule;
public class DatabaseStorageFactory implements StorageModule.Factory {
private UserEntity conversationUser;
private String conversationToken;
private ConversationInfoInterface conversationInfoInterface;
public DatabaseStorageFactory(UserEntity conversationUser, String conversationToken) {
public DatabaseStorageFactory(UserEntity conversationUser, String conversationToken,
ConversationInfoInterface conversationInfoInterface) {
this.conversationUser = conversationUser;
this.conversationToken = conversationToken;
this.conversationInfoInterface = conversationInfoInterface;
}
@Override
public StorageModule create(Context context) {
return new DatabaseStorageModule(conversationUser, conversationToken);
return new DatabaseStorageModule(conversationUser, conversationToken, conversationInfoInterface);
}
}

View File

@ -25,6 +25,7 @@ import android.text.TextUtils;
import autodagger.AutoInjector;
import com.nextcloud.talk.api.NcApi;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.interfaces.ConversationInfoInterface;
import com.nextcloud.talk.models.database.ArbitraryStorageEntity;
import com.nextcloud.talk.models.database.UserEntity;
import com.nextcloud.talk.models.json.generic.GenericOverall;
@ -50,10 +51,17 @@ public class DatabaseStorageModule implements StorageModule {
private long accountIdentifier;
private boolean lobbyValue;
private boolean favoriteConversationValue;
private boolean allowGuestsValue;
private Boolean hasPassword;
private String conversationNameValue;
private String messageNotificationLevel;
private ConversationInfoInterface conversationInfoInterface;
public DatabaseStorageModule(UserEntity conversationUser, String conversationToken) {
public DatabaseStorageModule(UserEntity conversationUser, String conversationToken,
ConversationInfoInterface conversationInfoInterface) {
NextcloudTalkApplication.Companion.getSharedApplication()
.getComponentApplication()
.inject(this);
@ -61,46 +69,94 @@ public class DatabaseStorageModule implements StorageModule {
this.conversationUser = conversationUser;
this.accountIdentifier = conversationUser.getId();
this.conversationToken = conversationToken;
this.conversationInfoInterface = conversationInfoInterface;
}
@Override
public void saveBoolean(String key, boolean value) {
if (!key.equals("conversation_lobby")) {
if (!key.equals("conversation_lobby") && !key.equals("allow_guests") && !key.equals(
"favorite_conversation")) {
arbitraryStorageUtils.storeStorageSetting(accountIdentifier, key, Boolean.toString(value),
conversationToken);
} else {
lobbyValue = value;
switch (key) {
case "conversation_lobby":
lobbyValue = value;
break;
case "allow_guests":
allowGuestsValue = value;
break;
case "favorite_conversation":
favoriteConversationValue = value;
break;
default:
}
}
}
@Override
public void saveString(String key, String value) {
if (!key.equals("message_notification_level")) {
if (!key.equals("message_notification_level")
&& !key.equals("conversation_name")
&& !key.equals("conversation_password")) {
arbitraryStorageUtils.storeStorageSetting(accountIdentifier, key, value, conversationToken);
} else {
if (conversationUser.hasSpreedFeatureCapability("notification-levels")) {
if (!TextUtils.isEmpty(messageNotificationLevel) && !messageNotificationLevel.equals(
value)) {
int intValue;
switch (value) {
case "never":
intValue = 3;
break;
case "mention":
intValue = 2;
break;
case "always":
intValue = 1;
break;
default:
intValue = 0;
}
if (key.equals("message_notification_level")) {
if (conversationUser.hasSpreedFeatureCapability("notification-levels")) {
if (!TextUtils.isEmpty(messageNotificationLevel) && !messageNotificationLevel.equals(
value)) {
int intValue;
switch (value) {
case "never":
intValue = 3;
break;
case "mention":
intValue = 2;
break;
case "always":
intValue = 1;
break;
default:
intValue = 0;
}
ncApi.setNotificationLevel(
ApiUtils.getCredentials(conversationUser.getUsername(), conversationUser.getToken()),
ApiUtils.getUrlForSettingNotificationlevel(conversationUser.getBaseUrl(),
conversationToken),
intValue)
ncApi.setNotificationLevel(
ApiUtils.getCredentials(conversationUser.getUsername(),
conversationUser.getToken()),
ApiUtils.getUrlForSettingNotificationlevel(conversationUser.getBaseUrl(),
conversationToken),
intValue)
.subscribeOn(Schedulers.io())
.subscribe(new Observer<GenericOverall>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(GenericOverall genericOverall) {
messageNotificationLevel = value;
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
} else {
messageNotificationLevel = value;
}
}
} else if (key.equals("conversation_password")) {
if (hasPassword != null) {
ncApi.setPassword(ApiUtils.getCredentials(conversationUser.getUsername(),
conversationUser.getToken()),
ApiUtils.getUrlForPassword(conversationUser.getBaseUrl(),
conversationToken), value)
.subscribeOn(Schedulers.io())
.subscribe(new Observer<GenericOverall>() {
@Override
@ -110,7 +166,8 @@ public class DatabaseStorageModule implements StorageModule {
@Override
public void onNext(GenericOverall genericOverall) {
messageNotificationLevel = value;
hasPassword = !TextUtils.isEmpty(value);
conversationInfoInterface.passwordSet(TextUtils.isEmpty(value));
}
@Override
@ -123,7 +180,37 @@ public class DatabaseStorageModule implements StorageModule {
}
});
} else {
messageNotificationLevel = value;
hasPassword = Boolean.parseBoolean(value);
}
} else if (key.equals("conversation_name")) {
if (!TextUtils.isEmpty(conversationNameValue) && !conversationNameValue.equals(value)) {
ncApi.renameRoom(ApiUtils.getCredentials(conversationUser.getUsername(),
conversationUser.getToken()), ApiUtils.getRoom(conversationUser.getBaseUrl(),
conversationToken), value)
.subscribeOn(Schedulers.io())
.subscribe(new Observer<GenericOverall>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(GenericOverall genericOverall) {
conversationNameValue = value;
conversationInfoInterface.conversationNameSet(value);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
} else {
conversationNameValue = value;
}
}
}
@ -144,6 +231,10 @@ public class DatabaseStorageModule implements StorageModule {
public boolean getBoolean(String key, boolean defaultVal) {
if (key.equals("conversation_lobby")) {
return lobbyValue;
} else if (key.equals("allow_guests")) {
return allowGuestsValue;
} else if (key.equals("favorite_conversation")) {
return favoriteConversationValue;
} else {
ArbitraryStorageEntity valueFromDb =
arbitraryStorageUtils.getStorageSetting(accountIdentifier, key, conversationToken);
@ -157,7 +248,9 @@ public class DatabaseStorageModule implements StorageModule {
@Override
public String getString(String key, String defaultVal) {
if (!key.equals("message_notification_level")) {
if (!key.equals("message_notification_level")
&& !key.equals("conversation_name")
&& !key.equals("conversation_password")) {
ArbitraryStorageEntity valueFromDb =
arbitraryStorageUtils.getStorageSetting(accountIdentifier, key, conversationToken);
if (valueFromDb == null) {
@ -165,9 +258,15 @@ public class DatabaseStorageModule implements StorageModule {
} else {
return valueFromDb.getValue();
}
} else {
} else if (key.equals("message_notification_level")) {
return messageNotificationLevel;
} else if (key.equals("conversation_name")) {
return conversationNameValue;
} else if (key.equals("conversation_password")) {
return "";
}
return "";
}
@Override

View File

@ -18,12 +18,11 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<vector xmlns:tools="http://schemas.android.com/tools"
android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#000000" android:fillType="nonZero"
android:pathData="M13,5.921L9.818,9.105C9.111,9.812 8.781,10.723 8.83,11.562C8.88,12.401 9.263,13.146 9.818,13.701L11.23,12.285C10.663,11.717 10.686,11.065 11.232,10.519L14.414,7.337C14.939,6.812 15.664,6.814 16.186,7.335C16.668,7.891 16.713,8.574 16.182,9.105L15.362,9.925C15.917,10.71 16.007,11.291 15.955,12.16L17.596,10.519C18.833,9.282 18.833,7.154 17.596,5.917C16.36,4.681 14.254,4.706 13,5.921L13,5.921ZM13.707,9.806L12.293,11.224L12.297,11.224C12.847,11.774 12.804,12.482 12.293,12.994L9.111,16.175C8.415,16.767 7.813,16.646 7.342,16.175C6.715,15.549 6.842,14.907 7.342,14.407L8.192,13.56C7.636,12.777 7.543,12.195 7.594,11.328L5.928,12.994C4.689,14.233 4.692,16.354 5.928,17.589C7.163,18.825 9.29,18.825 10.526,17.589L13.707,14.407C14.416,13.699 14.747,12.789 14.698,11.949C14.65,11.109 14.266,10.362 13.709,9.808L13.707,9.806Z"
android:strokeColor="#00000000" android:strokeWidth="1"
tools:ignore="VectorPath" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="#000000"
android:pathData="M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z" />
</vector>

View File

@ -1,29 +0,0 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<vector xmlns:tools="http://schemas.android.com/tools"
android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#757575" android:fillType="nonZero"
android:pathData="M13,5.921L9.818,9.105C9.111,9.812 8.781,10.723 8.83,11.562C8.88,12.401 9.263,13.146 9.818,13.701L11.23,12.285C10.663,11.717 10.686,11.065 11.232,10.519L14.414,7.337C14.939,6.812 15.664,6.814 16.186,7.335C16.668,7.891 16.713,8.574 16.182,9.105L15.362,9.925C15.917,10.71 16.007,11.291 15.955,12.16L17.596,10.519C18.833,9.282 18.833,7.154 17.596,5.917C16.36,4.681 14.254,4.706 13,5.921L13,5.921ZM13.707,9.806L12.293,11.224L12.297,11.224C12.847,11.774 12.804,12.482 12.293,12.994L9.111,16.175C8.415,16.767 7.813,16.646 7.342,16.175C6.715,15.549 6.842,14.907 7.342,14.407L8.192,13.56C7.636,12.777 7.543,12.195 7.594,11.328L5.928,12.994C4.689,14.233 4.692,16.354 5.928,17.589C7.163,18.825 9.29,18.825 10.526,17.589L13.707,14.407C14.416,13.699 14.747,12.789 14.698,11.949C14.65,11.109 14.266,10.362 13.709,9.808L13.707,9.806Z"
android:strokeColor="#00000000" android:strokeWidth="1"
tools:ignore="VectorPath" />
</vector>

View File

@ -0,0 +1,25 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z"/>
</vector>

View File

@ -1,25 +0,0 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.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/>.
-->
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="16.0" android:viewportWidth="16.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="m9.236,2.166 l-3.182,3.184c-0.707,0.707 -1.038,1.618 -0.988,2.457 0.05,0.839 0.433,1.584 0.988,2.139l1.412,-1.416c-0.567,-0.567 -0.544,-1.219 0.002,-1.766l3.181,-3.182c0.525,-0.525 1.251,-0.523 1.772,-0.002 0.482,0.556 0.527,1.238 -0.004,1.77l-0.82,0.82c0.555,0.785 0.645,1.366 0.593,2.234l1.641,-1.641c1.237,-1.237 1.237,-3.365 0,-4.602 -1.236,-1.236 -3.342,-1.211 -4.596,0.004zM9.943,6.051 L8.529,7.469c0,0 0.003,0 0.004,0 0.55,0.55 0.507,1.258 -0.004,1.77l-3.182,3.182c-0.696,0.592 -1.298,0.471 -1.77,0 -0.626,-0.626 -0.5,-1.268 0,-1.768l0.85,-0.847c-0.556,-0.784 -0.648,-1.365 -0.598,-2.232l-1.666,1.666c-1.239,1.239 -1.236,3.36 0,4.596 1.235,1.235 3.362,1.236 4.598,0l3.182,-3.182c0.709,-0.708 1.04,-1.618 0.991,-2.459 -0.048,-0.84 -0.432,-1.586 -0.989,-2.141z"/>
</vector>

View File

@ -0,0 +1,26 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<vector android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/grey_600"
android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
</vector>

View File

@ -0,0 +1,25 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M13.5,0.67s0.74,2.65 0.74,4.8c0,2.06 -1.35,3.73 -3.41,3.73 -2.07,0 -3.63,-1.67 -3.63,-3.73l0.03,-0.36C5.21,7.51 4,10.62 4,14c0,4.42 3.58,8 8,8s8,-3.58 8,-8C20,8.61 17.41,3.8 13.5,0.67zM11.71,19c-1.78,0 -3.22,-1.4 -3.22,-3.14 0,-1.62 1.05,-2.76 2.81,-3.12 1.77,-0.36 3.6,-1.21 4.62,-2.58 0.39,1.29 0.59,2.65 0.59,4.04 0,2.65 -2.15,4.8 -4.8,4.8z"/>
</vector>

View File

@ -0,0 +1,29 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<!-- drawable/link_variant.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/grey_600"
android:pathData="M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z" />
</vector>

View File

@ -75,24 +75,12 @@
</RelativeLayout>
</com.yarolegovich.mp.MaterialPreferenceCategory>
<com.yarolegovich.mp.MaterialPreferenceCategory
android:id="@+id/otherRoomOptions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
<include layout="@layout/general_info_item"
android:layout_below="@id/conversation_info_name"
android:visibility="gone">
<com.yarolegovich.mp.MaterialStandardPreference
android:id="@+id/favoriteConversationAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/ic_star_black_24dp"
apc:mp_icon_tint="@color/grey_600"
apc:mp_title="@string/nc_add_to_favorites">
</com.yarolegovich.mp.MaterialStandardPreference>
</com.yarolegovich.mp.MaterialPreferenceCategory>
android:layout_height="wrap_content"
android:layout_width="match_parent"
/>
<com.nextcloud.talk.utils.ui.MaterialPreferenceCategoryWithRightLink
android:id="@+id/participants_list_category"
@ -142,7 +130,7 @@
layout="@layout/notification_settings_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/otherRoomOptions"
android:layout_below="@id/generalConversationOptions"
android:visibility="gone" />
<include

View File

@ -38,7 +38,7 @@
android:layout_centerVertical="true"
android:layout_marginEnd="8dp"
android:contentDescription="@null"
android:src="@drawable/ic_public_black_24px"
android:src="@drawable/link_variant"
android:tint="@color/colorPrimary" />
<TextView

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.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/>.
-->
<com.yarolegovich.mp.MaterialPreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:apc="http://schemas.android.com/apk/res-auto"
android:id="@+id/generalConversationOptions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
>
<com.yarolegovich.mp.MaterialPreferenceCategory
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
apc:mpc_title="@string/nc_general_settings"
apc:mpc_title_color="@color/colorPrimary"
>
<com.yarolegovich.mp.MaterialEditTextPreference
android:id="@+id/changeConversationName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/ic_pencil_grey600_24dp"
apc:mp_icon_tint="@color/grey_600"
apc:mp_key="conversation_name"
apc:mp_title="@string/nc_rename"
/>
<com.yarolegovich.mp.MaterialSwitchPreference
android:id="@+id/favoriteConversationAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/ic_star_black_24dp"
apc:mp_icon_tint="@color/grey_600"
apc:mp_key="favorite_conversation"
apc:mp_summary="@string/nc_favorites_explanation"
apc:mp_title="@string/nc_favorite_conversation"
/>
<com.yarolegovich.mp.MaterialSwitchPreference
android:id="@+id/allowGuestsAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/link_variant"
apc:mp_icon_tint="@color/grey_600"
apc:mp_key="allow_guests"
apc:mp_title="@string/nc_allow_guests"
/>
<com.yarolegovich.mp.MaterialEditTextPreference
android:id="@+id/passwordAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/ic_lock_grey600_24px"
apc:mp_icon_tint="@color/grey_600"
apc:mp_key="conversation_password"
android:visibility="gone"
apc:mp_summary="@string/nc_manual"
apc:mp_title="@string/nc_password"
/>
<com.yarolegovich.mp.MaterialStandardPreference
android:id="@+id/shareAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/ic_share_black_24dp"
apc:mp_icon_tint="@color/grey_600"
android:visibility="gone"
apc:mp_title="@string/nc_share_link"
>
</com.yarolegovich.mp.MaterialStandardPreference>
</com.yarolegovich.mp.MaterialPreferenceCategory>
</com.yarolegovich.mp.MaterialPreferenceScreen>

View File

@ -33,7 +33,7 @@
android:layout_centerVertical="true"
android:layout_marginEnd="8dp"
android:contentDescription="@null"
android:src="@drawable/ic_public_black_24px"
android:src="@drawable/link_variant"
android:tint="@color/colorPrimary" />
<TextView

View File

@ -37,6 +37,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_default_value="false"
apc:mp_icon="@drawable/ic_whatshot_black_24dp"
apc:mp_icon_tint="@color/grey_600"
apc:mp_key="important_conversation"
apc:mp_title="@string/nc_important_conversation"
apc:mp_summary="@string/nc_important_conversation_desc"/>
@ -45,6 +47,8 @@
android:id="@+id/conversation_info_message_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
apc:mp_icon="@drawable/ic_message_black_24dp"
apc:mp_icon_tint="@color/grey_600"
apc:mp_entry_descriptions="@array/message_notification_levels"
apc:mp_entry_values="@array/message_notification_levels_entry_values"
apc:mp_key="message_notification_level"
@ -57,6 +61,8 @@
android:layout_height="wrap_content"
apc:mp_default_value="false"
apc:mp_key="mute_calls"
apc:mp_icon="@drawable/ic_volume_mute_white_24dp"
apc:mp_icon_tint="@color/grey_600"
apc:mp_title="@string/nc_mute_calls"
apc:mp_summary="@string/nc_mute_calls_desc"/>

View File

@ -46,7 +46,6 @@
android:layout_toStartOf="@id/checkedImageView"
android:layout_toEndOf="@id/simple_drawee_view"
android:ellipsize="end"
android:textAppearance="@style/ListItem"
tools:text="Contact item text" />
<com.facebook.drawee.view.SimpleDraweeView

View File

@ -61,13 +61,13 @@
android:padding="4dp"
android:scaleType="centerInside" />
<androidx.legacy.widget.Space
<Space
android:id="@id/attachmentButtonSpace"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_toEndOf="@id/attachmentButton" />
<androidx.legacy.widget.Space
<Space
android:id="@id/sendButtonSpace"
android:layout_width="0dp"
android:layout_height="0dp"

View File

@ -132,6 +132,7 @@
<string name="nc_no_proxy">No proxy</string>
<string name="nc_username">Username</string>
<string name="nc_password">Password</string>
<string name="nc_password_redacted">Redacted for privacy reasons</string>
<string name="nc_conversation_link">Conversation link</string>
<string name="nc_new_password">New password</string>
<string name="nc_wrong_password">Wrong password</string>
@ -169,8 +170,11 @@
<string name="nc_new_conversation">New conversation</string>
<string name="nc_join_via_link">Join with a link</string>
<string name="nc_join_via_web">Join via web</string>
<string name="nc_favorite_conversation">Favorite conversation</string>
<string name="nc_add_to_favorites">Add to favorites</string>
<string name="nc_remove_from_favorites">Remove from favorites</string>
<string name="nc_favorites_explanation">Conversation will be pinned to the top of the
conversations list</string>
<!-- Contacts -->
<string name="nc_select_contacts">Select contacts</string>
@ -311,4 +315,7 @@
<string name="nc_not_defined_error">Unknown error</string>
<string name="nc_unauthorized_error">No Unauthorized</string>
<string name="nc_general_settings">General</string>
<string name="nc_allow_guests">Allow guests</string>
</resources>

View File

@ -39,10 +39,6 @@
<item name="android:textSize">12sp</item>
</style>
<style name="ListItem" parent="BottomSheet.ListItem.TextAppearance">
<item name="android:textColor">@color/nc_incoming_text_default</item>
</style>
<style name="ChipIncomingTextAppearance" parent="TextAppearance.MaterialComponents.Chip">
<item name="android:textColor">@color/nc_incoming_text_default</item>
</style>