Groups and their messages will be deleted if they aren't on the server anymore

This commit is contained in:
Lyndon
2017-11-30 16:45:08 +01:00
parent 72c8fd3137
commit e8e4951c6a
5 changed files with 106 additions and 44 deletions

View File

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

View File

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

View File

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

View File

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

View File

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