mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 03:29:28 +01:00
Fresco and sharing (#531)
* Various improvements This is literally the worst commit I ever did, but due to rebasing issues this is how it is. * Fixes after rebase Signed-off-by: Mario Danic <mario@lovelyhq.com> * Updates post-rebase Signed-off-by: Mario Danic <mario@lovelyhq.com> * Updates #2 post rebase Signed-off-by: Mario Danic <mario@lovelyhq.com> * Update deps Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
fd0866dfc5
commit
4143bd841e
@ -1,6 +1,7 @@
|
|||||||
<component name="CopyrightManager">
|
<component name="CopyrightManager">
|
||||||
<copyright>
|
<copyright>
|
||||||
<option name="notice" value="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/>." />
|
<option name="allowReplaceRegexp" value="true" />
|
||||||
|
<option name="notice" value="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/>." />
|
||||||
<option name="myName" value="GPL3" />
|
<option name="myName" value="GPL3" />
|
||||||
</copyright>
|
</copyright>
|
||||||
</component>
|
</component>
|
101
app/build.gradle
101
app/build.gradle
@ -1,6 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'findbugs'
|
apply plugin: 'findbugs'
|
||||||
|
apply plugin: 'kotlin-kapt'
|
||||||
|
|
||||||
def taskRequest = getGradle().getStartParameter().getTaskRequests().toString()
|
def taskRequest = getGradle().getStartParameter().getTaskRequests().toString()
|
||||||
if (taskRequest.contains("Gplay") || taskRequest.contains("findbugs") || taskRequest.contains("lint")) {
|
if (taskRequest.contains("Gplay") || taskRequest.contains("findbugs") || taskRequest.contains("lint")) {
|
||||||
@ -17,8 +38,8 @@ android {
|
|||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
versionCode 92
|
versionCode 93
|
||||||
versionName "6.0.0beta4"
|
versionName "6.0.0"
|
||||||
|
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
renderscriptTargetApi 19
|
renderscriptTargetApi 19
|
||||||
@ -110,8 +131,9 @@ configurations.all {
|
|||||||
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(include: ['*'], dir: 'libs')
|
||||||
implementation 'androidx.appcompat:appcompat:1.0.2'
|
implementation 'androidx.appcompat:appcompat:1.0.2'
|
||||||
implementation 'com.google.android.material:material:1.0.0'
|
implementation 'com.google.android.material:material:1.0.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha4'
|
||||||
@ -121,6 +143,13 @@ dependencies {
|
|||||||
implementation "android.arch.work:work-rxjava2:${workVersion}"
|
implementation "android.arch.work:work-rxjava2:${workVersion}"
|
||||||
implementation 'com.google.android:flexbox:1.1.0'
|
implementation 'com.google.android:flexbox:1.1.0'
|
||||||
androidTestImplementation "android.arch.work:work-testing:${workVersion}"
|
androidTestImplementation "android.arch.work:work-testing:${workVersion}"
|
||||||
|
implementation ('com.gitlab.bitfireAT:dav4jvm:f2078bc846', {
|
||||||
|
exclude group: 'org.ogce', module: 'xpp3' // Android comes with its own XmlPullParser
|
||||||
|
})
|
||||||
|
compile 'org.conscrypt:conscrypt-android:2.0.0'
|
||||||
|
|
||||||
|
|
||||||
|
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
|
||||||
|
|
||||||
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
|
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
|
||||||
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
|
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
|
||||||
@ -139,76 +168,57 @@ dependencies {
|
|||||||
|
|
||||||
implementation 'com.bluelinelabs:logansquare:1.3.7'
|
implementation 'com.bluelinelabs:logansquare:1.3.7'
|
||||||
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8'
|
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8'
|
||||||
annotationProcessor 'com.bluelinelabs:logansquare-compiler:1.3.7'
|
kapt 'com.bluelinelabs:logansquare-compiler:1.3.7'
|
||||||
|
|
||||||
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
|
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
|
||||||
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
|
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
|
||||||
implementation 'com.github.aurae.retrofit2:converter-logansquare:1.4.1'
|
implementation 'com.github.aurae.retrofit2:converter-logansquare:1.4.1'
|
||||||
|
|
||||||
implementation 'com.google.dagger:dagger:2.21'
|
implementation 'com.google.dagger:dagger:2.21'
|
||||||
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
|
kapt 'com.google.dagger:dagger-compiler:2.21'
|
||||||
implementation 'com.github.lukaspili.autodagger2:autodagger2:1.1'
|
implementation 'com.github.lukaspili.autodagger2:autodagger2:1.1'
|
||||||
annotationProcessor 'com.github.lukaspili.autodagger2:autodagger2-compiler:1.1'
|
kapt 'com.github.lukaspili.autodagger2:autodagger2-compiler:1.1'
|
||||||
|
compileOnly 'javax.annotation:jsr250-api:1.0'
|
||||||
compileOnly 'javax.annotation:jsr250-api:1.0' // Android only
|
// Android only
|
||||||
|
|
||||||
implementation 'org.greenrobot:eventbus:3.1.1'
|
implementation 'org.greenrobot:eventbus:3.1.1'
|
||||||
|
|
||||||
implementation 'io.requery:requery:1.5.1'
|
implementation 'io.requery:requery:1.5.1'
|
||||||
implementation 'io.requery:requery-android:1.5.1'
|
implementation 'io.requery:requery-android:1.5.1'
|
||||||
implementation 'net.zetetic:android-database-sqlcipher:3.5.9'
|
implementation 'net.zetetic:android-database-sqlcipher:3.5.9'
|
||||||
annotationProcessor 'io.requery:requery-processor:1.5.1'
|
kapt 'io.requery:requery-processor:1.5.1'
|
||||||
|
|
||||||
implementation 'org.parceler:parceler-api:1.1.12'
|
implementation 'org.parceler:parceler-api:1.1.12'
|
||||||
annotationProcessor 'org.parceler:parceler:1.1.12'
|
kapt 'org.parceler:parceler:1.1.12'
|
||||||
|
|
||||||
implementation 'net.orange-box.storebox:storebox-lib:1.4.0'
|
implementation 'net.orange-box.storebox:storebox-lib:1.4.0'
|
||||||
|
compileOnly 'org.projectlombok:lombok:1.18.6'
|
||||||
compileOnly "org.projectlombok:lombok:1.18.6"
|
|
||||||
annotationProcessor "org.projectlombok:lombok:1.18.6"
|
annotationProcessor "org.projectlombok:lombok:1.18.6"
|
||||||
|
|
||||||
implementation 'com.jakewharton:butterknife:10.1.0'
|
implementation 'com.jakewharton:butterknife:10.1.0'
|
||||||
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
|
kapt 'com.jakewharton:butterknife-compiler:10.1.0'
|
||||||
|
|
||||||
implementation 'com.github.HITGIF:TextFieldBoxes:1.4.3'
|
implementation 'com.github.HITGIF:TextFieldBoxes:1.4.3'
|
||||||
|
|
||||||
implementation 'eu.davidea:flexible-adapter:5.1.0'
|
implementation 'eu.davidea:flexible-adapter:5.1.0'
|
||||||
implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
|
implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
|
||||||
|
|
||||||
implementation 'com.github.bumptech.glide:glide:4.9.0'
|
|
||||||
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
|
|
||||||
implementation 'com.github.bumptech.glide:okhttp3-integration:4.9.0@aar'
|
|
||||||
implementation 'com.facebook.fresco:fresco:1.13.0'
|
|
||||||
implementation 'com.facebook.fresco:animated-webp:1.13.0'
|
|
||||||
implementation 'com.facebook.fresco:webpsupport:1.13.0'
|
|
||||||
implementation 'com.facebook.fresco:animated-gif:1.13.0'
|
|
||||||
implementation "com.facebook.fresco:imagepipeline-okhttp3:1.13.0"
|
|
||||||
implementation 'org.webrtc:google-webrtc:1.0.23295'
|
implementation 'org.webrtc:google-webrtc:1.0.23295'
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"
|
||||||
|
|
||||||
implementation 'com.yarolegovich:lovely-dialog:1.1.0'
|
implementation 'com.yarolegovich:lovely-dialog:1.1.0'
|
||||||
implementation 'com.yarolegovich:lovelyinput:1.0.9'
|
implementation 'com.yarolegovich:lovelyinput:1.0.9'
|
||||||
implementation 'com.yarolegovich:mp:1.0.9'
|
implementation 'com.yarolegovich:mp:1.0.9'
|
||||||
|
|
||||||
implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
|
implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
|
||||||
|
implementation 'org.apache.commons:commons-lang3:3.8.1'
|
||||||
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
|
|
||||||
|
|
||||||
implementation 'com.github.wooplr:Spotlight:1.3'
|
implementation 'com.github.wooplr:Spotlight:1.3'
|
||||||
|
implementation('com.github.mario:chatkit:d63d61db95', {
|
||||||
|
exclude group: 'com.facebook.fresco'
|
||||||
|
})
|
||||||
|
|
||||||
implementation 'com.github.mario:chatkit:d63d61db95'
|
implementation 'com.mario.fresco:fresco:1.11.1-headers'
|
||||||
|
implementation 'com.mario.fresco:animated-webp:1.11.1-headers'
|
||||||
|
implementation 'com.mario.fresco:webpsupport:1.11.1-headers'
|
||||||
|
implementation 'com.mario.fresco:animated-gif:1.11.1-headers'
|
||||||
|
implementation "com.mario.fresco:imagepipeline-okhttp3:1.11.1-headers"
|
||||||
|
|
||||||
implementation 'com.github.natario1:Autocomplete:v1.1.0'
|
implementation 'com.github.natario1:Autocomplete:v1.1.0'
|
||||||
|
|
||||||
implementation 'com.github.Kennyc1012:BottomSheet:2.4.1'
|
implementation 'com.github.Kennyc1012:BottomSheet:2.4.1'
|
||||||
implementation 'eu.davidea:flipview:1.2.0'
|
|
||||||
implementation 'com.github.mario:PopupBubble:a365177d96'
|
implementation 'com.github.mario:PopupBubble:a365177d96'
|
||||||
|
|
||||||
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
|
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
|
||||||
implementation 'com.kevalpatel2106:emoticongifkeyboard:1.1'
|
implementation 'eu.medsea.mimeutil:mime-util:2.1.3'
|
||||||
|
|
||||||
implementation group: 'eu.medsea.mimeutil', name: 'mime-util', version: '2.1.3'
|
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
testImplementation 'org.mockito:mockito-core:2.26.0'
|
testImplementation 'org.mockito:mockito-core:2.26.0'
|
||||||
testImplementation 'org.powermock:powermock-core:2.0.0'
|
testImplementation 'org.powermock:powermock-core:2.0.0'
|
||||||
@ -218,7 +228,14 @@ dependencies {
|
|||||||
androidTestImplementation ('androidx.test.espresso:espresso-core:3.1.0-alpha4', {
|
androidTestImplementation ('androidx.test.espresso:espresso-core:3.1.0-alpha4', {
|
||||||
exclude group: 'com.android.support', module: 'support-annotations'
|
exclude group: 'com.android.support', module: 'support-annotations'
|
||||||
})
|
})
|
||||||
|
|
||||||
findbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.8.0'
|
findbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.8.0'
|
||||||
findbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.3'
|
findbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.3'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gradle.projectsEvaluated {
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.compilerArgs +=
|
||||||
|
['-Adagger.floatingBindsMethods=enabled',
|
||||||
|
'-AparcelerStacktrace',]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "com.google.firebase:firebase-messaging:17.3.4"
|
implementation "com.google.firebase:firebase-messaging:17.3.4"
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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/>.
|
||||||
|
-->
|
||||||
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="com.nextcloud.talk">
|
package="com.nextcloud.talk">
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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/>.
|
||||||
|
-->
|
||||||
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="com.nextcloud.talk">
|
package="com.nextcloud.talk">
|
||||||
|
@ -26,26 +26,23 @@ import android.widget.*;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.models.database.UserEntity;
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
import com.nextcloud.talk.models.json.participants.Participant;
|
import com.nextcloud.talk.models.json.participants.Participant;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFilterable;
|
import eu.davidea.flexibleadapter.items.IFilterable;
|
||||||
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
||||||
import eu.davidea.flipview.FlipView;
|
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.UserItemViewHolder> implements
|
public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.UserItemViewHolder> implements
|
||||||
IFilterable<String> {
|
IFilterable<String> {
|
||||||
@ -116,23 +113,15 @@ public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.User
|
|||||||
|
|
||||||
if (userEntity != null && userEntity.getBaseUrl() != null && userEntity.getBaseUrl().startsWith("http://") || userEntity.getBaseUrl().startsWith("https://")) {
|
if (userEntity != null && userEntity.getBaseUrl() != null && userEntity.getBaseUrl().startsWith("http://") || userEntity.getBaseUrl().startsWith("https://")) {
|
||||||
holder.avatarImageView.setVisibility(View.VISIBLE);
|
holder.avatarImageView.setVisibility(View.VISIBLE);
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
|
||||||
participant.getUserId(), R.dimen.avatar_size), new LazyHeaders.Builder()
|
|
||||||
.setHeader("Accept", "image/*")
|
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
|
||||||
.build());
|
|
||||||
|
|
||||||
int avatarSize = Math.round(NextcloudTalkApplication
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
.getSharedApplication().getResources().getDimension(R.dimen.avatar_size));
|
.setOldController(holder.avatarImageView.getController())
|
||||||
|
.setAutoPlayAnimations(true)
|
||||||
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
||||||
|
participant.getUserId(), R.dimen.avatar_size), null))
|
||||||
|
.build();
|
||||||
|
holder.avatarImageView.setController(draweeController);
|
||||||
|
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(holder.avatarImageView.getFrontImageView());
|
|
||||||
} else {
|
} else {
|
||||||
holder.avatarImageView.setVisibility(View.GONE);
|
holder.avatarImageView.setVisibility(View.GONE);
|
||||||
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) holder.linearLayout.getLayoutParams();
|
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) holder.linearLayout.getLayoutParams();
|
||||||
@ -146,7 +135,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.User
|
|||||||
@Override
|
@Override
|
||||||
public boolean filter(String constraint) {
|
public boolean filter(String constraint) {
|
||||||
return participant.getName() != null &&
|
return participant.getName() != null &&
|
||||||
StringUtils.containsIgnoreCase(participant.getName().trim(), constraint);
|
Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(participant.getName().trim()).find();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -157,7 +146,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem<AdvancedUserItem.User
|
|||||||
@BindView(R.id.secondary_text)
|
@BindView(R.id.secondary_text)
|
||||||
public TextView serverUrl;
|
public TextView serverUrl;
|
||||||
@BindView(R.id.avatar_image)
|
@BindView(R.id.avatar_image)
|
||||||
public FlipView avatarImageView;
|
public SimpleDraweeView avatarImageView;
|
||||||
@BindView(R.id.linear_layout)
|
@BindView(R.id.linear_layout)
|
||||||
LinearLayout linearLayout;
|
LinearLayout linearLayout;
|
||||||
@BindView(R.id.more_menu)
|
@BindView(R.id.more_menu)
|
||||||
|
@ -29,11 +29,9 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.events.MoreMenuClickEvent;
|
import com.nextcloud.talk.events.MoreMenuClickEvent;
|
||||||
@ -41,17 +39,15 @@ import com.nextcloud.talk.models.database.UserEntity;
|
|||||||
import com.nextcloud.talk.models.json.rooms.Conversation;
|
import com.nextcloud.talk.models.json.rooms.Conversation;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.DisplayUtils;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFilterable;
|
import eu.davidea.flexibleadapter.items.IFilterable;
|
||||||
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
||||||
import eu.davidea.flipview.FlipView;
|
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder> implements IFilterable<String> {
|
public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder> implements IFilterable<String> {
|
||||||
|
|
||||||
@ -134,21 +130,14 @@ public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder>
|
|||||||
.nc_description_more_menu_one_to_one), conversation.getDisplayName()));
|
.nc_description_more_menu_one_to_one), conversation.getDisplayName()));
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(conversation.getName())) {
|
if (!TextUtils.isEmpty(conversation.getName())) {
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
conversation.getName(), R.dimen.avatar_size), new LazyHeaders.Builder()
|
.setOldController(holder.avatarImageView.getController())
|
||||||
.setHeader("Accept", "image/*")
|
.setAutoPlayAnimations(true)
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
||||||
.build());
|
conversation.getLastMessage().getActorId(),
|
||||||
|
R.dimen.avatar_size), null))
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
.build();
|
||||||
.asBitmap()
|
holder.avatarImageView.setController(draweeController);
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(holder.avatarImageView.getFrontImageView());
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
holder.avatarImageView.setVisibility(View.GONE);
|
holder.avatarImageView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
@ -156,19 +145,13 @@ public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder>
|
|||||||
case ROOM_GROUP_CALL:
|
case ROOM_GROUP_CALL:
|
||||||
holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
|
holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
|
||||||
.nc_description_more_menu_group), conversation.getDisplayName()));
|
.nc_description_more_menu_group), conversation.getDisplayName()));
|
||||||
|
holder.avatarImageView.setActualImageResource(R.drawable.ic_people_group_white_24px);
|
||||||
holder.avatarImageView.setFrontImageBitmap(DisplayUtils
|
|
||||||
.getRoundedBitmapFromVectorDrawableResource(resources,
|
|
||||||
R.drawable.ic_people_group_white_24px));
|
|
||||||
holder.avatarImageView.setVisibility(View.VISIBLE);
|
holder.avatarImageView.setVisibility(View.VISIBLE);
|
||||||
break;
|
break;
|
||||||
case ROOM_PUBLIC_CALL:
|
case ROOM_PUBLIC_CALL:
|
||||||
holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
|
holder.moreMenuButton.setContentDescription(String.format(resources.getString(R.string
|
||||||
.nc_description_more_menu_public), conversation.getDisplayName()));
|
.nc_description_more_menu_public), conversation.getDisplayName()));
|
||||||
|
holder.avatarImageView.setActualImageResource(R.drawable.ic_link_white_24px);
|
||||||
holder.avatarImageView.setFrontImageBitmap(DisplayUtils
|
|
||||||
.getRoundedBitmapFromVectorDrawableResource(resources,
|
|
||||||
R.drawable.ic_link_white_24px));
|
|
||||||
holder.avatarImageView.setVisibility(View.VISIBLE);
|
holder.avatarImageView.setVisibility(View.VISIBLE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -182,8 +165,7 @@ public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder>
|
|||||||
@Override
|
@Override
|
||||||
public boolean filter(String constraint) {
|
public boolean filter(String constraint) {
|
||||||
return conversation.getDisplayName() != null &&
|
return conversation.getDisplayName() != null &&
|
||||||
StringUtils.containsIgnoreCase(conversation.getDisplayName().trim(), constraint);
|
Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(conversation.getDisplayName().trim()).find();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static class RoomItemViewHolder extends FlexibleViewHolder {
|
static class RoomItemViewHolder extends FlexibleViewHolder {
|
||||||
@ -193,7 +175,7 @@ public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder>
|
|||||||
@BindView(R.id.secondary_text)
|
@BindView(R.id.secondary_text)
|
||||||
public TextView roomLastPing;
|
public TextView roomLastPing;
|
||||||
@BindView(R.id.avatar_image)
|
@BindView(R.id.avatar_image)
|
||||||
public FlipView avatarImageView;
|
public SimpleDraweeView avatarImageView;
|
||||||
@BindView(R.id.more_menu)
|
@BindView(R.id.more_menu)
|
||||||
public ImageButton moreMenuButton;
|
public ImageButton moreMenuButton;
|
||||||
@BindView(R.id.password_protected_image_view)
|
@BindView(R.id.password_protected_image_view)
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
package com.nextcloud.talk.adapters.items;
|
package com.nextcloud.talk.adapters.items;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.LayerDrawable;
|
import android.graphics.drawable.LayerDrawable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@ -31,11 +32,9 @@ import android.widget.TextView;
|
|||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
import com.amulyakhare.textdrawable.TextDrawable;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.models.database.UserEntity;
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
@ -43,7 +42,6 @@ import com.nextcloud.talk.models.json.chat.ChatMessage;
|
|||||||
import com.nextcloud.talk.models.json.rooms.Conversation;
|
import com.nextcloud.talk.models.json.rooms.Conversation;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.DisplayUtils;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import com.vanniktech.emoji.EmojiTextView;
|
import com.vanniktech.emoji.EmojiTextView;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
@ -51,9 +49,9 @@ import eu.davidea.flexibleadapter.items.IFilterable;
|
|||||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class ConversationItem extends AbstractFlexibleItem<ConversationItem.ConversationItemViewHolder> implements
|
public class ConversationItem extends AbstractFlexibleItem<ConversationItem.ConversationItemViewHolder> implements
|
||||||
IFilterable<String> {
|
IFilterable<String> {
|
||||||
@ -146,10 +144,10 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
holder.dialogLastMessage.setText(conversation.getLastMessage().getText());
|
holder.dialogLastMessage.setText(conversation.getLastMessage().getText());
|
||||||
} else {
|
} else {
|
||||||
String authorDisplayName = "";
|
String authorDisplayName = "";
|
||||||
conversation.getLastMessage().setActiveUserId(userEntity.getUserId());
|
conversation.getLastMessage().setActiveUser(userEntity);
|
||||||
String text;
|
String text;
|
||||||
if (conversation.getLastMessage().getMessageType().equals(ChatMessage.MessageType.REGULAR_TEXT_MESSAGE)) {
|
if (conversation.getLastMessage().getMessageType().equals(ChatMessage.MessageType.REGULAR_TEXT_MESSAGE)) {
|
||||||
if (conversation.getLastMessage().getActorId().equals(conversation.getLastMessage().getActiveUserId())) {
|
if (conversation.getLastMessage().getActorId().equals(userEntity.getUserId())) {
|
||||||
text = String.format(context.getString(R.string.nc_formatted_message_you), conversation.getLastMessage().getLastMessageDisplayText());
|
text = String.format(context.getString(R.string.nc_formatted_message_you), conversation.getLastMessage().getLastMessageDisplayText());
|
||||||
} else {
|
} else {
|
||||||
authorDisplayName = !TextUtils.isEmpty(conversation.getLastMessage().getActorDisplayName()) ?
|
authorDisplayName = !TextUtils.isEmpty(conversation.getLastMessage().getActorDisplayName()) ?
|
||||||
@ -166,8 +164,6 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
|
|
||||||
holder.dialogLastMessage.setText(text);
|
holder.dialogLastMessage.setText(text);
|
||||||
|
|
||||||
int smallAvatarSize = Math.round(context.getResources().getDimension(R.dimen.small_item_height));
|
|
||||||
|
|
||||||
if (conversation.getLastMessage().getActorType().equals("guests")) {
|
if (conversation.getLastMessage().getActorType().equals("guests")) {
|
||||||
if (TextUtils.isEmpty(authorDisplayName)) {
|
if (TextUtils.isEmpty(authorDisplayName)) {
|
||||||
authorDisplayName = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest);
|
authorDisplayName = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest);
|
||||||
@ -176,26 +172,18 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
TextDrawable drawable = TextDrawable.builder().beginConfig().bold()
|
TextDrawable drawable = TextDrawable.builder().beginConfig().bold()
|
||||||
.endConfig().buildRound(String.valueOf(authorDisplayName.charAt(0)),
|
.endConfig().buildRound(String.valueOf(authorDisplayName.charAt(0)),
|
||||||
context.getResources().getColor(R.color.nc_grey));
|
context.getResources().getColor(R.color.nc_grey));
|
||||||
holder.dialogLastMessageUserAvatar.setImageDrawable(drawable);
|
holder.dialogLastMessageUserAvatar.getHierarchy().setImage(drawable, 100, true);
|
||||||
} else if (!conversation.getLastMessage().getActorId().equals(userEntity.getUserId())
|
} else if (conversation.getLastMessage().getActorId().equals(userEntity.getUserId())
|
||||||
&& !conversation.getType().equals(Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)) {
|
|| !conversation.getType().equals(Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)) {
|
||||||
holder.dialogLastMessageUserAvatar.setVisibility(View.VISIBLE);
|
holder.dialogLastMessageUserAvatar.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
if (!"bots".equals(conversation.getLastMessage().getActorType())) {
|
if (!"bots".equals(conversation.getLastMessage().getActorType())) {
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
conversation.getLastMessage().getActorId(), R.dimen.small_item_height), new LazyHeaders.Builder()
|
.setOldController(holder.dialogLastMessageUserAvatar.getController())
|
||||||
.setHeader("Accept", "image/*")
|
.setAutoPlayAnimations(true)
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(), conversation.getLastMessage().getActorId(), R.dimen.small_item_height), userEntity))
|
||||||
.build());
|
.build();
|
||||||
|
holder.dialogLastMessageUserAvatar.setController(draweeController);
|
||||||
GlideApp.with(context)
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(smallAvatarSize, smallAvatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(holder.dialogLastMessageUserAvatar);
|
|
||||||
} else {
|
} else {
|
||||||
TextDrawable drawable =
|
TextDrawable drawable =
|
||||||
TextDrawable.builder().beginConfig().bold().endConfig().buildRound(">", context.getResources().getColor(R.color.black));
|
TextDrawable.builder().beginConfig().bold().endConfig().buildRound(">", context.getResources().getColor(R.color.black));
|
||||||
@ -213,8 +201,6 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
holder.dialogLastMessage.setText(R.string.nc_no_messages_yet);
|
holder.dialogLastMessage.setText(R.string.nc_no_messages_yet);
|
||||||
}
|
}
|
||||||
|
|
||||||
int avatarSize = Math.round(context.getResources().getDimension(R.dimen.avatar_size));
|
|
||||||
|
|
||||||
|
|
||||||
holder.dialogAvatar.setVisibility(View.VISIBLE);
|
holder.dialogAvatar.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
@ -224,15 +210,15 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
switch (objectType) {
|
switch (objectType) {
|
||||||
case "share:password":
|
case "share:password":
|
||||||
shouldLoadAvatar = false;
|
shouldLoadAvatar = false;
|
||||||
holder.dialogAvatar.setImageBitmap(DisplayUtils
|
holder.dialogAvatar.getHierarchy().setImage(new BitmapDrawable(DisplayUtils
|
||||||
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
||||||
R.drawable.ic_file_password_request));
|
R.drawable.ic_file_password_request)), 100, true);
|
||||||
break;
|
break;
|
||||||
case "file":
|
case "file":
|
||||||
shouldLoadAvatar = false;
|
shouldLoadAvatar = false;
|
||||||
holder.dialogAvatar.setImageBitmap(DisplayUtils
|
holder.dialogAvatar.getHierarchy().setImage(new BitmapDrawable(DisplayUtils
|
||||||
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
||||||
R.drawable.ic_file_icon));
|
R.drawable.ic_file_icon)), 100, true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -245,14 +231,7 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground);
|
layers[1] = context.getDrawable(R.drawable.ic_launcher_foreground);
|
||||||
LayerDrawable layerDrawable = new LayerDrawable(layers);
|
LayerDrawable layerDrawable = new LayerDrawable(layers);
|
||||||
|
|
||||||
GlideApp.with(context)
|
holder.dialogAvatar.getHierarchy().setPlaceholderImage(DisplayUtils.getRoundedDrawable(layerDrawable));
|
||||||
.asDrawable()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(layerDrawable)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(holder.dialogAvatar);
|
|
||||||
|
|
||||||
shouldLoadAvatar = false;
|
shouldLoadAvatar = false;
|
||||||
}
|
}
|
||||||
@ -260,37 +239,26 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
if (shouldLoadAvatar) {
|
if (shouldLoadAvatar) {
|
||||||
switch (conversation.getType()) {
|
switch (conversation.getType()) {
|
||||||
case ROOM_TYPE_ONE_TO_ONE_CALL:
|
case ROOM_TYPE_ONE_TO_ONE_CALL:
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(conversation.getName())) {
|
if (!TextUtils.isEmpty(conversation.getName())) {
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
conversation.getName(), R.dimen.avatar_size), new LazyHeaders.Builder()
|
.setOldController(holder.dialogAvatar.getController())
|
||||||
.setHeader("Accept", "image/*")
|
.setAutoPlayAnimations(true)
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(), conversation.getName(), R.dimen.avatar_size), null))
|
||||||
.build());
|
.build();
|
||||||
|
holder.dialogAvatar.setController(draweeController);
|
||||||
GlideApp.with(context)
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(holder.dialogAvatar);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
holder.dialogAvatar.setVisibility(View.GONE);
|
holder.dialogAvatar.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ROOM_GROUP_CALL:
|
case ROOM_GROUP_CALL:
|
||||||
holder.dialogAvatar.setImageBitmap(DisplayUtils
|
holder.dialogAvatar.getHierarchy().setImage(new BitmapDrawable(DisplayUtils
|
||||||
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
||||||
R.drawable.ic_people_group_white_24px));
|
R.drawable.ic_people_group_white_24px)), 100, true);
|
||||||
break;
|
break;
|
||||||
case ROOM_PUBLIC_CALL:
|
case ROOM_PUBLIC_CALL:
|
||||||
holder.dialogAvatar.setImageBitmap(DisplayUtils
|
holder.dialogAvatar.getHierarchy().setImage(new BitmapDrawable(DisplayUtils
|
||||||
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
.getRoundedBitmapFromVectorDrawableResource(context.getResources(),
|
||||||
R.drawable.ic_link_white_24px));
|
R.drawable.ic_link_white_24px)), 100, true);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
holder.dialogAvatar.setVisibility(View.GONE);
|
holder.dialogAvatar.setVisibility(View.GONE);
|
||||||
@ -301,18 +269,18 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
@Override
|
@Override
|
||||||
public boolean filter(String constraint) {
|
public boolean filter(String constraint) {
|
||||||
return conversation.getDisplayName() != null &&
|
return conversation.getDisplayName() != null &&
|
||||||
StringUtils.containsIgnoreCase(conversation.getDisplayName().trim(), constraint);
|
Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(conversation.getDisplayName().trim()).find();
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ConversationItemViewHolder extends FlexibleViewHolder {
|
static class ConversationItemViewHolder extends FlexibleViewHolder {
|
||||||
@BindView(R.id.dialogAvatar)
|
@BindView(R.id.dialogAvatar)
|
||||||
ImageView dialogAvatar;
|
SimpleDraweeView dialogAvatar;
|
||||||
@BindView(R.id.dialogName)
|
@BindView(R.id.dialogName)
|
||||||
EmojiTextView dialogName;
|
EmojiTextView dialogName;
|
||||||
@BindView(R.id.dialogDate)
|
@BindView(R.id.dialogDate)
|
||||||
TextView dialogDate;
|
TextView dialogDate;
|
||||||
@BindView(R.id.dialogLastMessageUserAvatar)
|
@BindView(R.id.dialogLastMessageUserAvatar)
|
||||||
ImageView dialogLastMessageUserAvatar;
|
SimpleDraweeView dialogLastMessageUserAvatar;
|
||||||
@BindView(R.id.dialogLastMessage)
|
@BindView(R.id.dialogLastMessage)
|
||||||
EmojiTextView dialogLastMessage;
|
EmojiTextView dialogLastMessage;
|
||||||
@BindView(R.id.dialogUnreadBubble)
|
@BindView(R.id.dialogUnreadBubble)
|
||||||
|
@ -28,14 +28,12 @@ import butterknife.ButterKnife;
|
|||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem;
|
import eu.davidea.flexibleadapter.items.AbstractHeaderItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFilterable;
|
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class GenericTextHeaderItem extends AbstractHeaderItem<GenericTextHeaderItem.HeaderViewHolder> implements IFilterable<String> {
|
public class GenericTextHeaderItem extends AbstractHeaderItem<GenericTextHeaderItem.HeaderViewHolder> {
|
||||||
private static final String TAG = "GenericTextHeaderItem";
|
private static final String TAG = "GenericTextHeaderItem";
|
||||||
|
|
||||||
private String title;
|
private String title;
|
||||||
@ -47,11 +45,6 @@ public class GenericTextHeaderItem extends AbstractHeaderItem<GenericTextHeaderI
|
|||||||
this.title = title;
|
this.title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean filter(String constraint) {
|
|
||||||
return StringUtils.containsIgnoreCase(title, constraint);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getModel() {
|
public String getModel() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
@ -22,25 +22,21 @@ package com.nextcloud.talk.adapters.items;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.models.database.UserEntity;
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.DisplayUtils;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFilterable;
|
import eu.davidea.flexibleadapter.items.IFilterable;
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class MentionAutocompleteItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
public class MentionAutocompleteItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
||||||
implements IFilterable<String> {
|
implements IFilterable<String> {
|
||||||
@ -115,32 +111,23 @@ public class MentionAutocompleteItem extends AbstractFlexibleItem<UserItem.UserI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (source.equals("calls")) {
|
if (source.equals("calls")) {
|
||||||
holder.avatarFlipView.setFrontImageBitmap(DisplayUtils.getRoundedBitmapFromVectorDrawableResource(NextcloudTalkApplication.getSharedApplication().getResources(), R.drawable.ic_people_group_white_24px));
|
holder.simpleDraweeView.getHierarchy().setPlaceholderImage(DisplayUtils.getRoundedBitmapDrawableFromVectorDrawableResource(NextcloudTalkApplication.getSharedApplication().getResources(), R.drawable.ic_people_group_white_24px));
|
||||||
} else {
|
} else {
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(currentUser.getBaseUrl(),
|
holder.simpleDraweeView.setController(null);
|
||||||
objectId, R.dimen.avatar_size), new LazyHeaders.Builder()
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
.setHeader("Accept", "image/*")
|
.setOldController(holder.simpleDraweeView.getController())
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
.setAutoPlayAnimations(true)
|
||||||
.build());
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(currentUser.getBaseUrl(),
|
||||||
|
objectId, R.dimen.avatar_size_big), null))
|
||||||
int avatarSize = Math.round(NextcloudTalkApplication
|
.build();
|
||||||
.getSharedApplication().getResources().getDimension(R.dimen.avatar_size));
|
holder.simpleDraweeView.setController(draweeController);
|
||||||
|
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(holder.avatarFlipView.getFrontImageView());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filter(String constraint) {
|
public boolean filter(String constraint) {
|
||||||
return objectId != null && StringUtils.containsIgnoreCase(objectId, constraint) ||
|
return objectId != null && Pattern.compile(constraint,
|
||||||
displayName != null && StringUtils.containsIgnoreCase(displayName, constraint);
|
Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(objectId).find()
|
||||||
|
|| displayName != null && Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(displayName).find();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,12 +20,16 @@
|
|||||||
|
|
||||||
package com.nextcloud.talk.adapters.items;
|
package com.nextcloud.talk.adapters.items;
|
||||||
|
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.utils.MagicFlipView;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
@ -38,10 +42,6 @@ public class NotificationSoundItem extends AbstractFlexibleItem<NotificationSoun
|
|||||||
private String notificationSoundName;
|
private String notificationSoundName;
|
||||||
private String notificationSoundUri;
|
private String notificationSoundUri;
|
||||||
|
|
||||||
private boolean selected;
|
|
||||||
|
|
||||||
private MagicFlipView flipView;
|
|
||||||
|
|
||||||
public NotificationSoundItem(String notificationSoundName, String notificationSoundUri) {
|
public NotificationSoundItem(String notificationSoundName, String notificationSoundUri) {
|
||||||
this.notificationSoundName = notificationSoundName;
|
this.notificationSoundName = notificationSoundName;
|
||||||
this.notificationSoundUri = notificationSoundUri;
|
this.notificationSoundUri = notificationSoundUri;
|
||||||
@ -70,51 +70,34 @@ public class NotificationSoundItem extends AbstractFlexibleItem<NotificationSoun
|
|||||||
return new NotificationSoundItemViewHolder(view, adapter);
|
return new NotificationSoundItemViewHolder(view, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSelected() {
|
|
||||||
return selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelected(boolean selected) {
|
|
||||||
this.selected = selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void flipToFront() {
|
|
||||||
if (flipView != null && flipView.isFlipped()) {
|
|
||||||
flipView.flip(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void flipItemSelection() {
|
|
||||||
if (flipView != null) {
|
|
||||||
flipView.flip(!flipView.isFlipped());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, NotificationSoundItemViewHolder holder, int position, List<Object> payloads) {
|
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, NotificationSoundItemViewHolder holder, int position, List<Object> payloads) {
|
||||||
flipView = holder.magicFlipView;
|
|
||||||
|
|
||||||
holder.magicFlipView.flipSilently(adapter.isSelected(position) || isSelected());
|
|
||||||
|
|
||||||
if (isSelected() && !adapter.isSelected(position)) {
|
|
||||||
adapter.toggleSelection(position);
|
|
||||||
selected = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
holder.notificationName.setText(notificationSoundName);
|
holder.notificationName.setText(notificationSoundName);
|
||||||
|
|
||||||
if (position == 0) {
|
if (adapter.isSelected(position)) {
|
||||||
holder.magicFlipView.setFrontImage(R.drawable.ic_stop_white_24dp);
|
holder.checkedImageView.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
holder.magicFlipView.setFrontImage(R.drawable.ic_play_circle_outline_white_24dp);
|
holder.checkedImageView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Resources resources = NextcloudTalkApplication.getSharedApplication().getResources();
|
||||||
|
holder.simpleDraweeView.getHierarchy().setBackgroundImage(new ColorDrawable(resources.getColor(R.color.colorPrimary)));
|
||||||
|
if (position == 0) {
|
||||||
|
holder.simpleDraweeView.getHierarchy().setImage(resources.getDrawable(R.drawable.ic_stop_white_24dp), 100,
|
||||||
|
true);
|
||||||
|
} else {
|
||||||
|
holder.simpleDraweeView.getHierarchy().setImage(resources.getDrawable(R.drawable.ic_play_circle_outline_white_24dp), 100,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class NotificationSoundItemViewHolder extends FlexibleViewHolder {
|
static class NotificationSoundItemViewHolder extends FlexibleViewHolder {
|
||||||
@BindView(R.id.notificationNameTextView)
|
@BindView(R.id.notificationNameTextView)
|
||||||
public TextView notificationName;
|
public TextView notificationName;
|
||||||
@BindView(R.id.magicFlipView)
|
@BindView(R.id.simpleDraweeView)
|
||||||
MagicFlipView magicFlipView;
|
SimpleDraweeView simpleDraweeView;
|
||||||
|
@BindView(R.id.checkedImageView)
|
||||||
|
ImageView checkedImageView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor.
|
* Default constructor.
|
||||||
|
@ -139,4 +139,4 @@ public class ProgressItem extends AbstractFlexibleItem<ProgressItem.ProgressView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,17 +21,16 @@
|
|||||||
package com.nextcloud.talk.adapters.items;
|
package com.nextcloud.talk.adapters.items;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.models.database.UserEntity;
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
@ -39,18 +38,16 @@ import com.nextcloud.talk.models.json.converters.EnumParticipantTypeConverter;
|
|||||||
import com.nextcloud.talk.models.json.participants.Participant;
|
import com.nextcloud.talk.models.json.participants.Participant;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.DisplayUtils;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFilterable;
|
import eu.davidea.flexibleadapter.items.IFilterable;
|
||||||
import eu.davidea.flexibleadapter.items.ISectionable;
|
import eu.davidea.flexibleadapter.items.ISectionable;
|
||||||
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
|
||||||
import eu.davidea.flipview.FlipView;
|
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder> implements
|
public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder> implements
|
||||||
ISectionable<UserItem.UserItemViewHolder, GenericTextHeaderItem>, IFilterable<String> {
|
ISectionable<UserItem.UserItemViewHolder, GenericTextHeaderItem>, IFilterable<String> {
|
||||||
@ -59,9 +56,6 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
private UserEntity userEntity;
|
private UserEntity userEntity;
|
||||||
private GenericTextHeaderItem header;
|
private GenericTextHeaderItem header;
|
||||||
|
|
||||||
private FlipView flipView;
|
|
||||||
|
|
||||||
|
|
||||||
public UserItem(Participant participant, UserEntity userEntity, GenericTextHeaderItem genericTextHeaderItem) {
|
public UserItem(Participant participant, UserEntity userEntity, GenericTextHeaderItem genericTextHeaderItem) {
|
||||||
this.participant = participant;
|
this.participant = participant;
|
||||||
this.userEntity = userEntity;
|
this.userEntity = userEntity;
|
||||||
@ -94,9 +88,6 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
return userEntity;
|
return userEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void flipItemSelection() {
|
|
||||||
flipView.flip(!flipView.isFlipped());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getLayoutRes() {
|
public int getLayoutRes() {
|
||||||
@ -115,9 +106,13 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
@Override
|
@Override
|
||||||
public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) {
|
public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) {
|
||||||
|
|
||||||
flipView = holder.avatarFlipView;
|
if (holder.checkedImageView != null) {
|
||||||
|
if (adapter.isSelected(position)) {
|
||||||
flipView.flipSilently(adapter.isSelected(position));
|
holder.checkedImageView.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
holder.checkedImageView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (adapter.hasFilter()) {
|
if (adapter.hasFilter()) {
|
||||||
FlexibleUtils.highlightText(holder.contactDisplayName, participant.getDisplayName(),
|
FlexibleUtils.highlightText(holder.contactDisplayName, participant.getDisplayName(),
|
||||||
@ -132,35 +127,23 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int avatarSize = Math.round(NextcloudTalkApplication
|
|
||||||
.getSharedApplication().getResources().getDimension(R.dimen.avatar_size));
|
|
||||||
|
|
||||||
if (TextUtils.isEmpty(participant.getSource()) || participant.getSource().equals("users")) {
|
if (TextUtils.isEmpty(participant.getSource()) || participant.getSource().equals("users")) {
|
||||||
|
|
||||||
if (Participant.ParticipantType.GUEST.equals(participant.getType()) ||
|
if (Participant.ParticipantType.GUEST.equals(participant.getType()) ||
|
||||||
Participant.ParticipantType.USER_FOLLOWING_LINK.equals(participant.getType())) {
|
Participant.ParticipantType.USER_FOLLOWING_LINK.equals(participant.getType())) {
|
||||||
// TODO: Show generated avatar for guests
|
// TODO: Show generated avatar for guests
|
||||||
} else {
|
} else {
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
participant.getUserId(), R.dimen.avatar_size), new LazyHeaders.Builder()
|
.setOldController(holder.simpleDraweeView.getController())
|
||||||
.setHeader("Accept", "image/*")
|
.setAutoPlayAnimations(true)
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userEntity.getBaseUrl(),
|
||||||
.build());
|
participant.getUserId(), R.dimen.avatar_size), null))
|
||||||
|
.build();
|
||||||
|
holder.simpleDraweeView.setController(draweeController);
|
||||||
|
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(flipView.getFrontImageView());
|
|
||||||
}
|
}
|
||||||
} else if ("groups".equals(participant.getSource())) {
|
} else if ("groups".equals(participant.getSource())) {
|
||||||
|
holder.simpleDraweeView.getHierarchy().setImage(new BitmapDrawable(DisplayUtils.getRoundedBitmapFromVectorDrawableResource(NextcloudTalkApplication.getSharedApplication().getResources(), R.drawable.ic_people_group_white_24px)), 100, true);
|
||||||
flipView.setFrontImageBitmap(DisplayUtils
|
|
||||||
.getRoundedBitmapFromVectorDrawableResource(NextcloudTalkApplication.getSharedApplication().getResources(),
|
|
||||||
R.drawable.ic_people_group_white_24px));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEnabled()) {
|
if (!isEnabled()) {
|
||||||
@ -206,37 +189,40 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
String userType = "";
|
|
||||||
|
|
||||||
switch (new EnumParticipantTypeConverter().convertToInt(participant.getType())) {
|
if (holder.contactMentionId != null) {
|
||||||
case 1:
|
String userType = "";
|
||||||
//userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_owner);
|
|
||||||
//break;
|
switch (new EnumParticipantTypeConverter().convertToInt(participant.getType())) {
|
||||||
case 2:
|
case 1:
|
||||||
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_moderator);
|
//userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_owner);
|
||||||
break;
|
//break;
|
||||||
case 3:
|
case 2:
|
||||||
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_user);
|
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_moderator);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 3:
|
||||||
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest);
|
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_user);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 4:
|
||||||
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_following_link);
|
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest);
|
||||||
break;
|
break;
|
||||||
default:
|
case 5:
|
||||||
break;
|
userType = NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_following_link);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.contactMentionId.setText(userType);
|
||||||
|
holder.contactMentionId.setTextColor(NextcloudTalkApplication.getSharedApplication().getResources().getColor(R.color.colorPrimary));
|
||||||
}
|
}
|
||||||
|
|
||||||
holder.contactMentionId.setText(userType);
|
|
||||||
holder.contactMentionId.setTextColor(NextcloudTalkApplication.getSharedApplication().getResources().getColor(R.color.colorPrimary));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filter(String constraint) {
|
public boolean filter(String constraint) {
|
||||||
return participant.getDisplayName() != null &&
|
return participant.getDisplayName() != null &&
|
||||||
StringUtils.containsIgnoreCase(participant.getDisplayName().trim(), constraint);
|
Pattern.compile(constraint, Pattern.CASE_INSENSITIVE | Pattern.LITERAL).matcher(participant.getDisplayName().trim()).find();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -254,8 +240,8 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
|
|
||||||
@BindView(R.id.name_text)
|
@BindView(R.id.name_text)
|
||||||
public TextView contactDisplayName;
|
public TextView contactDisplayName;
|
||||||
@BindView(R.id.avatar_flip_view)
|
@BindView(R.id.simple_drawee_view)
|
||||||
public FlipView avatarFlipView;
|
public SimpleDraweeView simpleDraweeView;
|
||||||
@Nullable
|
@Nullable
|
||||||
@BindView(R.id.secondary_text)
|
@BindView(R.id.secondary_text)
|
||||||
public TextView contactMentionId;
|
public TextView contactMentionId;
|
||||||
@ -265,6 +251,9 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
|
|||||||
@Nullable
|
@Nullable
|
||||||
@BindView(R.id.videoCallImageView)
|
@BindView(R.id.videoCallImageView)
|
||||||
ImageView videoCallImageView;
|
ImageView videoCallImageView;
|
||||||
|
@Nullable
|
||||||
|
@BindView(R.id.checkedImageView)
|
||||||
|
ImageView checkedImageView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor.
|
* Default constructor.
|
||||||
|
@ -145,14 +145,14 @@ public class MagicIncomingTextMessageViewHolder
|
|||||||
Map<String, String> individualHashMap = message.getMessageParameters().get(key);
|
Map<String, String> individualHashMap = message.getMessageParameters().get(key);
|
||||||
if (individualHashMap != null) {
|
if (individualHashMap != null) {
|
||||||
if (individualHashMap.get("type").equals("user") || individualHashMap.get("type").equals("guest") || individualHashMap.get("type").equals("call")) {
|
if (individualHashMap.get("type").equals("user") || individualHashMap.get("type").equals("guest") || individualHashMap.get("type").equals("call")) {
|
||||||
if (individualHashMap.get("id").equals(message.getActiveUserId())) {
|
if (individualHashMap.get("id").equals(message.getActiveUser().getUserId())) {
|
||||||
messageString =
|
messageString =
|
||||||
DisplayUtils.searchAndReplaceWithMentionSpan(messageText.getContext(),
|
DisplayUtils.searchAndReplaceWithMentionSpan(messageText.getContext(),
|
||||||
messageString,
|
messageString,
|
||||||
individualHashMap.get("id"),
|
individualHashMap.get("id"),
|
||||||
individualHashMap.get("name"),
|
individualHashMap.get("name"),
|
||||||
individualHashMap.get("type"),
|
individualHashMap.get("type"),
|
||||||
userUtils.getUserById(message.getActiveUserId()),
|
userUtils.getUserById(message.getActiveUser().getUserId()),
|
||||||
R.xml.chip_accent_background);
|
R.xml.chip_accent_background);
|
||||||
} else {
|
} else {
|
||||||
messageString =
|
messageString =
|
||||||
@ -161,7 +161,7 @@ public class MagicIncomingTextMessageViewHolder
|
|||||||
individualHashMap.get("id"),
|
individualHashMap.get("id"),
|
||||||
individualHashMap.get("name"),
|
individualHashMap.get("name"),
|
||||||
individualHashMap.get("type"),
|
individualHashMap.get("type"),
|
||||||
userUtils.getUserById(message.getActiveUserId()),
|
userUtils.getUserById(message.getActiveUser().getUserId()),
|
||||||
R.xml.chip_incoming_others);
|
R.xml.chip_incoming_others);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,14 +92,14 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin
|
|||||||
Map<String, String> individualHashMap = message.getMessageParameters().get(key);
|
Map<String, String> individualHashMap = message.getMessageParameters().get(key);
|
||||||
if (individualHashMap != null) {
|
if (individualHashMap != null) {
|
||||||
if (individualHashMap.get("type").equals("user") || individualHashMap.get("type").equals("guest") || individualHashMap.get("type").equals("call")) {
|
if (individualHashMap.get("type").equals("user") || individualHashMap.get("type").equals("guest") || individualHashMap.get("type").equals("call")) {
|
||||||
if (!individualHashMap.get("id").equals(message.getActiveUserId())) {
|
if (!individualHashMap.get("id").equals(message.getActiveUser().getUserId())) {
|
||||||
messageString =
|
messageString =
|
||||||
DisplayUtils.searchAndReplaceWithMentionSpan(messageText.getContext(),
|
DisplayUtils.searchAndReplaceWithMentionSpan(messageText.getContext(),
|
||||||
messageString,
|
messageString,
|
||||||
individualHashMap.get("id"),
|
individualHashMap.get("id"),
|
||||||
individualHashMap.get("name"),
|
individualHashMap.get("name"),
|
||||||
individualHashMap.get("type"),
|
individualHashMap.get("type"),
|
||||||
userUtils.getUserById(message.getActiveUserId()),
|
userUtils.getUserById(message.getActiveUser().getUserId()),
|
||||||
R.xml.chip_outgoing_others);
|
R.xml.chip_outgoing_others);
|
||||||
} else {
|
} else {
|
||||||
messageString =
|
messageString =
|
||||||
@ -108,7 +108,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin
|
|||||||
individualHashMap.get("id"),
|
individualHashMap.get("id"),
|
||||||
individualHashMap.get("name"),
|
individualHashMap.get("name"),
|
||||||
individualHashMap.get("type"),
|
individualHashMap.get("type"),
|
||||||
userUtils.getUserById(message.getActiveUserId()),
|
userUtils.getUserById(message.getActiveUser().getUserId()),
|
||||||
R.xml.chip_outgoing_own_mention);
|
R.xml.chip_outgoing_own_mention);
|
||||||
}
|
}
|
||||||
} else if (individualHashMap.get("type").equals("file")) {
|
} else if (individualHashMap.get("type").equals("file")) {
|
||||||
|
@ -21,23 +21,39 @@
|
|||||||
package com.nextcloud.talk.adapters.messages;
|
package com.nextcloud.talk.adapters.messages;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.LayerDrawable;
|
import android.graphics.drawable.LayerDrawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import autodagger.AutoInjector;
|
import autodagger.AutoInjector;
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.BrowserFile;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.DavResponse;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.ReadFilesystemOperation;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
import com.nextcloud.talk.models.json.chat.ChatMessage;
|
import com.nextcloud.talk.models.json.chat.ChatMessage;
|
||||||
|
import com.nextcloud.talk.utils.AccountUtils;
|
||||||
import com.nextcloud.talk.utils.DisplayUtils;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
|
import com.nextcloud.talk.utils.DrawableUtils;
|
||||||
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
import com.stfalcon.chatkit.messages.MessageHolders;
|
import com.stfalcon.chatkit.messages.MessageHolders;
|
||||||
import com.vanniktech.emoji.EmojiTextView;
|
import com.vanniktech.emoji.EmojiTextView;
|
||||||
|
import io.reactivex.Single;
|
||||||
|
import io.reactivex.SingleObserver;
|
||||||
|
import io.reactivex.disposables.Disposable;
|
||||||
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication.class)
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageMessageViewHolder<ChatMessage> {
|
public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageMessageViewHolder<ChatMessage> {
|
||||||
@ -48,6 +64,9 @@ public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageM
|
|||||||
@Inject
|
@Inject
|
||||||
Context context;
|
Context context;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
OkHttpClient okHttpClient;
|
||||||
|
|
||||||
public MagicPreviewMessageViewHolder(View itemView) {
|
public MagicPreviewMessageViewHolder(View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
ButterKnife.bind(this, itemView);
|
ButterKnife.bind(this, itemView);
|
||||||
@ -58,7 +77,6 @@ public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageM
|
|||||||
@Override
|
@Override
|
||||||
public void onBind(ChatMessage message) {
|
public void onBind(ChatMessage message) {
|
||||||
super.onBind(message);
|
super.onBind(message);
|
||||||
|
|
||||||
if (userAvatar != null) {
|
if (userAvatar != null) {
|
||||||
if (message.isGrouped) {
|
if (message.isGrouped) {
|
||||||
userAvatar.setVisibility(View.INVISIBLE);
|
userAvatar.setVisibility(View.INVISIBLE);
|
||||||
@ -80,10 +98,32 @@ public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageM
|
|||||||
// it's a preview for a Nextcloud share
|
// it's a preview for a Nextcloud share
|
||||||
messageText.setText(message.getSelectedIndividualHashMap().get("name"));
|
messageText.setText(message.getSelectedIndividualHashMap().get("name"));
|
||||||
DisplayUtils.setClickableString(message.getSelectedIndividualHashMap().get("name"), message.getSelectedIndividualHashMap().get("link"), messageText);
|
DisplayUtils.setClickableString(message.getSelectedIndividualHashMap().get("name"), message.getSelectedIndividualHashMap().get("link"), messageText);
|
||||||
|
if (message.getSelectedIndividualHashMap().containsKey("mimetype")) {
|
||||||
|
image.getHierarchy().setPlaceholderImage(context.getDrawable(DrawableUtils.getDrawableResourceIdForMimeType(message.getSelectedIndividualHashMap().get("mimetype"))));
|
||||||
|
} else {
|
||||||
|
fetchFileInformation("/" + message.getSelectedIndividualHashMap().get("path"), message.getActiveUser());
|
||||||
|
}
|
||||||
|
|
||||||
image.setOnClickListener(v -> {
|
image.setOnClickListener(v -> {
|
||||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.getSelectedIndividualHashMap().get("link")));
|
|
||||||
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
String accountString =
|
||||||
NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent);
|
message.getActiveUser().getUsername() + "@" + message.getActiveUser().getBaseUrl().replace("https://", "").replace("http://", "");
|
||||||
|
|
||||||
|
if (AccountUtils.canWeOpenFilesApp(context, accountString)) {
|
||||||
|
Intent filesAppIntent = new Intent(Intent.ACTION_VIEW, null);
|
||||||
|
final ComponentName componentName = new ComponentName(context.getString(R.string.nc_import_accounts_from), "com.owncloud.android.ui.activity.FileDisplayActivity");
|
||||||
|
filesAppIntent.setComponent(componentName);
|
||||||
|
filesAppIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
filesAppIntent.setPackage(context.getString(R.string.nc_import_accounts_from));
|
||||||
|
Bundle options = new Bundle();
|
||||||
|
options.putString(BundleKeys.KEY_ACCOUNT, accountString);
|
||||||
|
options.putString(BundleKeys.KEY_FILE_PATH, "/" + message.getSelectedIndividualHashMap().get("path"));
|
||||||
|
context.startActivity(filesAppIntent, options);
|
||||||
|
} else {
|
||||||
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.getSelectedIndividualHashMap().get("link")));
|
||||||
|
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
context.startActivity(browserIntent);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else if (message.getMessageType() == ChatMessage.MessageType.SINGLE_LINK_GIPHY_MESSAGE) {
|
} else if (message.getMessageType() == ChatMessage.MessageType.SINGLE_LINK_GIPHY_MESSAGE) {
|
||||||
messageText.setText("GIPHY");
|
messageText.setText("GIPHY");
|
||||||
@ -95,4 +135,36 @@ public class MagicPreviewMessageViewHolder extends MessageHolders.IncomingImageM
|
|||||||
messageText.setText("");
|
messageText.setText("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void fetchFileInformation(String url, UserEntity activeUser) {
|
||||||
|
Single.fromCallable(new Callable<ReadFilesystemOperation>() {
|
||||||
|
@Override
|
||||||
|
public ReadFilesystemOperation call() {
|
||||||
|
return new ReadFilesystemOperation(okHttpClient, activeUser, url, 0);
|
||||||
|
}
|
||||||
|
}).subscribeOn(Schedulers.newThread())
|
||||||
|
.subscribe(new SingleObserver<ReadFilesystemOperation>() {
|
||||||
|
@Override
|
||||||
|
public void onSubscribe(Disposable d) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(ReadFilesystemOperation readFilesystemOperation) {
|
||||||
|
DavResponse davResponse = readFilesystemOperation.readRemotePath();
|
||||||
|
if (davResponse.getData() != null) {
|
||||||
|
List<BrowserFile> browserFileList = (List<BrowserFile>) davResponse.getData();
|
||||||
|
if (!browserFileList.isEmpty()) {
|
||||||
|
image.getHierarchy().setPlaceholderImage(context.getDrawable(DrawableUtils.getDrawableResourceIdForMimeType(browserFileList.get(0).getMimeType())));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable e) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ public class MagicSystemMessageViewHolder extends MessageHolders.IncomingTextMes
|
|||||||
int color;
|
int color;
|
||||||
if (individualHashMap != null && (individualHashMap.get("type").equals("user") || individualHashMap.get("type").equals("guest") || individualHashMap.get("type").equals("call"))) {
|
if (individualHashMap != null && (individualHashMap.get("type").equals("user") || individualHashMap.get("type").equals("guest") || individualHashMap.get("type").equals("call"))) {
|
||||||
|
|
||||||
if (individualHashMap.get("id").equals(message.getActiveUserId())) {
|
if (individualHashMap.get("id").equals(message.getActiveUser().getUserId())) {
|
||||||
color = context.getResources().getColor(R.color.nc_incoming_text_mention_you);
|
color = context.getResources().getColor(R.color.nc_incoming_text_mention_you);
|
||||||
} else {
|
} else {
|
||||||
color = context.getResources().getColor(R.color.nc_incoming_text_mention_others);
|
color = context.getResources().getColor(R.color.nc_incoming_text_mention_others);
|
||||||
|
@ -306,4 +306,11 @@ public interface NcApi {
|
|||||||
@PUT
|
@PUT
|
||||||
Observable<GenericOverall> setReadOnlyState(@Header("Authorization") String authorization, @Url String url, @Field("state") int state);
|
Observable<GenericOverall> setReadOnlyState(@Header("Authorization") String authorization, @Url String url, @Field("state") int state);
|
||||||
|
|
||||||
|
|
||||||
|
@FormUrlEncoded
|
||||||
|
@POST
|
||||||
|
Observable<Void> createRemoteShare(@Nullable @Header("Authorization") String authorization, @Url String url,
|
||||||
|
@Field("path") String remotePath,
|
||||||
|
@Field("shareWith") String roomToken,
|
||||||
|
@Field("shareType") String shareType);
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ import autodagger.AutoInjector;
|
|||||||
import com.facebook.cache.disk.DiskCacheConfig;
|
import com.facebook.cache.disk.DiskCacheConfig;
|
||||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.facebook.imagepipeline.core.ImagePipelineConfig;
|
import com.facebook.imagepipeline.core.ImagePipelineConfig;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
|
||||||
import com.nextcloud.talk.dagger.modules.BusModule;
|
import com.nextcloud.talk.dagger.modules.BusModule;
|
||||||
import com.nextcloud.talk.dagger.modules.ContextModule;
|
import com.nextcloud.talk.dagger.modules.ContextModule;
|
||||||
import com.nextcloud.talk.dagger.modules.DatabaseModule;
|
import com.nextcloud.talk.dagger.modules.DatabaseModule;
|
||||||
@ -53,12 +54,14 @@ import com.nextcloud.talk.webrtc.MagicWebRTCUtils;
|
|||||||
import com.vanniktech.emoji.EmojiManager;
|
import com.vanniktech.emoji.EmojiManager;
|
||||||
import com.vanniktech.emoji.twitter.TwitterEmojiProvider;
|
import com.vanniktech.emoji.twitter.TwitterEmojiProvider;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
import org.conscrypt.Conscrypt;
|
||||||
import org.webrtc.PeerConnectionFactory;
|
import org.webrtc.PeerConnectionFactory;
|
||||||
import org.webrtc.voiceengine.WebRtcAudioManager;
|
import org.webrtc.voiceengine.WebRtcAudioManager;
|
||||||
import org.webrtc.voiceengine.WebRtcAudioUtils;
|
import org.webrtc.voiceengine.WebRtcAudioUtils;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
import java.security.Security;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@AutoComponent(
|
@AutoComponent(
|
||||||
@ -121,6 +124,7 @@ public class NextcloudTalkApplication extends MultiDexApplication implements Lif
|
|||||||
initializeWebRtc();
|
initializeWebRtc();
|
||||||
DisplayUtils.useCompatVectorIfNeeded();
|
DisplayUtils.useCompatVectorIfNeeded();
|
||||||
buildComponent();
|
buildComponent();
|
||||||
|
DavUtils.registerCustomFactories();
|
||||||
|
|
||||||
componentApplication.inject(this);
|
componentApplication.inject(this);
|
||||||
|
|
||||||
@ -134,6 +138,7 @@ public class NextcloudTalkApplication extends MultiDexApplication implements Lif
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
Fresco.initialize(this, imagePipelineConfig);
|
Fresco.initialize(this, imagePipelineConfig);
|
||||||
|
Security.insertProviderAt(Conscrypt.newProvider(), 1);
|
||||||
|
|
||||||
new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync();
|
new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync();
|
||||||
DeviceUtils.ignoreSpecialBatteryFeatures();
|
DeviceUtils.ignoreSpecialBatteryFeatures();
|
||||||
|
@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.components.filebrowser.adapters.items;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.format.Formatter;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import autodagger.AutoInjector;
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
|
import com.nextcloud.talk.R;
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.BrowserFile;
|
||||||
|
import com.nextcloud.talk.interfaces.SelectionInterface;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
|
import com.nextcloud.talk.utils.DateUtils;
|
||||||
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
|
import com.nextcloud.talk.utils.DrawableUtils;
|
||||||
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFilterable;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
|
public class BrowserFileItem extends AbstractFlexibleItem<BrowserFileItem.ViewHolder> implements IFilterable<String> {
|
||||||
|
@Inject
|
||||||
|
Context context;
|
||||||
|
private BrowserFile browserFile;
|
||||||
|
private UserEntity activeUser;
|
||||||
|
private SelectionInterface selectionInterface;
|
||||||
|
private boolean selected;
|
||||||
|
|
||||||
|
public BrowserFileItem(BrowserFile browserFile, UserEntity activeUser, SelectionInterface selectionInterface) {
|
||||||
|
this.browserFile = browserFile;
|
||||||
|
this.activeUser = activeUser;
|
||||||
|
this.selectionInterface = selectionInterface;
|
||||||
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (o instanceof BrowserFileItem) {
|
||||||
|
BrowserFileItem inItem = (BrowserFileItem) o;
|
||||||
|
return browserFile.getPath().equals(inItem.getModel().getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BrowserFile getModel() {
|
||||||
|
return browserFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLayoutRes() {
|
||||||
|
return R.layout.rv_item_browser_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||||
|
return new ViewHolder(view, adapter);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isSelected() {
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSelected(boolean selected) {
|
||||||
|
this.selected = selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ViewHolder holder, int position, List<Object> payloads) {
|
||||||
|
holder.fileIconImageView.setController(null);
|
||||||
|
|
||||||
|
if (browserFile.isEncrypted()) {
|
||||||
|
holder.fileEncryptedImageView.setVisibility(View.VISIBLE);
|
||||||
|
holder.itemView.setEnabled(false);
|
||||||
|
holder.itemView.setAlpha(0.38f);
|
||||||
|
} else {
|
||||||
|
holder.fileEncryptedImageView.setVisibility(View.GONE);
|
||||||
|
holder.itemView.setEnabled(true);
|
||||||
|
holder.itemView.setAlpha(1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (browserFile.isFavorite()) {
|
||||||
|
holder.fileFavoriteImageView.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
holder.fileFavoriteImageView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.fileIconImageView.getHierarchy().setPlaceholderImage(context.getDrawable(DrawableUtils.getDrawableResourceIdForMimeType(browserFile.getMimeType())));
|
||||||
|
|
||||||
|
if (browserFile.isHasPreview()) {
|
||||||
|
String path = ApiUtils.getUrlForFilePreviewWithRemotePath(activeUser.getBaseUrl(),
|
||||||
|
browserFile.getPath(),
|
||||||
|
context.getResources().getDimensionPixelSize(R.dimen.small_item_height));
|
||||||
|
|
||||||
|
if (path.length() > 0) {
|
||||||
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
|
.setAutoPlayAnimations(true)
|
||||||
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(path, null))
|
||||||
|
.build();
|
||||||
|
holder.fileIconImageView.setController(draweeController);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.filenameTextView.setText(browserFile.getDisplayName());
|
||||||
|
holder.fileModifiedTextView.setText(String.format(context.getString(R.string.nc_last_modified),
|
||||||
|
Formatter.formatShortFileSize(context, browserFile.getSize()),
|
||||||
|
DateUtils.getLocalDateTimeStringFromTimestamp(context, browserFile.getModifiedTimestamp())));
|
||||||
|
setSelected(selectionInterface.isPathSelected(browserFile.getPath()));
|
||||||
|
holder.selectFileCheckbox.setChecked(isSelected());
|
||||||
|
|
||||||
|
if (!browserFile.isEncrypted()) {
|
||||||
|
holder.selectFileCheckbox.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (((CheckBox) v).isChecked() != isSelected()) {
|
||||||
|
setSelected(((CheckBox) v).isChecked());
|
||||||
|
selectionInterface.toggleBrowserItemSelection(browserFile.getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.filenameTextView.setSelected(true);
|
||||||
|
holder.fileModifiedTextView.setSelected(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean filter(String constraint) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ViewHolder extends FlexibleViewHolder {
|
||||||
|
|
||||||
|
@BindView(R.id.file_icon)
|
||||||
|
public SimpleDraweeView fileIconImageView;
|
||||||
|
@BindView(R.id.file_modified_info)
|
||||||
|
public TextView fileModifiedTextView;
|
||||||
|
@BindView(R.id.filename_text_view)
|
||||||
|
public TextView filenameTextView;
|
||||||
|
@BindView(R.id.select_file_checkbox)
|
||||||
|
public CheckBox selectFileCheckbox;
|
||||||
|
@BindView(R.id.fileEncryptedImageView)
|
||||||
|
public ImageView fileEncryptedImageView;
|
||||||
|
@BindView(R.id.fileFavoriteImageView)
|
||||||
|
public ImageView fileFavoriteImageView;
|
||||||
|
|
||||||
|
ViewHolder(View view, FlexibleAdapter adapter) {
|
||||||
|
super(view, adapter);
|
||||||
|
ButterKnife.bind(this, view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,333 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.components.filebrowser.controllers;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.*;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import androidx.work.Data;
|
||||||
|
import androidx.work.OneTimeWorkRequest;
|
||||||
|
import androidx.work.WorkManager;
|
||||||
|
import autodagger.AutoInjector;
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.OnClick;
|
||||||
|
import com.google.android.material.bottomnavigation.BottomNavigationItemView;
|
||||||
|
import com.nextcloud.talk.R;
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.adapters.items.BrowserFileItem;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.interfaces.ListingInterface;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.BrowserFile;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.DavResponse;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.operations.DavListing;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.operations.ListingAbstractClass;
|
||||||
|
import com.nextcloud.talk.controllers.base.BaseController;
|
||||||
|
import com.nextcloud.talk.interfaces.SelectionInterface;
|
||||||
|
import com.nextcloud.talk.jobs.ShareOperationWorker;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
|
import eu.davidea.fastscroller.FastScroller;
|
||||||
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
|
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager;
|
||||||
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import org.parceler.Parcel;
|
||||||
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
|
public class BrowserController extends BaseController implements ListingInterface,
|
||||||
|
FlexibleAdapter.OnItemClickListener, SelectionInterface {
|
||||||
|
private final Set<String> selectedPaths;
|
||||||
|
@Inject
|
||||||
|
UserUtils userUtils;
|
||||||
|
@BindView(R.id.recycler_view)
|
||||||
|
RecyclerView recyclerView;
|
||||||
|
@BindView(R.id.fast_scroller)
|
||||||
|
FastScroller fastScroller;
|
||||||
|
@BindView(R.id.action_back)
|
||||||
|
BottomNavigationItemView backMenuItem;
|
||||||
|
@BindView(R.id.action_refresh)
|
||||||
|
BottomNavigationItemView actionRefreshMenuItem;
|
||||||
|
@Inject
|
||||||
|
Context context;
|
||||||
|
@Inject
|
||||||
|
OkHttpClient okHttpClient;
|
||||||
|
|
||||||
|
private MenuItem filesSelectionDoneMenuItem;
|
||||||
|
private RecyclerView.LayoutManager layoutManager;
|
||||||
|
|
||||||
|
private FlexibleAdapter<AbstractFlexibleItem> adapter;
|
||||||
|
private List<AbstractFlexibleItem> recyclerViewItems = new ArrayList<>();
|
||||||
|
|
||||||
|
private ListingAbstractClass listingAbstractClass;
|
||||||
|
private BrowserType browserType;
|
||||||
|
private String currentPath;
|
||||||
|
private UserEntity activeUser;
|
||||||
|
private String roomToken;
|
||||||
|
|
||||||
|
public BrowserController(Bundle args) {
|
||||||
|
super(args);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
|
browserType = Parcels.unwrap(args.getParcelable(BundleKeys.KEY_BROWSER_TYPE));
|
||||||
|
activeUser = Parcels.unwrap(args.getParcelable(BundleKeys.KEY_USER_ENTITY));
|
||||||
|
roomToken = args.getString(BundleKeys.KEY_ROOM_TOKEN);
|
||||||
|
|
||||||
|
currentPath = "/";
|
||||||
|
if (BrowserType.DAV_BROWSER.equals(browserType)) {
|
||||||
|
listingAbstractClass = new DavListing(this);
|
||||||
|
} else {
|
||||||
|
//listingAbstractClass = new LocalListing(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedPaths = Collections.synchronizedSet(new TreeSet<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
|
||||||
|
return inflater.inflate(R.layout.controller_browser, container, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onViewBound(@NonNull View view) {
|
||||||
|
super.onViewBound(view);
|
||||||
|
if (adapter == null) {
|
||||||
|
adapter = new FlexibleAdapter<>(recyclerViewItems, context, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
changeEnabledStatusForBarItems(true);
|
||||||
|
prepareViews();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onFileSelectionDone() {
|
||||||
|
synchronized (selectedPaths) {
|
||||||
|
Iterator<String> iterator = selectedPaths.iterator();
|
||||||
|
|
||||||
|
List<String> paths = new ArrayList<>();
|
||||||
|
Data data;
|
||||||
|
OneTimeWorkRequest shareWorker;
|
||||||
|
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
String path = iterator.next();
|
||||||
|
paths.add(path);
|
||||||
|
iterator.remove();
|
||||||
|
if (paths.size() == 10 || !iterator.hasNext()) {
|
||||||
|
data = new Data.Builder()
|
||||||
|
.putLong(BundleKeys.KEY_INTERNAL_USER_ID, activeUser.getId())
|
||||||
|
.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken)
|
||||||
|
.putStringArray(BundleKeys.KEY_FILE_PATHS, paths.toArray(new String[0]))
|
||||||
|
.build();
|
||||||
|
shareWorker = new OneTimeWorkRequest.Builder(ShareOperationWorker.class)
|
||||||
|
.setInputData(data)
|
||||||
|
.build();
|
||||||
|
WorkManager.getInstance().enqueue(shareWorker);
|
||||||
|
paths = new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getRouter().popCurrentController();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
inflater.inflate(R.menu.menu_share_files, menu);
|
||||||
|
filesSelectionDoneMenuItem = menu.findItem(R.id.files_selection_done);
|
||||||
|
filesSelectionDoneMenuItem.setVisible(selectedPaths.size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.files_selection_done:
|
||||||
|
onFileSelectionDone();
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onAttach(@NonNull View view) {
|
||||||
|
super.onAttach(view);
|
||||||
|
refreshCurrentPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
listingAbstractClass.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getTitle() {
|
||||||
|
return currentPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.action_back)
|
||||||
|
void goBack() {
|
||||||
|
fetchPath(new File(currentPath).getParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.action_refresh)
|
||||||
|
void refreshCurrentPath() {
|
||||||
|
fetchPath(currentPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("RestrictedApi")
|
||||||
|
private void changeEnabledStatusForBarItems(boolean shouldBeEnabled) {
|
||||||
|
if (actionRefreshMenuItem != null) {
|
||||||
|
actionRefreshMenuItem.setEnabled(shouldBeEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (backMenuItem != null) {
|
||||||
|
backMenuItem.setEnabled(shouldBeEnabled && !currentPath.equals("/"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchPath(String path) {
|
||||||
|
listingAbstractClass.cancelAllJobs();
|
||||||
|
changeEnabledStatusForBarItems(false);
|
||||||
|
|
||||||
|
listingAbstractClass.getFiles(path, activeUser, BrowserType.DAV_BROWSER.equals(browserType) ? okHttpClient : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void listingResult(DavResponse davResponse) {
|
||||||
|
adapter.clear();
|
||||||
|
List<AbstractFlexibleItem> fileBrowserItems = new ArrayList<>();
|
||||||
|
if (davResponse.getData() != null) {
|
||||||
|
final List<BrowserFile> objectList = (List<BrowserFile>) davResponse.getData();
|
||||||
|
|
||||||
|
currentPath = objectList.get(0).getPath();
|
||||||
|
|
||||||
|
Objects.requireNonNull(getActivity()).runOnUiThread(this::setTitle);
|
||||||
|
|
||||||
|
for (int i = 1; i < objectList.size(); i++) {
|
||||||
|
fileBrowserItems.add(new BrowserFileItem(objectList.get(i), activeUser, this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter.addItems(0, fileBrowserItems);
|
||||||
|
Objects.requireNonNull(getActivity()).runOnUiThread(() -> {
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
changeEnabledStatusForBarItems(true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean shouldPathBeSelectedDueToParent(String currentPath) {
|
||||||
|
if (selectedPaths.size() > 0) {
|
||||||
|
File file = new File(currentPath);
|
||||||
|
if (!file.getParent().equals("/")) {
|
||||||
|
while (file.getParent() != null) {
|
||||||
|
String parent = file.getParent();
|
||||||
|
if (new File(file.getParent()).getParent() != null) {
|
||||||
|
parent += "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedPaths.contains(parent)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = new File(file.getParent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAndRemoveAnySelectedParents(String currentPath) {
|
||||||
|
File file = new File(currentPath);
|
||||||
|
selectedPaths.remove(currentPath);
|
||||||
|
while (file.getParent() != null) {
|
||||||
|
selectedPaths.remove(file.getParent() + "/");
|
||||||
|
file = new File(file.getParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onItemClick(View view, int position) {
|
||||||
|
BrowserFile browserFile = ((BrowserFileItem) adapter.getItem(position)).getModel();
|
||||||
|
if ("inode/directory".equals((browserFile.getMimeType()))) {
|
||||||
|
fetchPath(browserFile.getPath());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareViews() {
|
||||||
|
if (getActivity() != null) {
|
||||||
|
layoutManager = new SmoothScrollLinearLayoutManager(getActivity());
|
||||||
|
recyclerView.setLayoutManager(layoutManager);
|
||||||
|
recyclerView.setHasFixedSize(true);
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
adapter.setFastScroller(fastScroller);
|
||||||
|
adapter.addListener(this);
|
||||||
|
|
||||||
|
fastScroller.setBubbleTextCreator(position -> {
|
||||||
|
IFlexible abstractFlexibleItem = adapter.getItem(position);
|
||||||
|
if (abstractFlexibleItem instanceof BrowserFileItem) {
|
||||||
|
return String.valueOf(((BrowserFileItem) adapter.getItem(position)).getModel().getDisplayName().charAt(0));
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("RestrictedApi")
|
||||||
|
@Override
|
||||||
|
public void toggleBrowserItemSelection(String path) {
|
||||||
|
if (selectedPaths.contains(path) || shouldPathBeSelectedDueToParent(path)) {
|
||||||
|
checkAndRemoveAnySelectedParents(path);
|
||||||
|
} else {
|
||||||
|
// TOOD: if it's a folder, remove all the children we added manually
|
||||||
|
selectedPaths.add(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
filesSelectionDoneMenuItem.setVisible(selectedPaths.size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPathSelected(String path) {
|
||||||
|
return (selectedPaths.contains(path) || shouldPathBeSelectedDueToParent(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
public enum BrowserType {
|
||||||
|
FILE_BROWSER,
|
||||||
|
DAV_BROWSER,
|
||||||
|
}
|
||||||
|
}
|
@ -18,27 +18,10 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.nextcloud.talk.utils;
|
package com.nextcloud.talk.components.filebrowser.interfaces;
|
||||||
|
|
||||||
import android.content.Context;
|
import com.nextcloud.talk.components.filebrowser.models.DavResponse;
|
||||||
import android.util.AttributeSet;
|
|
||||||
import eu.davidea.flipview.FlipView;
|
|
||||||
|
|
||||||
public class MagicFlipView extends FlipView {
|
public interface ListingInterface {
|
||||||
public MagicFlipView(Context context) {
|
void listingResult(DavResponse davResponse);
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MagicFlipView(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDetachedFromWindow() {
|
|
||||||
try {
|
|
||||||
super.onDetachedFromWindow();
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
stopFlipping();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.components.filebrowser.models;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.Response;
|
||||||
|
import at.bitfire.dav4android.property.DisplayName;
|
||||||
|
import at.bitfire.dav4android.property.GetContentType;
|
||||||
|
import at.bitfire.dav4android.property.GetLastModified;
|
||||||
|
import at.bitfire.dav4android.property.ResourceType;
|
||||||
|
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.properties.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.parceler.Parcel;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@JsonObject
|
||||||
|
@Parcel
|
||||||
|
public class BrowserFile {
|
||||||
|
public String path;
|
||||||
|
public String displayName;
|
||||||
|
public String mimeType;
|
||||||
|
public long modifiedTimestamp;
|
||||||
|
public long size;
|
||||||
|
public boolean isFile;
|
||||||
|
// Used for remote files
|
||||||
|
public String remoteId;
|
||||||
|
public boolean hasPreview;
|
||||||
|
public boolean favorite;
|
||||||
|
public boolean encrypted;
|
||||||
|
|
||||||
|
public static BrowserFile getModelFromResponse(Response response, String remotePath) {
|
||||||
|
BrowserFile browserFile = new BrowserFile();
|
||||||
|
browserFile.setPath(Uri.decode(remotePath));
|
||||||
|
browserFile.setDisplayName(Uri.decode(new File(remotePath).getName()));
|
||||||
|
final List<Property> properties = response.getProperties();
|
||||||
|
|
||||||
|
for (Property property : properties) {
|
||||||
|
if (property instanceof OCId) {
|
||||||
|
browserFile.setRemoteId(((OCId) property).getOcId());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof ResourceType) {
|
||||||
|
browserFile.isFile =
|
||||||
|
!(((ResourceType) property).getTypes().contains(ResourceType.Companion.getCOLLECTION()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof GetLastModified) {
|
||||||
|
browserFile.setModifiedTimestamp(((GetLastModified) property).getLastModified());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof GetContentType) {
|
||||||
|
browserFile.setMimeType(((GetContentType) property).getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof OCSize) {
|
||||||
|
browserFile.setSize(((OCSize) property).getOcSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof NCPreview) {
|
||||||
|
browserFile.setHasPreview(((NCPreview) property).isNcPreview());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof OCFavorite) {
|
||||||
|
browserFile.setFavorite(((OCFavorite) property).isOcFavorite());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof DisplayName) {
|
||||||
|
browserFile.setDisplayName(((DisplayName) property).getDisplayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (property instanceof NCEncrypted) {
|
||||||
|
browserFile.setEncrypted(((NCEncrypted) property).isNcEncrypted());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(browserFile.getMimeType()) && !browserFile.isFile()) {
|
||||||
|
browserFile.setMimeType("inode/directory");
|
||||||
|
}
|
||||||
|
|
||||||
|
return browserFile;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.models;
|
||||||
|
|
||||||
|
import at.bitfire.dav4android.Response;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class DavResponse {
|
||||||
|
Response response;
|
||||||
|
Object data;
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.models.properties;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.PropertyFactory;
|
||||||
|
import at.bitfire.dav4android.XmlUtils;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class NCEncrypted implements Property {
|
||||||
|
public static final Name NAME = new Name(DavUtils.NC_NAMESPACE, DavUtils.EXTENDED_PROPERTY_IS_ENCRYPTED);
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean ncEncrypted;
|
||||||
|
|
||||||
|
private NCEncrypted(boolean isEncrypted) {
|
||||||
|
ncEncrypted = isEncrypted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory implements PropertyFactory {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Property create(@NotNull XmlPullParser xmlPullParser) {
|
||||||
|
try {
|
||||||
|
String text = XmlUtils.INSTANCE.readText(xmlPullParser);
|
||||||
|
if (!TextUtils.isEmpty(text)) {
|
||||||
|
return new NCEncrypted(Boolean.parseBoolean(text));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (XmlPullParserException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new NCEncrypted(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Name getName() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.models.properties;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.PropertyFactory;
|
||||||
|
import at.bitfire.dav4android.XmlUtils;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class NCPreview implements Property {
|
||||||
|
public static final Property.Name NAME = new Property.Name(DavUtils.NC_NAMESPACE, DavUtils.EXTENDED_PROPERTY_HAS_PREVIEW);
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean ncPreview;
|
||||||
|
|
||||||
|
private NCPreview(boolean hasPreview) {
|
||||||
|
ncPreview = hasPreview;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory implements PropertyFactory {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Property create(@NotNull XmlPullParser xmlPullParser) {
|
||||||
|
try {
|
||||||
|
String text = XmlUtils.INSTANCE.readText(xmlPullParser);
|
||||||
|
if (!TextUtils.isEmpty(text)) {
|
||||||
|
return new NCPreview(Boolean.parseBoolean(text));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (XmlPullParserException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OCFavorite(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Property.Name getName() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.models.properties;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.PropertyFactory;
|
||||||
|
import at.bitfire.dav4android.XmlUtils;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class OCFavorite implements Property {
|
||||||
|
public static final Property.Name NAME = new Property.Name(DavUtils.OC_NAMESPACE, DavUtils.EXTENDED_PROPERTY_FAVORITE);
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean ocFavorite;
|
||||||
|
|
||||||
|
OCFavorite(boolean isFavorite) {
|
||||||
|
ocFavorite = isFavorite;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory implements PropertyFactory {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Property create(@NotNull XmlPullParser xmlPullParser) {
|
||||||
|
try {
|
||||||
|
String text = XmlUtils.INSTANCE.readText(xmlPullParser);
|
||||||
|
if (!TextUtils.isEmpty(text)) {
|
||||||
|
return new OCFavorite(Boolean.parseBoolean(text));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (XmlPullParserException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OCFavorite(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Property.Name getName() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.models.properties;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.PropertyFactory;
|
||||||
|
import at.bitfire.dav4android.XmlUtils;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class OCId implements Property {
|
||||||
|
public static final Name NAME = new Name(DavUtils.OC_NAMESPACE, DavUtils.EXTENDED_PROPERTY_NAME_REMOTE_ID);
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private String ocId;
|
||||||
|
|
||||||
|
private OCId(String id) {
|
||||||
|
ocId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory implements PropertyFactory {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Property create(@NotNull XmlPullParser xmlPullParser) {
|
||||||
|
try {
|
||||||
|
String text = XmlUtils.INSTANCE.readText(xmlPullParser);
|
||||||
|
if (!TextUtils.isEmpty(text)) {
|
||||||
|
return new OCId(text);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (XmlPullParserException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OCId("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Name getName() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.models.properties;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.PropertyFactory;
|
||||||
|
import at.bitfire.dav4android.XmlUtils;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class OCSize implements Property {
|
||||||
|
public static final Property.Name NAME = new Property.Name(DavUtils.OC_NAMESPACE, DavUtils.EXTENDED_PROPERTY_NAME_SIZE);
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private long ocSize;
|
||||||
|
|
||||||
|
private OCSize(long size) {
|
||||||
|
ocSize = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Factory implements PropertyFactory {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Property create(@NotNull XmlPullParser xmlPullParser) {
|
||||||
|
try {
|
||||||
|
String text = XmlUtils.INSTANCE.readText(xmlPullParser);
|
||||||
|
if (!TextUtils.isEmpty(text)) {
|
||||||
|
return new OCSize(Long.parseLong(text));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (XmlPullParserException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OCSize(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Name getName() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.components.filebrowser.operations;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.interfaces.ListingInterface;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.DavResponse;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.webdav.ReadFilesystemOperation;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
|
import io.reactivex.Single;
|
||||||
|
import io.reactivex.SingleObserver;
|
||||||
|
import io.reactivex.disposables.Disposable;
|
||||||
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
public class DavListing extends ListingAbstractClass {
|
||||||
|
private DavResponse davResponse = new DavResponse();
|
||||||
|
|
||||||
|
public DavListing(ListingInterface listingInterface) {
|
||||||
|
super(listingInterface);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getFiles(String path, UserEntity currentUser, @Nullable OkHttpClient okHttpClient) {
|
||||||
|
Single.fromCallable(new Callable<ReadFilesystemOperation>() {
|
||||||
|
@Override
|
||||||
|
public ReadFilesystemOperation call() {
|
||||||
|
return new ReadFilesystemOperation(okHttpClient, currentUser, path, 1);
|
||||||
|
}
|
||||||
|
}).subscribeOn(Schedulers.newThread())
|
||||||
|
.subscribe(new SingleObserver<ReadFilesystemOperation>() {
|
||||||
|
@Override
|
||||||
|
public void onSubscribe(Disposable d) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(ReadFilesystemOperation readFilesystemOperation) {
|
||||||
|
davResponse = readFilesystemOperation.readRemotePath();
|
||||||
|
listingInterface.listingResult(davResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable e) {
|
||||||
|
listingInterface.listingResult(davResponse);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.components.filebrowser.operations;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.interfaces.ListingInterface;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
|
public abstract class ListingAbstractClass {
|
||||||
|
Handler handler;
|
||||||
|
ListingInterface listingInterface;
|
||||||
|
|
||||||
|
ListingAbstractClass(ListingInterface listingInterface) {
|
||||||
|
handler = new Handler();
|
||||||
|
this.listingInterface = listingInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void getFiles(String path, UserEntity currentUser, @Nullable OkHttpClient okHttpClient);
|
||||||
|
|
||||||
|
public void cancelAllJobs() {
|
||||||
|
handler.removeCallbacksAndMessages(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tearDown() {
|
||||||
|
cancelAllJobs();
|
||||||
|
handler = null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.webdav;
|
||||||
|
|
||||||
|
import at.bitfire.dav4android.Property;
|
||||||
|
import at.bitfire.dav4android.PropertyFactory;
|
||||||
|
import at.bitfire.dav4android.PropertyRegistry;
|
||||||
|
import at.bitfire.dav4android.property.*;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.properties.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class DavUtils {
|
||||||
|
public static final String OC_NAMESPACE = "http://owncloud.org/ns";
|
||||||
|
public static final String NC_NAMESPACE = "http://nextcloud.org/ns";
|
||||||
|
public static final String DAV_PATH = "/remote.php/dav/files/";
|
||||||
|
|
||||||
|
public static final String EXTENDED_PROPERTY_NAME_PERMISSIONS = "permissions";
|
||||||
|
public static final String EXTENDED_PROPERTY_NAME_REMOTE_ID = "id";
|
||||||
|
public static final String EXTENDED_PROPERTY_NAME_SIZE = "size";
|
||||||
|
public static final String EXTENDED_PROPERTY_FAVORITE = "favorite";
|
||||||
|
public static final String EXTENDED_PROPERTY_IS_ENCRYPTED = "is-encrypted";
|
||||||
|
public static final String EXTENDED_PROPERTY_MOUNT_TYPE = "mount-type";
|
||||||
|
public static final String EXTENDED_PROPERTY_OWNER_ID = "owner-id";
|
||||||
|
public static final String EXTENDED_PROPERTY_OWNER_DISPLAY_NAME = "owner-display-name";
|
||||||
|
public static final String EXTENDED_PROPERTY_UNREAD_COMMENTS = "comments-unread";
|
||||||
|
public static final String EXTENDED_PROPERTY_HAS_PREVIEW = "has-preview";
|
||||||
|
public static final String EXTENDED_PROPERTY_NOTE = "note";
|
||||||
|
public static final String TRASHBIN_FILENAME = "trashbin-filename";
|
||||||
|
public static final String TRASHBIN_ORIGINAL_LOCATION = "trashbin-original-location";
|
||||||
|
public static final String TRASHBIN_DELETION_TIME = "trashbin-deletion-time";
|
||||||
|
|
||||||
|
public static final String PROPERTY_QUOTA_USED_BYTES = "quota-used-bytes";
|
||||||
|
public static final String PROPERTY_QUOTA_AVAILABLE_BYTES = "quota-available-bytes";
|
||||||
|
|
||||||
|
static Property.Name[] getAllPropSet() {
|
||||||
|
List<Property.Name> propSet = new ArrayList<>();
|
||||||
|
|
||||||
|
propSet.add(DisplayName.NAME);
|
||||||
|
propSet.add(GetContentType.NAME);
|
||||||
|
propSet.add(GetContentLength.NAME);
|
||||||
|
propSet.add(GetContentType.NAME);
|
||||||
|
propSet.add(GetContentLength.NAME);
|
||||||
|
propSet.add(GetLastModified.NAME);
|
||||||
|
propSet.add(CreationDate.NAME);
|
||||||
|
propSet.add(GetETag.NAME);
|
||||||
|
propSet.add(ResourceType.NAME);
|
||||||
|
|
||||||
|
propSet.add(new Property.Name(OC_NAMESPACE, EXTENDED_PROPERTY_NAME_PERMISSIONS));
|
||||||
|
propSet.add(OCId.NAME);
|
||||||
|
propSet.add(OCSize.NAME);
|
||||||
|
propSet.add(OCFavorite.NAME);
|
||||||
|
propSet.add(new Property.Name(OC_NAMESPACE, EXTENDED_PROPERTY_OWNER_ID));
|
||||||
|
propSet.add(new Property.Name(OC_NAMESPACE, EXTENDED_PROPERTY_OWNER_DISPLAY_NAME));
|
||||||
|
propSet.add(new Property.Name(OC_NAMESPACE, EXTENDED_PROPERTY_UNREAD_COMMENTS));
|
||||||
|
|
||||||
|
propSet.add(NCEncrypted.NAME);
|
||||||
|
propSet.add(new Property.Name(NC_NAMESPACE, EXTENDED_PROPERTY_MOUNT_TYPE));
|
||||||
|
propSet.add(NCPreview.NAME);
|
||||||
|
propSet.add(new Property.Name(NC_NAMESPACE, EXTENDED_PROPERTY_NOTE));
|
||||||
|
|
||||||
|
return propSet.toArray(new Property.Name[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void registerCustomFactories() {
|
||||||
|
PropertyRegistry propertyRegistry = PropertyRegistry.INSTANCE;
|
||||||
|
try {
|
||||||
|
Field factories = propertyRegistry.getClass().getDeclaredField("factories");
|
||||||
|
factories.setAccessible(true);
|
||||||
|
Map<Property.Name, PropertyFactory> reflectionMap = (HashMap<Property.Name,
|
||||||
|
PropertyFactory>) factories.get(propertyRegistry);
|
||||||
|
|
||||||
|
reflectionMap.put(OCId.NAME, new OCId.Factory());
|
||||||
|
reflectionMap.put(NCPreview.NAME, new NCPreview.Factory());
|
||||||
|
reflectionMap.put(NCEncrypted.NAME, new NCEncrypted.Factory());
|
||||||
|
reflectionMap.put(OCFavorite.NAME, new OCFavorite.Factory());
|
||||||
|
reflectionMap.put(OCSize.NAME, new OCSize.Factory());
|
||||||
|
|
||||||
|
factories.set(propertyRegistry, reflectionMap);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* 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.components.filebrowser.webdav;
|
||||||
|
|
||||||
|
import at.bitfire.dav4android.DavResource;
|
||||||
|
import at.bitfire.dav4android.Response;
|
||||||
|
import at.bitfire.dav4android.exception.DavException;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.BrowserFile;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.models.DavResponse;
|
||||||
|
import com.nextcloud.talk.dagger.modules.RestModule;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
|
import kotlin.Unit;
|
||||||
|
import kotlin.jvm.functions.Function2;
|
||||||
|
import okhttp3.HttpUrl;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ReadFilesystemOperation {
|
||||||
|
private final OkHttpClient okHttpClient;
|
||||||
|
private final String url;
|
||||||
|
private final String basePath;
|
||||||
|
private final int depth;
|
||||||
|
|
||||||
|
public ReadFilesystemOperation(OkHttpClient okHttpClient, UserEntity currentUser, String path, int depth) {
|
||||||
|
OkHttpClient.Builder okHttpClientBuilder = okHttpClient.newBuilder();
|
||||||
|
okHttpClientBuilder.followRedirects(false);
|
||||||
|
okHttpClientBuilder.followSslRedirects(false);
|
||||||
|
okHttpClientBuilder.authenticator(new RestModule.MagicAuthenticator(ApiUtils.getCredentials(currentUser.getUsername(), currentUser.getToken()), "Authorization"));
|
||||||
|
this.okHttpClient = okHttpClientBuilder.build();
|
||||||
|
basePath = currentUser.getBaseUrl() + DavUtils.DAV_PATH + currentUser.getUserId();
|
||||||
|
this.url = basePath + path;
|
||||||
|
this.depth = depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DavResponse readRemotePath() {
|
||||||
|
DavResponse davResponse = new DavResponse();
|
||||||
|
final List<Response> memberElements = new ArrayList<>();
|
||||||
|
final Response[] rootElement = new Response[1];
|
||||||
|
final List<BrowserFile> remoteFiles = new ArrayList<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
new DavResource(okHttpClient, HttpUrl.parse(url)).propfind(depth, DavUtils.getAllPropSet(),
|
||||||
|
new Function2<Response, Response.HrefRelation, Unit>() {
|
||||||
|
@Override
|
||||||
|
public Unit invoke(Response response, Response.HrefRelation hrefRelation) {
|
||||||
|
davResponse.setResponse(response);
|
||||||
|
switch (hrefRelation) {
|
||||||
|
case MEMBER:
|
||||||
|
memberElements.add(response);
|
||||||
|
break;
|
||||||
|
case SELF:
|
||||||
|
rootElement[0] = response;
|
||||||
|
break;
|
||||||
|
case OTHER:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
return Unit.INSTANCE;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (DavException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
remoteFiles.add(BrowserFile.getModelFromResponse(rootElement[0],
|
||||||
|
rootElement[0].getHref().toString().substring(basePath.length())));
|
||||||
|
for (Response memberElement : memberElements) {
|
||||||
|
remoteFiles.add(BrowserFile.getModelFromResponse(memberElement,
|
||||||
|
memberElement.getHref().toString().substring(basePath.length())));
|
||||||
|
}
|
||||||
|
|
||||||
|
davResponse.setData(remoteFiles);
|
||||||
|
return davResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -44,9 +44,9 @@ import butterknife.BindView;
|
|||||||
import butterknife.OnClick;
|
import butterknife.OnClick;
|
||||||
import butterknife.OnLongClick;
|
import butterknife.OnLongClick;
|
||||||
import com.bluelinelabs.logansquare.LoganSquare;
|
import com.bluelinelabs.logansquare.LoganSquare;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
@ -65,18 +65,16 @@ import com.nextcloud.talk.models.json.signaling.*;
|
|||||||
import com.nextcloud.talk.models.json.signaling.settings.IceServer;
|
import com.nextcloud.talk.models.json.signaling.settings.IceServer;
|
||||||
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall;
|
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.MagicFlipView;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import com.nextcloud.talk.utils.NotificationUtils;
|
import com.nextcloud.talk.utils.NotificationUtils;
|
||||||
import com.nextcloud.talk.utils.animations.PulseAnimation;
|
import com.nextcloud.talk.utils.animations.PulseAnimation;
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import com.nextcloud.talk.utils.power.PowerManagerUtils;
|
import com.nextcloud.talk.utils.power.PowerManagerUtils;
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
||||||
import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder;
|
import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder;
|
||||||
import com.nextcloud.talk.webrtc.*;
|
import com.nextcloud.talk.webrtc.*;
|
||||||
import com.wooplr.spotlight.SpotlightView;
|
import com.wooplr.spotlight.SpotlightView;
|
||||||
import eu.davidea.flipview.FlipView;
|
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
import io.reactivex.Observer;
|
import io.reactivex.Observer;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
@ -117,7 +115,7 @@ public class CallController extends BaseController {
|
|||||||
};
|
};
|
||||||
|
|
||||||
@BindView(R.id.callControlEnableSpeaker)
|
@BindView(R.id.callControlEnableSpeaker)
|
||||||
MagicFlipView callControlEnableSpeaker;
|
SimpleDraweeView callControlEnableSpeaker;
|
||||||
|
|
||||||
@BindView(R.id.pip_video_view)
|
@BindView(R.id.pip_video_view)
|
||||||
SurfaceViewRenderer pipVideoView;
|
SurfaceViewRenderer pipVideoView;
|
||||||
@ -129,11 +127,11 @@ public class CallController extends BaseController {
|
|||||||
@BindView(R.id.callControlsRelativeLayout)
|
@BindView(R.id.callControlsRelativeLayout)
|
||||||
RelativeLayout callControls;
|
RelativeLayout callControls;
|
||||||
@BindView(R.id.call_control_microphone)
|
@BindView(R.id.call_control_microphone)
|
||||||
FlipView microphoneControlButton;
|
SimpleDraweeView microphoneControlButton;
|
||||||
@BindView(R.id.call_control_camera)
|
@BindView(R.id.call_control_camera)
|
||||||
FlipView cameraControlButton;
|
SimpleDraweeView cameraControlButton;
|
||||||
@BindView(R.id.call_control_switch_camera)
|
@BindView(R.id.call_control_switch_camera)
|
||||||
FlipView cameraSwitchButton;
|
SimpleDraweeView cameraSwitchButton;
|
||||||
@BindView(R.id.connectingTextView)
|
@BindView(R.id.connectingTextView)
|
||||||
TextView connectingTextView;
|
TextView connectingTextView;
|
||||||
|
|
||||||
@ -260,7 +258,7 @@ public class CallController extends BaseController {
|
|||||||
microphoneControlButton.setOnTouchListener(new MicrophoneButtonTouchListener());
|
microphoneControlButton.setOnTouchListener(new MicrophoneButtonTouchListener());
|
||||||
videoOnClickListener = new VideoClickListener();
|
videoOnClickListener = new VideoClickListener();
|
||||||
|
|
||||||
pulseAnimation = PulseAnimation.create().with(microphoneControlButton.getFrontImageView())
|
pulseAnimation = PulseAnimation.create().with(microphoneControlButton)
|
||||||
.setDuration(310)
|
.setDuration(310)
|
||||||
.setRepeatCount(PulseAnimation.INFINITE)
|
.setRepeatCount(PulseAnimation.INFINITE)
|
||||||
.setRepeatMode(PulseAnimation.REVERSE);
|
.setRepeatMode(PulseAnimation.REVERSE);
|
||||||
@ -454,7 +452,7 @@ public class CallController extends BaseController {
|
|||||||
onCameraClick();
|
onCameraClick();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cameraControlButton.getFrontImageView().setImageResource(R.drawable.ic_videocam_off_white_24px);
|
cameraControlButton.setImageResource(R.drawable.ic_videocam_off_white_24px);
|
||||||
cameraControlButton.setAlpha(0.7f);
|
cameraControlButton.setAlpha(0.7f);
|
||||||
cameraSwitchButton.setVisibility(View.GONE);
|
cameraSwitchButton.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
@ -465,7 +463,7 @@ public class CallController extends BaseController {
|
|||||||
onMicrophoneClick();
|
onMicrophoneClick();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
microphoneControlButton.getFrontImageView().setImageResource(R.drawable.ic_mic_off_white_24px);
|
microphoneControlButton.setImageResource(R.drawable.ic_mic_off_white_24px);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!inCall) {
|
if (!inCall) {
|
||||||
@ -584,7 +582,7 @@ public class CallController extends BaseController {
|
|||||||
public void onEnableSpeakerphoneClick() {
|
public void onEnableSpeakerphoneClick() {
|
||||||
if (audioManager != null) {
|
if (audioManager != null) {
|
||||||
audioManager.toggleUseSpeakerphone();
|
audioManager.toggleUseSpeakerphone();
|
||||||
callControlEnableSpeaker.flipSilently(!callControlEnableSpeaker.isFlipped());
|
//callControlEnableSpeaker.flipSilently(!callControlEnableSpeaker.isFlipped());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -620,14 +618,14 @@ public class CallController extends BaseController {
|
|||||||
audioOn = !audioOn;
|
audioOn = !audioOn;
|
||||||
|
|
||||||
if (audioOn) {
|
if (audioOn) {
|
||||||
microphoneControlButton.getFrontImageView().setImageResource(R.drawable.ic_mic_white_24px);
|
microphoneControlButton.setActualImageResource(R.drawable.ic_mic_white_24px);
|
||||||
} else {
|
} else {
|
||||||
microphoneControlButton.getFrontImageView().setImageResource(R.drawable.ic_mic_off_white_24px);
|
microphoneControlButton.setActualImageResource(R.drawable.ic_mic_off_white_24px);
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleMedia(audioOn, false);
|
toggleMedia(audioOn, false);
|
||||||
} else {
|
} else {
|
||||||
microphoneControlButton.getFrontImageView().setImageResource(R.drawable.ic_mic_white_24px);
|
microphoneControlButton.setActualImageResource(R.drawable.ic_mic_white_24px);
|
||||||
pulseAnimation.start();
|
pulseAnimation.start();
|
||||||
toggleMedia(true, false);
|
toggleMedia(true, false);
|
||||||
}
|
}
|
||||||
@ -663,12 +661,12 @@ public class CallController extends BaseController {
|
|||||||
videoOn = !videoOn;
|
videoOn = !videoOn;
|
||||||
|
|
||||||
if (videoOn) {
|
if (videoOn) {
|
||||||
cameraControlButton.getFrontImageView().setImageResource(R.drawable.ic_videocam_white_24px);
|
cameraControlButton.setActualImageResource(R.drawable.ic_videocam_white_24px);
|
||||||
if (cameraEnumerator.getDeviceNames().length > 1) {
|
if (cameraEnumerator.getDeviceNames().length > 1) {
|
||||||
cameraSwitchButton.setVisibility(View.VISIBLE);
|
cameraSwitchButton.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cameraControlButton.getFrontImageView().setImageResource(R.drawable.ic_videocam_off_white_24px);
|
cameraControlButton.setActualImageResource(R.drawable.ic_videocam_off_white_24px);
|
||||||
cameraSwitchButton.setVisibility(View.GONE);
|
cameraSwitchButton.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1792,21 +1790,19 @@ public class CallController extends BaseController {
|
|||||||
if (remoteRenderersLayout != null) {
|
if (remoteRenderersLayout != null) {
|
||||||
RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(session + "+video");
|
RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(session + "+video");
|
||||||
if (relativeLayout != null) {
|
if (relativeLayout != null) {
|
||||||
ImageView avatarImageView = relativeLayout.findViewById(R.id.avatarImageView);
|
SimpleDraweeView avatarImageView = relativeLayout.findViewById(R.id.avatarImageView);
|
||||||
|
|
||||||
if (participantMap.containsKey(session) && avatarImageView.getDrawable() == null) {
|
if (participantMap.containsKey(session) && avatarImageView.getDrawable() == null) {
|
||||||
|
|
||||||
int size = Math.round(getResources().getDimension(R.dimen.avatar_size_big));
|
|
||||||
|
|
||||||
if (getActivity() != null) {
|
if (getActivity() != null) {
|
||||||
GlideApp.with(getActivity())
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
.asBitmap()
|
.setOldController(avatarImageView.getController())
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
.setAutoPlayAnimations(true)
|
||||||
.load(ApiUtils.getUrlForAvatarWithName(baseUrl, participantMap.get(session).getUserId(), R.dimen.avatar_size_big))
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(baseUrl,
|
||||||
.centerInside()
|
participantMap.get(session).getUserId(),
|
||||||
.override(size, size)
|
R.dimen.avatar_size_big), null))
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
.build();
|
||||||
.into(avatarImageView);
|
avatarImageView.setController(draweeController);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1822,7 +1818,7 @@ public class CallController extends BaseController {
|
|||||||
|
|
||||||
RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(session + "+" + videoStreamType);
|
RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(session + "+" + videoStreamType);
|
||||||
SurfaceViewRenderer surfaceViewRenderer = relativeLayout.findViewById(R.id.surface_view);
|
SurfaceViewRenderer surfaceViewRenderer = relativeLayout.findViewById(R.id.surface_view);
|
||||||
ImageView imageView = relativeLayout.findViewById(R.id.avatarImageView);
|
SimpleDraweeView imageView = relativeLayout.findViewById(R.id.avatarImageView);
|
||||||
|
|
||||||
if (mediaStream != null && mediaStream.videoTracks != null && mediaStream.videoTracks.size() > 0 && enable) {
|
if (mediaStream != null && mediaStream.videoTracks != null && mediaStream.videoTracks.size() > 0 && enable) {
|
||||||
VideoTrack videoTrack = mediaStream.videoTracks.get(0);
|
VideoTrack videoTrack = mediaStream.videoTracks.get(0);
|
||||||
@ -1847,7 +1843,7 @@ public class CallController extends BaseController {
|
|||||||
RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(sessionId);
|
RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(sessionId);
|
||||||
if (relativeLayout != null) {
|
if (relativeLayout != null) {
|
||||||
ImageView imageView;
|
ImageView imageView;
|
||||||
ImageView avatarImageView = relativeLayout.findViewById(R.id.avatarImageView);
|
SimpleDraweeView avatarImageView = relativeLayout.findViewById(R.id.avatarImageView);
|
||||||
SurfaceViewRenderer surfaceViewRenderer = relativeLayout.findViewById(R.id.surface_view);
|
SurfaceViewRenderer surfaceViewRenderer = relativeLayout.findViewById(R.id.surface_view);
|
||||||
|
|
||||||
if (video) {
|
if (video) {
|
||||||
@ -1942,7 +1938,7 @@ public class CallController extends BaseController {
|
|||||||
v.onTouchEvent(event);
|
v.onTouchEvent(event);
|
||||||
if (event.getAction() == MotionEvent.ACTION_UP && isPTTActive) {
|
if (event.getAction() == MotionEvent.ACTION_UP && isPTTActive) {
|
||||||
isPTTActive = false;
|
isPTTActive = false;
|
||||||
microphoneControlButton.getFrontImageView().setImageResource(R.drawable.ic_mic_off_white_24px);
|
microphoneControlButton.setActualImageResource(R.drawable.ic_mic_off_white_24px);
|
||||||
pulseAnimation.stop();
|
pulseAnimation.stop();
|
||||||
toggleMedia(false, false);
|
toggleMedia(false, false);
|
||||||
animateCallControls(false, 5000);
|
animateCallControls(false, 5000);
|
||||||
|
@ -30,10 +30,7 @@ import android.media.AudioAttributes;
|
|||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.*;
|
import android.os.*;
|
||||||
import android.renderscript.Allocation;
|
|
||||||
import android.renderscript.Element;
|
|
||||||
import android.renderscript.RenderScript;
|
import android.renderscript.RenderScript;
|
||||||
import android.renderscript.ScriptIntrinsicBlur;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -50,14 +47,16 @@ import butterknife.OnClick;
|
|||||||
import com.bluelinelabs.conductor.RouterTransaction;
|
import com.bluelinelabs.conductor.RouterTransaction;
|
||||||
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
||||||
import com.bluelinelabs.logansquare.LoganSquare;
|
import com.bluelinelabs.logansquare.LoganSquare;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.facebook.common.executors.UiThreadImmediateExecutorService;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.common.references.CloseableReference;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.datasource.DataSource;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.resource.bitmap.TransformationUtils;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
import com.facebook.imagepipeline.core.ImagePipeline;
|
||||||
import com.bumptech.glide.request.target.SimpleTarget;
|
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
|
||||||
import com.bumptech.glide.request.transition.Transition;
|
import com.facebook.imagepipeline.image.CloseableImage;
|
||||||
|
import com.facebook.imagepipeline.postprocessors.BlurPostProcessor;
|
||||||
|
import com.facebook.imagepipeline.request.ImageRequest;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
@ -70,10 +69,9 @@ import com.nextcloud.talk.models.json.participants.ParticipantsOverall;
|
|||||||
import com.nextcloud.talk.models.json.rooms.Conversation;
|
import com.nextcloud.talk.models.json.rooms.Conversation;
|
||||||
import com.nextcloud.talk.models.json.rooms.RoomsOverall;
|
import com.nextcloud.talk.models.json.rooms.RoomsOverall;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
import com.nextcloud.talk.utils.DoNotDisturbUtils;
|
import com.nextcloud.talk.utils.DoNotDisturbUtils;
|
||||||
import com.nextcloud.talk.utils.MagicFlipView;
|
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
||||||
import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder;
|
import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder;
|
||||||
import io.reactivex.Observer;
|
import io.reactivex.Observer;
|
||||||
@ -87,6 +85,7 @@ import org.greenrobot.eventbus.ThreadMode;
|
|||||||
import org.michaelevans.colorart.library.ColorArt;
|
import org.michaelevans.colorart.library.ColorArt;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -113,13 +112,13 @@ public class CallNotificationController extends BaseController {
|
|||||||
TextView conversationNameTextView;
|
TextView conversationNameTextView;
|
||||||
|
|
||||||
@BindView(R.id.avatarImageView)
|
@BindView(R.id.avatarImageView)
|
||||||
ImageView avatarImageView;
|
SimpleDraweeView avatarImageView;
|
||||||
|
|
||||||
@BindView(R.id.callAnswerVoiceOnlyView)
|
@BindView(R.id.callAnswerVoiceOnlyView)
|
||||||
MagicFlipView callAnswerVoiceOnlyView;
|
SimpleDraweeView callAnswerVoiceOnlyView;
|
||||||
|
|
||||||
@BindView(R.id.callAnswerCameraView)
|
@BindView(R.id.callAnswerCameraView)
|
||||||
MagicFlipView callAnswerCameraView;
|
SimpleDraweeView callAnswerCameraView;
|
||||||
|
|
||||||
@BindView(R.id.backgroundImageView)
|
@BindView(R.id.backgroundImageView)
|
||||||
ImageView backgroundImageView;
|
ImageView backgroundImageView;
|
||||||
@ -148,7 +147,6 @@ public class CallNotificationController extends BaseController {
|
|||||||
this.userBeingCalled = args.getParcelable(BundleKeys.KEY_USER_ENTITY);
|
this.userBeingCalled = args.getParcelable(BundleKeys.KEY_USER_ENTITY);
|
||||||
|
|
||||||
this.originalBundle = args;
|
this.originalBundle = args;
|
||||||
|
|
||||||
credentials = ApiUtils.getCredentials(userBeingCalled.getUsername(), userBeingCalled.getToken());
|
credentials = ApiUtils.getCredentials(userBeingCalled.getUsername(), userBeingCalled.getToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,7 +382,6 @@ public class CallNotificationController extends BaseController {
|
|||||||
|
|
||||||
layoutParams.width = dimen;
|
layoutParams.width = dimen;
|
||||||
layoutParams.height = dimen;
|
layoutParams.height = dimen;
|
||||||
|
|
||||||
avatarImageView.setLayoutParams(layoutParams);
|
avatarImageView.setLayoutParams(layoutParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,92 +399,59 @@ public class CallNotificationController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void loadAvatar() {
|
private void loadAvatar() {
|
||||||
int avatarSize = Math.round(NextcloudTalkApplication
|
|
||||||
.getSharedApplication().getResources().getDimension(R.dimen.avatar_fetching_size_very_big));
|
|
||||||
|
|
||||||
switch (currentConversation.getType()) {
|
switch (currentConversation.getType()) {
|
||||||
case ROOM_TYPE_ONE_TO_ONE_CALL:
|
case ROOM_TYPE_ONE_TO_ONE_CALL:
|
||||||
avatarImageView.setVisibility(View.VISIBLE);
|
avatarImageView.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(userBeingCalled.getBaseUrl(),
|
ImageRequest imageRequest =
|
||||||
currentConversation.getName(), R.dimen.avatar_size_very_big), new LazyHeaders.Builder()
|
DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(userBeingCalled.getBaseUrl(),
|
||||||
.setHeader("Accept", "image/*")
|
currentConversation.getName(), R.dimen.avatar_size_very_big), null);
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
|
||||||
.build());
|
|
||||||
|
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
ImagePipeline imagePipeline = Fresco.getImagePipeline();
|
||||||
.asBitmap()
|
DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null);
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.into(new SimpleTarget<Bitmap>() {
|
|
||||||
@Override
|
|
||||||
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
|
|
||||||
if (getActivity() != null && avatarImageView != null) {
|
|
||||||
avatarImageView.setImageBitmap(TransformationUtils.circleCrop(GlideApp.get
|
|
||||||
(getActivity()).getBitmapPool(), resource, avatarSize, avatarSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getResources() != null && incomingTextRelativeLayout != null) {
|
dataSource.subscribe(new BaseBitmapDataSubscriber() {
|
||||||
incomingTextRelativeLayout.setBackground(getResources().getDrawable(R.drawable
|
@Override
|
||||||
.incoming_gradient));
|
protected void onNewResultImpl(@Nullable Bitmap bitmap) {
|
||||||
}
|
avatarImageView.getHierarchy().setImage(new BitmapDrawable(bitmap), 100,
|
||||||
|
true);
|
||||||
|
|
||||||
if (AvatarStatusCodeHolder.getInstance().getStatusCode() == 200 &&
|
if (getResources() != null) {
|
||||||
userBeingCalled.hasSpreedCapabilityWithName("no-ping")) {
|
incomingTextRelativeLayout.setBackground(getResources().getDrawable(R.drawable
|
||||||
final Allocation input = Allocation.createFromBitmap(renderScript, resource);
|
.incoming_gradient));
|
||||||
final Allocation output = Allocation.createTyped(renderScript, input.getType());
|
}
|
||||||
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(renderScript, Element
|
|
||||||
.U8_4(renderScript));
|
|
||||||
script.setRadius(15f);
|
|
||||||
script.setInput(input);
|
|
||||||
script.forEach(output);
|
|
||||||
output.copyTo(resource);
|
|
||||||
|
|
||||||
if (backgroundImageView != null) {
|
if (AvatarStatusCodeHolder.getInstance().getStatusCode() == 200 &&
|
||||||
backgroundImageView.setImageDrawable(new BitmapDrawable(resource));
|
userBeingCalled.hasSpreedCapabilityWithName("no-ping")) {
|
||||||
}
|
if (getActivity() != null) {
|
||||||
} else if (AvatarStatusCodeHolder.getInstance().getStatusCode() == 201) {
|
Bitmap backgroundBitmap = bitmap.copy(bitmap.getConfig(), true);
|
||||||
ColorArt colorArt = new ColorArt(resource);
|
new BlurPostProcessor(5, getActivity()).process(backgroundBitmap);
|
||||||
int color = colorArt.getBackgroundColor();
|
backgroundImageView.setImageDrawable(new BitmapDrawable(backgroundBitmap));
|
||||||
|
|
||||||
float[] hsv = new float[3];
|
|
||||||
Color.colorToHSV(color, hsv);
|
|
||||||
hsv[2] *= 0.75f;
|
|
||||||
color = Color.HSVToColor(hsv);
|
|
||||||
|
|
||||||
if (backgroundImageView != null) {
|
|
||||||
backgroundImageView.setImageDrawable(new ColorDrawable(color));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
} else if (AvatarStatusCodeHolder.getInstance().getStatusCode() == 201) {
|
||||||
|
ColorArt colorArt = new ColorArt(bitmap);
|
||||||
|
int color = colorArt.getBackgroundColor();
|
||||||
|
|
||||||
|
float[] hsv = new float[3];
|
||||||
|
Color.colorToHSV(color, hsv);
|
||||||
|
hsv[2] *= 0.75f;
|
||||||
|
color = Color.HSVToColor(hsv);
|
||||||
|
|
||||||
|
backgroundImageView.setImageDrawable(new ColorDrawable(color));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, UiThreadImmediateExecutorService.getInstance());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case ROOM_GROUP_CALL:
|
case ROOM_GROUP_CALL:
|
||||||
if (avatarImageView != null) {
|
avatarImageView.setActualImageResource(R.drawable.ic_people_group_white_24px);
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(R.drawable.ic_people_group_white_24px)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(avatarImageView);
|
|
||||||
}
|
|
||||||
case ROOM_PUBLIC_CALL:
|
case ROOM_PUBLIC_CALL:
|
||||||
if (avatarImageView != null) {
|
avatarImageView.setActualImageResource(R.drawable.ic_link_white_24px);
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
|
||||||
.asBitmap()
|
|
||||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
||||||
.load(R.drawable.ic_link_white_24px)
|
|
||||||
.centerInside()
|
|
||||||
.override(avatarSize, avatarSize)
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(avatarImageView);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@ import butterknife.BindView;
|
|||||||
import butterknife.OnClick;
|
import butterknife.OnClick;
|
||||||
import com.bluelinelabs.conductor.RouterTransaction;
|
import com.bluelinelabs.conductor.RouterTransaction;
|
||||||
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
||||||
|
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
|
||||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.facebook.drawee.interfaces.DraweeController;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.facebook.drawee.view.SimpleDraweeView;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
@ -58,6 +59,7 @@ import com.nextcloud.talk.adapters.messages.MagicSystemMessageViewHolder;
|
|||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.callbacks.MentionAutocompleteCallback;
|
import com.nextcloud.talk.callbacks.MentionAutocompleteCallback;
|
||||||
|
import com.nextcloud.talk.components.filebrowser.controllers.BrowserController;
|
||||||
import com.nextcloud.talk.controllers.base.BaseController;
|
import com.nextcloud.talk.controllers.base.BaseController;
|
||||||
import com.nextcloud.talk.events.UserMentionClickEvent;
|
import com.nextcloud.talk.events.UserMentionClickEvent;
|
||||||
import com.nextcloud.talk.models.RetrofitBucket;
|
import com.nextcloud.talk.models.RetrofitBucket;
|
||||||
@ -318,7 +320,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
@Override
|
@Override
|
||||||
public void loadImage(SimpleDraweeView imageView, String url) {
|
public void loadImage(SimpleDraweeView imageView, String url) {
|
||||||
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
.setImageRequest(DisplayUtils.getImageRequestForUrl(url))
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(url, conversationUser))
|
||||||
.setControllerListener(DisplayUtils.getImageControllerListener(imageView))
|
.setControllerListener(DisplayUtils.getImageControllerListener(imageView))
|
||||||
.setOldController(imageView.getController())
|
.setOldController(imageView.getController())
|
||||||
.setAutoPlayAnimations(true)
|
.setAutoPlayAnimations(true)
|
||||||
@ -415,6 +417,13 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
messageInputView.setAttachmentsListener(new MessageInput.AttachmentsListener() {
|
||||||
|
@Override
|
||||||
|
public void onAddAttachments() {
|
||||||
|
showBrowserScreen(BrowserController.BrowserType.DAV_BROWSER);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
messageInputView.getButton().setOnClickListener(v -> submitMessage());
|
messageInputView.getButton().setOnClickListener(v -> submitMessage());
|
||||||
messageInputView.getButton().setContentDescription(getResources()
|
messageInputView.getButton().setContentDescription(getResources()
|
||||||
.getString(R.string.nc_description_send_message_button));
|
.getString(R.string.nc_description_send_message_button));
|
||||||
@ -479,6 +488,16 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void showBrowserScreen(BrowserController.BrowserType browserType) {
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putParcelable(BundleKeys.KEY_BROWSER_TYPE, Parcels.wrap(browserType));
|
||||||
|
bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, Parcels.wrap(conversationUser));
|
||||||
|
bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken);
|
||||||
|
getRouter().pushController((RouterTransaction.with(new BrowserController(bundle))
|
||||||
|
.pushChangeHandler(new VerticalChangeHandler())
|
||||||
|
.popChangeHandler(new VerticalChangeHandler())));
|
||||||
|
}
|
||||||
|
|
||||||
private void showConversationInfoScreen() {
|
private void showConversationInfoScreen() {
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, conversationUser);
|
bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, conversationUser);
|
||||||
@ -486,7 +505,6 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
getRouter().pushController((RouterTransaction.with(new ConversationInfoController(bundle))
|
getRouter().pushController((RouterTransaction.with(new ConversationInfoController(bundle))
|
||||||
.pushChangeHandler(new HorizontalChangeHandler())
|
.pushChangeHandler(new HorizontalChangeHandler())
|
||||||
.popChangeHandler(new HorizontalChangeHandler())));
|
.popChangeHandler(new HorizontalChangeHandler())));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupMentionAutocomplete() {
|
private void setupMentionAutocomplete() {
|
||||||
@ -532,7 +550,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
@Override
|
@Override
|
||||||
public void onEmojiPopupDismiss() {
|
public void onEmojiPopupDismiss() {
|
||||||
if (smileyButton != null) {
|
if (smileyButton != null) {
|
||||||
smileyButton.clearColorFilter();
|
smileyButton.setColorFilter(getResources().getColor(R.color.emoji_icons),
|
||||||
|
PorterDuff.Mode.SRC_IN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).setOnEmojiClickListener(new OnEmojiClickListener() {
|
}).setOnEmojiClickListener(new OnEmojiClickListener() {
|
||||||
@ -950,8 +969,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
|
|
||||||
ChatMessage chatMessage = chatMessageList.get(i);
|
ChatMessage chatMessage = chatMessageList.get(i);
|
||||||
chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed);
|
chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed);
|
||||||
chatMessage.setBaseUrl(conversationUser.getBaseUrl());
|
chatMessage.setActiveUser(conversationUser);
|
||||||
chatMessage.setActiveUserId(conversationUser.getUserId());
|
|
||||||
if (globalLastKnownPastMessageId == -1 || chatMessageList.get(i).getJsonMessageId() <
|
if (globalLastKnownPastMessageId == -1 || chatMessageList.get(i).getJsonMessageId() <
|
||||||
globalLastKnownPastMessageId) {
|
globalLastKnownPastMessageId) {
|
||||||
globalLastKnownPastMessageId = chatMessageList.get(i).getJsonMessageId();
|
globalLastKnownPastMessageId = chatMessageList.get(i).getJsonMessageId();
|
||||||
@ -975,8 +994,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
for (int i = 0; i < chatMessageList.size(); i++) {
|
for (int i = 0; i < chatMessageList.size(); i++) {
|
||||||
chatMessage = chatMessageList.get(i);
|
chatMessage = chatMessageList.get(i);
|
||||||
|
|
||||||
chatMessage.setBaseUrl(conversationUser.getBaseUrl());
|
chatMessage.setActiveUser(conversationUser);
|
||||||
chatMessage.setActiveUserId(conversationUser.getUserId());
|
|
||||||
chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed);
|
chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed);
|
||||||
|
|
||||||
// if credentials are empty, we're acting as a guest
|
// if credentials are empty, we're acting as a guest
|
||||||
|
@ -80,7 +80,6 @@ import eu.davidea.flexibleadapter.SelectableAdapter;
|
|||||||
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager;
|
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.flipview.FlipView;
|
|
||||||
import io.reactivex.Observer;
|
import io.reactivex.Observer;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.disposables.Disposable;
|
import io.reactivex.disposables.Disposable;
|
||||||
@ -190,7 +189,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
if (isNewConversationView) {
|
if (isNewConversationView) {
|
||||||
toggleNewCallHeaderVisibility(!isPublicCall);
|
toggleNewCallHeaderVisibility(!isPublicCall);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -198,9 +196,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
super.onViewBound(view);
|
super.onViewBound(view);
|
||||||
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
|
|
||||||
FlipView.resetLayoutAnimationDelay(true, 1000L);
|
|
||||||
FlipView.stopLayoutAnimation();
|
|
||||||
|
|
||||||
currentUser = userUtils.getCurrentUser();
|
currentUser = userUtils.getCurrentUser();
|
||||||
|
|
||||||
if (currentUser != null) {
|
if (currentUser != null) {
|
||||||
@ -208,7 +203,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (adapter == null) {
|
if (adapter == null) {
|
||||||
adapter = new FlexibleAdapter<>(contactItems, getActivity(), false);
|
adapter = new FlexibleAdapter<>(contactItems, getActivity(), true);
|
||||||
|
|
||||||
if (currentUser != null) {
|
if (currentUser != null) {
|
||||||
fetchData(true);
|
fetchData(true);
|
||||||
@ -598,6 +593,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
adapter.clearSelection();
|
||||||
if (!shouldFilterManually) {
|
if (!shouldFilterManually) {
|
||||||
adapter.updateDataSet(newUserItemList, false);
|
adapter.updateDataSet(newUserItemList, false);
|
||||||
} else {
|
} else {
|
||||||
@ -660,7 +656,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
|
|
||||||
private void prepareViews() {
|
private void prepareViews() {
|
||||||
layoutManager = new SmoothScrollLinearLayoutManager(getActivity());
|
layoutManager = new SmoothScrollLinearLayoutManager(getActivity());
|
||||||
recyclerView.setLayoutManager(new SmoothScrollLinearLayoutManager(getActivity()));
|
recyclerView.setLayoutManager(layoutManager);
|
||||||
recyclerView.setHasFixedSize(true);
|
recyclerView.setHasFixedSize(true);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
@ -911,7 +907,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
((UserItem) adapter.getItem(position)).flipItemSelection();
|
|
||||||
adapter.toggleSelection(position);
|
adapter.toggleSelection(position);
|
||||||
|
|
||||||
if (currentUser.hasSpreedCapabilityWithName("last-room-activity")
|
if (currentUser.hasSpreedCapabilityWithName("last-room-activity")
|
||||||
@ -921,13 +916,14 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
List<Integer> selectedPositions = adapter.getSelectedPositions();
|
List<Integer> selectedPositions = adapter.getSelectedPositions();
|
||||||
for (int i = 0; i < selectedPositions.size(); i++) {
|
for (int i = 0; i < selectedPositions.size(); i++) {
|
||||||
if (!selectedPositions.get(i).equals(position) && "groups".equals(((UserItem) adapter.getItem(selectedPositions.get(i))).getModel().getSource())) {
|
if (!selectedPositions.get(i).equals(position) && "groups".equals(((UserItem) adapter.getItem(selectedPositions.get(i))).getModel().getSource())) {
|
||||||
((UserItem) adapter.getItem(selectedPositions.get(i))).flipItemSelection();
|
|
||||||
adapter.toggleSelection(selectedPositions.get(i));
|
adapter.toggleSelection(selectedPositions.get(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
|
||||||
checkAndHandleDoneMenuItem();
|
checkAndHandleDoneMenuItem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -955,7 +951,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
if (adapter.getItem(selectedPosition) instanceof UserItem) {
|
if (adapter.getItem(selectedPosition) instanceof UserItem) {
|
||||||
UserItem userItem = (UserItem) adapter.getItem(selectedPosition);
|
UserItem userItem = (UserItem) adapter.getItem(selectedPosition);
|
||||||
if ("groups".equals(userItem.getModel().getSource())) {
|
if ("groups".equals(userItem.getModel().getSource())) {
|
||||||
((UserItem) adapter.getItem(selectedPosition)).flipItemSelection();
|
|
||||||
adapter.toggleSelection(selectedPosition);
|
adapter.toggleSelection(selectedPosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -473,7 +473,7 @@ public class ConversationInfoController extends BaseController {
|
|||||||
.setOldController(conversationAvatarImageView.getController())
|
.setOldController(conversationAvatarImageView.getController())
|
||||||
.setAutoPlayAnimations(true)
|
.setAutoPlayAnimations(true)
|
||||||
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(conversationUser.getBaseUrl(),
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(conversationUser.getBaseUrl(),
|
||||||
conversation.getName(), R.dimen.avatar_size_big)))
|
conversation.getName(), R.dimen.avatar_size_big), null))
|
||||||
.build();
|
.build();
|
||||||
conversationAvatarImageView.setController(draweeController);
|
conversationAvatarImageView.setController(draweeController);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.widget.SearchView;
|
import androidx.appcompat.widget.SearchView;
|
||||||
import androidx.core.view.MenuItemCompat;
|
import androidx.core.view.MenuItemCompat;
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
import androidx.work.Data;
|
import androidx.work.Data;
|
||||||
@ -51,12 +50,15 @@ import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
|||||||
import com.bluelinelabs.conductor.changehandler.TransitionChangeHandlerCompat;
|
import com.bluelinelabs.conductor.changehandler.TransitionChangeHandlerCompat;
|
||||||
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
|
||||||
import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler;
|
import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.common.executors.UiThreadImmediateExecutorService;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.common.references.CloseableReference;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
import com.facebook.datasource.DataSource;
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.request.target.SimpleTarget;
|
import com.facebook.imagepipeline.core.ImagePipeline;
|
||||||
import com.bumptech.glide.request.transition.Transition;
|
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
|
||||||
|
import com.facebook.imagepipeline.image.CloseableImage;
|
||||||
|
import com.facebook.imagepipeline.postprocessors.RoundPostprocessor;
|
||||||
|
import com.facebook.imagepipeline.request.ImageRequest;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import com.kennyc.bottomsheet.BottomSheet;
|
import com.kennyc.bottomsheet.BottomSheet;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
@ -82,7 +84,6 @@ import com.nextcloud.talk.utils.KeyboardUtils;
|
|||||||
import com.nextcloud.talk.utils.animations.SharedElementTransition;
|
import com.nextcloud.talk.utils.animations.SharedElementTransition;
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
||||||
import com.yarolegovich.lovelydialog.LovelySaveStateHandler;
|
import com.yarolegovich.lovelydialog.LovelySaveStateHandler;
|
||||||
import com.yarolegovich.lovelydialog.LovelyStandardDialog;
|
import com.yarolegovich.lovelydialog.LovelyStandardDialog;
|
||||||
@ -111,10 +112,8 @@ public class ConversationsListController extends BaseController implements Searc
|
|||||||
.OnScrollStateChangeListener, ConversationMenuInterface {
|
.OnScrollStateChangeListener, ConversationMenuInterface {
|
||||||
|
|
||||||
public static final String TAG = "ConversationsListController";
|
public static final String TAG = "ConversationsListController";
|
||||||
|
|
||||||
private static final String KEY_SEARCH_QUERY = "ContactsController.searchQuery";
|
|
||||||
public static final int ID_DELETE_CONVERSATION_DIALOG = 0;
|
public static final int ID_DELETE_CONVERSATION_DIALOG = 0;
|
||||||
|
private static final String KEY_SEARCH_QUERY = "ContactsController.searchQuery";
|
||||||
@Inject
|
@Inject
|
||||||
UserUtils userUtils;
|
UserUtils userUtils;
|
||||||
|
|
||||||
@ -207,27 +206,25 @@ public class ConversationsListController extends BaseController implements Searc
|
|||||||
private void loadUserAvatar(MenuItem menuItem) {
|
private void loadUserAvatar(MenuItem menuItem) {
|
||||||
if (getActivity() != null) {
|
if (getActivity() != null) {
|
||||||
int avatarSize = (int) DisplayUtils.convertDpToPixel(menuItem.getIcon().getIntrinsicHeight(), getActivity());
|
int avatarSize = (int) DisplayUtils.convertDpToPixel(menuItem.getIcon().getIntrinsicHeight(), getActivity());
|
||||||
|
ImageRequest imageRequest = DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithNameAndPixels(currentUser.getBaseUrl(),
|
||||||
|
currentUser.getUserId(), avatarSize), null);
|
||||||
|
|
||||||
if (currentUser != null) {
|
ImagePipeline imagePipeline = Fresco.getImagePipeline();
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithNameAndPixels(currentUser.getBaseUrl(),
|
DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null);
|
||||||
currentUser.getUserId(), avatarSize), new LazyHeaders.Builder()
|
dataSource.subscribe(new BaseBitmapDataSubscriber() {
|
||||||
.setHeader("Accept", "image/*")
|
@Override
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
protected void onNewResultImpl(Bitmap bitmap) {
|
||||||
.build());
|
if (bitmap != null) {
|
||||||
|
new RoundPostprocessor(true).process(bitmap);
|
||||||
|
menuItem.setIcon(new BitmapDrawable(bitmap));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GlideApp.with(getActivity())
|
@Override
|
||||||
.asBitmap()
|
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
|
||||||
.centerInside()
|
menuItem.setIcon(R.drawable.ic_settings_white_24dp);
|
||||||
.override(avatarSize, avatarSize)
|
}
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
}, UiThreadImmediateExecutorService.getInstance());
|
||||||
.load(glideUrl)
|
|
||||||
.into(new SimpleTarget<Bitmap>() {
|
|
||||||
@Override
|
|
||||||
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
|
|
||||||
menuItem.setIcon(new BitmapDrawable(resource));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -434,11 +431,6 @@ public class ConversationsListController extends BaseController implements Searc
|
|||||||
|
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
recyclerView.addItemDecoration(new DividerItemDecoration(
|
|
||||||
recyclerView.getContext(),
|
|
||||||
layoutManager.getOrientation()
|
|
||||||
));
|
|
||||||
|
|
||||||
swipeRefreshLayout.setOnRefreshListener(() -> fetchData(false));
|
swipeRefreshLayout.setOnRefreshListener(() -> fetchData(false));
|
||||||
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary);
|
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary);
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ public class LockedController extends BaseController {
|
|||||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
|
||||||
if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS ) {
|
if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
if (SecurityUtils.checkIfWeAreAuthenticated(appPreferences.getScreenLockTimeout())) {
|
if (SecurityUtils.checkIfWeAreAuthenticated(appPreferences.getScreenLockTimeout())) {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
package com.nextcloud.talk.controllers;
|
package com.nextcloud.talk.controllers;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
import android.media.RingtoneManager;
|
import android.media.RingtoneManager;
|
||||||
@ -70,10 +71,14 @@ public class RingtoneSelectionController extends BaseController implements Flexi
|
|||||||
@Inject
|
@Inject
|
||||||
AppPreferences appPreferences;
|
AppPreferences appPreferences;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
Context context;
|
||||||
|
|
||||||
private FlexibleAdapter adapter;
|
private FlexibleAdapter adapter;
|
||||||
|
private RecyclerView.AdapterDataObserver adapterDataObserver;
|
||||||
private List<AbstractFlexibleItem> abstractFlexibleItemList = new ArrayList<>();
|
private List<AbstractFlexibleItem> abstractFlexibleItemList = new ArrayList<>();
|
||||||
|
|
||||||
private boolean callNotificationSounds = false;
|
private boolean callNotificationSounds;
|
||||||
private MediaPlayer mediaPlayer;
|
private MediaPlayer mediaPlayer;
|
||||||
private Handler cancelMediaPlayerHandler;
|
private Handler cancelMediaPlayerHandler;
|
||||||
|
|
||||||
@ -100,21 +105,20 @@ public class RingtoneSelectionController extends BaseController implements Flexi
|
|||||||
.setMode(SelectableAdapter.Mode.SINGLE);
|
.setMode(SelectableAdapter.Mode.SINGLE);
|
||||||
|
|
||||||
adapter.addListener(this);
|
adapter.addListener(this);
|
||||||
fetchNotificationSounds();
|
|
||||||
|
|
||||||
cancelMediaPlayerHandler = new Handler();
|
cancelMediaPlayerHandler = new Handler();
|
||||||
}
|
}
|
||||||
|
|
||||||
adapter.addListener(this);
|
adapter.addListener(this);
|
||||||
prepareViews();
|
prepareViews();
|
||||||
|
fetchNotificationSounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case android.R.id.home:
|
case android.R.id.home:
|
||||||
getRouter().popCurrentController();
|
return getRouter().popCurrentController();
|
||||||
return true;
|
|
||||||
default:
|
default:
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
@ -126,38 +130,72 @@ public class RingtoneSelectionController extends BaseController implements Flexi
|
|||||||
recyclerView.setHasFixedSize(true);
|
recyclerView.setHasFixedSize(true);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
adapterDataObserver = new RecyclerView.AdapterDataObserver() {
|
||||||
|
@Override
|
||||||
|
public void onChanged() {
|
||||||
|
super.onChanged();
|
||||||
|
findSelectedSound();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
adapter.registerAdapterDataObserver(adapterDataObserver);
|
||||||
swipeRefreshLayout.setEnabled(false);
|
swipeRefreshLayout.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("LongLogTag")
|
@SuppressLint("LongLogTag")
|
||||||
private void fetchNotificationSounds() {
|
private void findSelectedSound() {
|
||||||
abstractFlexibleItemList = new ArrayList<>();
|
|
||||||
abstractFlexibleItemList.add(new NotificationSoundItem(getResources().getString(R.string.nc_settings_no_ringtone),
|
|
||||||
null));
|
|
||||||
|
|
||||||
String ringtoneString;
|
|
||||||
|
|
||||||
if (callNotificationSounds) {
|
|
||||||
ringtoneString = "android.resource://" + getApplicationContext().getPackageName() +
|
|
||||||
"/raw/librem_by_feandesign_call";
|
|
||||||
} else {
|
|
||||||
ringtoneString = "android.resource://" + getApplicationContext().getPackageName() +
|
|
||||||
"/raw/librem_by_feandesign_message";
|
|
||||||
}
|
|
||||||
|
|
||||||
abstractFlexibleItemList.add(new NotificationSoundItem(getResources()
|
|
||||||
.getString(R.string.nc_settings_default_ringtone), ringtoneString));
|
|
||||||
|
|
||||||
boolean foundDefault = false;
|
boolean foundDefault = false;
|
||||||
|
|
||||||
String preferencesString = null;
|
String preferencesString = null;
|
||||||
if ((callNotificationSounds && TextUtils.isEmpty((preferencesString = appPreferences.getCallRingtoneUri())))
|
if ((callNotificationSounds && TextUtils.isEmpty((preferencesString = appPreferences.getCallRingtoneUri())))
|
||||||
|| (!callNotificationSounds && TextUtils.isEmpty((preferencesString = appPreferences
|
|| (!callNotificationSounds && TextUtils.isEmpty((preferencesString = appPreferences
|
||||||
.getMessageRingtoneUri())))) {
|
.getMessageRingtoneUri())))) {
|
||||||
((NotificationSoundItem) abstractFlexibleItemList.get(1)).setSelected(true);
|
adapter.toggleSelection(1);
|
||||||
foundDefault = true;
|
foundDefault = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!TextUtils.isEmpty(preferencesString) && !foundDefault) {
|
||||||
|
try {
|
||||||
|
RingtoneSettings ringtoneSettings = LoganSquare.parse(preferencesString, RingtoneSettings.class);
|
||||||
|
if (ringtoneSettings.getRingtoneUri() == null) {
|
||||||
|
adapter.toggleSelection(0);
|
||||||
|
} else if (ringtoneSettings.getRingtoneUri().toString().equals(getRingtoneString())) {
|
||||||
|
adapter.toggleSelection(1);
|
||||||
|
} else {
|
||||||
|
NotificationSoundItem notificationSoundItem;
|
||||||
|
for (int i = 2; i < adapter.getItemCount(); i++) {
|
||||||
|
notificationSoundItem = (NotificationSoundItem) adapter.getItem(i);
|
||||||
|
if (notificationSoundItem.getNotificationSoundUri().equals(ringtoneSettings.getRingtoneUri().toString())) {
|
||||||
|
adapter.toggleSelection(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Failed to parse ringtone settings");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter.unregisterAdapterDataObserver(adapterDataObserver);
|
||||||
|
adapterDataObserver = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getRingtoneString() {
|
||||||
|
if (callNotificationSounds) {
|
||||||
|
return ("android.resource://" + context.getPackageName() +
|
||||||
|
"/raw/librem_by_feandesign_call");
|
||||||
|
} else {
|
||||||
|
return ("android.resource://" + context.getPackageName() + "/raw" +
|
||||||
|
"/librem_by_feandesign_message");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchNotificationSounds() {
|
||||||
|
abstractFlexibleItemList.add(new NotificationSoundItem(getResources().getString(R.string.nc_settings_no_ringtone), null));
|
||||||
|
abstractFlexibleItemList.add(new NotificationSoundItem(getResources()
|
||||||
|
.getString(R.string.nc_settings_default_ringtone), getRingtoneString()));
|
||||||
|
|
||||||
|
|
||||||
if (getActivity() != null) {
|
if (getActivity() != null) {
|
||||||
RingtoneManager manager = new RingtoneManager(getActivity());
|
RingtoneManager manager = new RingtoneManager(getActivity());
|
||||||
@ -181,29 +219,10 @@ public class RingtoneSelectionController extends BaseController implements Flexi
|
|||||||
notificationSoundItem = new NotificationSoundItem(notificationTitle, completeNotificationUri);
|
notificationSoundItem = new NotificationSoundItem(notificationTitle, completeNotificationUri);
|
||||||
|
|
||||||
abstractFlexibleItemList.add(notificationSoundItem);
|
abstractFlexibleItemList.add(notificationSoundItem);
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(preferencesString) && !foundDefault) {
|
|
||||||
try {
|
|
||||||
RingtoneSettings ringtoneSettings = LoganSquare.parse(preferencesString, RingtoneSettings.class);
|
|
||||||
if (ringtoneSettings.getRingtoneUri() == null) {
|
|
||||||
((NotificationSoundItem) abstractFlexibleItemList.get(0)).setSelected(true);
|
|
||||||
foundDefault = true;
|
|
||||||
} else if (completeNotificationUri.equals(ringtoneSettings.getRingtoneUri().toString())) {
|
|
||||||
notificationSoundItem.setSelected(true);
|
|
||||||
foundDefault = true;
|
|
||||||
} else if (ringtoneSettings.getRingtoneUri().toString().equals(ringtoneString)) {
|
|
||||||
((NotificationSoundItem) abstractFlexibleItemList.get(1)).setSelected(true);
|
|
||||||
foundDefault = true;
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e(TAG, "Failed to parse ringtone settings");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
adapter.updateDataSet(abstractFlexibleItemList, true);
|
adapter.updateDataSet(abstractFlexibleItemList, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -242,14 +261,16 @@ public class RingtoneSelectionController extends BaseController implements Flexi
|
|||||||
if (callNotificationSounds) {
|
if (callNotificationSounds) {
|
||||||
try {
|
try {
|
||||||
appPreferences.setCallRingtoneUri(LoganSquare.serialize(ringtoneSettings));
|
appPreferences.setCallRingtoneUri(LoganSquare.serialize(ringtoneSettings));
|
||||||
toggleSelection(position);
|
adapter.toggleSelection(position);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Failed to store selected ringtone for calls");
|
Log.e(TAG, "Failed to store selected ringtone for calls");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
appPreferences.setMessageRingtoneUri(LoganSquare.serialize(ringtoneSettings));
|
appPreferences.setMessageRingtoneUri(LoganSquare.serialize(ringtoneSettings));
|
||||||
toggleSelection(position);
|
adapter.toggleSelection(position);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Failed to store selected ringtone for calls");
|
Log.e(TAG, "Failed to store selected ringtone for calls");
|
||||||
}
|
}
|
||||||
@ -259,19 +280,6 @@ public class RingtoneSelectionController extends BaseController implements Flexi
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toggleSelection(int position) {
|
|
||||||
adapter.toggleSelection(position);
|
|
||||||
((NotificationSoundItem) adapter.getItem(position)).flipItemSelection();
|
|
||||||
|
|
||||||
NotificationSoundItem notificationSoundItem;
|
|
||||||
for (int i = 0; i < adapter.getItemCount(); i++) {
|
|
||||||
if (i != position) {
|
|
||||||
notificationSoundItem = (NotificationSoundItem) adapter.getItem(i);
|
|
||||||
notificationSoundItem.flipToFront();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void endMediaPlayer() {
|
private void endMediaPlayer() {
|
||||||
if (cancelMediaPlayerHandler != null) {
|
if (cancelMediaPlayerHandler != null) {
|
||||||
cancelMediaPlayerHandler.removeCallbacksAndMessages(null);
|
cancelMediaPlayerHandler.removeCallbacksAndMessages(null);
|
||||||
|
@ -36,7 +36,6 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.Checkable;
|
import android.widget.Checkable;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@ -49,10 +48,9 @@ import com.bluelinelabs.conductor.RouterTransaction;
|
|||||||
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
||||||
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
|
||||||
import com.bluelinelabs.logansquare.LoganSquare;
|
import com.bluelinelabs.logansquare.LoganSquare;
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.bumptech.glide.load.model.LazyHeaders;
|
import com.facebook.drawee.interfaces.DraweeController;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
|
import com.facebook.drawee.view.SimpleDraweeView;
|
||||||
import com.bumptech.glide.request.RequestOptions;
|
|
||||||
import com.nextcloud.talk.BuildConfig;
|
import com.nextcloud.talk.BuildConfig;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
@ -67,7 +65,6 @@ import com.nextcloud.talk.utils.DoNotDisturbUtils;
|
|||||||
import com.nextcloud.talk.utils.SecurityUtils;
|
import com.nextcloud.talk.utils.SecurityUtils;
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
||||||
import com.nextcloud.talk.utils.preferences.MagicUserInputModule;
|
import com.nextcloud.talk.utils.preferences.MagicUserInputModule;
|
||||||
import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder;
|
import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder;
|
||||||
@ -90,113 +87,78 @@ import java.util.*;
|
|||||||
public class SettingsController extends BaseController {
|
public class SettingsController extends BaseController {
|
||||||
|
|
||||||
public static final String TAG = "SettingsController";
|
public static final String TAG = "SettingsController";
|
||||||
|
private static final int ID_REMOVE_ACCOUNT_WARNING_DIALOG = 0;
|
||||||
@BindView(R.id.settings_screen)
|
@BindView(R.id.settings_screen)
|
||||||
MaterialPreferenceScreen settingsScreen;
|
MaterialPreferenceScreen settingsScreen;
|
||||||
|
|
||||||
@BindView(R.id.settings_proxy_choice)
|
@BindView(R.id.settings_proxy_choice)
|
||||||
MaterialChoicePreference proxyChoice;
|
MaterialChoicePreference proxyChoice;
|
||||||
|
|
||||||
@BindView(R.id.settings_proxy_port_edit)
|
@BindView(R.id.settings_proxy_port_edit)
|
||||||
MaterialEditTextPreference proxyPortEditText;
|
MaterialEditTextPreference proxyPortEditText;
|
||||||
|
|
||||||
@BindView(R.id.settings_licence)
|
@BindView(R.id.settings_licence)
|
||||||
MaterialStandardPreference licenceButton;
|
MaterialStandardPreference licenceButton;
|
||||||
|
|
||||||
@BindView(R.id.settings_privacy)
|
@BindView(R.id.settings_privacy)
|
||||||
MaterialStandardPreference privacyButton;
|
MaterialStandardPreference privacyButton;
|
||||||
|
|
||||||
@BindView(R.id.settings_source_code)
|
@BindView(R.id.settings_source_code)
|
||||||
MaterialStandardPreference sourceCodeButton;
|
MaterialStandardPreference sourceCodeButton;
|
||||||
|
|
||||||
@BindView(R.id.settings_version)
|
@BindView(R.id.settings_version)
|
||||||
MaterialStandardPreference versionInfo;
|
MaterialStandardPreference versionInfo;
|
||||||
|
|
||||||
@BindView(R.id.avatar_image)
|
@BindView(R.id.avatar_image)
|
||||||
ImageView avatarImageView;
|
SimpleDraweeView avatarImageView;
|
||||||
|
|
||||||
@BindView(R.id.display_name_text)
|
@BindView(R.id.display_name_text)
|
||||||
TextView displayNameTextView;
|
TextView displayNameTextView;
|
||||||
|
|
||||||
@BindView(R.id.base_url_text)
|
@BindView(R.id.base_url_text)
|
||||||
TextView baseUrlTextView;
|
TextView baseUrlTextView;
|
||||||
|
|
||||||
@BindView(R.id.settings_call_sound)
|
@BindView(R.id.settings_call_sound)
|
||||||
MaterialStandardPreference settingsCallSound;
|
MaterialStandardPreference settingsCallSound;
|
||||||
|
|
||||||
@BindView(R.id.settings_message_sound)
|
@BindView(R.id.settings_message_sound)
|
||||||
MaterialStandardPreference settingsMessageSound;
|
MaterialStandardPreference settingsMessageSound;
|
||||||
|
|
||||||
@BindView(R.id.settings_remove_account)
|
@BindView(R.id.settings_remove_account)
|
||||||
MaterialStandardPreference removeAccountButton;
|
MaterialStandardPreference removeAccountButton;
|
||||||
|
|
||||||
@BindView(R.id.settings_switch)
|
@BindView(R.id.settings_switch)
|
||||||
MaterialStandardPreference switchAccountButton;
|
MaterialStandardPreference switchAccountButton;
|
||||||
|
|
||||||
@BindView(R.id.settings_reauthorize)
|
@BindView(R.id.settings_reauthorize)
|
||||||
MaterialStandardPreference reauthorizeButton;
|
MaterialStandardPreference reauthorizeButton;
|
||||||
|
|
||||||
@BindView(R.id.settings_add_account)
|
@BindView(R.id.settings_add_account)
|
||||||
MaterialStandardPreference addAccountButton;
|
MaterialStandardPreference addAccountButton;
|
||||||
|
|
||||||
@BindView(R.id.message_view)
|
@BindView(R.id.message_view)
|
||||||
MaterialPreferenceCategory messageView;
|
MaterialPreferenceCategory messageView;
|
||||||
|
|
||||||
@BindView(R.id.settings_client_cert)
|
@BindView(R.id.settings_client_cert)
|
||||||
MaterialStandardPreference certificateSetup;
|
MaterialStandardPreference certificateSetup;
|
||||||
|
|
||||||
@BindView(R.id.settings_always_vibrate)
|
@BindView(R.id.settings_always_vibrate)
|
||||||
MaterialSwitchPreference shouldVibrateSwitchPreference;
|
MaterialSwitchPreference shouldVibrateSwitchPreference;
|
||||||
|
|
||||||
@BindView(R.id.settings_incognito_keyboard)
|
@BindView(R.id.settings_incognito_keyboard)
|
||||||
MaterialSwitchPreference incognitoKeyboardSwitchPreference;
|
MaterialSwitchPreference incognitoKeyboardSwitchPreference;
|
||||||
|
|
||||||
@BindView(R.id.settings_screen_security)
|
@BindView(R.id.settings_screen_security)
|
||||||
MaterialSwitchPreference screenSecuritySwitchPreference;
|
MaterialSwitchPreference screenSecuritySwitchPreference;
|
||||||
|
|
||||||
@BindView(R.id.settings_link_previews)
|
@BindView(R.id.settings_link_previews)
|
||||||
MaterialSwitchPreference linkPreviewsSwitchPreference;
|
MaterialSwitchPreference linkPreviewsSwitchPreference;
|
||||||
|
|
||||||
@BindView(R.id.settings_screen_lock)
|
@BindView(R.id.settings_screen_lock)
|
||||||
MaterialSwitchPreference screenLockSwitchPreference;
|
MaterialSwitchPreference screenLockSwitchPreference;
|
||||||
|
|
||||||
@BindView(R.id.settings_screen_lock_timeout)
|
@BindView(R.id.settings_screen_lock_timeout)
|
||||||
MaterialChoicePreference screenLockTimeoutChoicePreference;
|
MaterialChoicePreference screenLockTimeoutChoicePreference;
|
||||||
|
|
||||||
@BindView(R.id.message_text)
|
@BindView(R.id.message_text)
|
||||||
TextView messageText;
|
TextView messageText;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
EventBus eventBus;
|
EventBus eventBus;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
AppPreferences appPreferences;
|
AppPreferences appPreferences;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
NcApi ncApi;
|
NcApi ncApi;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
UserUtils userUtils;
|
UserUtils userUtils;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
Context context;
|
Context context;
|
||||||
|
|
||||||
private LovelySaveStateHandler saveStateHandler;
|
private LovelySaveStateHandler saveStateHandler;
|
||||||
|
|
||||||
private UserEntity currentUser;
|
private UserEntity currentUser;
|
||||||
private String credentials;
|
private String credentials;
|
||||||
|
|
||||||
private OnPreferenceValueChangedListener<String> proxyTypeChangeListener;
|
private OnPreferenceValueChangedListener<String> proxyTypeChangeListener;
|
||||||
private OnPreferenceValueChangedListener<Boolean> proxyCredentialsChangeListener;
|
private OnPreferenceValueChangedListener<Boolean> proxyCredentialsChangeListener;
|
||||||
private OnPreferenceValueChangedListener<Boolean> screenSecurityChangeListener;
|
private OnPreferenceValueChangedListener<Boolean> screenSecurityChangeListener;
|
||||||
private OnPreferenceValueChangedListener<Boolean> screenLockChangeListener;
|
private OnPreferenceValueChangedListener<Boolean> screenLockChangeListener;
|
||||||
private OnPreferenceValueChangedListener<String> screenLockTimeoutChangeListener;
|
private OnPreferenceValueChangedListener<String> screenLockTimeoutChangeListener;
|
||||||
|
|
||||||
private Disposable profileQueryDisposable;
|
private Disposable profileQueryDisposable;
|
||||||
private Disposable dbQueryDisposable;
|
private Disposable dbQueryDisposable;
|
||||||
|
|
||||||
private static final int ID_REMOVE_ACCOUNT_WARNING_DIALOG = 0;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
|
protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
|
||||||
return inflater.inflate(R.layout.controller_settings, container, false);
|
return inflater.inflate(R.layout.controller_settings, container, false);
|
||||||
@ -636,17 +598,13 @@ public class SettingsController extends BaseController {
|
|||||||
avatarId = currentUser.getUsername();
|
avatarId = currentUser.getUsername();
|
||||||
}
|
}
|
||||||
|
|
||||||
GlideUrl glideUrl = new GlideUrl(ApiUtils.getUrlForAvatarWithName(currentUser.getBaseUrl(),
|
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
|
||||||
avatarId, R.dimen.avatar_size_big), new LazyHeaders.Builder()
|
.setOldController(avatarImageView.getController())
|
||||||
.setHeader("Accept", "image/*")
|
.setAutoPlayAnimations(true)
|
||||||
.setHeader("User-Agent", ApiUtils.getUserAgent())
|
.setImageRequest(DisplayUtils.getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(currentUser.getBaseUrl(),
|
||||||
.build());
|
avatarId, R.dimen.avatar_size_big), null))
|
||||||
|
.build();
|
||||||
GlideApp.with(NextcloudTalkApplication.getSharedApplication().getApplicationContext())
|
avatarImageView.setController(draweeController);
|
||||||
.load(glideUrl)
|
|
||||||
.centerInside()
|
|
||||||
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
|
|
||||||
.into(avatarImageView);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -30,7 +30,6 @@ import android.view.MenuItem;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
@ -227,11 +226,6 @@ public class SwitchAccountController extends BaseController {
|
|||||||
recyclerView.setHasFixedSize(true);
|
recyclerView.setHasFixedSize(true);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
recyclerView.addItemDecoration(new DividerItemDecoration(
|
|
||||||
recyclerView.getContext(),
|
|
||||||
layoutManager.getOrientation()
|
|
||||||
));
|
|
||||||
|
|
||||||
swipeRefreshLayout.setEnabled(false);
|
swipeRefreshLayout.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,20 +231,20 @@ public class CallMenuController extends BaseController implements FlexibleAdapte
|
|||||||
|
|
||||||
if (tag > 0) {
|
if (tag > 0) {
|
||||||
if (tag == 1 || tag == 9) {
|
if (tag == 1 || tag == 9) {
|
||||||
if (tag == 1) {
|
if (tag == 1) {
|
||||||
Data data;
|
Data data;
|
||||||
if ((data = getWorkerData()) != null) {
|
if ((data = getWorkerData()) != null) {
|
||||||
OneTimeWorkRequest leaveConversationWorker =
|
OneTimeWorkRequest leaveConversationWorker =
|
||||||
new OneTimeWorkRequest.Builder(LeaveConversationWorker.class).setInputData(data).build();
|
new OneTimeWorkRequest.Builder(LeaveConversationWorker.class).setInputData(data).build();
|
||||||
WorkManager.getInstance().enqueue(leaveConversationWorker);
|
WorkManager.getInstance().enqueue(leaveConversationWorker);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Bundle deleteConversationBundle;
|
|
||||||
if ((deleteConversationBundle = getDeleteConversationBundle()) != null) {
|
|
||||||
conversationMenuInterface.openLovelyDialogWithIdAndBundle(ConversationsListController.ID_DELETE_CONVERSATION_DIALOG, deleteConversationBundle);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
eventBus.post(new BottomSheetLockEvent(true, 0, false, true));
|
} else {
|
||||||
|
Bundle deleteConversationBundle;
|
||||||
|
if ((deleteConversationBundle = getDeleteConversationBundle()) != null) {
|
||||||
|
conversationMenuInterface.openLovelyDialogWithIdAndBundle(ConversationsListController.ID_DELETE_CONVERSATION_DIALOG, deleteConversationBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eventBus.post(new BottomSheetLockEvent(true, 0, false, true));
|
||||||
} else {
|
} else {
|
||||||
bundle.putInt(BundleKeys.KEY_OPERATION_CODE, tag);
|
bundle.putInt(BundleKeys.KEY_OPERATION_CODE, tag);
|
||||||
if (tag != 2 && tag != 4 && tag != 6 && tag != 7) {
|
if (tag != 2 && tag != 4 && tag != 6 && tag != 7) {
|
||||||
@ -291,11 +291,6 @@ public class CallMenuController extends BaseController implements FlexibleAdapte
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Parcel
|
|
||||||
public enum MenuType {
|
|
||||||
REGULAR, SHARE
|
|
||||||
}
|
|
||||||
|
|
||||||
private Data getWorkerData() {
|
private Data getWorkerData() {
|
||||||
if (!TextUtils.isEmpty(conversation.getToken())) {
|
if (!TextUtils.isEmpty(conversation.getToken())) {
|
||||||
Data.Builder data = new Data.Builder();
|
Data.Builder data = new Data.Builder();
|
||||||
@ -318,4 +313,9 @@ public class CallMenuController extends BaseController implements FlexibleAdapte
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
public enum MenuType {
|
||||||
|
REGULAR, SHARE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,9 +197,9 @@ public class RestModule {
|
|||||||
if (appPreferences.getProxyCredentials() &&
|
if (appPreferences.getProxyCredentials() &&
|
||||||
!TextUtils.isEmpty(appPreferences.getProxyUsername()) &&
|
!TextUtils.isEmpty(appPreferences.getProxyUsername()) &&
|
||||||
!TextUtils.isEmpty(appPreferences.getProxyPassword())) {
|
!TextUtils.isEmpty(appPreferences.getProxyPassword())) {
|
||||||
httpClient.proxyAuthenticator(new ProxyAuthenticator(Credentials.basic(
|
httpClient.proxyAuthenticator(new MagicAuthenticator(Credentials.basic(
|
||||||
appPreferences.getProxyUsername(),
|
appPreferences.getProxyUsername(),
|
||||||
appPreferences.getProxyPassword())));
|
appPreferences.getProxyPassword()), "Proxy-Authorization"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,10 +210,10 @@ public class RestModule {
|
|||||||
|
|
||||||
public static class HeadersInterceptor implements Interceptor {
|
public static class HeadersInterceptor implements Interceptor {
|
||||||
|
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Response intercept(@NonNull Chain chain) throws IOException {
|
public Response intercept(@NonNull Chain chain) throws IOException {
|
||||||
Request original = chain.request();
|
Request original = chain.request();
|
||||||
|
|
||||||
Request request = original.newBuilder()
|
Request request = original.newBuilder()
|
||||||
.header("User-Agent", ApiUtils.getUserAgent())
|
.header("User-Agent", ApiUtils.getUserAgent())
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
@ -231,24 +231,27 @@ public class RestModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ProxyAuthenticator implements Authenticator {
|
public static class MagicAuthenticator implements Authenticator {
|
||||||
|
|
||||||
private String credentials;
|
private String credentials;
|
||||||
|
private String authenticatorType;
|
||||||
|
|
||||||
private ProxyAuthenticator(String credentials) {
|
public MagicAuthenticator(@NonNull String credentials, @NonNull String authenticatorType) {
|
||||||
this.credentials = credentials;
|
this.credentials = credentials;
|
||||||
|
this.authenticatorType = authenticatorType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Request authenticate(@NonNull Route route, @NonNull Response response) throws IOException {
|
public Request authenticate(@Nullable Route route, @NonNull Response response) {
|
||||||
if (credentials.equals(response.request().header("Proxy-Authorization"))) {
|
if (response.request().header(authenticatorType) != null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
int attemptsCount = 0;
|
|
||||||
Response countedResponse = response;
|
Response countedResponse = response;
|
||||||
|
|
||||||
|
int attemptsCount = 0;
|
||||||
|
|
||||||
while ((countedResponse = countedResponse.priorResponse()) != null) {
|
while ((countedResponse = countedResponse.priorResponse()) != null) {
|
||||||
attemptsCount++;
|
attemptsCount++;
|
||||||
if (attemptsCount == 3) {
|
if (attemptsCount == 3) {
|
||||||
@ -257,7 +260,7 @@ public class RestModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return response.request().newBuilder()
|
return response.request().newBuilder()
|
||||||
.header("Proxy-Authorization", credentials)
|
.header(authenticatorType, credentials)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.interfaces;
|
||||||
|
|
||||||
|
public interface SelectionInterface {
|
||||||
|
void toggleBrowserItemSelection(String path);
|
||||||
|
|
||||||
|
boolean isPathSelected(String path);
|
||||||
|
}
|
@ -86,6 +86,7 @@ public class DeleteConversationWorker extends Worker {
|
|||||||
.subscribeOn(Schedulers.newThread())
|
.subscribeOn(Schedulers.newThread())
|
||||||
.blockingSubscribe(new Observer<GenericOverall>() {
|
.blockingSubscribe(new Observer<GenericOverall>() {
|
||||||
Disposable disposable;
|
Disposable disposable;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(Disposable d) {
|
public void onSubscribe(Disposable d) {
|
||||||
disposable = d;
|
disposable = d;
|
||||||
|
@ -86,6 +86,7 @@ public class LeaveConversationWorker extends Worker {
|
|||||||
.subscribeOn(Schedulers.newThread())
|
.subscribeOn(Schedulers.newThread())
|
||||||
.blockingSubscribe(new Observer<GenericOverall>() {
|
.blockingSubscribe(new Observer<GenericOverall>() {
|
||||||
Disposable disposable;
|
Disposable disposable;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(Disposable d) {
|
public void onSubscribe(Disposable d) {
|
||||||
disposable = d;
|
disposable = d;
|
||||||
|
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.jobs;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.work.Data;
|
||||||
|
import androidx.work.Worker;
|
||||||
|
import androidx.work.WorkerParameters;
|
||||||
|
import autodagger.AutoInjector;
|
||||||
|
import com.nextcloud.talk.api.NcApi;
|
||||||
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
|
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||||
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
|
import io.reactivex.Observer;
|
||||||
|
import io.reactivex.disposables.Disposable;
|
||||||
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
|
public class ShareOperationWorker extends Worker {
|
||||||
|
@Inject
|
||||||
|
UserUtils userUtils;
|
||||||
|
@Inject
|
||||||
|
NcApi ncApi;
|
||||||
|
private long userId;
|
||||||
|
private UserEntity operationsUser;
|
||||||
|
private String roomToken;
|
||||||
|
private List<String> filesArray = new ArrayList<>();
|
||||||
|
private String credentials;
|
||||||
|
private String baseUrl;
|
||||||
|
|
||||||
|
public ShareOperationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
|
||||||
|
super(context, workerParams);
|
||||||
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
|
Data data = workerParams.getInputData();
|
||||||
|
userId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, 0);
|
||||||
|
roomToken = data.getString(BundleKeys.KEY_ROOM_TOKEN);
|
||||||
|
Collections.addAll(filesArray, data.getStringArray(BundleKeys.KEY_FILE_PATHS));
|
||||||
|
operationsUser = userUtils.getUserWithId(userId);
|
||||||
|
credentials = ApiUtils.getCredentials(operationsUser.getUsername(), operationsUser.getToken());
|
||||||
|
baseUrl = operationsUser.getBaseUrl();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Result doWork() {
|
||||||
|
for (int i = 0; i < filesArray.size(); i++) {
|
||||||
|
ncApi.createRemoteShare(credentials,
|
||||||
|
ApiUtils.getSharingUrl(baseUrl),
|
||||||
|
filesArray.get(i),
|
||||||
|
roomToken,
|
||||||
|
"10")
|
||||||
|
.subscribeOn(Schedulers.newThread())
|
||||||
|
.blockingSubscribe(new Observer<Void>() {
|
||||||
|
@Override
|
||||||
|
public void onSubscribe(Disposable d) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNext(Void aVoid) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onComplete() {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.success();
|
||||||
|
}
|
||||||
|
}
|
@ -75,6 +75,20 @@ public interface User extends Parcelable, Persistable, Serializable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default boolean hasExternalCapability(String capabilityName) {
|
||||||
|
if (getCapabilities() != null) {
|
||||||
|
try {
|
||||||
|
Capabilities capabilities = LoganSquare.parse(getCapabilities(), Capabilities.class);
|
||||||
|
if (capabilities.getExternalCapability() != null && capabilities.getExternalCapability().containsKey("v1")) {
|
||||||
|
return capabilities.getExternalCapability().get("v1").contains("capabilityName");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Failed to get capabilities for the user");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
default boolean hasSpreedCapabilityWithName(String capabilityName) {
|
default boolean hasSpreedCapabilityWithName(String capabilityName) {
|
||||||
if (getCapabilities() != null) {
|
if (getCapabilities() != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -25,6 +25,9 @@ import com.bluelinelabs.logansquare.annotation.JsonObject;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.parceler.Parcel;
|
import org.parceler.Parcel;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Parcel
|
@Parcel
|
||||||
@Data
|
@Data
|
||||||
@JsonObject
|
@JsonObject
|
||||||
@ -34,4 +37,10 @@ public class Capabilities {
|
|||||||
|
|
||||||
@JsonField(name = "notifications")
|
@JsonField(name = "notifications")
|
||||||
NotificationsCapability notificationsCapability;
|
NotificationsCapability notificationsCapability;
|
||||||
|
|
||||||
|
@JsonField(name = "theming")
|
||||||
|
ThemingCapability themingCapability;
|
||||||
|
|
||||||
|
@JsonField(name = "external")
|
||||||
|
HashMap<String, List<String>> externalCapability;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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.models.json.capabilities;
|
||||||
|
|
||||||
|
import com.bluelinelabs.logansquare.annotation.JsonField;
|
||||||
|
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.parceler.Parcel;
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
@Data
|
||||||
|
@JsonObject
|
||||||
|
class ThemingCapability {
|
||||||
|
@JsonField(name = "name")
|
||||||
|
String name;
|
||||||
|
|
||||||
|
@JsonField(name = "url")
|
||||||
|
String url;
|
||||||
|
|
||||||
|
@JsonField(name = "slogan")
|
||||||
|
String slogan;
|
||||||
|
|
||||||
|
@JsonField(name = "color")
|
||||||
|
String color;
|
||||||
|
|
||||||
|
@JsonField(name = "color-text")
|
||||||
|
String colorText;
|
||||||
|
|
||||||
|
@JsonField(name = "color-element")
|
||||||
|
String colorElement;
|
||||||
|
|
||||||
|
@JsonField(name = "logo")
|
||||||
|
String logo;
|
||||||
|
|
||||||
|
@JsonField(name = "background")
|
||||||
|
String background;
|
||||||
|
|
||||||
|
@JsonField(name = "background-plain")
|
||||||
|
boolean backgroundPlain;
|
||||||
|
|
||||||
|
@JsonField(name = "background-default")
|
||||||
|
boolean backgroundDefault;
|
||||||
|
}
|
@ -26,6 +26,7 @@ import com.bluelinelabs.logansquare.annotation.JsonIgnore;
|
|||||||
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter;
|
import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.TextMatchers;
|
import com.nextcloud.talk.utils.TextMatchers;
|
||||||
@ -44,7 +45,7 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent
|
|||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public boolean isGrouped;
|
public boolean isGrouped;
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public String activeUserId;
|
public UserEntity activeUser;
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public Map<String, String> selectedIndividualHashMap;
|
public Map<String, String> selectedIndividualHashMap;
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@ -52,7 +53,6 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent
|
|||||||
List<MessageType> messageTypesToIgnore = Arrays.asList(MessageType.REGULAR_TEXT_MESSAGE,
|
List<MessageType> messageTypesToIgnore = Arrays.asList(MessageType.REGULAR_TEXT_MESSAGE,
|
||||||
MessageType.SYSTEM_MESSAGE, MessageType.SINGLE_LINK_VIDEO_MESSAGE,
|
MessageType.SYSTEM_MESSAGE, MessageType.SINGLE_LINK_VIDEO_MESSAGE,
|
||||||
MessageType.SINGLE_LINK_AUDIO_MESSAGE, MessageType.SINGLE_LINK_MESSAGE);
|
MessageType.SINGLE_LINK_AUDIO_MESSAGE, MessageType.SINGLE_LINK_MESSAGE);
|
||||||
String baseUrl;
|
|
||||||
@JsonField(name = "id")
|
@JsonField(name = "id")
|
||||||
int jsonMessageId;
|
int jsonMessageId;
|
||||||
@JsonField(name = "token")
|
@JsonField(name = "token")
|
||||||
@ -96,9 +96,8 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent
|
|||||||
Map<String, String> individualHashMap = messageParameters.get(key);
|
Map<String, String> individualHashMap = messageParameters.get(key);
|
||||||
if (individualHashMap.get("type").equals("file")) {
|
if (individualHashMap.get("type").equals("file")) {
|
||||||
selectedIndividualHashMap = individualHashMap;
|
selectedIndividualHashMap = individualHashMap;
|
||||||
return String.format(Locale.getDefault(),
|
return (ApiUtils.getUrlForFilePreviewWithFileId(getActiveUser().getBaseUrl(),
|
||||||
"%s/index.php/core/preview?fileId=%s&x=%d&y=%d&forceIcon=1",
|
individualHashMap.get("id"), NextcloudTalkApplication.getSharedApplication().getResources().getDimensionPixelSize(R.dimen.maximum_file_preview_size)));
|
||||||
baseUrl, individualHashMap.get("id"), 480, 480);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -130,14 +129,6 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent
|
|||||||
this.selectedIndividualHashMap = selectedIndividualHashMap;
|
this.selectedIndividualHashMap = selectedIndividualHashMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBaseUrl() {
|
|
||||||
return baseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBaseUrl(String baseUrl) {
|
|
||||||
this.baseUrl = baseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return Integer.toString(jsonMessageId);
|
return Integer.toString(jsonMessageId);
|
||||||
@ -155,42 +146,42 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent
|
|||||||
if (getMessageType().equals(MessageType.SINGLE_LINK_GIPHY_MESSAGE)
|
if (getMessageType().equals(MessageType.SINGLE_LINK_GIPHY_MESSAGE)
|
||||||
|| getMessageType().equals(MessageType.SINGLE_LINK_TENOR_MESSAGE)
|
|| getMessageType().equals(MessageType.SINGLE_LINK_TENOR_MESSAGE)
|
||||||
|| getMessageType().equals(MessageType.SINGLE_LINK_GIF_MESSAGE)) {
|
|| getMessageType().equals(MessageType.SINGLE_LINK_GIF_MESSAGE)) {
|
||||||
if (getActorId().equals(getActiveUserId())) {
|
if (getActorId().equals(getActiveUser().getUserId())) {
|
||||||
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_gif_you));
|
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_gif_you));
|
||||||
} else {
|
} else {
|
||||||
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_a_gif),
|
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_a_gif),
|
||||||
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
||||||
}
|
}
|
||||||
} else if (getMessageType().equals(MessageType.SINGLE_NC_ATTACHMENT_MESSAGE)) {
|
} else if (getMessageType().equals(MessageType.SINGLE_NC_ATTACHMENT_MESSAGE)) {
|
||||||
if (getActorId().equals(getActiveUserId())) {
|
if (getActorId().equals(getActiveUser().getUserId())) {
|
||||||
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_attachment_you));
|
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_attachment_you));
|
||||||
} else {
|
} else {
|
||||||
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_an_attachment),
|
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_an_attachment),
|
||||||
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
||||||
}
|
}
|
||||||
} else if (getMessageType().equals(MessageType.SINGLE_LINK_MESSAGE)) {
|
} else if (getMessageType().equals(MessageType.SINGLE_LINK_MESSAGE)) {
|
||||||
if (getActorId().equals(getActiveUserId())) {
|
if (getActorId().equals(getActiveUser().getUserId())) {
|
||||||
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_link_you));
|
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_link_you));
|
||||||
} else {
|
} else {
|
||||||
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_a_link),
|
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_a_link),
|
||||||
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
||||||
}
|
}
|
||||||
} else if (getMessageType().equals(MessageType.SINGLE_LINK_AUDIO_MESSAGE)) {
|
} else if (getMessageType().equals(MessageType.SINGLE_LINK_AUDIO_MESSAGE)) {
|
||||||
if (getActorId().equals(getActiveUserId())) {
|
if (getActorId().equals(getActiveUser().getUserId())) {
|
||||||
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_audio_you));
|
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_audio_you));
|
||||||
} else {
|
} else {
|
||||||
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_an_audio),
|
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_an_audio),
|
||||||
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
||||||
}
|
}
|
||||||
} else if (getMessageType().equals(MessageType.SINGLE_LINK_VIDEO_MESSAGE)) {
|
} else if (getMessageType().equals(MessageType.SINGLE_LINK_VIDEO_MESSAGE)) {
|
||||||
if (getActorId().equals(getActiveUserId())) {
|
if (getActorId().equals(getActiveUser().getUserId())) {
|
||||||
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_video_you));
|
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_a_video_you));
|
||||||
} else {
|
} else {
|
||||||
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_a_video),
|
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_a_video),
|
||||||
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
!TextUtils.isEmpty(getActorDisplayName()) ? getActorDisplayName() : NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_guest)));
|
||||||
}
|
}
|
||||||
} else if (getMessageType().equals(MessageType.SINGLE_LINK_IMAGE_MESSAGE)) {
|
} else if (getMessageType().equals(MessageType.SINGLE_LINK_IMAGE_MESSAGE)) {
|
||||||
if (getActorId().equals(getActiveUserId())) {
|
if (getActorId().equals(getActiveUser().getUserId())) {
|
||||||
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_image_you));
|
return (NextcloudTalkApplication.getSharedApplication().getString(R.string.nc_sent_an_image_you));
|
||||||
} else {
|
} else {
|
||||||
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_an_image),
|
return (String.format(NextcloudTalkApplication.getSharedApplication().getResources().getString(R.string.nc_sent_an_image),
|
||||||
@ -218,7 +209,7 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent
|
|||||||
@Override
|
@Override
|
||||||
public String getAvatar() {
|
public String getAvatar() {
|
||||||
if (getActorType().equals("users")) {
|
if (getActorType().equals("users")) {
|
||||||
return ApiUtils.getUrlForAvatarWithName(getBaseUrl(), actorId, R.dimen.avatar_size);
|
return ApiUtils.getUrlForAvatarWithName(getActiveUser().getBaseUrl(), actorId, R.dimen.avatar_size);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
package com.nextcloud.talk.models.json.mention;
|
package com.nextcloud.talk.models.json.mention;
|
||||||
|
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonField;
|
import com.bluelinelabs.logansquare.annotation.JsonField;
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonIgnore;
|
|
||||||
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.parceler.Parcel;
|
import org.parceler.Parcel;
|
||||||
|
@ -26,6 +26,7 @@ package com.nextcloud.talk.utils;
|
|||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.accounts.AccountManager;
|
import android.accounts.AccountManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
@ -101,6 +102,26 @@ public class AccountUtils {
|
|||||||
return appName;
|
return appName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean canWeOpenFilesApp(Context context, String accountName) {
|
||||||
|
PackageManager pm = context.getPackageManager();
|
||||||
|
try {
|
||||||
|
PackageInfo packageInfo =
|
||||||
|
pm.getPackageInfo(context.getString(R.string.nc_import_accounts_from), 0);
|
||||||
|
if (packageInfo.versionCode < 1) {
|
||||||
|
final AccountManager accMgr = AccountManager.get(context);
|
||||||
|
final Account[] accounts = accMgr.getAccountsByType(context.getString(R.string.nc_import_account_type));
|
||||||
|
for (Account account : accounts) {
|
||||||
|
if (account.name.equals(accountName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (PackageManager.NameNotFoundException appNotFoundException) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static ImportAccount getInformationFromAccount(Account account) {
|
public static ImportAccount getInformationFromAccount(Account account) {
|
||||||
int lastAtPos = account.name.lastIndexOf("@");
|
int lastAtPos = account.name.lastIndexOf("@");
|
||||||
String urlString = account.name.substring(lastAtPos + 1);
|
String urlString = account.name.substring(lastAtPos + 1);
|
||||||
|
@ -60,6 +60,21 @@ public class ApiUtils {
|
|||||||
return retrofitBucket;
|
return retrofitBucket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getUrlForFilePreviewWithRemotePath(String baseUrl, String remotePath, int px) {
|
||||||
|
return baseUrl + "/index.php/core/preview.png?file="
|
||||||
|
+ Uri.encode(remotePath, "UTF-8")
|
||||||
|
+ "&x=" + px + "&y=" + px + "&a=1&mode=cover&forceIcon=1";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUrlForFilePreviewWithFileId(String baseUrl, String fileId, int px) {
|
||||||
|
return baseUrl + "/index.php/core/preview?fileId="
|
||||||
|
+ fileId + "&x=" + px + "&y=" + px + "&a=1&mode=cover&forceIcon=1";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSharingUrl(String baseUrl) {
|
||||||
|
return baseUrl + ocsApiVersion + "/apps/files_sharing/api/v1/shares";
|
||||||
|
}
|
||||||
|
|
||||||
public static RetrofitBucket getRetrofitBucketForContactsSearchFor14(String baseUrl, @Nullable String searchQuery) {
|
public static RetrofitBucket getRetrofitBucketForContactsSearchFor14(String baseUrl, @Nullable String searchQuery) {
|
||||||
RetrofitBucket retrofitBucket = getRetrofitBucketForContactsSearch(baseUrl, searchQuery);
|
RetrofitBucket retrofitBucket = getRetrofitBucketForContactsSearch(baseUrl, searchQuery);
|
||||||
retrofitBucket.setUrl(baseUrl + ocsApiVersion + "/core/autocomplete/get");
|
retrofitBucket.setUrl(baseUrl + ocsApiVersion + "/core/autocomplete/get");
|
||||||
|
43
app/src/main/java/com/nextcloud/talk/utils/DateUtils.java
Normal file
43
app/src/main/java/com/nextcloud/talk/utils/DateUtils.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.utils;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
public class DateUtils {
|
||||||
|
public static String getLocalDateTimeStringFromTimestamp(Context context, long timestamp) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
TimeZone tz = cal.getTimeZone();
|
||||||
|
|
||||||
|
/* date formatter in local timezone */
|
||||||
|
Locale currentLocale = context.getResources().getConfiguration().locale;
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", currentLocale);
|
||||||
|
sdf.setTimeZone(tz);
|
||||||
|
|
||||||
|
return sdf.format(new Date(timestamp));
|
||||||
|
}
|
||||||
|
}
|
@ -60,6 +60,7 @@ import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
|
|||||||
import com.facebook.imagepipeline.image.CloseableImage;
|
import com.facebook.imagepipeline.image.CloseableImage;
|
||||||
import com.facebook.imagepipeline.image.ImageInfo;
|
import com.facebook.imagepipeline.image.ImageInfo;
|
||||||
import com.facebook.imagepipeline.postprocessors.RoundAsCirclePostprocessor;
|
import com.facebook.imagepipeline.postprocessors.RoundAsCirclePostprocessor;
|
||||||
|
import com.facebook.imagepipeline.postprocessors.RoundPostprocessor;
|
||||||
import com.facebook.imagepipeline.request.ImageRequest;
|
import com.facebook.imagepipeline.request.ImageRequest;
|
||||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||||
import com.google.android.material.chip.ChipDrawable;
|
import com.google.android.material.chip.ChipDrawable;
|
||||||
@ -72,9 +73,13 @@ import com.vanniktech.emoji.EmojiEditText;
|
|||||||
import com.vanniktech.emoji.EmojiTextView;
|
import com.vanniktech.emoji.EmojiTextView;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -86,14 +91,14 @@ public class DisplayUtils {
|
|||||||
SpannableString spannableString = new SpannableString(string);
|
SpannableString spannableString = new SpannableString(string);
|
||||||
spannableString.setSpan(new ClickableSpan() {
|
spannableString.setSpan(new ClickableSpan() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(@NonNull View widget) {
|
public void onClick(@Nonnull View widget) {
|
||||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||||
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent);
|
NextcloudTalkApplication.getSharedApplication().getApplicationContext().startActivity(browserIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateDrawState(TextPaint ds) {
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
super.updateDrawState(ds);
|
super.updateDrawState(ds);
|
||||||
ds.setUnderlineText(false);
|
ds.setUnderlineText(false);
|
||||||
}
|
}
|
||||||
@ -104,7 +109,8 @@ public class DisplayUtils {
|
|||||||
|
|
||||||
private static void updateViewSize(@Nullable ImageInfo imageInfo, SimpleDraweeView draweeView) {
|
private static void updateViewSize(@Nullable ImageInfo imageInfo, SimpleDraweeView draweeView) {
|
||||||
if (imageInfo != null) {
|
if (imageInfo != null) {
|
||||||
draweeView.getLayoutParams().width = imageInfo.getWidth() > 480 ? 480 : imageInfo.getWidth();
|
int maxSize = draweeView.getContext().getResources().getDimensionPixelSize(R.dimen.maximum_file_preview_size);
|
||||||
|
draweeView.getLayoutParams().width = imageInfo.getWidth() > maxSize ? maxSize : imageInfo.getWidth();
|
||||||
draweeView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
draweeView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||||
draweeView.setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight());
|
draweeView.setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight());
|
||||||
draweeView.requestLayout();
|
draweeView.requestLayout();
|
||||||
@ -120,7 +126,7 @@ public class DisplayUtils {
|
|||||||
public static Bitmap getRoundedBitmapFromVectorDrawableResource(Resources resources, int resource) {
|
public static Bitmap getRoundedBitmapFromVectorDrawableResource(Resources resources, int resource) {
|
||||||
VectorDrawable vectorDrawable = (VectorDrawable) resources.getDrawable(resource);
|
VectorDrawable vectorDrawable = (VectorDrawable) resources.getDrawable(resource);
|
||||||
Bitmap bitmap = getBitmap(vectorDrawable);
|
Bitmap bitmap = getBitmap(vectorDrawable);
|
||||||
new RoundAsCirclePostprocessor(true).process(bitmap);
|
new RoundPostprocessor(true).process(bitmap);
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,11 +148,18 @@ public class DisplayUtils {
|
|||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ImageRequest getImageRequestForUrl(String url) {
|
public static ImageRequest getImageRequestForUrl(String url, @Nullable UserEntity userEntity) {
|
||||||
|
Map<String, String> headers = new HashMap<>();
|
||||||
|
if (userEntity != null && url.startsWith(userEntity.getBaseUrl()) && url.contains("index.php/core/preview?fileId=")) {
|
||||||
|
headers.put("Authorization", ApiUtils.getCredentials(userEntity.getUsername(),
|
||||||
|
userEntity.getToken()));
|
||||||
|
}
|
||||||
|
|
||||||
return ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))
|
return ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))
|
||||||
.setProgressiveRenderingEnabled(true)
|
.setProgressiveRenderingEnabled(true)
|
||||||
.setRotationOptions(RotationOptions.autoRotate())
|
.setRotationOptions(RotationOptions.autoRotate())
|
||||||
.disableDiskCache()
|
.disableDiskCache()
|
||||||
|
.setHeaders(headers)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,7 +265,7 @@ public class DisplayUtils {
|
|||||||
|
|
||||||
if (!isCall) {
|
if (!isCall) {
|
||||||
ImageRequest imageRequest =
|
ImageRequest imageRequest =
|
||||||
getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(conversationUser.getBaseUrl(), id, R.dimen.avatar_size_big));
|
getImageRequestForUrl(ApiUtils.getUrlForAvatarWithName(conversationUser.getBaseUrl(), id, R.dimen.avatar_size_big), null);
|
||||||
ImagePipeline imagePipeline = Fresco.getImagePipeline();
|
ImagePipeline imagePipeline = Fresco.getImagePipeline();
|
||||||
DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
|
DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
|
||||||
|
|
||||||
|
161
app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.java
Normal file
161
app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.java
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.utils;
|
||||||
|
|
||||||
|
import com.nextcloud.talk.R;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class DrawableUtils {
|
||||||
|
|
||||||
|
|
||||||
|
public static int getDrawableResourceIdForMimeType(String mimetype) {
|
||||||
|
Map<String, Integer> drawableMap = new HashMap<>();
|
||||||
|
|
||||||
|
// Initial list of mimetypes was acquired from https://github.com/nextcloud/server/blob/694ba5435b2963e201f6a6d2c775836bde07aaef/core/js/mimetypelist.js
|
||||||
|
drawableMap.put("application/coreldraw", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/epub+zip", R.drawable.ic_mimetype_text);
|
||||||
|
drawableMap.put("application/font-sfnt", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/font-woff", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/gpx+xml", R.drawable.ic_mimetype_location);
|
||||||
|
drawableMap.put("application/illustrator", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/javascript", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/json", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/msaccess", R.drawable.ic_mimetype_file);
|
||||||
|
drawableMap.put("application/msexcel", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/msonenote", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/mspowerpoint", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/msword", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/octet-stream", R.drawable.ic_mimetype_file);
|
||||||
|
drawableMap.put("application/postscript", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/rss+xml", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/vnd.android.package-archive", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/vnd.lotus-wordpro", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.garmin.tcx+xml", R.drawable.ic_mimetype_location);
|
||||||
|
drawableMap.put("application/vnd.google-earth.kml+xml", R.drawable.ic_mimetype_location);
|
||||||
|
drawableMap.put("application/vnd.google-earth.kmz", R.drawable.ic_mimetype_location);
|
||||||
|
drawableMap.put("application/vnd.ms-excel", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.ms-excel.addin.macroEnabled.12", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.ms-excel.sheet.binary.macroEnabled.12", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.ms-excel.sheet.macroEnabled.12", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.ms-excel.template.macroEnabled.12", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.ms-fontobject", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/vnd.ms-powerpoint", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.ms-powerpoint.addin.macroEnabled.12", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.ms-powerpoint.presentation.macroEnabled.12", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.ms-powerpoint.slideshow.macroEnabled.12", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.ms-powerpoint.template.macroEnabled.12", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.ms-visio.drawing.macroEnabled.12", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.ms-visio.drawing", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.ms-visio.stencil.macroEnabled.12", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.ms-visio.stencil", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.ms-visio.template.macroEnabled.12", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.ms-visio.template", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.ms-word.template.macroEnabled.12", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.presentation", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.presentation-template", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.spreadsheet", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.spreadsheet-template", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.text", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.text-master", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.text-template", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.oasis.opendocument.text-web", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.presentationml.presentation", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.presentationml.slideshow", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.presentationml.template", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.spreadsheetml.template", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.wordprocessingml.document", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.openxmlformats-officedocument.wordprocessingml.template", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.visio", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/vnd.wordperfect", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/x-7z-compressed", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-bzip2", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-cbr", R.drawable.ic_mimetype_text);
|
||||||
|
drawableMap.put("application/x-compressed", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-dcraw", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/x-deb", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-fictionbook+xml", R.drawable.ic_mimetype_text);
|
||||||
|
drawableMap.put("application/x-font", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/x-gimp", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/x-gzip", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-iwork-keynote-sffkey", R.drawable.ic_mimetype_x_office_presentation);
|
||||||
|
drawableMap.put("application/x-iwork-numbers-sffnumbers", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("application/x-iwork-pages-sffpages", R.drawable.ic_mimetype_x_office_document);
|
||||||
|
drawableMap.put("application/x-mobipocket-ebook", R.drawable.ic_mimetype_text);
|
||||||
|
drawableMap.put("application/x-perl", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/x-photoshop", R.drawable.ic_mimetype_image);
|
||||||
|
drawableMap.put("application/x-php", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/x-rar-compressed", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-tar", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("application/x-tex", R.drawable.ic_mimetype_text);
|
||||||
|
drawableMap.put("application/xml", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/yaml", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/zip", R.drawable.ic_mimetype_package_x_generic);
|
||||||
|
drawableMap.put("database", R.drawable.ic_mimetype_file);
|
||||||
|
drawableMap.put("httpd/unix-directory", R.drawable.ic_mimetype_folder);
|
||||||
|
drawableMap.put("text/css", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/csv", R.drawable.ic_mimetype_x_office_spreadsheet);
|
||||||
|
drawableMap.put("text/html", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-c", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-c++src", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-h", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-java-source", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-ldif", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-python", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("text/x-shellscript", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("web", R.drawable.ic_mimetype_text_code);
|
||||||
|
drawableMap.put("application/internet-shortcut", R.drawable.ic_mimetype_link);
|
||||||
|
|
||||||
|
drawableMap.put("inode/directory", R.drawable.ic_mimetype_folder);
|
||||||
|
drawableMap.put("unknown", R.drawable.ic_mimetype_file);
|
||||||
|
drawableMap.put("application/pdf", R.drawable.ic_mimetype_application_pdf);
|
||||||
|
|
||||||
|
if ("DIR".equals(mimetype)) {
|
||||||
|
mimetype = "inode/directory";
|
||||||
|
return drawableMap.get(mimetype);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawableMap.containsKey(mimetype)) {
|
||||||
|
return drawableMap.get(mimetype);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimetype.startsWith("image/")) {
|
||||||
|
return R.drawable.ic_mimetype_image;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimetype.startsWith("video/")) {
|
||||||
|
return R.drawable.ic_mimetype_video;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimetype.startsWith("text/")) {
|
||||||
|
return R.drawable.ic_mimetype_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimetype.startsWith("audio")) {
|
||||||
|
return R.drawable.ic_mimetype_audio;
|
||||||
|
}
|
||||||
|
|
||||||
|
return drawableMap.get("unknown");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -24,9 +24,7 @@ import android.content.Context;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import autodagger.AutoInjector;
|
import autodagger.AutoInjector;
|
||||||
|
|
||||||
import com.bluelinelabs.logansquare.LoganSquare;
|
import com.bluelinelabs.logansquare.LoganSquare;
|
||||||
import com.nextcloud.talk.R;
|
import com.nextcloud.talk.R;
|
||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
@ -38,15 +36,12 @@ import com.nextcloud.talk.models.json.push.PushConfigurationState;
|
|||||||
import com.nextcloud.talk.models.json.push.PushRegistrationOverall;
|
import com.nextcloud.talk.models.json.push.PushRegistrationOverall;
|
||||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
import com.nextcloud.talk.utils.preferences.AppPreferences;
|
||||||
|
|
||||||
import io.reactivex.Observer;
|
import io.reactivex.Observer;
|
||||||
import io.reactivex.disposables.Disposable;
|
import io.reactivex.disposables.Disposable;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
@ -24,11 +24,10 @@ package com.nextcloud.talk.utils;
|
|||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.core.util.PatternsCompat;
|
||||||
import com.nextcloud.talk.models.json.chat.ChatMessage;
|
import com.nextcloud.talk.models.json.chat.ChatMessage;
|
||||||
import com.vanniktech.emoji.EmojiInformation;
|
import com.vanniktech.emoji.EmojiInformation;
|
||||||
import com.vanniktech.emoji.EmojiUtils;
|
import com.vanniktech.emoji.EmojiUtils;
|
||||||
|
|
||||||
import androidx.core.util.PatternsCompat;
|
|
||||||
import eu.medsea.mimeutil.MimeUtil;
|
import eu.medsea.mimeutil.MimeUtil;
|
||||||
import eu.medsea.mimeutil.detector.ExtensionMimeDetector;
|
import eu.medsea.mimeutil.detector.ExtensionMimeDetector;
|
||||||
import eu.medsea.mimeutil.detector.MagicMimeMimeDetector;
|
import eu.medsea.mimeutil.detector.MagicMimeMimeDetector;
|
||||||
|
@ -51,4 +51,8 @@ public class BundleKeys {
|
|||||||
public static final String KEY_FROM_NOTIFICATION_START_CALL = "KEY_FROM_NOTIFICATION_START_CALL";
|
public static final String KEY_FROM_NOTIFICATION_START_CALL = "KEY_FROM_NOTIFICATION_START_CALL";
|
||||||
public static final String KEY_ROOM_ID = "KEY_ROOM_ID";
|
public static final String KEY_ROOM_ID = "KEY_ROOM_ID";
|
||||||
public static final String KEY_ARE_CALL_SOUNDS = "KEY_ARE_CALL_SOUNDS";
|
public static final String KEY_ARE_CALL_SOUNDS = "KEY_ARE_CALL_SOUNDS";
|
||||||
|
public static final String KEY_BROWSER_TYPE = "KEY_BROWSER_TYPE";
|
||||||
|
public static final String KEY_FILE_PATHS = "KEY_FILE_PATHS";
|
||||||
|
public static final String KEY_ACCOUNT = "KEY_ACCOUNT";
|
||||||
|
public static final String KEY_FILE_PATH = "KEY_FILE_PATH";
|
||||||
}
|
}
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Nextcloud Talk application
|
|
||||||
*
|
|
||||||
* @author Mario Danic
|
|
||||||
* Copyright (C) 2017 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.utils.glide;
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import autodagger.AutoInjector;
|
|
||||||
import com.bumptech.glide.Glide;
|
|
||||||
import com.bumptech.glide.GlideBuilder;
|
|
||||||
import com.bumptech.glide.Registry;
|
|
||||||
import com.bumptech.glide.annotation.GlideModule;
|
|
||||||
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
|
|
||||||
import com.bumptech.glide.load.model.GlideUrl;
|
|
||||||
import com.bumptech.glide.module.AppGlideModule;
|
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication.class)
|
|
||||||
@GlideModule
|
|
||||||
public class CachingGlideModule extends AppGlideModule {
|
|
||||||
@Inject
|
|
||||||
OkHttpClient okHttpClient;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerComponents(Context context, Glide glide, Registry registry) {
|
|
||||||
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
|
||||||
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void applyOptions(Context context, GlideBuilder builder) {
|
|
||||||
}
|
|
||||||
}
|
|
@ -39,40 +39,17 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
public class PowerManagerUtils {
|
public class PowerManagerUtils {
|
||||||
private static final String TAG = "PowerManagerUtils";
|
private static final String TAG = "PowerManagerUtils";
|
||||||
|
|
||||||
@Inject
|
|
||||||
Context context;
|
|
||||||
|
|
||||||
private final PowerManager.WakeLock fullLock;
|
private final PowerManager.WakeLock fullLock;
|
||||||
private final PowerManager.WakeLock partialLock;
|
private final PowerManager.WakeLock partialLock;
|
||||||
private final WifiManager.WifiLock wifiLock;
|
private final WifiManager.WifiLock wifiLock;
|
||||||
private ProximityLock proximityLock;
|
|
||||||
|
|
||||||
private final boolean wifiLockEnforced;
|
private final boolean wifiLockEnforced;
|
||||||
|
@Inject
|
||||||
|
Context context;
|
||||||
|
private ProximityLock proximityLock;
|
||||||
private boolean proximityDisabled = false;
|
private boolean proximityDisabled = false;
|
||||||
|
|
||||||
private int orientation;
|
private int orientation;
|
||||||
|
|
||||||
public enum PhoneState {
|
|
||||||
IDLE,
|
|
||||||
PROCESSING, //used when the phone is active but before the user should be alerted.
|
|
||||||
INTERACTIVE,
|
|
||||||
WITHOUT_PROXIMITY_SENSOR_LOCK,
|
|
||||||
WITH_PROXIMITY_SENSOR_LOCK
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum WakeLockState {
|
|
||||||
FULL,
|
|
||||||
PARTIAL,
|
|
||||||
SLEEP,
|
|
||||||
PROXIMITY
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOrientation(int newOrientation) {
|
|
||||||
orientation = newOrientation;
|
|
||||||
updateInCallWakeLockState();
|
|
||||||
}
|
|
||||||
|
|
||||||
public PowerManagerUtils() {
|
public PowerManagerUtils() {
|
||||||
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
|
|
||||||
@ -95,8 +72,13 @@ public class PowerManagerUtils {
|
|||||||
orientation = context.getResources().getConfiguration().orientation;
|
orientation = context.getResources().getConfiguration().orientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOrientation(int newOrientation) {
|
||||||
|
orientation = newOrientation;
|
||||||
|
updateInCallWakeLockState();
|
||||||
|
}
|
||||||
|
|
||||||
public void updatePhoneState(PhoneState state) {
|
public void updatePhoneState(PhoneState state) {
|
||||||
switch(state) {
|
switch (state) {
|
||||||
case IDLE:
|
case IDLE:
|
||||||
setWakeLockState(WakeLockState.SLEEP);
|
setWakeLockState(WakeLockState.SLEEP);
|
||||||
break;
|
break;
|
||||||
@ -132,7 +114,7 @@ public class PowerManagerUtils {
|
|||||||
|
|
||||||
@SuppressLint("WakelockTimeout")
|
@SuppressLint("WakelockTimeout")
|
||||||
private synchronized void setWakeLockState(WakeLockState newState) {
|
private synchronized void setWakeLockState(WakeLockState newState) {
|
||||||
switch(newState) {
|
switch (newState) {
|
||||||
case FULL:
|
case FULL:
|
||||||
if (!fullLock.isHeld()) {
|
if (!fullLock.isHeld()) {
|
||||||
fullLock.acquire();
|
fullLock.acquire();
|
||||||
@ -183,7 +165,7 @@ public class PowerManagerUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fullLock.release(
|
fullLock.release(
|
||||||
|
|
||||||
);
|
);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
proximityLock.acquire();
|
proximityLock.acquire();
|
||||||
@ -193,4 +175,19 @@ public class PowerManagerUtils {
|
|||||||
// something went very very wrong
|
// something went very very wrong
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum PhoneState {
|
||||||
|
IDLE,
|
||||||
|
PROCESSING, //used when the phone is active but before the user should be alerted.
|
||||||
|
INTERACTIVE,
|
||||||
|
WITHOUT_PROXIMITY_SENSOR_LOCK,
|
||||||
|
WITH_PROXIMITY_SENSOR_LOCK
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WakeLockState {
|
||||||
|
FULL,
|
||||||
|
PARTIAL,
|
||||||
|
SLEEP,
|
||||||
|
PROXIMITY
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
25
app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
Normal file
25
app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
~ 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="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,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
|
||||||
|
</vector>
|
25
app/src/main/res/drawable/ic_check_black_24dp.xml
Normal file
25
app/src/main/res/drawable/ic_check_black_24dp.xml
Normal 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: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="#FF000000" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
|
||||||
|
</vector>
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
|
27
app/src/main/res/drawable/ic_file_icon_black_24h.xml
Normal file
27
app/src/main/res/drawable/ic_file_icon_black_24h.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<!--
|
||||||
|
~ 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="24" android:viewportWidth="24"
|
||||||
|
android:width="20.57dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="#000000" android:fillType="nonZero"
|
||||||
|
android:pathData="M0.8571,0C0.3771,0 0,0.3771 0,0.8571L0,23.1429C0,23.6229 0.3771,24 0.8571,24L19.7143,24C20.1943,24 20.5714,23.6229 20.5714,23.1429L20.5714,5.1429L15.4286,0L0.8571,0ZM3.4286,3.4286L13.7143,3.4286L13.7143,5.1429L3.4286,5.1429L3.4286,3.4286ZM3.4286,8.5714L12,8.5714L12,10.2857L3.4286,10.2857L3.4286,8.5714ZM3.4286,13.7143L17.1429,13.7143L17.1429,15.4286L3.4286,15.4286L3.4286,13.7143ZM3.4286,18.8571L10.2857,18.8571L10.2857,20.5714L3.4286,20.5714L3.4286,18.8571Z"
|
||||||
|
android:strokeColor="#00000000" android:strokeWidth="1"/>
|
||||||
|
</vector>
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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"
|
<vector xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:autoMirrored="true" android:height="24dp"
|
android:autoMirrored="true" android:height="24dp"
|
||||||
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
||||||
|
25
app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml
Normal file
25
app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
~ 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="24.0" android:viewportWidth="24.0"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="#FF000000" android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z"/>
|
||||||
|
</vector>
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="108dp"
|
android:width="108dp"
|
||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="108dp"
|
android:width="108dp"
|
||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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"
|
<vector xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:autoMirrored="true" android:height="24dp"
|
android:autoMirrored="true" android:height="24dp"
|
||||||
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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"
|
<vector xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:autoMirrored="true" android:height="24dp"
|
android:autoMirrored="true" android:height="24dp"
|
||||||
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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:autoMirrored="true" android:height="24dp"
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
android:viewportHeight="128" android:viewportWidth="128"
|
android:viewportHeight="128" android:viewportWidth="128"
|
||||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
27
app/src/main/res/drawable/ic_mimetype_application.xml
Executable file
27
app/src/main/res/drawable/ic_mimetype_application.xml
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M6.94,0.5 C6.7,0.5,6.5,0.7,6.5,0.94 L6.5,2.2 C6,2.34,5.45,2.55,4.97,2.85
|
||||||
|
L4.06,1.94 C3.9,1.76,3.6,1.75,3.44,1.94 L1.94,3.44 C1.76,3.61,1.76,3.9,1.94,4.06
|
||||||
|
L2.85,4.97 C2.566,5.45,2.35,5.97,2.2,6.5 L0.94,6.5 C0.7,6.5,0.5,6.7,0.5,6.94
|
||||||
|
L0.5,9.06 C0.5,9.31,0.69,9.5,0.94,9.5 L2.2,9.5 C2.34,10.04,2.56,10.55,2.85,11.03
|
||||||
|
L1.94,11.94 C1.76,12.11,1.76,12.39,1.94,12.56 L3.44,14.06
|
||||||
|
C3.62,14.24,3.9,14.24,4.06,14.06 L4.97,13.15 C5.45,13.435,5.97,13.65,6.5,13.8
|
||||||
|
L6.5,15.06 C6.5,15.31,6.7,15.5,6.94,15.5 L9.06,15.5
|
||||||
|
C9.3,15.5,9.51,15.3,9.5,15.06 L9.5,13.8 C10.04,13.66,10.55,13.44,11.03,13.15
|
||||||
|
L11.94,14.06 C12.11,14.24,12.39,14.24,12.56,14.06 L14.06,12.56
|
||||||
|
C14.24,12.39,14.24,12.11,14.06,11.94 L13.15,11.03
|
||||||
|
C13.44,10.55,13.65,10.03,13.8,9.5 L15.06,9.5 C15.3,9.5,15.51,9.3,15.5,9.06
|
||||||
|
L15.5,6.94 C15.5,6.7,15.3,6.5,15.06,6.5 L13.8,6.5
|
||||||
|
C13.66,5.96,13.44,5.45,13.15,4.97 L14.06,4.06 C14.24,3.89,14.24,3.61,14.06,3.44
|
||||||
|
L12.56,1.94 C12.39,1.76,12.11,1.76,11.94,1.94 L11.03,2.85
|
||||||
|
C10.55,2.56,10.03,2.35,9.5,2.2 L9.5,0.94 C9.5,0.7,9.3,0.5,9.06,0.5 L6.94,0.5 Z
|
||||||
|
M8,4.5 A3.5,3.5,0,0,1,11.5,8 A3.5,3.5,0,0,1,8,11.5 A3.5,3.5,0,0,1,4.5,8
|
||||||
|
A3.5,3.5,0,0,1,8,4.5 Z" />
|
||||||
|
</vector>
|
19
app/src/main/res/drawable/ic_mimetype_application_pdf.xml
Executable file
19
app/src/main/res/drawable/ic_mimetype_application_pdf.xml
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#dc5047"
|
||||||
|
android:pathData="M2.5,1 C2.22,1,2,1.22,2,1.5 L2,14.5 C2,14.78,2.22,15,2.5,15 L13.5,15
|
||||||
|
C13.78,15,14,14.78,14,14.5 L14,4 L11,1 Z M8.3,4.9 S8.37,5.85,8.15,7.2
|
||||||
|
C8.865,9.253,9.65,9.53,10,9.7 C10.74,9.64,11.565,9.6,12.3,10
|
||||||
|
C12.8,10.286,13.194,11.5,12,11.5 C11.46,11.466,10.463,11.154,9.75,10.8
|
||||||
|
C8.684,10.92,7.36,11.12,6.25,11.6 C5,13.7,4.44,14,4,14
|
||||||
|
C2.785,13.68,3.44,12.07,3.9,11.8 C4.45,11.33,5.095,11.06,5.3,11
|
||||||
|
C5.39,10.85,6.684,8.31,7,7.25 C6.7,6.226,6.63,5.144,6.8,4.5
|
||||||
|
C7.58,3.482,8.3,4.15,8.3,4.9 Z M7.6,8 C7.33,9.057,6.252,11.084,6.3,11
|
||||||
|
C7.405,10.515,8.4,10.37,9.5,10.2 C8.974,9.965,8.354,9.95,7.6,8 Z" />
|
||||||
|
</vector>
|
16
app/src/main/res/drawable/ic_mimetype_audio.xml
Executable file
16
app/src/main/res/drawable/ic_mimetype_audio.xml
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M12.97,0.5 C12.71,0.5,8.175,1.5,5.8,2 C5.33,2.1,5,2.53,5,3 L5,11
|
||||||
|
C4.44,10.94,3.856,11.0625,3.35,11.34 C2.124,12.01,1.65,13.4,2.284,14.45
|
||||||
|
C2.924,15.5,4.434,15.8,5.654,15.13 C6.5,14.68,7,13.85,7,13 L7,5 L12,4 L12,10.016
|
||||||
|
C11.44,9.958,10.856,10.0785,10.35,10.356 C9.124,11.026,8.65,12.416,9.284,13.466
|
||||||
|
C9.924,14.512,11.434,14.816,12.654,14.146 C13.5,13.68,14,12.85,14,12 L14,1.475
|
||||||
|
C14,0.91,13.534,0.5,12.97,0.5 Z" />
|
||||||
|
</vector>
|
12
app/src/main/res/drawable/ic_mimetype_file.xml
Executable file
12
app/src/main/res/drawable/ic_mimetype_file.xml
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M2.5,1 C2.22,1,2,1.22,2,1.5 L2,14.5 C2,14.78,2.22,15,2.5,15 L13.5,15
|
||||||
|
C13.78,15,14,14.78,14,14.5 L14,4 L11,1 Z" />
|
||||||
|
</vector>
|
12
app/src/main/res/drawable/ic_mimetype_folder.xml
Executable file
12
app/src/main/res/drawable/ic_mimetype_folder.xml
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:pathData="M1.5,2 C1.25,2,1,2.25,1,2.5 L1,13.5 C1,13.76,1.24,14,1.5,14 L14.5,14
|
||||||
|
C14.76,14,15,13.759,15,13.5 L15,4.5 C15,4.25,14.75,4,14.5,4 L8,4 L6,2 Z" />
|
||||||
|
</vector>
|
13
app/src/main/res/drawable/ic_mimetype_folder_drag_accept.xml
Executable file
13
app/src/main/res/drawable/ic_mimetype_folder_drag_accept.xml
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:pathData="M1.46,2 C1.21,2,1,2.21,1,2.46 L1,13.54 C1,13.798,1.202,14,1.46,14 L14.54,14
|
||||||
|
C14.798,14,15,13.798,15,13.54 L15,4.462 C15,4.212,14.79,3.999,14.54,3.999
|
||||||
|
L8,3.999 L6,2 L1.46,2 Z M2,5 L14,5 L14,13 L2,13 L2,5 Z" />
|
||||||
|
</vector>
|
20
app/src/main/res/drawable/ic_mimetype_folder_encrypted.xml
Executable file
20
app/src/main/res/drawable/ic_mimetype_folder_encrypted.xml
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:fillType="evenOdd"
|
||||||
|
android:pathData="M1.4609,2 C1.2109,2,1,2.2109,1,2.4609 L1,13.5389
|
||||||
|
C1,13.7969,1.2029,13.9999,1.4609,13.9999 L14.5389,13.9999
|
||||||
|
C14.7969,13.9999,14.9999,13.7969,14.9999,13.5389 L14.9999,4.4628
|
||||||
|
C14.9999,4.2128,14.7889,3.9979,14.5389,3.9979 L7.9999,3.9979 L5.9999,1.9999
|
||||||
|
L1.4608,1.9999 Z M8,5.8008 C8.8836,5.8008,9.5996,6.5167,9.5996,7.4004
|
||||||
|
L9.5996,8.1992 L10,8.1992 L10,11 L6,11 L6,8.1992 L6.4004,8.1992 L6.4004,7.4004
|
||||||
|
C6.4004,6.5167,7.1164,5.8008,8,5.8008 Z M8,6.5996
|
||||||
|
C7.5581,6.5996,7.1992,6.9585,7.1992,7.4004 L7.1992,8.1992 L8.8008,8.1992
|
||||||
|
L8.8008,7.4004 C8.8008,6.9585,8.4419,6.5996,8,6.5996 Z" />
|
||||||
|
</vector>
|
19
app/src/main/res/drawable/ic_mimetype_folder_external.xml
Executable file
19
app/src/main/res/drawable/ic_mimetype_folder_external.xml
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:fillType="evenOdd"
|
||||||
|
android:pathData="M1.46,2 C1.21,2,1,2.21,1,2.46 L1,13.54 C1,13.798,1.202,14,1.46,14 L14.54,14
|
||||||
|
C14.798,14,15,13.798,15,13.54 L15,4.462 C15,4.212,14.79,3.999,14.54,3.999
|
||||||
|
L8,3.999 L6,2 L1.46,2 Z M7.977,5.793 L11.547,5.793 L11.547,9.178 L10.355,8.05
|
||||||
|
L8.57,9.743 L7.38,8.613 L9.166,6.923 L7.976,5.793 Z M5.597,6.357 L7.38,6.357
|
||||||
|
L7.977,6.922 L5.597,6.922 L5.597,11.436 L10.355,11.436 L10.355,9.178
|
||||||
|
L10.951,9.742 L10.951,11.436 C10.951,11.748,10.686,12,10.356,12 L5.596,12
|
||||||
|
C5.266,12,5.001,11.748,5.001,11.436 L5.001,6.922
|
||||||
|
C5.001,6.609,5.267,6.357,5.597,6.357 Z" />
|
||||||
|
</vector>
|
29
app/src/main/res/drawable/ic_mimetype_folder_public.xml
Executable file
29
app/src/main/res/drawable/ic_mimetype_folder_public.xml
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:pathData="M1.5,2 C1.25,2,1,2.25,1,2.5 L1,13.5 C1,13.76,1.24,14,1.5,14 L14.5,14
|
||||||
|
C14.76,14,15,13.759,15,13.5 L15,4.5 C15,4.25,14.75,4,14.5,4 L8,4 L6,2 L1.5,2 Z
|
||||||
|
M9.834,5.5 C10.268,5.4981,10.7,5.6545,11.02,5.9746
|
||||||
|
C11.66,6.6153,11.66,7.7166,11.02,8.3574 L10.17,9.207
|
||||||
|
C10.197,8.7574,10.151,8.4573,9.8633,8.0508 L10.287,7.625
|
||||||
|
C10.562,7.3498,10.539,6.9967,10.289,6.709
|
||||||
|
C10.019,6.4391,9.645,6.4388,9.373,6.7109 L7.7266,8.3574
|
||||||
|
C7.4437,8.6404,7.431,8.9797,7.7246,9.2734 L6.9941,10.006
|
||||||
|
C6.7069,9.7186,6.5083,9.3329,6.4824,8.8984
|
||||||
|
C6.4568,8.464,6.6281,7.9913,6.9941,7.625 L8.6406,5.9766
|
||||||
|
C8.9651,5.6619,9.4004,5.5019,9.834,5.5 Z M9.0078,7.9902
|
||||||
|
C9.296,8.2773,9.4947,8.6645,9.5195,9.0996
|
||||||
|
C9.5449,9.5348,9.3746,10.006,9.0078,10.373 L7.3594,12.02
|
||||||
|
C6.7198,12.659,5.6199,12.659,4.9805,12.02
|
||||||
|
C4.3409,11.38,4.339,10.282,4.9805,9.6406 L5.8418,8.7773
|
||||||
|
C5.8155,9.2266,5.8645,9.5278,6.1523,9.9336 L5.7129,10.373
|
||||||
|
C5.4541,10.632,5.3887,10.963,5.7129,11.287
|
||||||
|
C5.9567,11.531,6.2686,11.594,6.6289,11.287 L8.2754,9.6406
|
||||||
|
C8.5401,9.3758,8.562,9.0075,8.2773,8.7227 L9.0078,7.9902 Z" />
|
||||||
|
</vector>
|
19
app/src/main/res/drawable/ic_mimetype_folder_shared.xml
Executable file
19
app/src/main/res/drawable/ic_mimetype_folder_shared.xml
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:pathData="M1.5,2 C1.25,2,1,2.25,1,2.5 L1,13.5 C1,13.76,1.24,14,1.5,14 L14.5,14
|
||||||
|
C14.76,14,15,13.759,15,13.5 L15,4.5 C15,4.25,14.75,4,14.5,4 L8,4 L6,2 L1.5,2 Z
|
||||||
|
M10.25,5.5 A1.25,1.25,0,0,1,11.5,6.75 A1.25,1.25,0,0,1,10.25,8
|
||||||
|
A1.25,1.25,0,0,1,9.4492,7.709 L6.998,8.9355 A1.25,1.25,0,0,1,7,9
|
||||||
|
A1.25,1.25,0,0,1,6.9961,9.0645 L9.4492,10.291 A1.25,1.25,0,0,1,10.25,10
|
||||||
|
A1.25,1.25,0,0,1,11.5,11.25 A1.25,1.25,0,0,1,10.25,12.5 A1.25,1.25,0,0,1,9,11.25
|
||||||
|
A1.25,1.25,0,0,1,9.0039,11.186 L6.5508,9.959 A1.25,1.25,0,0,1,5.75,10.25
|
||||||
|
A1.25,1.25,0,0,1,4.5,9 A1.25,1.25,0,0,1,5.75,7.75 A1.25,1.25,0,0,1,6.5508,8.041
|
||||||
|
L9.002,6.8145 A1.25,1.25,0,0,1,9,6.75 A1.25,1.25,0,0,1,10.25,5.5 Z" />
|
||||||
|
</vector>
|
14
app/src/main/res/drawable/ic_mimetype_folder_starred.xml
Executable file
14
app/src/main/res/drawable/ic_mimetype_folder_starred.xml
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:pathData="M1.5,2 C1.25,2,1,2.25,1,2.5 L1,13.5 C1,13.76,1.24,14,1.5,14 L14.5,14
|
||||||
|
C14.76,14,15,13.759,15,13.5 L15,4.5 C15,4.25,14.75,4,14.5,4 L8,4 L6,2 L1.5,2 Z
|
||||||
|
M8,5.25 L9.1,7.9004 L12,8.125 L9.75,10 L10.5,12.75 L8,11.199 L5.5,12.75 L6.25,10
|
||||||
|
L4,8.125 L6.9,7.9004 L8,5.25 Z" />
|
||||||
|
</vector>
|
14
app/src/main/res/drawable/ic_mimetype_image.xml
Executable file
14
app/src/main/res/drawable/ic_mimetype_image.xml
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M1.5,2 C1.3,2,1,2.3,1,2.5 L1,13.5 C1,13.7,1.3,14,1.5,14 L14.5,14
|
||||||
|
C14.7,14,15,13.7,15,13.5 L15,2.5 C15,2.3,14.7,2,14.5,2 Z M2,3 L14,3 L14,8 L13,7
|
||||||
|
L10,11 L7,8 L3,12 L2,12 Z M4.5,4 C3.67,4,3,4.67,3,5.5 S3.67,7,4.5,7
|
||||||
|
S6,6.33,6,5.5 S5.33,4,4.5,4 Z" />
|
||||||
|
</vector>
|
32
app/src/main/res/drawable/ic_mimetype_link.xml
Executable file
32
app/src/main/res/drawable/ic_mimetype_link.xml
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M7.95,0.65 C3.85,0.65,0.55,3.95,0.55,8.05 S3.85,15.45,7.95,15.45
|
||||||
|
S15.35,12.15,15.35,8.05 S12.05,0.65,7.95,0.65 Z M8.75,1.55
|
||||||
|
C10.05,1.55,11.15,2.35,12.25,2.85 L14.05,5.35 L13.75,6.45 L14.35,6.75
|
||||||
|
L14.35,9.15 C14.15,9.85,13.75,10.45,13.45,11.15
|
||||||
|
C13.25,11.25,13.45,10.35,13.35,10.15 C13.35,9.55,12.85,9.55,12.45,9.95
|
||||||
|
C12.05,10.25,11.05,10.25,10.95,9.55 C10.65,8.75,10.95,7.85,11.25,7.05
|
||||||
|
L10.65,6.35 L10.85,4.55 L10.05,3.65 L10.25,2.65 L9.25,2.05
|
||||||
|
C9.05,1.85,8.65,1.85,8.55,1.65 C8.65,1.65,8.75,1.55,8.75,1.55 Z M6.15,1.65
|
||||||
|
S6.25,1.65,6.25,1.75 C6.65,1.95,6.15,2.15,6.05,2.35
|
||||||
|
C5.55,2.65,6.35,3.05,6.55,3.35 C6.95,3.25,7.35,2.65,7.95,2.85
|
||||||
|
C8.65,2.65,8.55,3.45,9.05,3.85 C9.15,4.05,9.95,4.65,9.45,4.45
|
||||||
|
C8.95,4.05,8.45,4.05,8.15,4.55 C7.35,5.05,7.85,3.65,7.45,3.35
|
||||||
|
C6.85,2.65,7.05,3.85,7.05,4.25 C6.65,4.25,5.95,3.95,5.55,4.45 L5.95,5.05
|
||||||
|
L6.45,4.35 C6.45,4.05,6.55,4.55,6.75,4.65 C6.85,4.85,7.55,5.35,7.05,5.55
|
||||||
|
C6.25,5.95,5.65,6.65,4.95,7.25 C4.75,7.75,4.25,7.65,3.95,7.25
|
||||||
|
C3.25,6.85,3.25,7.95,3.35,8.35 L3.95,7.95 L3.95,9.05
|
||||||
|
C3.55,9.45,3.05,8.35,2.65,8.15 L2.65,6.55 C2.65,6.15,2.55,5.65,2.65,5.25
|
||||||
|
C3.45,4.35,4.35,3.35,4.85,2.25 L5.65,2.25 C6.25,2.45,5.95,1.55,6.15,1.65 Z
|
||||||
|
M4.95,9.85 C5.05,9.85,5.15,9.85,5.25,9.95 C6.05,10.05,6.65,10.65,7.25,11.05
|
||||||
|
C7.75,11.55,8.85,11.35,8.95,12.25 C8.75,13.15,7.85,13.65,7.15,13.95
|
||||||
|
C6.95,14.05,6.75,14.15,6.55,14.15 C5.85,14.35,5.55,13.55,5.35,13.05
|
||||||
|
C5.05,12.35,4.25,11.85,4.35,10.95 C4.35,10.55,4.55,9.95,4.95,9.85 Z" />
|
||||||
|
</vector>
|
16
app/src/main/res/drawable/ic_mimetype_location.xml
Executable file
16
app/src/main/res/drawable/ic_mimetype_location.xml
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:strokeColor="#969696"
|
||||||
|
android:strokeWidth="2"
|
||||||
|
android:pathData="M8,2 C10.2091,2,12,3.79086,12,6 C12,8.20914,10.2091,10,8,10
|
||||||
|
C5.79086,10,4,8.20914,4,6 C4,3.79086,5.79086,2,8,2 Z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M4,9 L12,9 L8,15 Z" />
|
||||||
|
</vector>
|
12
app/src/main/res/drawable/ic_mimetype_package_x_generic.xml
Executable file
12
app/src/main/res/drawable/ic_mimetype_package_x_generic.xml
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#0082c9"
|
||||||
|
android:pathData="M4,3 L2,5 L2,12.5 C2,12.76,2.24,13,2.5,13 L13.5,13 C13.76,13,14,12.76,14,12.5
|
||||||
|
L14,5 L12,3 Z M5,4 L11,4 L12,5 L4,5 Z" />
|
||||||
|
</vector>
|
14
app/src/main/res/drawable/ic_mimetype_text.xml
Executable file
14
app/src/main/res/drawable/ic_mimetype_text.xml
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M2.5,1 C2.22,1,2,1.22,2,1.5 L2,14.5 C2,14.78,2.22,15,2.5,15 L13.5,15
|
||||||
|
C13.78,15,14,14.78,14,14.5 L14,4 L11,1 L2.5,1 Z M4,3 L10,3 L10,4 L4,4 L4,3 Z
|
||||||
|
M4,6 L9,6 L9,7 L4,7 L4,6 Z M4,9 L12,9 L12,10 L4,10 L4,9 Z M4,12 L8,12 L8,13
|
||||||
|
L4,13 L4,12 Z" />
|
||||||
|
</vector>
|
16
app/src/main/res/drawable/ic_mimetype_text_calendar.xml
Executable file
16
app/src/main/res/drawable/ic_mimetype_text_calendar.xml
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M4,1 C3.5,1,3,1.5,3,2 L3,4 C3,4.5,3.5,5,4,5 S5,4.5,5,4 L5,2 C5,1.5,4.5,1,4,1 Z
|
||||||
|
M12,1 C11.5,1,11,1.5,11,2 L11,4 C11,4.5,11.5,5,12,5 S13,4.5,13,4 L13,2
|
||||||
|
C13,1.5,12.5,1,12,1 Z M5.5,3 L5.5,4 C5.5,4.831,5,5.5,4,5.5 S2.5,5,2.5,4
|
||||||
|
L2.5,3.0625 C1.6159,3.2895,1,4.0872,1,5 L1,13 C1,14.108,1.892,15,3,15 L13,15
|
||||||
|
C14.108,15,15,14.108,15,13 L15,5 C15,4.0872,14.3841,3.2895,13.5,3.0625 L13.5,4
|
||||||
|
C13.5,4.831,13,5.5,12,5.5 S10.5,5,10.5,4 L10.5,3 Z M13,8 L13,13 L3,13 L3,8 Z" />
|
||||||
|
</vector>
|
16
app/src/main/res/drawable/ic_mimetype_text_code.xml
Executable file
16
app/src/main/res/drawable/ic_mimetype_text_code.xml
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:strokeColor="#969696"
|
||||||
|
android:strokeWidth="2"
|
||||||
|
android:pathData="M6.3,3.714 L1.9284,8 L6.3,12.286" />
|
||||||
|
<path
|
||||||
|
android:strokeColor="#969696"
|
||||||
|
android:strokeWidth="2"
|
||||||
|
android:pathData="M9.7,12.286 L14.072,8 L9.7,3.714" />
|
||||||
|
</vector>
|
23
app/src/main/res/drawable/ic_mimetype_text_vcard.xml
Executable file
23
app/src/main/res/drawable/ic_mimetype_text_vcard.xml
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M10,1 C8.25,1,7,2.43,7,3.8 C7,5.2,7.1,6.2,7.8,7.3 C8,7.59,8.3,7.65,8.5,7.9
|
||||||
|
C8.635,8.4,8.74,8.9,8.6,9.4 C8.32,9.5,8.075,9.62,7.8,9.73
|
||||||
|
C7.715,9.58,7.57,9.53,7.33,9.33 C6.6,8.89,5.77,8.58,5,8.29
|
||||||
|
C4.9,7.92,4.9,7.64,5,7.29 C5.156,7.124,5.37,7.02,5.5,6.86
|
||||||
|
C5.96,6.26,6,5.206,6,4.49 C6,3.43,5.046,2.59,4,2.59 C2.83,2.59,2,3.59,2,4.49
|
||||||
|
C2,5.42,2.034,6.13,2.5,6.86 C2.63,7.06,2.867,7.12,3,7.29
|
||||||
|
C3.1,7.62,3.1,7.944,3,8.29 C2.15,8.59,1.4,8.93,0.66,9.33
|
||||||
|
C0.09,9.73,0.14,9.535,0,10.86 C-0.11,11.92,2.335,11.99,4,11.99
|
||||||
|
C4.06,11.99,4.11,11.99,4.17,11.99 C4.116,12.264,4.07,12.62,4,13.29
|
||||||
|
C3.84,14.88,7.5,14.99,10,14.99 S16.16,14.89,16,13.29
|
||||||
|
C15.785,11.29,15.77,11.58,15,10.99 C13.9,10.336,12.55,9.82,11.4,9.39
|
||||||
|
C11.25,8.83,11.36,8.42,11.5,7.89 C11.735,7.64,12,7.53,12.2,7.29
|
||||||
|
C12.9,6.405,13,4.865,13,3.79 C13,2.19,11.57,0.99,10,0.99 Z" />
|
||||||
|
</vector>
|
13
app/src/main/res/drawable/ic_mimetype_video.xml
Executable file
13
app/src/main/res/drawable/ic_mimetype_video.xml
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#969696"
|
||||||
|
android:pathData="M1.5,2 C1.3,2.05,1,2.29,1,2.5 L1,13.5 C1,13.73,1.274,14,1.5,14 L14.5,14
|
||||||
|
C14.84,14,15,13.74,15,13.5 L15,2.5 C15,2.16,14.751,2,14.5,2 Z M2,3 L14,3 L14,13
|
||||||
|
L2,13 Z M5,5 L5,11 L11,8 Z" />
|
||||||
|
</vector>
|
14
app/src/main/res/drawable/ic_mimetype_x_office_document.xml
Executable file
14
app/src/main/res/drawable/ic_mimetype_x_office_document.xml
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#49abea"
|
||||||
|
android:pathData="M2.5,1 C2.22,1,2,1.22,2,1.5 L2,14.5 C2,14.78,2.22,15,2.5,15 L13.5,15
|
||||||
|
C13.78,15,14,14.78,14,14.5 L14,4 L11,1 L2.5,1 Z M4,3 L10,3 L10,4 L4,4 L4,3 Z
|
||||||
|
M4,6 L9,6 L9,7 L4,7 L4,6 Z M4,9 L12,9 L12,10 L4,10 L4,9 Z M4,12 L8,12 L8,13
|
||||||
|
L4,13 L4,12 Z" />
|
||||||
|
</vector>
|
13
app/src/main/res/drawable/ic_mimetype_x_office_presentation.xml
Executable file
13
app/src/main/res/drawable/ic_mimetype_x_office_presentation.xml
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="16dp"
|
||||||
|
android:height="16dp"
|
||||||
|
android:viewportWidth="16"
|
||||||
|
android:viewportHeight="16">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#f0965f"
|
||||||
|
android:pathData="M1.5,2 C1.25,2,1,2.25,1,2.5 L1,13.5 C1,13.75,1.25,14,1.5,14 L14.5,14
|
||||||
|
C14.75,14,15,13.75,15,13.5 L15,2.5 C15,2.25,14.75,2,14.5,2 Z M2,5 L14,5 L14,11
|
||||||
|
L2,11 Z" />
|
||||||
|
</vector>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user