diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java index a86b1024c83b0df469b5cba2c7c6c19642ed561c..108bad6e0298faeb4aac009b8a34aaaf34e35e24 100644 --- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java +++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java @@ -1,10 +1,12 @@ package de.kuschku.libquassel; import android.support.annotation.NonNull; +import android.util.Log; import java.util.UUID; import de.greenrobot.event.EventBus; +import de.greenrobot.event.NoSubscriberEvent; public class BusProvider { @NonNull @@ -16,11 +18,18 @@ public class BusProvider { @NonNull private final String id; + private final BusHandler handleHandler = new BusHandler("QHANDLE"); + private final BusHandler dispatchHandler = new BusHandler("QDISPATCH"); + private final BusHandler eventHandler = new BusHandler("QEVENT"); + public BusProvider() { this.id = UUID.randomUUID().toString(); this.handle = new EventBus(); + this.handle.register(handleHandler); this.dispatch = new EventBus(); + this.dispatch.register(dispatchHandler); this.event = new EventBus(); + this.event.register(eventHandler); } public void handle(Object o) { @@ -41,4 +50,16 @@ public class BusProvider { "id='" + id + '\'' + '}'; } + + public static class BusHandler { + private final String identifier; + + public BusHandler(String identifier) { + this.identifier = identifier; + } + + public void onEvent(NoSubscriberEvent event) { + Log.e(identifier, String.valueOf(event)); + } + } } diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java index 2ae9a6547d79d741f8c6ceab58dc695b8c8da975..b7ed184f5c2047bc7d1ef3822b2747d040420f08 100644 --- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java +++ b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java @@ -181,7 +181,6 @@ public class CoreConnection { inputThread = new ReadThread(); heartbeatThread = new HeartbeatThread(); inputThread.start(); - heartbeatThread.start(); } public void onEventAsync(HandshakeFailedEvent event) { @@ -261,6 +260,7 @@ public class CoreConnection { // Mark prehandshake as read hasReadPreHandshake = true; + heartbeatThread.start(); // Send client data to core String clientDate = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.US).format(new Date()); @@ -304,7 +304,6 @@ public class CoreConnection { while (running) { Heartbeat heartbeat = new Heartbeat(DateTime.now()); - Log.e("heartbeat", String.valueOf(heartbeat)); busProvider.dispatch(heartbeat); Thread.sleep(30 * 1000); diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java index d94d356667f6e02ffe12625373919061a700cc36..323cea8dccba8ae604b7f24c6ff3ca06285bf36f 100644 --- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java +++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java @@ -121,6 +121,8 @@ public class ProtocolHandler implements IProtocolHandler { } public void onEvent(@NonNull SessionInit message) { + busProvider.dispatch(new Heartbeat(DateTime.now())); + client.setState(message.SessionState); client.setConnectionStatus(ConnectionChangeEvent.Status.INITIALIZING_DATA); @@ -148,8 +150,6 @@ public class ProtocolHandler implements IProtocolHandler { } public void onEventMainThread(@NonNull HeartbeatReply heartbeat) { - Log.e("heartbeatreply", String.valueOf(heartbeat)); - long roundtrip = DateTime.now().getMillis() - heartbeat.dateTime.getMillis(); long lag = (long) (roundtrip * 0.5); diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java index 88101609597b84a63b9868d4b8212a46b137b9c1..0f3e8f460377661d92b0e5cb0056d714c37b774c 100644 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java @@ -29,7 +29,7 @@ public class HeartbeatReplySerializer implements FunctionSerializer<HeartbeatRep @Override public List serialize(@NonNull HeartbeatReply data) { return Arrays.asList( - FunctionType.HEARTBEATREPLY.id, + new QVariant<>(FunctionType.HEARTBEATREPLY.id), new QVariant<>(data.dateTime) ); } diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java index 38d20cd724cc3bbdf21c21e6e6a7408cc00471e1..fe1d6b86bdae094558c197444d13145abd25b6e3 100644 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java @@ -9,7 +9,6 @@ import java.util.List; import de.kuschku.libquassel.functions.FunctionType; import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.primitives.QMetaType; import de.kuschku.libquassel.primitives.types.QVariant; import static de.kuschku.util.AndroidAssert.assertTrue; @@ -30,8 +29,8 @@ public class HeartbeatSerializer implements FunctionSerializer<Heartbeat> { @Override public List serialize(@NonNull Heartbeat data) { return Arrays.asList( - FunctionType.HEARTBEAT.id, - new QVariant<>(QMetaType.Type.QDateTime, data.dateTime) + new QVariant<>(FunctionType.HEARTBEAT.id), + new QVariant<>(data.dateTime) ); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java index 90a005a47323a66c11a484ac262f0f7d144218e7..2fd588da680f40c25f9251a9d4a36222b5af76f5 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java @@ -66,7 +66,7 @@ public class BacklogFilter implements UICallback { } private boolean filterItem(Message message) { - return client.getIgnoreListManager().matches(message) || filteredTypes.contains(message.type); + return (client.getIgnoreListManager() != null && client.getIgnoreListManager().matches(message)) || filteredTypes.contains(message.type); } public void addFilter(Message.Type type) { diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java index 1d88e0ccd223bb3a49239015e8720f9760c726bd..fbefbdb7ce4d6794a49f4184ee3633cbd94b1acf 100644 --- a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java +++ b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java @@ -202,10 +202,10 @@ public class LegacyPeer implements RemotePeer { busProvider.handle(UnpackedInitDataFunctionSerializer.get().deserialize((List<QVariant>) data.data)); break; case HEARTBEAT: - busProvider.handle(HeartbeatSerializer.get().deserialize((List<QVariant>) data)); + busProvider.handle(HeartbeatSerializer.get().deserialize((List<QVariant>) data.data)); break; case HEARTBEATREPLY: - busProvider.handle(HeartbeatReplySerializer.get().deserialize((List<QVariant>) data)); + busProvider.handle(HeartbeatReplySerializer.get().deserialize((List<QVariant>) data.data)); break; default: busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data)); diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java index bcff02275303b6c540ddb46afa6ed6bf61d4fff9..838aff5b38f0ea29161ec21dfb6b57d135452882 100644 --- a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java +++ b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java @@ -1,7 +1,6 @@ package de.kuschku.libquassel.ssl; import android.support.annotation.NonNull; -import android.util.Log; import java.security.GeneralSecurityException; import java.security.KeyStore; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java index 41d02734c2a57044e287e35d37f3c8e995cf8578..f3619522ea58fecc91cdb45b41dfb5aa96414be0 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java @@ -20,7 +20,7 @@ public class ClientBackgroundThread implements Runnable { @NonNull private static final ClientData CLIENT_DATA = new ClientData( new ClientData.FeatureFlags(true, true), - new byte[]{RemotePeer.DATASTREAM, RemotePeer.LEGACY}, + new byte[]{RemotePeer.DATASTREAM}, "QuasselDroid-ng 0.1 | libquassel 0.2", RemotePeer.PROTOCOL_VERSION_LEGACY ); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java index 2f07658ca0ef5b8ff2d5641e1ea4110ae14ea088..ad7f34965530b9ee38d5d72c05a68dd59b169382 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java @@ -42,6 +42,8 @@ import com.mikepenz.materialdrawer.model.ProfileDrawerItem; import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; import com.sothree.slidinguppanel.SlidingUpPanelLayout; +import org.joda.time.DateTime; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -59,6 +61,7 @@ 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.functions.types.Heartbeat; import de.kuschku.libquassel.localtypes.Buffer; import de.kuschku.libquassel.localtypes.ChannelBuffer; import de.kuschku.libquassel.localtypes.backlogmanagers.BacklogFilter; @@ -88,38 +91,76 @@ import static de.kuschku.util.AndroidAssert.assertNotNull; @UiThread public class ChatActivity extends AppCompatActivity { - @NonNull - private final Status status = new Status(); + // Main layout @Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.sliding_layout) SlidingUpPanelLayout slidingLayout; - @Bind(R.id.sliding_layout_history) - SlidingUpPanelLayout slidingLayoutHistory; + + // Input Line @Bind(R.id.chatline_scroller) ScrollView chatlineScroller; @Bind(R.id.chatline) AppCompatEditText chatline; @Bind(R.id.send) AppCompatImageButton send; + + // Input History + @Bind(R.id.sliding_layout_history) + SlidingUpPanelLayout slidingLayoutHistory; @Bind(R.id.msg_history) RecyclerView msgHistory; - @Bind(R.id.swipe_view) - SwipeRefreshLayout swipeView; - @Bind(R.id.messages) - RecyclerView messages; + + // Advanced Formatter @Bind(R.id.formatting_menu) ActionMenuView formattingMenu; @Bind(R.id.formatting_toolbar) Toolbar formattingToolbar; - private AppContext context = new AppContext(); - private ServiceInterface serviceInterface = new ServiceInterface(); - private QuasselService.LocalBinder binder; + + // Content view + @Bind(R.id.swipe_view) + SwipeRefreshLayout swipeView; + @Bind(R.id.messages) + RecyclerView messages; + private MessageAdapter messageAdapter; private AccountHeader accountHeader; private Drawer drawerLeft; - private BufferViewConfigWrapper wrapper; private AdvancedEditor editor; + private BufferViewConfigWrapper wrapper; + + @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(); + + context.setProvider(new BusProvider()); + context.getProvider().event.register(ChatActivity.this); + binder.startBackgroundThread(context.getProvider(), address); + onConnectionEstablished(); + + context.getProvider().handle(new Heartbeat(DateTime.parse("1980-01-01T00:00"))); + } + + private void disconnect() { + if (context.getProvider() != null) { + context.getProvider().event.unregister(ChatActivity.this); + } + context.setProvider(null); + context.setClient(null); + } + } + private ServiceConnection serviceConnection = new ServiceConnection() { @UiThread public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) { @@ -131,9 +172,9 @@ public class ChatActivity extends AppCompatActivity { serviceInterface.disconnect(); - backgroundThread.provider.event.register(ChatActivity.this); - context.setClient(backgroundThread.handler.client); context.setProvider(backgroundThread.provider); + context.setClient(backgroundThread.handler.client); + context.getProvider().event.register(ChatActivity.this); updateBufferViewConfigs(); updateSubTitle(); } @@ -147,20 +188,30 @@ 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); - } + @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; - public static boolean isNoColor(Buffer buffer) { - return buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null && - ((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c"); + @StringPreference("") + String lastHost; + @IntPreference(4242) + int lastPort; + @StringPreference("") + String lastUsername; + @StringPreference("") + String lastPassword; } + private AppContext context = new AppContext(); + private QuasselService.LocalBinder binder; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { setupContext(); @@ -186,6 +237,141 @@ public class ChatActivity extends AppCompatActivity { initLoader(); } + @Override + protected void onPause() { + serviceInterface.disconnect(); + unbindService(serviceConnection); + super.onPause(); + } + + @Override + protected void onResume() { + super.onResume(); + Intent intent = new Intent(this, QuasselService.class); + bindService(intent, serviceConnection, Context.BIND_IMPORTANT); + } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + } + + @Override + protected void onRestart() { + super.onRestart(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + assertNotNull(outState); + + super.onSaveInstanceState(outState); + status.onSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { + assertNotNull(savedInstanceState); + + super.onRestoreInstanceState(savedInstanceState); + status.onRestoreInstanceState(savedInstanceState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.chat, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + List<Integer> filterSettings = Arrays.asList( + Message.Type.Join.value, + Message.Type.Part.value, + Message.Type.Quit.value, + Message.Type.Nick.value, + Message.Type.Mode.value, + Message.Type.Topic.value + ); + int[] filterSettingsInts = new int[filterSettings.size()]; + for (int i = 0; i < filterSettingsInts.length; i++) { + filterSettingsInts[i] = filterSettings.get(i); + } + + switch (item.getItemId()) { + case R.id.action_hide_events: { + if (context.getClient() != null) { + BacklogFilter backlogFilter = context.getClient().getBacklogManager().getFilter(status.bufferId); + if (backlogFilter != null) { + int oldFilters = backlogFilter.getFilters(); + List<Integer> oldFiltersList = new ArrayList<>(); + for (int type : filterSettings) { + if ((type & oldFilters) != 0) + oldFiltersList.add(filterSettings.indexOf(type)); + } + Integer[] selectedIndices = oldFiltersList.toArray(new Integer[oldFiltersList.size()]); + new MaterialDialog.Builder(this) + .items( + "Joins", + "Parts", + "Quits", + "Nick Changes", + "Mode Changes", + "Topic Changes" + ) + .itemsIds(filterSettingsInts) + .itemsCallbackMultiChoice( + selectedIndices, + (dialog, which, text) -> false + ) + .positiveText("Select") + .negativeText("Cancel") + .onPositive((dialog, which) -> { + int filters = 0x00000000; + if (dialog.getSelectedIndices() != null) + for (int i : dialog.getSelectedIndices()) { + filters |= filterSettings.get(i); + } + backlogFilter.setFilters(filters); + }) + .build() + .show(); + } + } + } + } + return super.onOptionsItemSelected(item); + } + + 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"); + } + private void setupContext() { context.setSettings(new WrappedSettings(this)); AppTheme theme = AppTheme.themeFromString(context.getSettings().theme.get()); @@ -331,102 +517,20 @@ public class ChatActivity extends AppCompatActivity { .withSavedInstance(savedInstanceState) .withProfileImagesVisible(false) .withOnAccountHeaderListener((view, profile, current) -> { - if (!current) { - selectBufferViewConfig((int) profile.getIdentifier()); - } + selectBufferViewConfig((int) profile.getIdentifier()); return true; }) .build(); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.chat, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - List<Integer> filterSettings = Arrays.asList( - Message.Type.Join.value, - Message.Type.Part.value, - Message.Type.Quit.value, - Message.Type.Nick.value, - Message.Type.Mode.value, - Message.Type.Topic.value - ); - int[] filterSettingsInts = new int[filterSettings.size()]; - for (int i = 0; i < filterSettingsInts.length; i++) { - filterSettingsInts[i] = filterSettings.get(i); - } - - switch (item.getItemId()) { - case R.id.action_hide_events: { - if (context.getClient() != null) { - BacklogFilter backlogFilter = context.getClient().getBacklogManager().getFilter(status.bufferId); - if (backlogFilter != null) { - int oldFilters = backlogFilter.getFilters(); - List<Integer> oldFiltersList = new ArrayList<>(); - for (int type : filterSettings) { - if ((type & oldFilters) != 0) - oldFiltersList.add(filterSettings.indexOf(type)); - } - Integer[] selectedIndices = oldFiltersList.toArray(new Integer[oldFiltersList.size()]); - new MaterialDialog.Builder(this) - .items( - "Joins", - "Parts", - "Quits", - "Nick Changes", - "Mode Changes", - "Topic Changes" - ) - .itemsIds(filterSettingsInts) - .itemsCallbackMultiChoice( - selectedIndices, - (dialog, which, text) -> false - ) - .positiveText("Select") - .negativeText("Cancel") - .onPositive((dialog, which) -> { - int filters = 0x00000000; - if (dialog.getSelectedIndices() != null) - for (int i : dialog.getSelectedIndices()) { - filters |= filterSettings.get(i); - } - backlogFilter.setFilters(filters); - }) - .build() - .show(); - } - } - } - } - return super.onOptionsItemSelected(item); - } - - @Override - protected void onPause() { - super.onPause(); - serviceInterface.disconnect(); - unbindService(serviceConnection); - } - - @Override - protected void onResume() { - super.onResume(); - Intent intent = new Intent(this, QuasselService.class); - bindService(intent, serviceConnection, Context.BIND_IMPORTANT); - } - public void setChatlineExpanded(boolean expanded) { int selectionStart = chatline.getSelectionStart(); int selectionEnd = chatline.getSelectionEnd(); if (expanded) { - chatlineScroller.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; + chatline.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; } else { - chatlineScroller.getLayoutParams().height = context.getThemeUtil().res.actionBarSize; + chatline.getLayoutParams().height = context.getThemeUtil().res.actionBarSize; } chatline.setSingleLine(!expanded); @@ -456,22 +560,6 @@ public class ChatActivity extends AppCompatActivity { .show(); } - @Override - protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { - assertNotNull(savedInstanceState); - - super.onRestoreInstanceState(savedInstanceState); - status.onRestoreInstanceState(savedInstanceState); - } - - @Override - protected void onSaveInstanceState(@NonNull Bundle outState) { - assertNotNull(outState); - - super.onSaveInstanceState(outState); - status.onSaveInstanceState(outState); - } - private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) { status.bufferViewConfigId = bufferViewConfigId; accountHeader.setActiveProfile(bufferViewConfigId, false); @@ -671,51 +759,4 @@ 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); - } - } }