diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java index 4fa6f80d735634b58205afeec33e896a5b64cbb0..74f910c850e381db04d093c196574ccca6605504 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java @@ -163,7 +163,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { openBuffer = bufferId; if (bufferId != -1) client.bufferSyncer().requestMarkBufferAsRead(bufferId); - provider.sendEvent(new BufferChangeEvent()); + provider.event.postSticky(new BufferChangeEvent()); } @Override 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 a6d46c706294111c375d15c184345bce97e444a8..7c745d83116069d4dfed5e9332c9a9482102fdf0 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 @@ -22,6 +22,7 @@ package de.kuschku.quasseldroid_ng.ui.chat; import android.os.Bundle; +import android.support.annotation.IntRange; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; @@ -33,18 +34,28 @@ import android.widget.FrameLayout; import com.mikepenz.materialdrawer.AccountHeader; import com.mikepenz.materialdrawer.AccountHeaderBuilder; import com.mikepenz.materialdrawer.Drawer; +import com.mikepenz.materialdrawer.model.ProfileDrawerItem; + +import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; +import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.GeneralErrorEvent; +import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; +import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; +import de.kuschku.quasseldroid_ng.ui.chat.drawer.BufferItem; +import de.kuschku.quasseldroid_ng.ui.chat.drawer.BufferViewConfigItem; +import de.kuschku.quasseldroid_ng.ui.chat.drawer.NetworkItem; import de.kuschku.quasseldroid_ng.ui.chat.fragment.ChatFragment; import de.kuschku.quasseldroid_ng.ui.chat.fragment.LoadingFragment; import de.kuschku.quasseldroid_ng.ui.chat.util.ActivityImplFactory; import de.kuschku.quasseldroid_ng.ui.chat.util.ILayoutHelper; import de.kuschku.quasseldroid_ng.ui.chat.util.Status; +import de.kuschku.quasseldroid_ng.ui.theme.AppTheme; import de.kuschku.quasseldroid_ng.util.BoundActivity; import de.kuschku.quasseldroid_ng.util.accounts.AccountManager; @@ -89,6 +100,8 @@ public class MainActivity extends BoundActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { + new Settings(this).theme.set(AppTheme.QUASSEL_LIGHT.name()); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); @@ -96,6 +109,17 @@ public class MainActivity extends BoundActivity { layoutHelper = ActivityImplFactory.of(getResources().getBoolean(R.bool.isTablet), this); accountHeader = buildAccountHeader(); drawerLeft = layoutHelper.buildDrawer(savedInstanceState, accountHeader, toolbar); + drawerLeft.setOnDrawerItemClickListener((view, position, drawerItem) -> { + if (drawerItem instanceof NetworkItem) { + drawerLeft.getAdapter().toggleExpandable(position); + return true; + } else if (drawerItem instanceof BufferItem) { + int id = ((BufferItem) drawerItem).getBuffer().getInfo().id(); + context.client().backlogManager().open(id); + return false; + } + return true; + }); replaceFragment(new LoadingFragment()); @@ -150,18 +174,21 @@ public class MainActivity extends BoundActivity { .withCompactStyle(true) .withHeaderBackground(R.drawable.bg1) .withProfileImagesVisible(false) + .withOnAccountHeaderListener((view, profile, current) -> { + selectBufferViewConfig((int) profile.getIdentifier()); + return true; + }) .build(); } public void onEventMainThread(ConnectionChangeEvent event) { - if (event.status == ConnectionChangeEvent.Status.CONNECTED) { - replaceFragment(new ChatFragment()); - } + onConnectionChange(event.status); } public void onConnectionChange(ConnectionChangeEvent.Status status) { if (status == ConnectionChangeEvent.Status.CONNECTED) { replaceFragment(new ChatFragment()); + updateBufferViewConfigs(); } } @@ -169,6 +196,44 @@ public class MainActivity extends BoundActivity { } + private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) { + assertNotNull(drawerLeft); + assertNotNull(accountHeader); + Client client = context.client(); + assertNotNull(client); + + status.bufferViewConfigId = bufferViewConfigId; + accountHeader.setActiveProfile(bufferViewConfigId, false); + + if (bufferViewConfigId == -1) { + drawerLeft.removeAllItems(); + } else { + drawerLeft.removeAllItems(); + QBufferViewManager bufferViewManager = client.bufferViewManager(); + assertNotNull(bufferViewManager); + QBufferViewConfig viewConfig = bufferViewManager.bufferViewConfig(bufferViewConfigId); + assertNotNull(viewConfig); + + new BufferViewConfigItem(drawerLeft, viewConfig, context); + } + } + + private void updateBufferViewConfigs() { + assertNotNull(context.client().bufferViewManager()); + List<QBufferViewConfig> bufferViews = context.client().bufferViewManager().bufferViewConfigs(); + accountHeader.clear(); + for (QBufferViewConfig viewConfig : bufferViews) { + if (viewConfig != null) { + accountHeader.addProfiles( + new ProfileDrawerItem() + .withName(viewConfig.bufferViewName()) + .withIdentifier(viewConfig.bufferViewId()) + ); + } + } + accountHeader.setActiveProfile(status.bufferViewConfigId, true); + } + @Override protected void onConnectToThread(@Nullable ClientBackgroundThread thread) { super.onConnectToThread(thread); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java index 3abb53736ea96f60cb88cc9f8ce35a7240c9a32e..da9fbbd63e47ef428f9aafad76c0d32e34297461 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java @@ -41,36 +41,32 @@ import de.kuschku.libquassel.events.BufferChangeEvent; import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.util.BoundFragment; import de.kuschku.quasseldroid_ng.ui.chat.chatview.MessageAdapter; import de.kuschku.quasseldroid_ng.ui.chat.util.SlidingPanelHandler; +import de.kuschku.quasseldroid_ng.util.BoundFragment; import de.kuschku.util.observables.AutoScroller; import de.kuschku.util.observables.lists.ObservableComparableSortedList; import static de.kuschku.util.AndroidAssert.assertNotNull; public class ChatFragment extends BoundFragment { - private SlidingPanelHandler panelHandler; - private MessageAdapter messageAdapter; - /** * The list containing the messages to be displayed */ @Bind(R.id.messages) RecyclerView messages; - @Bind(R.id.swipe_view) SwipeRefreshLayout swipeView; - @Bind(R.id.sliding_layout) SlidingUpPanelLayout sliderMain; + private MessageAdapter messageAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_chat, container, false); - panelHandler = new SlidingPanelHandler(getActivity(), (SlidingUpPanelLayout) view, context); ButterKnife.bind(this, view); + new SlidingPanelHandler(getActivity(), sliderMain, context); assertNotNull(messages); @@ -81,6 +77,13 @@ public class ChatFragment extends BoundFragment { swipeView.setColorSchemeColors(context.themeUtil().res.colorPrimary); swipeView.setEnabled(false); + swipeView.setOnRefreshListener(() -> { + Client client = context.client(); + assertNotNull(client); + QBacklogManager<? extends QBacklogManager> backlogManager = client.backlogManager(); + assertNotNull(backlogManager); + backlogManager.requestMoreBacklog(client.backlogManager().open(), 20); + }); return view; } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java index 3f02e84a2f00ebffea4d6b1af393310b66fd5976..66f920c640b95da472290b51736f48e3c360b5c5 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java @@ -29,6 +29,7 @@ import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -42,6 +43,7 @@ import com.sothree.slidinguppanel.SlidingUpPanelLayout; import butterknife.Bind; import butterknife.ButterKnife; +import de.kuschku.libquassel.localtypes.buffers.Buffer; import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.ui.editor.AdvancedEditor; import de.kuschku.quasseldroid_ng.ui.theme.AppContext; @@ -176,6 +178,31 @@ public class SlidingPanelHandler { } }); setChatlineExpanded(slidingLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED); + + send.setOnClickListener(v -> sendInput()); + chatline.setOnKeyListener((v, keyCode, event) -> { + if (event.getAction() == KeyEvent.ACTION_DOWN && (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER)) { + sendInput(); + return true; + } else { + return false; + } + }); + } + + private void sendInput() { + if (context.client() == null) return; + + int bufferId = context.client().backlogManager().open(); + + if (bufferId >= 0) { + Buffer buffer = context.client().bufferManager().buffer(bufferId); + assertNotNull(buffer); + + String text = editor.toFormatString(); + context.client().sendInput(buffer.getInfo(), text); + chatline.setText(""); + } } private void setupHistoryFakeData() { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java index 15eb3f9b3e553c3c3e7ec65229e0d04e758fbcd1..a854aa32173ec9f530b5f0109a0dc749630307ca 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java @@ -26,5 +26,5 @@ import de.kuschku.util.instancestateutil.Store; public class Status extends Storable { @Store - int bufferViewConfigId = -1; + public int bufferViewConfigId = -1; } diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index ee979f7c7e542b6278c6fc406987368e0e5db7b2..40c4bcd4778b16efdb2591a3e3546e8c844e9e5e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -268,7 +268,7 @@ <item name="colorBackground">#002B36</item> <item name="colorBackgroundHighlight">#268bd2</item> - <item name="colorBackgroundSecondary">#073642</item> + <item name="colorBackgroundSecondary">#002B36</item> <item name="colorBackgroundCard">#073642</item> <item name="colorTintActivity">#88cc33</item>