Skip to content
Snippets Groups Projects
Commit 2471328a authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Fixed even more memory leaks.

parent a211edfe
Branches
Tags
No related merge requests found
Showing
with 243 additions and 101 deletions
......@@ -28,6 +28,10 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import de.kuschku.libquassel.client.Client;
import de.kuschku.libquassel.message.Message;
import de.kuschku.libquassel.primitives.types.BufferInfo;
......@@ -48,18 +52,7 @@ public class BacklogFilter implements UICallback {
private final ObservableComparableSortedList<Message> filtered;
private final EventBus bus = new EventBus();
@Nullable
private CharSequence searchQuery;
private Message markerlineMessage;
public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) {
this.client = client;
this.bufferId = bufferId;
this.unfiltered = unfiltered;
this.filtered = filtered;
this.bus.register(this);
client.bufferSyncer().getFilteredTypes(bufferId).addCallback(new ElementCallback<Message.Type>() {
ElementCallback<Message.Type> typeCallback = new ElementCallback<Message.Type>() {
@Override
public void notifyItemInserted(Message.Type element) {
bus.post(new UpdateRemoveEvent());
......@@ -74,7 +67,18 @@ public class BacklogFilter implements UICallback {
public void notifyItemChanged(Message.Type element) {
}
});
};
@Nullable
private CharSequence searchQuery;
private Message markerlineMessage;
public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) {
this.client = client;
this.bufferId = bufferId;
this.unfiltered = unfiltered;
this.filtered = filtered;
this.bus.register(this);
client.bufferSyncer().getFilteredTypes(bufferId).addCallback(typeCallback);
updateDayChangeMessages();
}
......@@ -207,12 +211,18 @@ public class BacklogFilter implements UICallback {
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventAsync(@NonNull MessageFilterEvent event) {
if (!filterItem(event.msg)) bus.post(new MessageInsertEvent(event.msg));
List<Message> filteredMessages = new ArrayList<>();
for (Message message : event.msgs) {
if (!filterItem(message))
filteredMessages.add(message);
}
bus.post(new MessageInsertEvent(filteredMessages));
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(@NonNull MessageInsertEvent event) {
filtered.add(event.msg);
filtered.addAll(event.msgs);
}
@Subscribe(threadMode = ThreadMode.MAIN)
......@@ -222,12 +232,14 @@ public class BacklogFilter implements UICallback {
@Override
public void notifyItemChanged(int position) {
filtered.notifyItemChanged(position);
int position1 = filtered.indexOf(unfiltered.get(position));
if (position1 != -1)
filtered.notifyItemChanged(position1);
}
@Override
public void notifyItemRemoved(int position) {
filtered.remove(position);
bus.post(new MessageRemoveEvent(unfiltered.get(position)));
}
@Override
......@@ -237,9 +249,8 @@ public class BacklogFilter implements UICallback {
@Override
public void notifyItemRangeInserted(int position, int count) {
for (int i = position; i < position + count; i++) {
notifyItemInserted(i);
}
List<Message> message = unfiltered.subList(position, position + count);
bus.post(new MessageFilterEvent(message));
}
@Override
......@@ -256,11 +267,21 @@ public class BacklogFilter implements UICallback {
}
}
public void onDestroy() {
bus.unregister(this);
client.bufferSyncer().getFilteredTypes(bufferId).removeCallback(typeCallback);
typeCallback = null;
}
private class MessageInsertEvent {
public final Message msg;
public final List<Message> msgs;
public MessageInsertEvent(Message msg) {
this.msg = msg;
this.msgs = Collections.singletonList(msg);
}
public MessageInsertEvent(List<Message> msgs) {
this.msgs = msgs;
}
}
......@@ -273,10 +294,14 @@ public class BacklogFilter implements UICallback {
}
private class MessageFilterEvent {
public final Message msg;
public final List<Message> msgs;
public MessageFilterEvent(Message msg) {
this.msg = msg;
this.msgs = Collections.singletonList(msg);
}
public MessageFilterEvent(List<Message> msgs) {
this.msgs = msgs;
}
}
......
......@@ -29,6 +29,7 @@ import android.util.SparseArray;
import com.raizlabs.android.dbflow.config.FlowManager;
import com.raizlabs.android.dbflow.sql.language.SQLite;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
......@@ -88,14 +89,17 @@ public class HybridBacklogStorage implements BacklogStorage {
for (Message message : messages) {
client.unbufferBuffer(message.bufferInfo);
synchronized (backlogs) {
if (backlogs.get(bufferId) != null)
backlogs.get(bufferId).add(message);
client.bufferSyncer().addActivity(message);
message.save();
message.bufferInfo.save();
}
updateLatest(message);
}
synchronized (backlogs) {
if (backlogs.get(bufferId) != null)
backlogs.get(bufferId).addAll(Arrays.asList(messages));
}
});
}
......@@ -113,6 +117,11 @@ public class HybridBacklogStorage implements BacklogStorage {
}
updateLatest(message);
}
synchronized (backlogs) {
if (backlogs.get(bufferId) != null)
backlogs.get(bufferId).addAll(messages);
}
});
}
......@@ -130,6 +139,7 @@ public class HybridBacklogStorage implements BacklogStorage {
synchronized (backlogs) {
if (backlogs.get(message.bufferInfo.id) != null)
backlogs.get(message.bufferInfo.id).add(message);
if (client.bufferSyncer() != null)
client.bufferSyncer().addActivity(message);
message.save();
message.bufferInfo.save();
......@@ -163,13 +173,18 @@ public class HybridBacklogStorage implements BacklogStorage {
@Override
public void markBufferUnused(@IntRange(from = 0) int bufferid) {
synchronized (backlogs) {
if (backlogs.get(bufferid) != null && filters.get(bufferid) != null)
backlogs.get(bufferid).removeCallback(filters.get(bufferid));
BacklogFilter filter = filters.get(bufferid);
if (backlogs.get(bufferid) != null && filter != null)
backlogs.get(bufferid).removeCallbacks();
backlogs.remove(bufferid);
filteredBacklogs.remove(bufferid);
if (filter != null)
filter.onDestroy();
if (filteredBacklogs.get(bufferid) != null)
filteredBacklogs.get(bufferid).removeCallbacks();
filteredBacklogs.delete(bufferid);
synchronized (filterSet) {
filterSet.remove(filters.get(bufferid));
filters.remove(bufferid);
filterSet.remove(filter);
filters.delete(bufferid);
}
}
}
......
......@@ -179,13 +179,14 @@ public class BacklogManager extends ABacklogManager {
assertNotNull(provider);
int oldBuffer = open();
if (oldBuffer != bufferId) {
setOpen(bufferId);
if (bufferId != -1 && client.bufferSyncer() != null)
client.bufferSyncer().requestMarkBufferAsRead(bufferId);
provider.sendEvent(new BufferChangeEvent());
if (oldBuffer != bufferId)
client.backlogStorage().markBufferUnused(oldBuffer);
}
}
@Override
public int open() {
......
......@@ -115,42 +115,106 @@ public class SlidingPanelHandler {
case R.id.fill_clear:
editor.toggleBackground(-1);
return true;
case R.id.fill_mircColor0: editor.toggleBackground(0x0); return true;
case R.id.fill_mircColor1: editor.toggleBackground(0x1); return true;
case R.id.fill_mircColor2: editor.toggleBackground(0x2); return true;
case R.id.fill_mircColor3: editor.toggleBackground(0x3); return true;
case R.id.fill_mircColor4: editor.toggleBackground(0x4); return true;
case R.id.fill_mircColor5: editor.toggleBackground(0x5); return true;
case R.id.fill_mircColor6: editor.toggleBackground(0x6); return true;
case R.id.fill_mircColor7: editor.toggleBackground(0x7); return true;
case R.id.fill_mircColor8: editor.toggleBackground(0x8); return true;
case R.id.fill_mircColor9: editor.toggleBackground(0x9); return true;
case R.id.fill_mircColorA: editor.toggleBackground(0xA); return true;
case R.id.fill_mircColorB: editor.toggleBackground(0xB); return true;
case R.id.fill_mircColorC: editor.toggleBackground(0xC); return true;
case R.id.fill_mircColorD: editor.toggleBackground(0xD); return true;
case R.id.fill_mircColorE: editor.toggleBackground(0xE); return true;
case R.id.fill_mircColorF: editor.toggleBackground(0xF); return true;
case R.id.fill_mircColor0:
editor.toggleBackground(0x0);
return true;
case R.id.fill_mircColor1:
editor.toggleBackground(0x1);
return true;
case R.id.fill_mircColor2:
editor.toggleBackground(0x2);
return true;
case R.id.fill_mircColor3:
editor.toggleBackground(0x3);
return true;
case R.id.fill_mircColor4:
editor.toggleBackground(0x4);
return true;
case R.id.fill_mircColor5:
editor.toggleBackground(0x5);
return true;
case R.id.fill_mircColor6:
editor.toggleBackground(0x6);
return true;
case R.id.fill_mircColor7:
editor.toggleBackground(0x7);
return true;
case R.id.fill_mircColor8:
editor.toggleBackground(0x8);
return true;
case R.id.fill_mircColor9:
editor.toggleBackground(0x9);
return true;
case R.id.fill_mircColorA:
editor.toggleBackground(0xA);
return true;
case R.id.fill_mircColorB:
editor.toggleBackground(0xB);
return true;
case R.id.fill_mircColorC:
editor.toggleBackground(0xC);
return true;
case R.id.fill_mircColorD:
editor.toggleBackground(0xD);
return true;
case R.id.fill_mircColorE:
editor.toggleBackground(0xE);
return true;
case R.id.fill_mircColorF:
editor.toggleBackground(0xF);
return true;
case R.id.paint_clear:
editor.toggleForeground(-1);
return true;
case R.id.paint_mircColor0: editor.toggleForeground(0x0); return true;
case R.id.paint_mircColor1: editor.toggleForeground(0x1); return true;
case R.id.paint_mircColor2: editor.toggleForeground(0x2); return true;
case R.id.paint_mircColor3: editor.toggleForeground(0x3); return true;
case R.id.paint_mircColor4: editor.toggleForeground(0x4); return true;
case R.id.paint_mircColor5: editor.toggleForeground(0x5); return true;
case R.id.paint_mircColor6: editor.toggleForeground(0x6); return true;
case R.id.paint_mircColor7: editor.toggleForeground(0x7); return true;
case R.id.paint_mircColor8: editor.toggleForeground(0x8); return true;
case R.id.paint_mircColor9: editor.toggleForeground(0x9); return true;
case R.id.paint_mircColorA: editor.toggleForeground(0xA); return true;
case R.id.paint_mircColorB: editor.toggleForeground(0xB); return true;
case R.id.paint_mircColorC: editor.toggleForeground(0xC); return true;
case R.id.paint_mircColorD: editor.toggleForeground(0xD); return true;
case R.id.paint_mircColorE: editor.toggleForeground(0xE); return true;
case R.id.paint_mircColorF: editor.toggleForeground(0xF); return true;
case R.id.paint_mircColor0:
editor.toggleForeground(0x0);
return true;
case R.id.paint_mircColor1:
editor.toggleForeground(0x1);
return true;
case R.id.paint_mircColor2:
editor.toggleForeground(0x2);
return true;
case R.id.paint_mircColor3:
editor.toggleForeground(0x3);
return true;
case R.id.paint_mircColor4:
editor.toggleForeground(0x4);
return true;
case R.id.paint_mircColor5:
editor.toggleForeground(0x5);
return true;
case R.id.paint_mircColor6:
editor.toggleForeground(0x6);
return true;
case R.id.paint_mircColor7:
editor.toggleForeground(0x7);
return true;
case R.id.paint_mircColor8:
editor.toggleForeground(0x8);
return true;
case R.id.paint_mircColor9:
editor.toggleForeground(0x9);
return true;
case R.id.paint_mircColorA:
editor.toggleForeground(0xA);
return true;
case R.id.paint_mircColorB:
editor.toggleForeground(0xB);
return true;
case R.id.paint_mircColorC:
editor.toggleForeground(0xC);
return true;
case R.id.paint_mircColorD:
editor.toggleForeground(0xD);
return true;
case R.id.paint_mircColorE:
editor.toggleForeground(0xE);
return true;
case R.id.paint_mircColorF:
editor.toggleForeground(0xF);
return true;
default:
return false;
......
......@@ -147,7 +147,8 @@ public class ChatListEditActivity extends BoundActivity {
})
.build()
.show();
} return true;
}
return true;
case R.id.action_confirm: {
save();
finish();
......
......@@ -167,7 +167,8 @@ public class IdentityCreateActivity extends BoundActivity {
finish();
}
} return true;
}
return true;
default:
return super.onOptionsItemSelected(item);
}
......
......@@ -181,11 +181,13 @@ public class IdentityEditActivity extends BoundActivity {
})
.build()
.show();
} return true;
}
return true;
case R.id.action_confirm: {
save();
finish();
} return true;
}
return true;
default:
return super.onOptionsItemSelected(item);
}
......
......@@ -143,7 +143,8 @@ public class IdentityNickListActivity extends BoundActivity implements OnStartDr
intent.putStringArrayListExtra("nicks", nicks);
setResult(RESULT_OK, intent);
finish();
} return true;
}
return true;
default:
return super.onOptionsItemSelected(item);
}
......
......@@ -164,13 +164,15 @@ public class NetworkCreateActivity extends BoundActivity {
switch (requestCode) {
case REQUEST_PERFORM: {
} break;
}
break;
case REQUEST_SERVER_LIST: {
Parcelable[] servers = data.getParcelableArrayExtra("servers");
if (servers != null) {
serverList = NetworkServerSerializeHelper.deserialize(servers);
}
} break;
}
break;
}
}
}
......
......@@ -256,11 +256,13 @@ public class NetworkEditActivity extends BoundActivity {
})
.build()
.show();
} return true;
}
return true;
case R.id.action_confirm: {
save();
finish();
} return true;
}
return true;
default:
return super.onOptionsItemSelected(item);
}
......
......@@ -183,7 +183,8 @@ public class NetworkServerEditActivity extends BoundActivity {
intent.putExtra("id", id);
setResult(RESULT_OK, intent);
finish();
} return true;
}
return true;
default:
return super.onOptionsItemSelected(item);
}
......
......@@ -117,7 +117,8 @@ public class NetworkServerListActivity extends BoundActivity implements OnStartD
intent.putExtra("servers", NetworkServerSerializeHelper.serialize(servers));
setResult(RESULT_OK, intent);
finish();
} return true;
}
return true;
default:
return super.onOptionsItemSelected(item);
}
......
......@@ -42,6 +42,7 @@ public class AccountSelectActivity extends AppCompatActivity {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
@Bind(R.id.view_pager)
ViewPager viewPager;
@Bind(R.id.btn)
......
......@@ -25,4 +25,6 @@ public interface IObservable<T> {
void addCallback(T callback);
void removeCallback(T callback);
void removeCallbacks();
}
......@@ -62,4 +62,9 @@ public class MultiDrawerItemCallback implements DrawerItemCallback, IObservable<
public void removeCallback(DrawerItemCallback callback) {
callbacks.remove(callback);
}
@Override
public void removeCallbacks() {
callbacks.clear();
}
}
......@@ -75,4 +75,8 @@ public class MultiElementCallbackWrapper<T> implements ElementCallback<T> {
callback.notifyItemChanged(element);
}
}
public void removeCallbacks() {
callbacks.clear();
}
}
......@@ -61,4 +61,9 @@ public class MultiGeneralCallback<T> implements IObservable<GeneralCallback<T>>,
public void removeCallback(GeneralCallback<T> callback) {
callbacks.remove(callback);
}
@Override
public void removeCallbacks() {
callbacks.clear();
}
}
......@@ -101,4 +101,8 @@ public class MultiUICallbackWrapper implements UICallback {
callback.notifyItemRangeRemoved(position, count);
}
}
public void removeCallbacks() {
callbacks.clear();
}
}
......@@ -55,6 +55,11 @@ public class ObservableElementList<T> extends ArrayList<T> implements IObservabl
this.callback.removeCallback(callback);
}
@Override
public void removeCallbacks() {
callback.removeCallbacks();
}
private int getPosition() {
return isEmpty() ? 0 : size() - 1;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment