From f38b7a30a0ac09a3b3ed24e7f0272df4ae9ee7b0 Mon Sep 17 00:00:00 2001
From: Niels Andriesse <andriesseniels@gmail.com>
Date: Wed, 5 Feb 2020 11:29:45 +1100
Subject: [PATCH] Implement open group suggestion sheet

---
 .../default_bottom_sheet_background.xml       | 11 ++++
 .../default_bottom_sheet_background_inset.xml |  8 +++
 res/drawable/ic_chat_bubbles.xml              | 37 +++++++++++
 ...ent_open_group_suggestion_bottom_sheet.xml | 63 +++++++++++++++++++
 res/values/styles.xml                         |  8 +++
 .../securesms/DeviceListFragment.java         |  2 +-
 .../loki/redesign/activities/HomeActivity.kt  | 29 +++++++++
 .../activities/LinkedDevicesActivity.kt       |  6 +-
 .../DeviceEditingOptionsBottomSheet.kt        |  2 +-
 .../dialogs/OpenGroupSuggestionBottomSheet.kt | 29 +++++++++
 .../securesms/util/TextSecurePreferences.java |  8 +++
 11 files changed, 196 insertions(+), 7 deletions(-)
 create mode 100644 res/drawable/default_bottom_sheet_background.xml
 create mode 100644 res/drawable/default_bottom_sheet_background_inset.xml
 create mode 100644 res/drawable/ic_chat_bubbles.xml
 create mode 100644 res/layout/fragment_open_group_suggestion_bottom_sheet.xml
 rename src/org/thoughtcrime/securesms/loki/redesign/{views => dialogs}/DeviceEditingOptionsBottomSheet.kt (94%)
 create mode 100644 src/org/thoughtcrime/securesms/loki/redesign/dialogs/OpenGroupSuggestionBottomSheet.kt

diff --git a/res/drawable/default_bottom_sheet_background.xml b/res/drawable/default_bottom_sheet_background.xml
new file mode 100644
index 0000000000..127fdb9645
--- /dev/null
+++ b/res/drawable/default_bottom_sheet_background.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <solid android:color="@color/dialog_background" />
+
+    <corners android:topLeftRadius="24dp" android:topRightRadius="24dp" />
+
+    <stroke android:width="@dimen/border_thickness" android:color="@color/dialog_border" />
+</shape>
\ No newline at end of file
diff --git a/res/drawable/default_bottom_sheet_background_inset.xml b/res/drawable/default_bottom_sheet_background_inset.xml
new file mode 100644
index 0000000000..6806f7b96c
--- /dev/null
+++ b/res/drawable/default_bottom_sheet_background_inset.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<inset
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/default_bottom_sheet_background"
+    android:insetLeft="-2dp"
+    android:insetRight="-2dp"
+    android:insetBottom="-2dp">
+</inset>
\ No newline at end of file
diff --git a/res/drawable/ic_chat_bubbles.xml b/res/drawable/ic_chat_bubbles.xml
new file mode 100644
index 0000000000..6af5f35f47
--- /dev/null
+++ b/res/drawable/ic_chat_bubbles.xml
@@ -0,0 +1,37 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="129dp"
+    android:height="89dp"
+    android:viewportWidth="129"
+    android:viewportHeight="89">
+  <path
+      android:pathData="M84.282,21C108.03,21 127.282,35.775 127.282,54C127.282,60.581 124.772,66.712 120.446,71.86C120.387,74.448 122.309,78.125 126.213,82.89C122.04,82.593 118.037,82.029 114.202,81.199C112.522,80.835 111.249,80.511 110.382,80.226C103.147,84.476 94.098,87 84.282,87C60.534,87 41.282,72.225 41.282,54C41.282,35.775 60.534,21 84.282,21Z"
+      android:strokeLineJoin="round"
+      android:strokeWidth="3"
+      android:fillColor="#00000000"
+      android:strokeColor="#02D370"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M33.282,1C50.403,1 64.282,11.969 64.282,25.5C64.282,39.031 50.403,50 33.282,50C26.123,50 19.531,48.082 14.283,44.861C13.67,45.098 12.651,45.376 11.226,45.693C8.462,46.309 5.576,46.728 2.568,46.949C5.767,42.926 7.12,39.948 6.627,38.015C3.867,34.353 2.282,30.073 2.282,25.5C2.282,11.969 16.161,1 33.282,1Z"
+      android:strokeWidth="2"
+      android:fillColor="#FFFFFF"
+      android:fillType="evenOdd"
+      android:strokeColor="#161616"/>
+  <path
+      android:pathData="M64,54m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
+      android:strokeWidth="1"
+      android:fillColor="#02D370"
+      android:fillType="evenOdd"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M84,54m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
+      android:strokeWidth="1"
+      android:fillColor="#02D370"
+      android:fillType="evenOdd"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M100,54a3.5,4 0,1 0,7 0a3.5,4 0,1 0,-7 0z"
+      android:strokeWidth="1"
+      android:fillColor="#02D370"
+      android:fillType="evenOdd"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/res/layout/fragment_open_group_suggestion_bottom_sheet.xml b/res/layout/fragment_open_group_suggestion_bottom_sheet.xml
new file mode 100644
index 0000000000..b26d9f86dc
--- /dev/null
+++ b/res/layout/fragment_open_group_suggestion_bottom_sheet.xml
@@ -0,0 +1,63 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:gravity="center_horizontal"
+    android:padding="@dimen/large_spacing"
+    app:behavior_hideable="true"
+    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
+    android:background="@drawable/default_bottom_sheet_background_inset">
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_chat_bubbles" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/large_spacing"
+        android:text="No messages yet"
+        android:textColor="@color/text"
+        android:textStyle="bold"
+        android:textSize="@dimen/large_font_size" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/large_spacing"
+        android:text="Would you like to join the Session Public Chat?"
+        android:textColor="@color/text"
+        android:textSize="@dimen/medium_font_size"
+        android:textAlignment="center" />
+
+    <Button
+        style="@style/MediumProminentOutlineButton"
+        android:id="@+id/joinButton"
+        android:layout_width="240dp"
+        android:layout_height="@dimen/medium_button_height"
+        android:layout_marginTop="@dimen/large_spacing"
+        android:text="Join Public Chat" />
+
+    <Button
+        style="@style/MediumUnimportantOutlineButton"
+        android:id="@+id/dismissButton"
+        android:layout_width="240dp"
+        android:layout_height="@dimen/medium_button_height"
+        android:layout_marginTop="@dimen/medium_spacing"
+        android:text="No, thank you" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/medium_spacing"
+        android:textSize="@dimen/very_small_font_size"
+        android:textColor="@color/text"
+        android:alpha="0.6"
+        android:textAlignment="center"
+        android:text="Open groups can be joined by anyone and do not provide full metadata protection" />
+
+</LinearLayout>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index fe6bab3fc9..7ceeb76dff 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -49,6 +49,14 @@
         <item name="buttonBarPositiveButtonStyle">@style/Session.AlertDialog.PositiveButtonStyle</item>
     </style>
 
