From b4328d1aa3408a09ddcf8c36bdcb7d7ea51f266e Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 6 Jun 2019 15:01:06 +1000 Subject: [PATCH] Create UI path to new conversation screen --- res/layout/contact_filter_toolbar.xml | 40 ++++++------- res/values/strings.xml | 10 +++- res/xml/preferences.xml | 4 ++ .../ApplicationPreferencesActivity.java | 34 ++++++++++- .../ContactSelectionListFragment.java | 43 +++++++------- .../securesms/NewConversationActivity.java | 19 +++---- .../components/ContactFilterToolbar.java | 57 ++++++++++--------- ...abaseUtilities.kt => DatabaseUtilities.kt} | 0 8 files changed, 122 insertions(+), 85 deletions(-) rename src/org/thoughtcrime/securesms/loki/{LokiDatabaseUtilities.kt => DatabaseUtilities.kt} (100%) diff --git a/res/layout/contact_filter_toolbar.xml b/res/layout/contact_filter_toolbar.xml index d2df675416..f6615b7623 100644 --- a/res/layout/contact_filter_toolbar.xml +++ b/res/layout/contact_filter_toolbar.xml @@ -14,7 +14,7 @@ android:layout_height="wrap_content" android:layout_width="0px" android:layout_weight="1" - android:hint="@string/contact_selection_activity__enter_name_or_number" + android:hint="@string/activity_contact_selection_search_bar_placeholder" android:inputType="textPersonName" style="@style/TextSecure.TitleTextStyle" android:background="@android:color/transparent" @@ -33,26 +33,26 @@ android:paddingEnd="10dp" android:gravity="center"> - + + + + + + + + + - + + + + + + + + + + Copy Copied to Clipboard Register - + Share Public Key - Copied to Clipboard + Show Seed + Your Seed + Copy + Cancel + Copied to Clipboard + + Search by name or public key diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index f6cfb733e4..a88542804b 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -37,4 +37,8 @@ android:title="@string/activity_settings_share_public_key_button_title" android:icon="@drawable/ic_textsms_24dp"/> + + diff --git a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java index 07f6424045..0fd9345bcd 100644 --- a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java +++ b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java @@ -21,6 +21,7 @@ import android.annotation.TargetApi; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.TypedArray; @@ -34,9 +35,11 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; +import android.support.v7.app.AlertDialog; import android.support.v7.preference.Preference; import android.widget.Toast; +import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; import org.thoughtcrime.securesms.preferences.AdvancedPreferenceFragment; import org.thoughtcrime.securesms.preferences.AppProtectionPreferenceFragment; import org.thoughtcrime.securesms.preferences.AppearancePreferenceFragment; @@ -48,9 +51,11 @@ import org.thoughtcrime.securesms.preferences.widgets.ProfilePreference; import org.thoughtcrime.securesms.service.KeyCachingService; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.IdentityUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.whispersystems.signalservice.api.SignalServiceAccountManager; +import org.whispersystems.signalservice.loki.crypto.MnemonicCodec; +import org.whispersystems.signalservice.loki.utilities.SerializationKt; + +import java.io.File; /** * The Activity for application preference display and management. @@ -74,6 +79,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA private static final String PREFERENCE_CATEGORY_DEVICES = "preference_category_devices"; private static final String PREFERENCE_CATEGORY_ADVANCED = "preference_category_advanced"; private static final String PREFERENCE_CATEGORY_PUBLIC_KEY = "preference_category_public_key"; + private static final String PREFERENCE_CATEGORY_SEED = "preference_category_seed"; private final DynamicTheme dynamicTheme = new DynamicTheme(); private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); @@ -162,6 +168,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA .setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_ADVANCED)); this.findPreference(PREFERENCE_CATEGORY_PUBLIC_KEY) .setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_PUBLIC_KEY)); + this.findPreference(PREFERENCE_CATEGORY_SEED) + .setOnPreferenceClickListener(new CategoryClickListener((PREFERENCE_CATEGORY_SEED))); if (VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { tintIcons(getActivity()); @@ -213,7 +221,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA Drawable chats = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_forum_white_24dp)); Drawable devices = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_laptop_white_24dp)); Drawable advanced = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_advanced_white_24dp)); - Drawable publicKey = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_share_white_24dp)); + Drawable publicKey = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_textsms_24dp)); + Drawable seed = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_security_24dp)); int[] tintAttr = new int[]{R.attr.pref_icon_tint}; TypedArray typedArray = context.obtainStyledAttributes(tintAttr); @@ -227,6 +236,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA DrawableCompat.setTint(chats, color); DrawableCompat.setTint(devices, color); DrawableCompat.setTint(advanced, color); + DrawableCompat.setTint(publicKey, color); + DrawableCompat.setTint(seed, color); this.findPreference(PREFERENCE_CATEGORY_SMS_MMS).setIcon(sms); this.findPreference(PREFERENCE_CATEGORY_NOTIFICATIONS).setIcon(notifications); @@ -236,6 +247,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA this.findPreference(PREFERENCE_CATEGORY_DEVICES).setIcon(devices); this.findPreference(PREFERENCE_CATEGORY_ADVANCED).setIcon(advanced); this.findPreference(PREFERENCE_CATEGORY_PUBLIC_KEY).setIcon(publicKey); + this.findPreference(PREFERENCE_CATEGORY_SEED).setIcon(seed); } private class CategoryClickListener implements Preference.OnPreferenceClickListener { @@ -280,6 +292,22 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA shareIntent.setType("text/plain"); startActivity(shareIntent); break; + case PREFERENCE_CATEGORY_SEED: + File languageFileDirectory = new File(getContext().getApplicationInfo().dataDir); + String hexEncodedPrivateKey = SerializationKt.getHexEncodedPrivateKey(IdentityKeyUtil.getIdentityKeyPair(getContext())); + String seed = new MnemonicCodec(languageFileDirectory).encode(hexEncodedPrivateKey, MnemonicCodec.Language.Configuration.Companion.getEnglish()); + new AlertDialog.Builder(getContext()) + .setTitle(R.string.activity_settings_seed_dialog_title) + .setMessage(seed) + .setPositiveButton(R.string.activity_settings_seed_dialog_copy_button_title, (DialogInterface.OnClickListener) (dialog, which) -> { + ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("seed", seed); + clipboard.setPrimaryClip(clip); + Toast.makeText(getContext(), R.string.activity_settings_seed_copied_message, Toast.LENGTH_SHORT).show(); + }) + .setNeutralButton(R.string.activity_settings_seed_dialog_cancel_button_title, null) + .show(); + break; default: throw new AssertionError(); } diff --git a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java index e6c244b238..0ce78ad909 100644 --- a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -21,7 +21,6 @@ import android.Manifest; import android.annotation.SuppressLint; import android.database.Cursor; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; @@ -33,7 +32,6 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; @@ -51,7 +49,6 @@ import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.DirectoryHelper; import org.thoughtcrime.securesms.util.StickyHeaderDecoration; -import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; import java.io.IOException; @@ -99,26 +96,28 @@ public class ContactSelectionListFragment extends Fragment public void onStart() { super.onStart(); - Permissions.with(this) - .request(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CONTACTS) - .ifNecessary() - .onAllGranted(() -> { - if (!TextSecurePreferences.hasSuccessfullyRetrievedDirectory(getActivity())) { - handleContactPermissionGranted(); - } else { - this.getLoaderManager().initLoader(0, null, this); - } - }) - .onAnyDenied(() -> { - getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + handleContactPermissionGranted(); - if (getActivity().getIntent().getBooleanExtra(RECENTS, false)) { - getLoaderManager().initLoader(0, null, ContactSelectionListFragment.this); - } else { - initializeNoContactsPermission(); - } - }) - .execute(); +// Permissions.with(this) +// .request(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CONTACTS) +// .ifNecessary() +// .onAllGranted(() -> { +// if (!TextSecurePreferences.hasSuccessfullyRetrievedDirectory(getActivity())) { +// handleContactPermissionGranted(); +// } else { +// this.getLoaderManager().initLoader(0, null, this); +// } +// }) +// .onAnyDenied(() -> { +// getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); +// +// if (getActivity().getIntent().getBooleanExtra(RECENTS, false)) { +// getLoaderManager().initLoader(0, null, ContactSelectionListFragment.this); +// } else { +// initializeNoContactsPermission(); +// } +// }) +// .execute(); } @Override diff --git a/src/org/thoughtcrime/securesms/NewConversationActivity.java b/src/org/thoughtcrime/securesms/NewConversationActivity.java index f77b385d98..4f44d3a73b 100644 --- a/src/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/org/thoughtcrime/securesms/NewConversationActivity.java @@ -18,10 +18,7 @@ package org.thoughtcrime.securesms; import android.content.Intent; import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; -import android.view.View; import org.thoughtcrime.securesms.conversation.ConversationActivity; import org.thoughtcrime.securesms.database.Address; @@ -91,12 +88,12 @@ public class NewConversationActivity extends ContactSelectionActivity { startActivity(new Intent(this, InviteActivity.class)); } - @Override - protected boolean onPrepareOptionsPanel(View view, Menu menu) { - MenuInflater inflater = this.getMenuInflater(); - menu.clear(); - inflater.inflate(R.menu.new_conversation_activity, menu); - super.onPrepareOptionsMenu(menu); - return true; - } +// @Override +// protected boolean onPrepareOptionsPanel(View view, Menu menu) { +// MenuInflater inflater = this.getMenuInflater(); +// menu.clear(); +// inflater.inflate(R.menu.new_conversation_activity, menu); +// super.onPrepareOptionsMenu(menu); +// return true; +// } } diff --git a/src/org/thoughtcrime/securesms/components/ContactFilterToolbar.java b/src/org/thoughtcrime/securesms/components/ContactFilterToolbar.java index a9029865db..0be9fef214 100644 --- a/src/org/thoughtcrime/securesms/components/ContactFilterToolbar.java +++ b/src/org/thoughtcrime/securesms/components/ContactFilterToolbar.java @@ -14,7 +14,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.ViewUtil; public class ContactFilterToolbar extends Toolbar { @@ -22,8 +21,8 @@ public class ContactFilterToolbar extends Toolbar { private EditText searchText; private AnimatingToggle toggle; - private ImageView keyboardToggle; - private ImageView dialpadToggle; +// private ImageView keyboardToggle; +// private ImageView dialpadToggle; private ImageView clearToggle; private LinearLayout toggleContainer; @@ -41,36 +40,36 @@ public class ContactFilterToolbar extends Toolbar { this.searchText = ViewUtil.findById(this, R.id.search_view); this.toggle = ViewUtil.findById(this, R.id.button_toggle); - this.keyboardToggle = ViewUtil.findById(this, R.id.search_keyboard); - this.dialpadToggle = ViewUtil.findById(this, R.id.search_dialpad); +// this.keyboardToggle = ViewUtil.findById(this, R.id.search_keyboard); +// this.dialpadToggle = ViewUtil.findById(this, R.id.search_dialpad); this.clearToggle = ViewUtil.findById(this, R.id.search_clear); this.toggleContainer = ViewUtil.findById(this, R.id.toggle_container); - this.keyboardToggle.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - searchText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME); - ServiceUtil.getInputMethodManager(getContext()).showSoftInput(searchText, 0); - displayTogglingView(dialpadToggle); - } - }); +// this.keyboardToggle.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// searchText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME); +// ServiceUtil.getInputMethodManager(getContext()).showSoftInput(searchText, 0); +// displayTogglingView(dialpadToggle); +// } +// }); - this.dialpadToggle.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - searchText.setInputType(InputType.TYPE_CLASS_PHONE); - ServiceUtil.getInputMethodManager(getContext()).showSoftInput(searchText, 0); - displayTogglingView(keyboardToggle); - } - }); +// this.dialpadToggle.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// searchText.setInputType(InputType.TYPE_CLASS_PHONE); +// ServiceUtil.getInputMethodManager(getContext()).showSoftInput(searchText, 0); +// displayTogglingView(keyboardToggle); +// } +// }); this.clearToggle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { searchText.setText(""); - if (SearchUtil.isTextInput(searchText)) displayTogglingView(dialpadToggle); - else displayTogglingView(keyboardToggle); +// if (SearchUtil.isTextInput(searchText)) displayTogglingView(dialpadToggle); +// else displayTogglingView(keyboardToggle); } }); @@ -88,15 +87,17 @@ public class ContactFilterToolbar extends Toolbar { @Override public void afterTextChanged(Editable s) { if (!SearchUtil.isEmpty(searchText)) displayTogglingView(clearToggle); - else if (SearchUtil.isTextInput(searchText)) displayTogglingView(dialpadToggle); - else if (SearchUtil.isPhoneInput(searchText)) displayTogglingView(keyboardToggle); + else displayTogglingView(null); +// else if (SearchUtil.isTextInput(searchText)) displayTogglingView(dialpadToggle); +// else if (SearchUtil.isPhoneInput(searchText)) displayTogglingView(keyboardToggle); notifyListener(); } }); setLogo(null); setContentInsetStartWithNavigation(0); - expandTapArea(toggleContainer, dialpadToggle); + displayTogglingView(null); +// expandTapArea(toggleContainer, dialpadToggle); } public void clear() { @@ -114,7 +115,9 @@ public class ContactFilterToolbar extends Toolbar { private void displayTogglingView(View view) { toggle.display(view); - expandTapArea(toggleContainer, view); + if (view != null) { + expandTapArea(toggleContainer, view); + } } private void expandTapArea(final View container, final View child) { diff --git a/src/org/thoughtcrime/securesms/loki/LokiDatabaseUtilities.kt b/src/org/thoughtcrime/securesms/loki/DatabaseUtilities.kt similarity index 100% rename from src/org/thoughtcrime/securesms/loki/LokiDatabaseUtilities.kt rename to src/org/thoughtcrime/securesms/loki/DatabaseUtilities.kt