From 3a8d509c1e28bbb2952f575cbde5a28742c4a734 Mon Sep 17 00:00:00 2001
From: Niels Andriesse <andriesseniels@gmail.com>
Date: Thu, 18 Jul 2019 15:59:41 +1000
Subject: [PATCH] Further Lokify UI

---
 AndroidManifest.xml                           |  4 ++
 build.gradle                                  |  2 +-
 res/layout/activity_new_conversation.xml      | 42 +++++++++++++++
 res/layout/conversation_list_fragment.xml     |  5 +-
 res/values/strings.xml                        |  8 ++-
 .../securesms/ConversationListFragment.java   |  3 +-
 .../securesms/SmsSendtoActivity.java          |  6 +--
 .../securesms/loki/NewConversationActivity.kt | 53 +++++++++++++++++++
 8 files changed, 114 insertions(+), 9 deletions(-)
 create mode 100644 res/layout/activity_new_conversation.xml
 create mode 100644 src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt

diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 60bbad9dbf..678d284d4f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -447,6 +447,10 @@
               android:windowSoftInputMode="stateUnchanged"
               android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
 
+    <activity android:name=".loki.NewConversationActivity"
+              android:windowSoftInputMode="stateAlwaysVisible"
+              android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
+
     <service android:enabled="true" android:name="org.thoughtcrime.securesms.service.WebRtcCallService"/>
     <service android:enabled="true" android:name=".service.ApplicationMigrationService"/>
     <service android:enabled="true" android:exported="false" android:name=".service.KeyCachingService"/>