+    <style name="SessionBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
+        <item name="bottomSheetStyle">@style/SessionBottomSheetStyle</item>
+    </style>
+
+    <style name="SessionBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
+        <item name="android:background">@android:color/transparent</item>
+    </style>
+
     <style name="Session.AlertDialog.NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
         <item name="android:textColor">@color/accent</item>
     </style>
diff --git a/src/org/thoughtcrime/securesms/DeviceListFragment.java b/src/org/thoughtcrime/securesms/DeviceListFragment.java
index 61328af624..91381c4835 100644
--- a/src/org/thoughtcrime/securesms/DeviceListFragment.java
+++ b/src/org/thoughtcrime/securesms/DeviceListFragment.java
@@ -25,7 +25,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
 import org.thoughtcrime.securesms.database.loaders.DeviceListLoader;
 import org.thoughtcrime.securesms.dependencies.InjectableType;
 import org.thoughtcrime.securesms.devicelist.Device;
-import org.thoughtcrime.securesms.loki.redesign.views.DeviceEditingOptionsBottomSheet;
+import org.thoughtcrime.securesms.loki.redesign.dialogs.DeviceEditingOptionsBottomSheet;
 import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities;
 import org.thoughtcrime.securesms.util.TextSecurePreferences;
 import org.thoughtcrime.securesms.util.ViewUtil;
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt
index 514363f404..78cb11d8a2 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt
@@ -22,13 +22,16 @@ import android.text.style.ForegroundColorSpan
 import android.view.View
 import kotlinx.android.synthetic.main.activity_home.*
 import network.loki.messenger.R
+import nl.komponents.kovenant.ui.successUi
 import org.thoughtcrime.securesms.ApplicationContext
 import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
 import org.thoughtcrime.securesms.conversation.ConversationActivity
+import org.thoughtcrime.securesms.crypto.ProfileKeyUtil
 import org.thoughtcrime.securesms.database.DatabaseFactory
 import org.thoughtcrime.securesms.database.ThreadDatabase
 import org.thoughtcrime.securesms.database.model.ThreadRecord
 import org.thoughtcrime.securesms.loki.getColorWithID
+import org.thoughtcrime.securesms.loki.redesign.dialogs.OpenGroupSuggestionBottomSheet
 import org.thoughtcrime.securesms.loki.redesign.utilities.push
 import org.thoughtcrime.securesms.loki.redesign.utilities.show
 import org.thoughtcrime.securesms.loki.redesign.views.ConversationView
@@ -147,6 +150,32 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe
         if (hasViewedSeed || !isMasterDevice) {
             seedReminderView.visibility = View.GONE
         }
