diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java index f58fc882ccf240e011d3a4a1652b0b1fba91dee9..cb76664d86a702f3e5941795f1554ddc1ea583b6 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java @@ -121,6 +121,7 @@ public class BufferManager { Buffer buffer = buffer(bufferId); if (buffer != null) { buffer.renameBuffer(newName); + bufferIds().notifyItemChanged(bufferId); } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java index e8a37213491ef20cc35d1097b0405a23e1520cec..cba73fa3d267a8e099ac9becebacf6156675fb73 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java @@ -95,6 +95,7 @@ public class BufferSyncer extends ABufferSyncer { for (Message m : filtered) { addActivity(m); } + client.bufferManager().bufferIds().notifyItemChanged(buffer); _update(); } @@ -108,6 +109,7 @@ public class BufferSyncer extends ABufferSyncer { markerLines.put(buffer, msgId); client.backlogStorage().setMarkerLine(buffer, msgId); } + client.bufferManager().bufferIds().notifyItemChanged(buffer); _update(); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java index bb22de2bfa6798734b8d29256559552587d45254..2999b84838a1ab8cd2768ce8df388c111e796f95 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java @@ -37,6 +37,7 @@ import java.util.Set; import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.client.Client; +import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.abstracts.AIrcUser; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; @@ -288,15 +289,6 @@ public class IrcUser extends AIrcUser { public void _setRealName(String realName) { this.realName = realName; _update(); - for (String channel : this.channels) { - QNetwork network = this.network(); - if (network != null) { - QIrcChannel channel1 = network.ircChannel(channel); - if (channel1 != null) { - channel1.users().notifyItemChanged(nick); - } - } - } } @Override @@ -493,6 +485,18 @@ public class IrcUser extends AIrcUser { @Override public void _update() { super._update(); + for (String channel : this.channels) { + QNetwork network = this.network(); + if (network != null) { + QIrcChannel channel1 = network.ircChannel(channel); + if (channel1 != null) { + channel1.users().notifyItemChanged(nick); + } + } + } + QueryBuffer user = client.bufferManager().user(this); + if (user != null) + client.bufferManager().bufferIds().notifyItemChanged(user.getInfo().id); } @NonNull diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java index 0dae6699b0b9ad7eb93ff405507100a1a1745004..0f3512529a5ee558b143b2a9fe5a176fb9686bd4 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java @@ -104,6 +104,7 @@ import de.kuschku.util.accounts.AccountManager; import de.kuschku.util.annotationbind.AutoBinder; import de.kuschku.util.certificates.CertificateUtils; import de.kuschku.util.certificates.SQLiteCertificateManager; +import de.kuschku.util.observables.callbacks.ElementCallback; import de.kuschku.util.servicebound.BoundActivity; import de.kuschku.util.ui.DividerItemDecoration; import de.kuschku.util.ui.MenuTint; @@ -383,6 +384,10 @@ public class MainActivity extends BoundActivity { private void updateBuffer(int id) { nickListAdapter.setChannel(null); + updateTitleAndSubtitle(id); + } + + private void updateTitleAndSubtitle(int id) { Client client = context.client(); if (client != null) { Buffer buffer = client.bufferManager().buffer(id); @@ -393,7 +398,7 @@ public class MainActivity extends BoundActivity { if (user == null) { toolbarWrapper.setSubtitle(null); } else { - toolbarWrapper.setSubtitle(user.hostmask() + " | " + user.realName()); + toolbarWrapper.setSubtitle(user.realName()); } } else if (buffer instanceof ChannelBuffer) { QIrcChannel channel = ((ChannelBuffer) buffer).getChannel(); @@ -460,6 +465,23 @@ public class MainActivity extends BoundActivity { if (drawerLayout != null) drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + context.client().bufferManager().bufferIds().addCallback(new ElementCallback<Integer>() { + @Override + public void notifyItemInserted(Integer element) { + + } + + @Override + public void notifyItemRemoved(Integer element) { + + } + + @Override + public void notifyItemChanged(Integer element) { + if (element == context.client().backlogManager().open()) + updateTitleAndSubtitle(element); + } + }); context.client().backlogManager().open(status.bufferId); if (context.client().bufferViewManager() != null) { chatListSpinner.setAdapter(new BufferViewConfigSpinnerAdapter(context.client().bufferViewManager())); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java index 6eed74b4f7587d1d007053aacb084c07d0d6d039..399870d15d348db53fd89e3ac73f52c02be5b6cc 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java @@ -23,6 +23,7 @@ package de.kuschku.quasseldroid_ng.ui.chat.drawer; import com.bignerdranch.expandablerecyclerview.Model.ParentListItem; +import java.util.ArrayList; import java.util.List; import de.kuschku.libquassel.localtypes.buffers.Buffer; @@ -39,6 +40,7 @@ public class NetworkItem implements ParentListItem { private final AppContext context; private final QBufferViewConfig config; private final QNetwork network; + private final List<Buffer> bufferList = new ArrayList<>(); private final ObservableSortedList<Buffer> buffers = new ObservableSortedList<>(Buffer.class, new ObservableSortedList.ItemComparator<Buffer>() { @Override public int compare(Buffer o1, Buffer o2) { @@ -78,6 +80,7 @@ public class NetworkItem implements ParentListItem { Buffer buffer = context.client().bufferManager().buffer(element); if (buffer != null && buffer.getInfo().networkId == network.networkId()) { buffers.add(buffer); + bufferList.add(buffers.indexOf(buffer), buffer); } } @@ -85,16 +88,13 @@ public class NetworkItem implements ParentListItem { public void notifyItemRemoved(Integer element) { Buffer buffer = context.client().bufferManager().buffer(element); if (buffer != null && buffer.getInfo().networkId == network.networkId()) { - buffers.remove(buffer); + buffers.remove(bufferList.indexOf(buffer)); + bufferList.remove(buffer); } } @Override public void notifyItemChanged(Integer element) { - Buffer buffer = context.client().bufferManager().buffer(element); - if (buffer != null && buffer.getInfo().networkId == network.networkId() && buffers.contains(buffer)) { - buffers.notifyItemChanged(buffers.indexOf(buffer)); - } } }; private ObservableSet<Integer> backingSet; @@ -148,18 +148,41 @@ public class NetworkItem implements ParentListItem { } } }); + context.client().bufferManager().bufferIds().addCallback(new ElementCallback<Integer>() { + @Override + public void notifyItemInserted(Integer element) { + } + + @Override + public void notifyItemRemoved(Integer element) { + } + + @Override + public void notifyItemChanged(Integer element) { + Buffer buffer = NetworkItem.this.context.client().bufferManager().buffer(element); + if (buffer != null && buffer.getInfo().networkId == NetworkItem.this.network.networkId() && bufferList.contains(buffer)) { + buffers.remove(bufferList.indexOf(buffer)); + bufferList.remove(buffer); + buffers.add(buffer); + bufferList.add(buffers.indexOf(buffer), buffer); + } + } + }); } public void populateList(ObservableSet<Integer> backingSet) { if (this.backingSet != null) this.backingSet.removeCallback(callback); buffers.clear(); + bufferList.clear(); backingSet.addCallback(callback); for (int id : backingSet) { Buffer buffer = context.client().bufferManager().buffer(id); - if (buffer != null && buffer.getInfo().networkId == network.networkId()) + if (buffer != null && buffer.getInfo().networkId == network.networkId()) { buffers.add(buffer); + bufferList.add(buffers.indexOf(buffer), buffer); + } } this.backingSet = backingSet; } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java index f4f4f606f5f4a7f3ef7f1fb29e22875077cb44ca..09c34fcc8634b14c5ef303f4b0f4cb427c9e0395 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java @@ -44,6 +44,8 @@ import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; import de.kuschku.util.observables.lists.ObservableSortedList; public class NickListAdapter extends RecyclerView.Adapter<NickListAdapter.NickViewHolder> { + public static final int TYPE_NORMAL = 0; + public static final int TYPE_AWAY = 1; private final AppContext context; QIrcChannel channel; @@ -125,10 +127,20 @@ public class NickListAdapter extends RecyclerView.Adapter<NickListAdapter.NickVi @Override public NickViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_nick, parent, false); + View view = inflater.inflate(getLayoutResource(viewType), parent, false); return new NickViewHolder(view); } + public int getLayoutResource(int viewType) { + switch (viewType) { + default: + case TYPE_NORMAL: + return R.layout.widget_nick; + case TYPE_AWAY: + return R.layout.widget_nick_away; + } + } + @Override public void onBindViewHolder(NickViewHolder holder, int position) { holder.bind(users.get(position)); @@ -148,6 +160,11 @@ public class NickListAdapter extends RecyclerView.Adapter<NickListAdapter.NickVi return builder.toString(); } + @Override + public int getItemViewType(int position) { + return users.get(position).isAway() ? TYPE_AWAY : TYPE_NORMAL; + } + class NickViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.mode) TextView mode; diff --git a/app/src/main/res/layout/widget_nick.xml b/app/src/main/res/layout/widget_nick.xml index 5fe59b912eadd91561dbe248189db09d4598a5d6..9e9ee3ff88db9d638232d4f4947ab7cb3f326f4f 100644 --- a/app/src/main/res/layout/widget_nick.xml +++ b/app/src/main/res/layout/widget_nick.xml @@ -20,15 +20,16 @@ ~ with this program. If not, see <http://www.gnu.org/licenses/>. --> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="56dp" + android:background="?selectableItemBackground" + android:clickable="true" + android:orientation="horizontal" + android:paddingLeft="?listPreferredItemPaddingLeft" + android:paddingRight="?listPreferredItemPaddingRight"> <TextView android:id="@+id/mode" diff --git a/app/src/main/res/layout/widget_nick_away.xml b/app/src/main/res/layout/widget_nick_away.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b0fb2f3f4c36ebd67b598668218a3d12cb6f04c --- /dev/null +++ b/app/src/main/res/layout/widget_nick_away.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ QuasselDroid - Quassel client for Android + ~ Copyright (C) 2016 Janne Koschinski + ~ Copyright (C) 2016 Ken Børge Viktil + ~ Copyright (C) 2016 Magnus Fjell + ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> + ~ + ~ 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/>. + --> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="56dp" + android:background="?selectableItemBackground" + android:clickable="true" + android:orientation="horizontal" + android:paddingLeft="?listPreferredItemPaddingLeft" + android:paddingRight="?listPreferredItemPaddingRight"> + + <TextView + android:id="@+id/mode" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginBottom="8dp" + android:layout_marginTop="8dp" + android:background="@drawable/badge" + android:fontFamily="monospace" + android:gravity="center" + android:minWidth="40dp" + android:textColor="?colorBackground" + android:textStyle="bold" + tools:text="\@" + /> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" + android:layout_weight="1" + android:gravity="center_vertical|start" + android:orientation="vertical"> + + <TextView + android:id="@+id/nick" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:fontFamily="sans-serif-medium" + android:gravity="center_vertical|start" + android:lines="1" + android:singleLine="true" + android:textColor="?colorForegroundSecondary" + android:textSize="@dimen/material_drawer_item_primary_text" + android:textStyle="italic" + tools:text="justJanne"/> + + <TextView + android:id="@+id/realname" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:fontFamily="sans-serif" + android:gravity="center_vertical|start" + android:lines="1" + android:singleLine="true" + android:textColor="?colorForegroundSecondary" + android:textSize="@dimen/material_drawer_item_primary_description" + android:textStyle="italic" + tools:text="Janne Koschinski: https://kuschku.de/"/> + </LinearLayout> +</LinearLayout> \ No newline at end of file