Groups and their messages will be deleted if they aren't on the server anymore
This commit is contained in:
@@ -9,7 +9,7 @@ buildscript {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'io.fabric.tools:gradle:1.+'
|
||||
classpath 'io.fabric.tools:gradle:1.25.0'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +34,10 @@ android {
|
||||
applicationId "de.beyondsoft.ownchat"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 26
|
||||
versionCode 9
|
||||
versionName "1.9"
|
||||
versionCode 10
|
||||
versionName "1.10"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
multiDexEnabled true
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@@ -51,6 +52,7 @@ android {
|
||||
buildTypes {
|
||||
debug {
|
||||
ext.enableCrashlytics = false
|
||||
minifyEnabled = false
|
||||
}
|
||||
|
||||
release {
|
||||
@@ -111,7 +113,7 @@ dependencies {
|
||||
compile 'com.github.bumptech.glide:glide:3.7.0'
|
||||
compile 'de.hdodenhof:circleimageview:2.1.0'
|
||||
compile 'com.scottyab:secure-preferences-lib:0.1.4'
|
||||
compile 'com.google.firebase:firebase-messaging:11.6.0'
|
||||
compile 'com.google.firebase:firebase-messaging:11.6.2'
|
||||
compile 'hani.momanii.supernova_emoji_library:supernova-emoji-library:0.0.2'
|
||||
compile 'com.github.lzyzsd:circleprogress:1.2.1'
|
||||
compile 'org.greenrobot:eventbus:3.0.0'
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package de.beyondsoft.ownchat.data.repository;
|
||||
|
||||
import android.os.Environment;
|
||||
import android.util.Log;
|
||||
|
||||
import de.beyondsoft.ownchat.BewoplanerApplication;
|
||||
import de.beyondsoft.ownchat.data.repository.mapper.Mapper;
|
||||
import de.beyondsoft.ownchat.data.repository.models.GroupRealm;
|
||||
import de.beyondsoft.ownchat.data.repository.models.MessageRealm;
|
||||
@@ -13,11 +15,13 @@ import de.beyondsoft.ownchat.model.Group;
|
||||
import de.beyondsoft.ownchat.model.Message;
|
||||
import de.beyondsoft.ownchat.model.User;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import de.beyondsoft.ownchat.utils.Constants;
|
||||
import io.realm.Realm;
|
||||
import io.realm.RealmList;
|
||||
import io.realm.RealmQuery;
|
||||
@@ -35,9 +39,7 @@ public class GroupRealmRepository implements Repository<Group> {
|
||||
private final Mapper<Group, GroupRealm> mToRealmMapper;
|
||||
private final Mapper<GroupRealm, Group> mToGroupMapper;
|
||||
|
||||
public GroupRealmRepository(RealmProvider realmProvider,
|
||||
Mapper<Group, GroupRealm> toRealmMapper,
|
||||
Mapper<GroupRealm, Group> toMessageMapper) {
|
||||
public GroupRealmRepository(RealmProvider realmProvider, Mapper<Group, GroupRealm> toRealmMapper, Mapper<GroupRealm, Group> toMessageMapper) {
|
||||
mRealmProvider = realmProvider;
|
||||
mToRealmMapper = toRealmMapper;
|
||||
mToGroupMapper = toMessageMapper;
|
||||
@@ -100,52 +102,60 @@ public class GroupRealmRepository implements Repository<Group> {
|
||||
|
||||
GroupByIdSpecification realmSpecification = (GroupByIdSpecification) specification;
|
||||
|
||||
int itemsSize = ((ArrayList<Group>) items).size();
|
||||
|
||||
Long[] ids = new Long[itemsSize];
|
||||
for(int i = 0; i < ids.length; i++) {
|
||||
ids[i] = ((ArrayList<Group>) items).get(i).id;
|
||||
}
|
||||
|
||||
List<String> filePaths = new ArrayList<>();
|
||||
boolean hasGroupsToDelete = false;
|
||||
boolean hasMessagesToDelete = false;
|
||||
|
||||
try {
|
||||
realmWrapper.realm = mRealmProvider.provide();
|
||||
realmWrapper.realm.beginTransaction();
|
||||
|
||||
Long[] ids = new Long[((ArrayList<Group>) items).size()];
|
||||
for(int i = 0; i < ids.length; i++) {
|
||||
ids[i] = ((ArrayList<Group>) items).get(i).id;
|
||||
}
|
||||
|
||||
RealmResults<GroupRealm> allWhoAreNotComingFromTheServer = realmWrapper.realm.where(GroupRealm.class).not().in(GroupRealm.ID, ids).findAll();
|
||||
RealmResults<MessageRealm> messagesToDelete = realmWrapper.realm.where(MessageRealm.class).not().in(MessageRealm.GROUP_ID, ids).findAll();
|
||||
|
||||
long userId = ((GroupByIdSpecification) specification).getUserId();
|
||||
Log.d("REALM_TRANSACTION", String.format(Locale.getDefault(),"UserId: %d", userId));
|
||||
|
||||
|
||||
for(GroupRealm groupRealm : allWhoAreNotComingFromTheServer) {
|
||||
RealmList<UserRealm> userIdList = groupRealm.getUserIdList();
|
||||
for(UserRealm userRealm : userIdList) {
|
||||
// TODO: Are there groups with just two users that aren't normal chats?
|
||||
for(MessageRealm mr : messagesToDelete) {
|
||||
if(mr.isFileDownloaded()) {
|
||||
filePaths.add(mr.getFilePath());
|
||||
}
|
||||
}
|
||||
|
||||
hasGroupsToDelete = allWhoAreNotComingFromTheServer.size() > 0;
|
||||
hasMessagesToDelete = messagesToDelete.size() > 0;
|
||||
|
||||
Log.d("REALM_TRANSACTION", String.format(Locale.getDefault(), "Number of groups to delete: %d and the number of their messages: %d", allWhoAreNotComingFromTheServer.size(), messagesToDelete.size()));
|
||||
//realmWrapper.realm.where(GroupRealm.class).not().in(GroupRealm.ID, ids).findAll().deleteAllFromRealm();
|
||||
//realmWrapper.realm.where(MessageRealm.class).not().in(MessageRealm.GROUP_ID, ids).findAll().deleteAllFromRealm();
|
||||
|
||||
int j = 0;
|
||||
for(MessageRealm mr : messagesToDelete) {
|
||||
if(j == 10) {
|
||||
break;
|
||||
}
|
||||
|
||||
String[] splitFileName = mr.getFilePath().split("/");
|
||||
|
||||
Log.d("REALM_TRANSACTION", String.format(Locale.getDefault(), "%2d. %s; Has been downloaded: %s", (j+1), splitFileName[splitFileName.length - 1], mr.isFileDownloaded()));
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
realmWrapper.realm.commitTransaction();
|
||||
realmWrapper.realm.close();
|
||||
} catch(Exception e) {
|
||||
Log.e("REALM_TRANSACTION", e.getMessage());
|
||||
|
||||
realmWrapper.realm.cancelTransaction();
|
||||
realmWrapper.realm.close();
|
||||
Log.e("REALM_TRANSACTION", "Error: " + e.getMessage());
|
||||
}
|
||||
|
||||
if(hasGroupsToDelete) {
|
||||
removeGroupsById(ids);
|
||||
}
|
||||
|
||||
if(hasMessagesToDelete) {
|
||||
removeMessagesByGroupIds(ids);
|
||||
|
||||
// for (String path : filePaths) {
|
||||
// ///storage/emulated/0/Android/data/de.beyondsoft.ownchat/files/26_1512056288.pdf
|
||||
// String[] splitFileName = path.split("/");
|
||||
// String fileName = splitFileName[splitFileName.length - 1];
|
||||
//
|
||||
// boolean fileExists = (new File(getExternalFilesDir(), "ownChat" + File.separator + fileName)).exists();
|
||||
//
|
||||
// Log.d("REALM_TRANSACTION", String.format(Locale.getDefault(), "%s; exists on phone: %s", splitFileName[splitFileName.length - 1], fileExists));
|
||||
// }
|
||||
}
|
||||
|
||||
return Observable.from(items)
|
||||
@@ -153,7 +163,6 @@ public class GroupRealmRepository implements Repository<Group> {
|
||||
realmWrapper.realm = mRealmProvider.provide();
|
||||
realmWrapper.realm.beginTransaction();
|
||||
})
|
||||
|
||||
.map(mToRealmMapper::from)
|
||||
.doOnNext(newGroup -> {
|
||||
realmSpecification.setGroupId(newGroup.getId());
|
||||
@@ -174,6 +183,7 @@ public class GroupRealmRepository implements Repository<Group> {
|
||||
realmWrapper.realm.copyToRealmOrUpdate(newGroup);
|
||||
})
|
||||
.doOnError(throwable -> {
|
||||
Log.e("REALM_TRANSACTION", "Error while updating groups: " + throwable.getMessage());
|
||||
realmWrapper.realm.cancelTransaction();
|
||||
realmWrapper.realm.close();
|
||||
})
|
||||
@@ -184,6 +194,44 @@ public class GroupRealmRepository implements Repository<Group> {
|
||||
.toCompletable();
|
||||
}
|
||||
|
||||
private void removeGroupsById(Long[] groupIds) {
|
||||
final RealmWrapper realmWrapper = new RealmWrapper();
|
||||
|
||||
try {
|
||||
realmWrapper.realm = mRealmProvider.provide();
|
||||
realmWrapper.realm.beginTransaction();
|
||||
|
||||
realmWrapper.realm.where(GroupRealm.class).not().in(GroupRealm.ID, groupIds).findAll().deleteAllFromRealm();
|
||||
|
||||
realmWrapper.realm.commitTransaction();
|
||||
realmWrapper.realm.close();
|
||||
} catch(Exception e) {
|
||||
Log.e("REALM_TRANSACTION", "Error while removing groups: " + e.getMessage());
|
||||
|
||||
realmWrapper.realm.cancelTransaction();
|
||||
realmWrapper.realm.close();
|
||||
}
|
||||
}
|
||||
|
||||
private void removeMessagesByGroupIds(Long[] groupIds) {
|
||||
final RealmWrapper realmWrapper = new RealmWrapper();
|
||||
|
||||
try {
|
||||
realmWrapper.realm = mRealmProvider.provide();
|
||||
realmWrapper.realm.beginTransaction();
|
||||
|
||||
realmWrapper.realm.where(MessageRealm.class).not().in(MessageRealm.GROUP_ID, groupIds).findAll().deleteAllFromRealm();
|
||||
|
||||
realmWrapper.realm.commitTransaction();
|
||||
realmWrapper.realm.close();
|
||||
} catch(Exception e) {
|
||||
Log.e("REALM_TRANSACTION", "Error while removing messages from removed groups: " + e.getMessage());
|
||||
|
||||
realmWrapper.realm.cancelTransaction();
|
||||
realmWrapper.realm.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Completable remove(Specification specification) {
|
||||
return null;
|
||||
@@ -268,29 +316,33 @@ public class GroupRealmRepository implements Repository<Group> {
|
||||
.map(mToRealmMapper::from)
|
||||
.doOnNext(newGroup -> {
|
||||
realmSpecification.setGroupId(newGroup.getId());
|
||||
GroupRealm groupToUpdate =
|
||||
realmSpecification.toRealmQuery(realmWrapper.realm).findFirst();
|
||||
GroupRealm groupToUpdate = realmSpecification.toRealmQuery(realmWrapper.realm).findFirst();
|
||||
|
||||
if (groupToUpdate == null) {
|
||||
return;
|
||||
}
|
||||
if (groupToUpdate.getMessage() != null &&
|
||||
group.lastMessage.createdAt < (groupToUpdate.getMessage().getCreatedAt() / 1000)) {
|
||||
|
||||
if (groupToUpdate.getMessage() != null && group.lastMessage.createdAt < (groupToUpdate.getMessage().getCreatedAt() / 1000)) {
|
||||
return;
|
||||
}
|
||||
|
||||
RealmList<UserRealm> userRealms = groupToUpdate.getUserIdList();
|
||||
ArrayList<User> users = null;
|
||||
|
||||
if (userRealms != null) {
|
||||
users = new ArrayList<>(userRealms.size());
|
||||
|
||||
for (int i = 0, size = userRealms.size(); i < size; i++) {
|
||||
users.add(User.createFromUserRealm(userRealms.get(i)));
|
||||
}
|
||||
}
|
||||
|
||||
Message message = group.lastMessage;
|
||||
if (groupToUpdate.getMessage() != null
|
||||
&& groupToUpdate.getMessage().getUniqueId().equals(message.getUniqueId())
|
||||
&& groupToUpdate.getMessage().isRead()) {
|
||||
|
||||
if (groupToUpdate.getMessage() != null && groupToUpdate.getMessage().getUniqueId().equals(message.getUniqueId()) && groupToUpdate.getMessage().isRead()) {
|
||||
message.isRead = true;
|
||||
}
|
||||
|
||||
newGroup = new GroupRealm(groupToUpdate.getId(),
|
||||
groupToUpdate.getName(),
|
||||
groupToUpdate.getAvatar(),
|
||||
|
||||
@@ -44,11 +44,13 @@ public class GroupRealm extends RealmObject {
|
||||
this.createdAt = this.message != null ? this.message.getCreatedAt() : 0;
|
||||
this.onlyEmployees = onlyEmployees;
|
||||
this.mobile = mobile;
|
||||
|
||||
if (userList != null) {
|
||||
for (User l : userList) {
|
||||
this.userIdList.add(UserRealm.createFromUser(l));
|
||||
}
|
||||
}
|
||||
|
||||
this.userId = userId;
|
||||
this.uniqueId = id + "_" + userId;
|
||||
}
|
||||
@@ -61,6 +63,7 @@ public class GroupRealm extends RealmObject {
|
||||
if (group == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new GroupRealm(group.id, group.name, group.avatar, group.lastMessage, group.mobile, group.onlyEmployees, group.users, group.userId);
|
||||
}
|
||||
|
||||
|
||||
@@ -566,14 +566,18 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
Log.e("ChatPresenter", "downloadFile", e);
|
||||
|
||||
if (!isAttached()) {
|
||||
return;
|
||||
}
|
||||
|
||||
getView().stopItemProgress(itemPosition);
|
||||
|
||||
if (mSystemUtils.isNetworkUnavailable()) {
|
||||
getView().showError(R.string.error_no_internet_connection);
|
||||
return;
|
||||
}
|
||||
|
||||
getView().showError(R.string.error_something_went_wrong);
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,7 @@ class ContactsPresenter extends MVPAbstractPresenter<ContactsView> implements Co
|
||||
* Send error messages to view.
|
||||
*/
|
||||
private void groupsError(Throwable throwable) {
|
||||
Log.e("REALM_TRANSACTION", "An error occurred. This message was brought to you by ContactsPresenter");
|
||||
if (mSystemUtils.isNetworkUnavailable()) {
|
||||
getView().showError(R.string.error_no_internet_connection);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user