+        if (!TextSecurePreferences.getHasSeenOpenGroupSuggestionSheet(this)) {
+            val bottomSheet = OpenGroupSuggestionBottomSheet()
+            bottomSheet.onJoinTapped = {
+                TextSecurePreferences.setHasSeenOpenGroupSuggestionSheet(this)
+                bottomSheet.dismiss()
+                // TODO: Duplication of the code in JoinPublicChatActivity
+                val application = ApplicationContext.getInstance(this)
+                val channel: Long = 1
+                val displayName = TextSecurePreferences.getProfileName(this)
+                val lokiPublicChatAPI = application.lokiPublicChatAPI!!
+                val url = "https://chat.getsession.org"
+                application.lokiPublicChatManager.addChat(url, channel).successUi {
+                    lokiPublicChatAPI.getMessages(channel, url)
+                    lokiPublicChatAPI.setDisplayName(displayName, url)
+                    lokiPublicChatAPI.join(channel, url)
+                    val profileKey: ByteArray = ProfileKeyUtil.getProfileKey(this)
+                    val profileUrl: String? = TextSecurePreferences.getProfileAvatarUrl(this)
+                    lokiPublicChatAPI.setProfilePicture(url, profileKey, profileUrl)
+                }
+            }
+            bottomSheet.onDismissTapped = {
+                TextSecurePreferences.setHasSeenOpenGroupSuggestionSheet(this)
+                bottomSheet.dismiss()
+            }
+            bottomSheet.show(supportFragmentManager, bottomSheet.tag)
+        }
     }
     // endregion
 
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt
index 669f575ac5..ba659cfa21 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt
@@ -15,11 +15,7 @@ import network.loki.messenger.R
 import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
 import org.thoughtcrime.securesms.database.DatabaseFactory
 import org.thoughtcrime.securesms.devicelist.Device
-import org.thoughtcrime.securesms.loki.redesign.views.DeviceEditingOptionsBottomSheet
-import org.thoughtcrime.securesms.loki.redesign.dialogs.EditDeviceNameDialog
-import org.thoughtcrime.securesms.loki.redesign.dialogs.EditDeviceNameDialogDelegate
-import org.thoughtcrime.securesms.loki.redesign.dialogs.LinkDeviceMasterModeDialog
-import org.thoughtcrime.securesms.loki.redesign.dialogs.LinkDeviceMasterModeDialogDelegate
+import org.thoughtcrime.securesms.loki.redesign.dialogs.*
 import org.thoughtcrime.securesms.loki.signAndSendPairingAuthorisationMessage
 import org.thoughtcrime.securesms.sms.MessageSender
 import org.thoughtcrime.securesms.util.TextSecurePreferences
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/views/DeviceEditingOptionsBottomSheet.kt b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/DeviceEditingOptionsBottomSheet.kt
similarity index 94%
rename from src/org/thoughtcrime/securesms/loki/redesign/views/DeviceEditingOptionsBottomSheet.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/dialogs/DeviceEditingOptionsBottomSheet.kt
index 78904471e4..d8bb4967f4 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/views/DeviceEditingOptionsBottomSheet.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/DeviceEditingOptionsBottomSheet.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki.redesign.views
+package org.thoughtcrime.securesms.loki.redesign.dialogs
 
 import android.os.Bundle
 import android.support.design.widget.BottomSheetDialogFragment
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/dialogs/OpenGroupSuggestionBottomSheet.kt b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/OpenGroupSuggestionBottomSheet.kt
new file mode 100644
index 0000000000..274b36af74
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/OpenGroupSuggestionBottomSheet.kt
@@ -0,0 +1,29 @@
+package org.thoughtcrime.securesms.loki.redesign.dialogs
+
+import android.os.Bundle
+import android.support.design.widget.BottomSheetDialogFragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import kotlinx.android.synthetic.main.fragment_open_group_suggestion_bottom_sheet.*
+import network.loki.messenger.R
+
+public class OpenGroupSuggestionBottomSheet : BottomSheetDialogFragment() {
+    var onJoinTapped: (() -> Unit)? = null
+    var onDismissTapped: (() -> Unit)? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setStyle(STYLE_NORMAL, R.style.SessionBottomSheetDialogTheme)
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        return inflater.inflate(R.layout.fragment_open_group_suggestion_bottom_sheet, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        joinButton.setOnClickListener { onJoinTapped?.invoke() }
+        dismissButton.setOnClickListener { onDismissTapped?.invoke() }
+    }
+}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
index d7fece32d1..052997e3ac 100644
--- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
+++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
@@ -1250,6 +1250,14 @@ public class TextSecurePreferences {
   public static long getRestorationTime(Context context) {
     return getLongPreference(context, "restoration_time", 0);
   }
+
+  public static boolean getHasSeenOpenGroupSuggestionSheet(Context context) {
+    return getBooleanPreference(context, "has_seen_open_group_suggestion_sheet", false);
+  }
+
+  public static void setHasSeenOpenGroupSuggestionSheet(Context context) {
+    setBooleanPreference(context, "has_seen_open_group_suggestion_sheet", true);
+  }
   // endregion
 
   public static void clearAll(Context context) {