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

Added SSL Handling

parent 42fa2d26
Branches
Tags
No related merge requests found
Showing
with 275 additions and 257 deletions
package de.kuschku.libquassel.syncables.types;
import android.support.annotation.NonNull;
import android.util.Log;
import java.util.Collections;
import java.util.List;
import java.util.Map;
......@@ -290,7 +288,6 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> {
}
@NonNull
public IObservableList<ElementCallback<Integer>, Integer> getNetworkList() {
return NetworkList;
......
......@@ -10,7 +10,6 @@ import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.BufferViewManagerSerializer;
public class BufferViewManager extends SyncableObject<BufferViewManager> {
......
......@@ -2,7 +2,6 @@ package de.kuschku.libquassel.syncables.types;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import java.util.List;
import java.util.Map;
......@@ -12,7 +11,6 @@ import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.Syncable;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.IdentitySerializer;
public class Identity extends SyncableObject<Identity> {
......
......@@ -11,7 +11,6 @@ import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.message.Message;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer;
import static de.kuschku.util.AndroidAssert.assertEquals;
......@@ -94,15 +93,21 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
HARD(2);
public final int id;
Strictness(int id) {
this.id = id;
}
public static Strictness of(int id) {
switch (id) {
case 0: return UNMATCHED;
case 1: return SOFT;
case 2: return HARD;
default: return INVALID;
case 0:
return UNMATCHED;
case 1:
return SOFT;
case 2:
return HARD;
default:
return INVALID;
}
}
}
......@@ -114,15 +119,21 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
CTCP_IGNORE(2);
public final int id;
Type(int id) {
this.id = id;
}
public static Type of(int id) {
switch (id) {
case 0: return SENDER_IGNORE;
case 1: return MESSAGE_IGNORE;
case 2: return CTCP_IGNORE;
default: return INVALID;
case 0:
return SENDER_IGNORE;
case 1:
return MESSAGE_IGNORE;
case 2:
return CTCP_IGNORE;
default:
return INVALID;
}
}
}
......@@ -134,15 +145,21 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
CHANNEL_SCOPE(2);
public final int id;
Scope(int id) {
this.id = id;
}
public static Scope of(int id) {
switch (id) {
case 0: return GLOBAL_SCOPE;
case 1: return NETWORK_SCOPE;
case 2: return CHANNEL_SCOPE;
default: return INVALID;
case 0:
return GLOBAL_SCOPE;
case 1:
return NETWORK_SCOPE;
case 2:
return CHANNEL_SCOPE;
default:
return INVALID;
}
}
}
......
......@@ -11,7 +11,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
......@@ -19,17 +18,22 @@ import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.Synced;
import de.kuschku.libquassel.syncables.serializers.IrcChannelSerializer;
import de.kuschku.util.AndroidAssert;
import static de.kuschku.util.AndroidAssert.*;
import static de.kuschku.util.AndroidAssert.assertNotNull;
public class IrcChannel extends SyncableObject<IrcChannel> {
@Synced private String name;
@Synced private String topic;
@Synced private String password;
@Synced private Map<String, String> UserModes;
@Synced private Map<String, Object> ChanModes;
@Synced private boolean encrypted;
@Synced
private String name;
@Synced
private String topic;
@Synced
private String password;
@Synced
private Map<String, String> UserModes;
@Synced
private Map<String, Object> ChanModes;
@Synced
private boolean encrypted;
@Nullable
private Network network;
......@@ -128,9 +132,11 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
public void addChannelMode(Character mode, String params) {
addChannelMode(String.copyValueOf(new char[]{mode}), params);
}
public void addChannelMode(char mode, String params) {
addChannelMode(String.copyValueOf(new char[]{mode}), params);
}
public void addChannelMode(String mode, String params) {
assertNotNull(network);
......@@ -157,12 +163,15 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
break;
}
}
public void removeChannelMode(Character mode, String params) {
removeChannelMode(String.copyValueOf(new char[]{mode}), params);
}
public void removeChannelMode(char mode, String params) {
removeChannelMode(String.copyValueOf(new char[]{mode}), params);
}
public void removeChannelMode(String mode, String params) {
assertNotNull(network);
......@@ -189,9 +198,11 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
public boolean hasMode(Character mode) {
return hasMode(String.copyValueOf(new char[]{mode}));
}
public boolean hasMode(char mode) {
return hasMode(String.copyValueOf(new char[]{mode}));
}
public boolean hasMode(String mode) {
assertNotNull(network);
......
......@@ -12,7 +12,6 @@ import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.IrcUserSerializer;
import static de.kuschku.util.AndroidAssert.assertNotNull;
......@@ -64,129 +63,129 @@ public class IrcUser extends SyncableObject<IrcUser> {
return server;
}
public String getIrcOperator() {
return ircOperator;
public void setServer(String server) {
this.server = server;
}
public boolean isAway() {
return away;
public String getIrcOperator() {
return ircOperator;
}
public int getLastAwayMessage() {
return lastAwayMessage;
public void setIrcOperator(String ircOperator) {
this.ircOperator = ircOperator;
}
public DateTime getIdleTime() {
return idleTime;
public boolean isAway() {
return away;
}
public String getWhoisServiceReply() {
return whoisServiceReply;
public void setAway(boolean away) {
this.away = away;
}
public String getSuserHost() {
return suserHost;
public int getLastAwayMessage() {
return lastAwayMessage;
}
public String getNick() {
return nick;
public void setLastAwayMessage(int lastAwayMessage) {
this.lastAwayMessage = lastAwayMessage;
}
public String getRealName() {
return realName;
public DateTime getIdleTime() {
return idleTime;
}
public String getAwayMessage() {
return awayMessage;
public void setIdleTime(DateTime idleTime) {
this.idleTime = idleTime;
}
public DateTime getLoginTime() {
return loginTime;
public String getWhoisServiceReply() {
return whoisServiceReply;
}
public boolean isEncrypted() {
return encrypted;
public void setWhoisServiceReply(String whoisServiceReply) {
this.whoisServiceReply = whoisServiceReply;
}
@NonNull
public List<String> getChannels() {
return channels;
public String getSuserHost() {
return suserHost;
}
public String getHost() {
return host;
public void setSuserHost(String suserHost) {
this.suserHost = suserHost;
}
public String getUserModes() {
return userModes;
public String getNick() {
return nick;
}
public String getUser() {
return user;
public void setNick(String nick) {
this.nick = nick;
}
/* BEGIN SYNC */
public void setServer(String server) {
this.server = server;
}
public void setIrcOperator(String ircOperator) {
this.ircOperator = ircOperator;
}
public void setAway(boolean away) {
this.away = away;
}
public void setLastAwayMessage(int lastAwayMessage) {
this.lastAwayMessage = lastAwayMessage;
}
public void setIdleTime(DateTime idleTime) {
this.idleTime = idleTime;
}
public void setWhoisServiceReply(String whoisServiceReply) {
this.whoisServiceReply = whoisServiceReply;
}
public void setSuserHost(String suserHost) {
this.suserHost = suserHost;
}
public void setNick(String nick) {
this.nick = nick;
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getAwayMessage() {
return awayMessage;
}
public void setAwayMessage(String awayMessage) {
this.awayMessage = awayMessage;
}
public DateTime getLoginTime() {
return loginTime;
}
public void setLoginTime(DateTime loginTime) {
this.loginTime = loginTime;
}
public boolean isEncrypted() {
return encrypted;
}
public void setEncrypted(boolean encrypted) {
this.encrypted = encrypted;
}
@NonNull
public List<String> getChannels() {
return channels;
}
public void setChannels(@NonNull List<String> channels) {
this.channels = channels;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUserModes() {
return userModes;
}
public void setUserModes(String userModes) {
this.userModes = userModes;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
......
......@@ -197,6 +197,10 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
return channels;
}
public void setChannels(@NonNull Map<String, IrcChannel> channels) {
this.channels = channels;
}
public void addIrcChannel(String channelName) {
IrcChannel ircChannel = new IrcChannel(
channelName,
......@@ -210,10 +214,6 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
channels.put(channelName, ircChannel);
}
public void setChannels(@NonNull Map<String, IrcChannel> channels) {
this.channels = channels;
}
@NonNull
public List<NetworkServer> getServerList() {
return ServerList;
......@@ -562,25 +562,6 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
this.client = client;
}
public static class IrcMode {
public final int rank;
public final String prefix;
public IrcMode(int rank, String prefix) {
this.rank = rank;
this.prefix = prefix;
}
@NonNull
@Override
public String toString() {
return "IrcMode{" +
"rank=" + rank +
", prefix='" + prefix + '\'' +
'}';
}
}
public ChannelModeType channelModeType(char mode) {
return channelModeType(String.copyValueOf(new char[]{mode}));
}
......@@ -597,11 +578,16 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
for (int i = 0; i < chanModes.length; i++) {
if (chanModes[i].contains(mode)) {
switch (i) {
case 0: return ChannelModeType.A_CHANMODE;
case 1: return ChannelModeType.B_CHANMODE;
case 2: return ChannelModeType.C_CHANMODE;
case 3: return ChannelModeType.D_CHANMODE;
default: return ChannelModeType.NOT_A_CHANMODE;
case 0:
return ChannelModeType.A_CHANMODE;
case 1:
return ChannelModeType.B_CHANMODE;
case 2:
return ChannelModeType.C_CHANMODE;
case 3:
return ChannelModeType.D_CHANMODE;
default:
return ChannelModeType.NOT_A_CHANMODE;
}
}
}
......@@ -618,4 +604,23 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
C_CHANMODE,
D_CHANMODE
}
public static class IrcMode {
public final int rank;
public final String prefix;
public IrcMode(int rank, String prefix) {
this.rank = rank;
this.prefix = prefix;
}
@NonNull
@Override
public String toString() {
return "IrcMode{" +
"rank=" + rank +
", prefix='" + prefix + '\'' +
'}';
}
}
}
......@@ -8,7 +8,6 @@ import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.primitives.types.QVariant;
import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
import de.kuschku.libquassel.syncables.serializers.NetworkConfigSerializer;
public class NetworkConfig extends SyncableObject<NetworkConfig> {
......
......@@ -10,7 +10,6 @@ import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.Client;
import de.kuschku.libquassel.functions.types.InitDataFunction;
import de.kuschku.libquassel.functions.types.SyncFunction;
import de.kuschku.libquassel.message.Message;
import de.kuschku.libquassel.primitives.types.QVariant;
import static de.kuschku.util.AndroidAssert.assertNotNull;
......@@ -51,8 +50,10 @@ public abstract class SyncableObject<T extends SyncableObject<T>> {
public abstract void init(@NonNull InitDataFunction function, @NonNull BusProvider provider, @NonNull Client client);
public void doInit() {}
public void doInit() {
}
public abstract void update(T from);
public abstract void update(Map<String, QVariant> from);
}
package de.kuschku.quasseldroid_ng.service;
import android.content.Context;
import android.support.annotation.NonNull;
import java.io.IOException;
......@@ -10,13 +11,15 @@ import de.kuschku.libquassel.CoreConnection;
import de.kuschku.libquassel.ProtocolHandler;
import de.kuschku.libquassel.events.GeneralErrorEvent;
import de.kuschku.libquassel.protocols.RemotePeer;
import de.kuschku.libquassel.ssl.CertificateManager;
import de.kuschku.util.CompatibilityUtils;
import de.kuschku.util.ServerAddress;
import de.kuschku.util.certificates.SQLiteCertificateManager;
public class ClientBackgroundThread implements Runnable {
@NonNull
private static final ClientData CLIENT_DATA = new ClientData(
new ClientData.FeatureFlags(false, true),
new ClientData.FeatureFlags(true, true),
new byte[]{RemotePeer.DATASTREAM, RemotePeer.LEGACY},
"QuasselDroid-ng 0.1 | libquassel 0.2",
RemotePeer.PROTOCOL_VERSION_LEGACY
......@@ -28,10 +31,13 @@ public class ClientBackgroundThread implements Runnable {
public final CoreConnection connection;
@NonNull
public final ProtocolHandler handler;
@NonNull
public final CertificateManager certificateManager;
public ClientBackgroundThread(@NonNull BusProvider provider, @NonNull ServerAddress address) {
public ClientBackgroundThread(@NonNull BusProvider provider, @NonNull ServerAddress address, @NonNull Context context) {
this.provider = provider;
this.connection = new CoreConnection(address, CLIENT_DATA, provider);
this.certificateManager = new SQLiteCertificateManager(context);
this.connection = new CoreConnection(address, CLIENT_DATA, provider, certificateManager);
this.handler = new ProtocolHandler(provider);
this.handler.client.setClientData(CLIENT_DATA);
this.connection.setClient(handler.client);
......@@ -47,10 +53,6 @@ public class ClientBackgroundThread implements Runnable {
}
public void close() {
try {
connection.close();
} catch (IOException e) {
provider.sendEvent(new GeneralErrorEvent(e));
}
}
}
......@@ -39,7 +39,7 @@ public class QuasselService extends Service {
public class LocalBinder extends Binder {
public void startBackgroundThread(@NonNull BusProvider provider, @NonNull ServerAddress address) {
bgThread = new ClientBackgroundThread(provider, address);
bgThread = new ClientBackgroundThread(provider, address, QuasselService.this);
new Thread(bgThread).start();
}
......
......@@ -4,7 +4,6 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.IntRange;
......@@ -32,7 +31,6 @@ import com.afollestad.materialdialogs.MaterialDialog;
import com.google.common.base.Splitter;
import com.mikepenz.fastadapter.FastAdapter;
import com.mikepenz.fastadapter.IExpandable;
import com.mikepenz.fastadapter.IIdentifyable;
import com.mikepenz.fastadapter.IItem;
import com.mikepenz.fastadapter.adapters.ItemAdapter;
import com.mikepenz.materialdrawer.AccountHeader;
......@@ -46,7 +44,6 @@ import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
......@@ -61,6 +58,7 @@ import de.kuschku.libquassel.events.BacklogReceivedEvent;
import de.kuschku.libquassel.events.ConnectionChangeEvent;
import de.kuschku.libquassel.events.GeneralErrorEvent;
import de.kuschku.libquassel.events.LagChangedEvent;
import de.kuschku.libquassel.events.UnknownCertificateEvent;
import de.kuschku.libquassel.localtypes.Buffer;
import de.kuschku.libquassel.localtypes.ChannelBuffer;
import de.kuschku.libquassel.localtypes.backlogmanagers.BacklogFilter;
......@@ -73,13 +71,12 @@ import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread;
import de.kuschku.quasseldroid_ng.service.QuasselService;
import de.kuschku.quasseldroid_ng.ui.chat.chatview.MessageAdapter;
import de.kuschku.quasseldroid_ng.ui.chat.drawer.BufferViewConfigWrapper;
import de.kuschku.quasseldroid_ng.ui.chat.drawer.NetworkItem;
import de.kuschku.quasseldroid_ng.ui.editor.AdvancedEditor;
import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
import de.kuschku.quasseldroid_ng.ui.theme.AppTheme;
import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil;
import de.kuschku.util.ServerAddress;
import de.kuschku.util.backports.Stream;
import de.kuschku.util.certificates.CertificateUtils;
import de.kuschku.util.instancestateutil.Storable;
import de.kuschku.util.instancestateutil.Store;
import de.kuschku.util.keyboardutils.DialogKeyboardUtil;
......@@ -91,85 +88,38 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
@UiThread
public class ChatActivity extends AppCompatActivity {
@NonNull
private final Status status = new Status();
@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.sliding_layout)
SlidingUpPanelLayout slidingLayout;
@Bind(R.id.sliding_layout_history)
SlidingUpPanelLayout slidingLayoutHistory;
@Bind(R.id.chatline_scroller)
ScrollView chatlineScroller;
@Bind(R.id.chatline)
AppCompatEditText chatline;
@Bind(R.id.send)
AppCompatImageButton send;
@Bind(R.id.msg_history)
RecyclerView msgHistory;
@Bind(R.id.swipe_view)
SwipeRefreshLayout swipeView;
@Bind(R.id.messages)
RecyclerView messages;
@Bind(R.id.formatting_menu)
ActionMenuView formattingMenu;
@Bind(R.id.formatting_toolbar)
Toolbar formattingToolbar;
@PreferenceWrapper(BuildConfig.APPLICATION_ID)
public static abstract class Settings {
@StringPreference("QUASSEL_LIGHT")
String theme;
@BooleanPreference(false) boolean fullHostmask;
@IntPreference(2) int textSize;
@BooleanPreference(true) boolean mircColors;
@StringPreference("") String lastHost;
@IntPreference(4242) int lastPort;
@StringPreference("") String lastUsername;
@StringPreference("") String lastPassword;
}
private AppContext context = new AppContext();
@NonNull
private final Status status = new Status();
private static class Status extends Storable {
@Store int bufferId = -1;
@Store int bufferViewConfigId = -1;
}
private ServiceInterface serviceInterface = new ServiceInterface();
private class ServiceInterface {
private void connect(@NonNull ServerAddress address) {
assertNotNull(binder);
disconnect();
BusProvider provider = new BusProvider();
provider.event.register(ChatActivity.this);
binder.startBackgroundThread(provider, address);
onConnectionEstablished();
}
private void disconnect() {
if (context.getProvider() != null)
context.getProvider().event.unregister(this);
context.setProvider(null);
context.setClient(null);
}
}
private QuasselService.LocalBinder binder;
private MessageAdapter messageAdapter;
private AccountHeader accountHeader;
private Drawer drawerLeft;
private BufferViewConfigWrapper wrapper;
private AdvancedEditor editor;
private ServiceConnection serviceConnection = new ServiceConnection() {
@UiThread
public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) {
......@@ -197,6 +147,20 @@ public class ChatActivity extends AppCompatActivity {
}
};
private static void updateNoColor(Buffer buffer, Menu menu) {
boolean isNoColor = isNoColor(buffer);
menu.findItem(R.id.format_bold).setEnabled(!isNoColor);
menu.findItem(R.id.format_italic).setEnabled(!isNoColor);
menu.findItem(R.id.format_underline).setEnabled(!isNoColor);
menu.findItem(R.id.format_paint).setEnabled(!isNoColor);
menu.findItem(R.id.format_fill).setEnabled(!isNoColor);
}
public static boolean isNoColor(Buffer buffer) {
return buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null &&
((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c");
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setupContext();
......@@ -381,17 +345,6 @@ public class ChatActivity extends AppCompatActivity {
return super.onCreateOptionsMenu(menu);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks whether a hardware keyboard is available
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
List<Integer> filterSettings = Arrays.asList(
......@@ -403,7 +356,9 @@ public class ChatActivity extends AppCompatActivity {
Message.Type.Topic.value
);
int[] filterSettingsInts = new int[filterSettings.size()];
for (int i = 0; i < filterSettingsInts.length; i++) { filterSettingsInts[i] = filterSettings.get(i); }
for (int i = 0; i < filterSettingsInts.length; i++) {
filterSettingsInts[i] = filterSettings.get(i);
}
switch (item.getItemId()) {
case R.id.action_hide_events: {
......@@ -441,7 +396,6 @@ public class ChatActivity extends AppCompatActivity {
}
backlogFilter.setFilters(filters);
})
.buttonRippleColorAttr(R.attr.colorAccentFocus)
.build()
.show();
}
......@@ -498,7 +452,6 @@ public class ChatActivity extends AppCompatActivity {
return true;
})
.negativeColor(context.getThemeUtil().res.colorForeground)
.buttonRippleColor(context.getThemeUtil().res.colorAccentFocus)
.build()
.show();
}
......@@ -563,23 +516,6 @@ public class ChatActivity extends AppCompatActivity {
}
}
private static void updateNoColor(Buffer buffer, Menu menu) {
boolean isNoColor = isNoColor(buffer);
menu.findItem(R.id.format_bold).setEnabled(!isNoColor);
menu.findItem(R.id.format_italic).setEnabled(!isNoColor);
menu.findItem(R.id.format_underline).setEnabled(!isNoColor);
menu.findItem(R.id.format_paint).setEnabled(!isNoColor);
menu.findItem(R.id.format_fill).setEnabled(!isNoColor);
}
public static boolean isNoColor(Buffer buffer) {
if (buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null) {
return ((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c");
} else {
return false;
}
}
private void onConnectionEstablished() {
assertNotNull(binder);
assertNotNull(binder.getBackgroundThread());
......@@ -653,7 +589,6 @@ public class ChatActivity extends AppCompatActivity {
Log.e("TIME", String.valueOf(System.currentTimeMillis()));
})
.negativeColor(context.getThemeUtil().res.colorForeground)
.buttonRippleColor(context.getThemeUtil().res.colorAccentFocus)
.positiveText("Login")
.negativeText("Cancel")
.build();
......@@ -668,7 +603,8 @@ public class ChatActivity extends AppCompatActivity {
.title("Address")
.customView(R.layout.dialog_address, false)
.onPositive((dialog1, which) -> {
if (binder != null && binder.getBackgroundThread() != null) binder.stopBackgroundThread();
if (binder != null && binder.getBackgroundThread() != null)
binder.stopBackgroundThread();
View parent = dialog1.getCustomView();
AppCompatEditText hostField = (AppCompatEditText) parent.findViewById(R.id.host);
......@@ -699,6 +635,22 @@ public class ChatActivity extends AppCompatActivity {
}
}
public void onEventMainThread(UnknownCertificateEvent event) {
new MaterialDialog.Builder(this)
.content("Do you trust this certificate?\n" + CertificateUtils.certificateToFingerprint(event.certificate, ""))
.title("Unknown Certificate")
.onPositive((dialog, which) -> {
if (binder.getBackgroundThread() != null) {
binder.getBackgroundThread().certificateManager.addCertificate(event.certificate, event.address);
}
})
.negativeColor(context.getThemeUtil().res.colorForeground)
.positiveText("Yes")
.negativeText("No")
.build()
.show();
}
public void onEventMainThread(GeneralErrorEvent event) {
Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show();
for (String line : Splitter.fixedLength(2048).split(event.toString())) {
......@@ -719,4 +671,51 @@ public class ChatActivity extends AppCompatActivity {
toolbar.setSubtitle("");
}
}
@PreferenceWrapper(BuildConfig.APPLICATION_ID)
public static abstract class Settings {
@StringPreference("QUASSEL_LIGHT")
String theme;
@BooleanPreference(false)
boolean fullHostmask;
@IntPreference(2)
int textSize;
@BooleanPreference(true)
boolean mircColors;
@StringPreference("")
String lastHost;
@IntPreference(4242)
int lastPort;
@StringPreference("")
String lastUsername;
@StringPreference("")
String lastPassword;
}
private static class Status extends Storable {
@Store
int bufferId = -1;
@Store
int bufferViewConfigId = -1;
}
private class ServiceInterface {
private void connect(@NonNull ServerAddress address) {
assertNotNull(binder);
disconnect();
BusProvider provider = new BusProvider();
provider.event.register(ChatActivity.this);
binder.startBackgroundThread(provider, address);
onConnectionEstablished();
}
private void disconnect() {
if (context.getProvider() != null)
context.getProvider().event.unregister(this);
context.setProvider(null);
context.setClient(null);
}
}
}
......@@ -4,21 +4,13 @@ import android.content.Context;
import android.graphics.Typeface;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.util.Log;
import de.kuschku.libquassel.localtypes.Buffer;
import de.kuschku.libquassel.message.Message;
import de.kuschku.quasseldroid_ng.R;
import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
import de.kuschku.util.annotationbind.AutoBinder;
import de.kuschku.util.annotationbind.AutoString;
import de.kuschku.util.irc.IrcFormatHelper;
import de.kuschku.util.irc.IrcUserUtils;
import de.kuschku.util.ui.MessageUtil;
import de.kuschku.util.ui.SpanFormatter;
import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil;
import static de.kuschku.util.AndroidAssert.assertNotNull;
......
......@@ -22,6 +22,7 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
@UiThread
public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
private static ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<Message>(Message.class);
@NonNull
private final ChatMessageRenderer renderer;
@NonNull
......@@ -37,6 +38,10 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
this.callback = new AdapterUICallbackWrapper(this, scroller);
}
public static ObservableSortedList<Message> emptyList() {
return emptyList;
}
public void setMessageList(@NonNull ObservableSortedList<Message> messageList) {
this.messageList.removeCallback(callback);
this.messageList = messageList;
......@@ -62,9 +67,4 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
public int getItemCount() {
return messageList.size();
}
private static ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<Message>(Message.class);
public static ObservableSortedList<Message> emptyList() {
return emptyList;
}
}
package de.kuschku.quasseldroid_ng.ui.chat.drawer;
import android.util.Log;
import com.mikepenz.fastadapter.IIdentifyable;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import de.kuschku.libquassel.syncables.types.BufferViewConfig;
import de.kuschku.libquassel.syncables.types.Network;
import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
import de.kuschku.quasseldroid_ng.ui.chat.drawer.NetworkItem;
import de.kuschku.util.backports.Stream;
import de.kuschku.util.observables.callbacks.ElementCallback;
import de.kuschku.util.observables.lists.ObservableSortedList;
......
package de.kuschku.quasseldroid_ng.ui.chat.drawer;
import android.util.Log;
import android.util.SparseArray;
import com.mikepenz.materialdrawer.holder.ColorHolder;
......
......@@ -22,6 +22,7 @@ public class AdvancedEditor {
public void toggleUnderline() {
toggleUnderline(editText.getSelectionStart(), editText.getSelectionEnd());
}
public void toggleUnderline(int start, int end) {
boolean isUnderline = false;
for (UnderlineSpan span : editText.getText().getSpans(start, end, UnderlineSpan.class)) {
......@@ -41,6 +42,7 @@ public class AdvancedEditor {
public void toggleBold() {
toggleBold(editText.getSelectionStart(), editText.getSelectionEnd());
}
public void toggleBold(int start, int end) {
boolean isBold = false;
for (BoldSpan span : editText.getText().getSpans(start, end, BoldSpan.class)) {
......@@ -59,6 +61,7 @@ public class AdvancedEditor {
public void toggleItalic() {
toggleItalic(editText.getSelectionStart(), editText.getSelectionEnd());
}
public void toggleItalic(int start, int end) {
boolean isItalic = false;
for (ItalicSpan span : editText.getText().getSpans(start, end, ItalicSpan.class)) {
......@@ -77,6 +80,7 @@ public class AdvancedEditor {
public void toggleForeground(@IntRange(from = 0, to = 15) int color) {
toggleForeground(editText.getSelectionStart(), editText.getSelectionEnd(), color);
}
public void toggleForeground(int start, int end, @ColorInt int color) {
boolean isColored = false;
for (ForegroundColorSpan span : editText.getText().getSpans(start, end, ForegroundColorSpan.class)) {
......@@ -95,6 +99,7 @@ public class AdvancedEditor {
public void toggleBackground(@IntRange(from = 0, to = 15) int color) {
toggleBackground(editText.getSelectionStart(), editText.getSelectionEnd(), color);
}
public void toggleBackground(int start, int end, @ColorInt int color) {
boolean isColored = false;
for (BackgroundColorSpan span : editText.getText().getSpans(start, end, BackgroundColorSpan.class)) {
......
......@@ -23,12 +23,16 @@ public enum AppTheme {
public static AppTheme themeFromString(String s) {
if (s == null) s = "";
switch (s) {
case "MATERIAL_DARK": return MATERIAL_DARK;
case "MATERIAL_LIGHT": return MATERIAL_LIGHT;
case "QUASSEL_DARK": return QUASSEL_DARK;
case "MATERIAL_DARK":
return MATERIAL_DARK;
case "MATERIAL_LIGHT":
return MATERIAL_LIGHT;
case "QUASSEL_DARK":
return QUASSEL_DARK;
default:
case "QUASSEL_LIGHT": return QUASSEL_LIGHT;
case "QUASSEL_LIGHT":
return QUASSEL_LIGHT;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment