diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/build.gradle b/BeWoPlanerChat/bewoplaner-chat-android/app/build.gradle index ee67134..97a0cbb 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/build.gradle +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/build.gradle @@ -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' diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/GroupRealmRepository.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/GroupRealmRepository.java index 2f0d7a1..271f743 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/GroupRealmRepository.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/GroupRealmRepository.java @@ -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 { private final Mapper mToRealmMapper; private final Mapper mToGroupMapper; - public GroupRealmRepository(RealmProvider realmProvider, - Mapper toRealmMapper, - Mapper toMessageMapper) { + public GroupRealmRepository(RealmProvider realmProvider, Mapper toRealmMapper, Mapper toMessageMapper) { mRealmProvider = realmProvider; mToRealmMapper = toRealmMapper; mToGroupMapper = toMessageMapper; @@ -100,52 +102,60 @@ public class GroupRealmRepository implements Repository { GroupByIdSpecification realmSpecification = (GroupByIdSpecification) specification; + int itemsSize = ((ArrayList) items).size(); + + Long[] ids = new Long[itemsSize]; + for(int i = 0; i < ids.length; i++) { + ids[i] = ((ArrayList) items).get(i).id; + } + + List filePaths = new ArrayList<>(); + boolean hasGroupsToDelete = false; + boolean hasMessagesToDelete = false; + try { realmWrapper.realm = mRealmProvider.provide(); realmWrapper.realm.beginTransaction(); - Long[] ids = new Long[((ArrayList) items).size()]; - for(int i = 0; i < ids.length; i++) { - ids[i] = ((ArrayList) items).get(i).id; - } - RealmResults allWhoAreNotComingFromTheServer = realmWrapper.realm.where(GroupRealm.class).not().in(GroupRealm.ID, ids).findAll(); RealmResults 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 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 { 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 { 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 { .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 { .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 userRealms = groupToUpdate.getUserIdList(); ArrayList 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(), diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/GroupRealm.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/GroupRealm.java index 66b2bc0..31162f1 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/GroupRealm.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/GroupRealm.java @@ -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); } diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatPresenter.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatPresenter.java index 0c3c1ea..336e56b 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatPresenter.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatPresenter.java @@ -566,14 +566,18 @@ public class ChatPresenter extends MVPAbstractPresenter 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); } diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsPresenter.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsPresenter.java index d7ade96..bf1e97e 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsPresenter.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsPresenter.java @@ -102,6 +102,7 @@ class ContactsPresenter extends MVPAbstractPresenter 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;