diff --git a/build.gradle b/build.gradle
index 7bea4d7f1a..19e4767c92 100644
--- a/build.gradle
+++ b/build.gradle
@@ -171,7 +171,7 @@ dependencies {
     testImplementation 'org.robolectric:shadows-multidex:4.2'
 
     // Loki
-    implementation "com.github.loki-project:loki-messenger-android-core:master-SNAPSHOT"
+    implementation "com.github.loki-project:loki-messenger-android-service:master-SNAPSHOT"
     implementation "org.signal:signal-metadata-android:0.0.3"
     implementation "com.google.protobuf:protobuf-java:2.5.0"
     implementation "com.googlecode.libphonenumber:libphonenumber:8.10.7"
diff --git a/res/layout/activity_new_conversation.xml b/res/layout/activity_new_conversation.xml
new file mode 100644
index 0000000000..f2f28a1b80
--- /dev/null
+++ b/res/layout/activity_new_conversation.xml
@@ -0,0 +1,42 @@
+<?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="match_parent"
+    android:layout_marginStart="32dp"
+    android:layout_marginEnd="32dp"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <org.thoughtcrime.securesms.components.LabeledEditText
+        android:id="@+id/publicKeyEditText"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="32dp"
+        app:labeledEditText_background="@color/white"
+        app:labeledEditText_label="@string/activity_new_conversation_public_key_edit_text_label"/>
+
+    <TextView
+        android:id="@+id/explanationTextView"
+        style="@style/Signal.Text.Body"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="24dp"
+        android:text="@string/activity_new_conversation_public_key_explanation" />
+
+    <com.dd.CircularProgressButton
+        android:id="@+id/nextButton"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:layout_marginTop="24dp"
+        android:layout_gravity="center_horizontal"
+        android:background="@color/signal_primary"
+        android:textColor="@color/white"
+        app:cpb_colorIndicator="@color/white"
+        app:cpb_colorProgress="@color/textsecure_primary"
+        app:cpb_cornerRadius="4dp"
+        app:cpb_selectorIdle="@drawable/progress_button_state"
+        app:cpb_textIdle="@string/activity_new_conversation_button_title" />
+
+</LinearLayout>
diff --git a/res/layout/conversation_list_fragment.xml b/res/layout/conversation_list_fragment.xml
index 536041924a..68806f42f6 100644
--- a/res/layout/conversation_list_fragment.xml
+++ b/res/layout/conversation_list_fragment.xml
@@ -31,7 +31,8 @@
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
-                   tools:src="@drawable/conversation_list_empty_state" />
+                   tools:src="@drawable/conversation_list_empty_state"
+                   android:visibility="gone" />
 
 
         <TextView android:layout_width="match_parent"
@@ -41,7 +42,7 @@
                   android:layout_marginTop="20dp"
                   android:layout_marginBottom="20dp"
                   style="@style/Signal.Text.Body"
-                  android:text="@string/conversation_list_fragment__give_your_inbox_something_to_write_home_about_get_started_by_messaging_a_friend"
+                  android:text="@string/activity_conversation_list_empty_state_message"
                   android:gravity="center" />
     </LinearLayout>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 27178cee01..dbd0243b04 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1335,12 +1335,10 @@
     <string name="conversation_list_item_inbox_zero__inbox_zeeerrro">Inbox zeeerrro</string>
     <string name="conversation_list_item_inbox_zero__zip_zilch_zero_nada_nyou_re_all_caught_up">Zip. Zilch. Zero. Nada.\nYou\'re all caught up!</string>
 
-
     <!-- conversation_list_fragment -->
     <string name="conversation_list_fragment__fab_content_description">New conversation</string>
     <string name="conversation_list_fragment__give_your_inbox_something_to_write_home_about_get_started_by_messaging_a_friend">Give your inbox something to write home about. Get started by messaging a friend.</string>
 
-
     <!-- conversation_secure_verified -->
     <string name="conversation_secure_verified__menu_reset_secure_session">Reset secure session</string>
 
@@ -1539,6 +1537,8 @@
     <string name="activity_key_pair_mnemonic_copied_message">Copied to Clipboard</string>
     <string name="activity_key_pair_register_or_restore_button_title_1">Register</string>
     <string name="activity_key_pair_register_or_restore_button_title_2">Restore</string>
+    <!-- Conversation list activity -->
+    <string name="activity_conversation_list_empty_state_message">Looks like you don\'t have any conversations yet. Get started by messaging a friend.</string>
     <!-- Settings activity -->
     <string name="activity_settings_share_public_key_button_title">Share Public Key</string>
     <string name="activity_settings_show_seed_button_title">Show Seed</string>
@@ -1556,6 +1556,10 @@
     <!-- Contact selection activity -->
     <string name="activity_contact_selection_search_bar_placeholder">Search by name or public key</string>
     <!-- New conversation activity -->
+    <string name="activity_new_conversation_title">New Conversation</string>
+    <string name="activity_new_conversation_public_key_edit_text_label">Public Key</string>
+    <string name="activity_new_conversation_public_key_explanation">Enter the public key of the person you\'d like to securely message. They can share their public key with you by going into Loki Messenger\'s in-app settings and clicking "Share Public Key".</string>
+    <string name="activity_new_conversation_button_title">Next</string>
     <string name="activity_new_conversation_invalid_public_key_message">Invalid Public Key</string>
     <!-- Friend request view -->
     <string name="view_friend_request_accept_button_title">Accept</string>
diff --git a/src/org/thoughtcrime/securesms/ConversationListFragment.java b/src/org/thoughtcrime/securesms/ConversationListFragment.java
index eaaf27cc4f..e235f9062e 100644
--- a/src/org/thoughtcrime/securesms/ConversationListFragment.java
+++ b/src/org/thoughtcrime/securesms/ConversationListFragment.java
@@ -74,6 +74,7 @@ import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
 import org.thoughtcrime.securesms.database.loaders.ConversationListLoader;
 import org.thoughtcrime.securesms.events.ReminderUpdateEvent;
 import org.thoughtcrime.securesms.jobs.ServiceOutageDetectionJob;
+import org.thoughtcrime.securesms.loki.NewConversationActivity;
 import org.thoughtcrime.securesms.mms.GlideApp;
 import org.thoughtcrime.securesms.notifications.MarkReadReceiver;
 import org.thoughtcrime.securesms.notifications.MessageNotifier;
@@ -360,7 +361,7 @@ public class ConversationListFragment extends Fragment
   public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
     if ((cursor == null || cursor.getCount() <= 0) && TextUtils.isEmpty(queryFilter) && !archive) {
       list.setVisibility(View.INVISIBLE);
-      emptyState.setVisibility(View.GONE);
+      emptyState.setVisibility(View.VISIBLE);
       emptySearch.setVisibility(View.INVISIBLE);
       emptyImage.setImageResource(EMPTY_IMAGES[(int) (Math.random() * EMPTY_IMAGES.length)]);
       fab.startPulse(3 * 1000);
diff --git a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java
index 428ec78fad..cf0add6a74 100644
--- a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java
+++ b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java
@@ -7,13 +7,13 @@ import android.os.Bundle;
 import android.provider.ContactsContract;
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
-
-import org.thoughtcrime.securesms.conversation.ConversationActivity;
-import org.thoughtcrime.securesms.logging.Log;
 import android.widget.Toast;
 
+import org.thoughtcrime.securesms.conversation.ConversationActivity;
 import org.thoughtcrime.securesms.database.Address;
 import org.thoughtcrime.securesms.database.DatabaseFactory;
+import org.thoughtcrime.securesms.logging.Log;
+import org.thoughtcrime.securesms.loki.NewConversationActivity;
 import org.thoughtcrime.securesms.recipients.Recipient;
 import org.thoughtcrime.securesms.util.Rfc5724Uri;
 
diff --git a/src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt b/src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt
new file mode 100644
index 0000000000..f4a044c164
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt
@@ -0,0 +1,53 @@
+package org.thoughtcrime.securesms.loki
+
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import kotlinx.android.synthetic.main.activity_new_conversation.*
+import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
+import org.thoughtcrime.securesms.R
+import org.thoughtcrime.securesms.conversation.ConversationActivity
+import org.thoughtcrime.securesms.database.Address
+import org.thoughtcrime.securesms.database.DatabaseFactory
+import org.thoughtcrime.securesms.database.ThreadDatabase
+import org.thoughtcrime.securesms.recipients.Recipient
+import org.thoughtcrime.securesms.util.DynamicTheme
+import org.whispersystems.signalservice.loki.utilities.PublicKeyValidation
+
+class NewConversationActivity : PassphraseRequiredActionBarActivity() {
+    private val dynamicTheme = DynamicTheme()
+
+    override fun onPreCreate() {
+        dynamicTheme.onCreate(this)
+    }
+
+    override fun onCreate(bundle: Bundle?, isReady: Boolean) {
+        setContentView(R.layout.activity_new_conversation)
+        supportActionBar!!.setTitle(R.string.activity_new_conversation_title)
+        supportActionBar!!.setDisplayHomeAsUpEnabled(true)
+        nextButton.setOnClickListener { startNewConversationIfPossible() }
+    }
+
+    public override fun onResume() {
+        super.onResume()
+        dynamicTheme.onResume(this)
+    }
+
+    private fun startNewConversationIfPossible() {
+        val hexEncodedPublicKey = publicKeyEditText.text.toString().trim()
+        if (PublicKeyValidation.isValid(hexEncodedPublicKey)) {
+            val contact = Recipient.from(this, Address.fromSerialized(hexEncodedPublicKey), true)
+            val intent = Intent(this, ConversationActivity::class.java)
+            intent.putExtra(ConversationActivity.ADDRESS_EXTRA, contact.address)
+            intent.putExtra(ConversationActivity.TEXT_EXTRA, getIntent().getStringExtra(ConversationActivity.TEXT_EXTRA))
+            intent.setDataAndType(getIntent().data, getIntent().type)
+            val existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(contact)
+            intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, existingThread)
+            intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT)
+            startActivity(intent)
+            finish()
+        } else {
+            Toast.makeText(this, R.string.activity_new_conversation_invalid_public_key_message, Toast.LENGTH_SHORT).show()
+        }
+    }
+}
\ No newline at end of file