diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 51e4770361a76e9b0e1d223e7e43608a7bcff616..6eb90413420abd211b0b4ecc0d5d109487b5288c 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -34,7 +34,10 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.widget.EditText +import android.widget.LinearLayout +import android.widget.TextView import androidx.appcompat.app.ActionBarDrawerToggle +import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat @@ -92,6 +95,7 @@ import de.kuschku.quasseldroid.util.ui.MaterialContentLoadingProgressBar import de.kuschku.quasseldroid.util.ui.NickCountDrawable import de.kuschku.quasseldroid.viewmodel.EditorViewModel import de.kuschku.quasseldroid.viewmodel.data.BufferData +import me.zhanghai.android.materialprogressbar.MaterialProgressBar import org.threeten.bp.Instant import org.threeten.bp.ZoneId import org.threeten.bp.format.DateTimeFormatter @@ -110,6 +114,18 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc @BindView(R.id.progress_bar) lateinit var progressBar: MaterialContentLoadingProgressBar + @BindView(R.id.connection_status) + lateinit var connectionStatusDisplay: LinearLayout + + @BindView(R.id.connection_status_icon) + lateinit var connectionStatusDisplayIcon: AppCompatImageView + + @BindView(R.id.connection_status_progress) + lateinit var connectionStatusDisplayProgress: MaterialProgressBar + + @BindView(R.id.connection_status_text) + lateinit var connectionStatusDisplayText: TextView + @BindView(R.id.autocomplete_list) lateinit var autoCompleteList: RecyclerView @@ -571,23 +587,48 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc viewModel.connectionProgress.toLiveData().observe(this, Observer { val (state, progress, max) = it ?: Triple(ConnectionState.DISCONNECTED, 0, 0) when (state) { - ConnectionState.CONNECTED -> { - progressBar.visibility = View.INVISIBLE - } ConnectionState.DISCONNECTED, - ConnectionState.CLOSED -> { + ConnectionState.CLOSED -> { progressBar.visibility = View.INVISIBLE + + connectionStatusDisplay.visibility = View.VISIBLE + connectionStatusDisplayText.text = getString(R.string.label_status_disconnected) + connectionStatusDisplayIcon.visibility = View.VISIBLE + connectionStatusDisplayProgress.visibility = View.GONE } - ConnectionState.INIT -> { + ConnectionState.CONNECTING -> { + progressBar.visibility = View.VISIBLE + progressBar.isIndeterminate = true + + connectionStatusDisplay.visibility = View.VISIBLE + connectionStatusDisplayText.text = getString(R.string.label_status_connecting) + connectionStatusDisplayIcon.visibility = View.GONE + connectionStatusDisplayProgress.visibility = View.VISIBLE + } + ConnectionState.HANDSHAKE -> { + progressBar.visibility = View.VISIBLE + progressBar.isIndeterminate = true + + connectionStatusDisplay.visibility = View.VISIBLE + connectionStatusDisplayText.text = getString(R.string.label_status_handshake) + connectionStatusDisplayIcon.visibility = View.GONE + connectionStatusDisplayProgress.visibility = View.VISIBLE + } + ConnectionState.INIT -> { progressBar.visibility = View.VISIBLE // Show indeterminate when no progress has been made yet progressBar.isIndeterminate = progress == 0 || max == 0 progressBar.progress = progress progressBar.max = max + + connectionStatusDisplay.visibility = View.VISIBLE + connectionStatusDisplayText.text = getString(R.string.label_status_init) + connectionStatusDisplayIcon.visibility = View.GONE + connectionStatusDisplayProgress.visibility = View.VISIBLE } - else -> { - progressBar.visibility = View.VISIBLE - progressBar.isIndeterminate = true + ConnectionState.CONNECTED -> { + progressBar.visibility = View.INVISIBLE + connectionStatusDisplay.visibility = View.GONE } } }) diff --git a/app/src/main/res/drawable/ic_disconnected.xml b/app/src/main/res/drawable/ic_disconnected.xml new file mode 100644 index 0000000000000000000000000000000000000000..9eae842ce3f489907eca6569ffa2de0ceeb466d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_disconnected.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#000" + android:pathData="M19,17H21V9H19M19,21H21V19H19M1,21H17V7H21V1" /> +</vector> diff --git a/app/src/main/res/layout-land/layout_main.xml b/app/src/main/res/layout-land/layout_main.xml index 0759f57ef1ff192f26b905fed818ade65b6c211b..72cdad6a66a39a51730297b29f91dbff739a6772 100644 --- a/app/src/main/res/layout-land/layout_main.xml +++ b/app/src/main/res/layout-land/layout_main.xml @@ -32,13 +32,20 @@ <include layout="@layout/layout_toolbar" /> - <fragment - android:id="@+id/fragment_messages" - android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment" + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - tools:layout="@layout/fragment_messages" /> + android:layout_height="match_parent"> + + <fragment + android:id="@+id/fragment_messages" + android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:layout="@layout/fragment_messages" /> + + <include layout="@layout/widget_connection_status" /> + </FrameLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/autocomplete_list" diff --git a/app/src/main/res/layout-sw600dp-land/layout_main.xml b/app/src/main/res/layout-sw600dp-land/layout_main.xml index 4f5b192987d9c3a1cd51ac2c8cd3182d770a14e6..61fe90495eb669e7a13d12da3b177b234b045817 100644 --- a/app/src/main/res/layout-sw600dp-land/layout_main.xml +++ b/app/src/main/res/layout-sw600dp-land/layout_main.xml @@ -38,13 +38,20 @@ android:layout_marginBottom="?actionBarSize" android:orientation="vertical"> - <fragment - android:id="@+id/fragment_messages" - android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment" + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - tools:layout="@layout/fragment_messages" /> + android:layout_height="match_parent"> + + <fragment + android:id="@+id/fragment_messages" + android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:layout="@layout/fragment_messages" /> + + <include layout="@layout/widget_connection_status" /> + </FrameLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/autocomplete_list" diff --git a/app/src/main/res/layout/layout_main.xml b/app/src/main/res/layout/layout_main.xml index bb80ce059ab4c49978dfbda03d6cd608897ca6e8..3149aea6de2f179c65f5f51968611bdaa4f2d982 100644 --- a/app/src/main/res/layout/layout_main.xml +++ b/app/src/main/res/layout/layout_main.xml @@ -38,12 +38,20 @@ android:layout_marginBottom="?actionBarSize" android:orientation="vertical"> - <fragment - android:id="@+id/fragment_messages" - android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment" + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - tools:layout="@layout/fragment_messages" /> + android:layout_height="match_parent"> + + <fragment + android:id="@+id/fragment_messages" + android:name="de.kuschku.quasseldroid.ui.chat.messages.MessageListFragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:layout="@layout/fragment_messages" /> + + <include layout="@layout/widget_connection_status" /> + + </FrameLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/autocomplete_list" diff --git a/app/src/main/res/layout/widget_connection_status.xml b/app/src/main/res/layout/widget_connection_status.xml new file mode 100644 index 0000000000000000000000000000000000000000..40b2c94ea51960a505522dbcab926b60db6976d2 --- /dev/null +++ b/app/src/main/res/layout/widget_connection_status.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/connection_status" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?colorPrimaryDark" + android:minHeight="32dp" + android:paddingLeft="16dp" + android:paddingTop="6dp" + android:paddingRight="16dp" + android:paddingBottom="6dp" + android:visibility="gone" + tools:visibility="visible"> + + <androidx.appcompat.widget.AppCompatImageView + android:id="@+id/connection_status_icon" + android:layout_width="20dp" + android:layout_height="20dp" + app:srcCompat="@drawable/ic_disconnected" + app:tint="?colorTextPrimaryInverse" /> + + <me.zhanghai.android.materialprogressbar.MaterialProgressBar + android:id="@+id/connection_status_progress" + style="@style/Widget.MaterialProgressBar.ProgressBar" + android:layout_width="20dp" + android:layout_height="20dp" + android:indeterminate="true" + app:mpb_indeterminateTint="?colorTextPrimaryInverse" /> + + <TextView + android:id="@+id/connection_status_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginLeft="16dp" + android:textColor="?colorTextPrimaryInverse" + tools:text="@string/label_status_connecting" /> + +</LinearLayout>