From beed9d803450344c01965e15b7df4fd6c4884608 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Thu, 24 Aug 2017 17:40:35 -0700 Subject: [PATCH] Add length limit feedback when setting profile name // FREEBIE --- res/layout/profile_preference_view.xml | 13 ++--- res/values/strings.xml | 2 + .../ApplicationPreferencesActivity.java | 6 ++- .../securesms/CreateProfileActivity.java | 20 ++++++++ .../contacts/avatars/ContactPhotoFactory.java | 1 + .../preferences/ProfilePreference.java | 47 ++++++++++++++----- 6 files changed, 70 insertions(+), 19 deletions(-) diff --git a/res/layout/profile_preference_view.xml b/res/layout/profile_preference_view.xml index 8734d5c7c8..006ed5ecc2 100644 --- a/res/layout/profile_preference_view.xml +++ b/res/layout/profile_preference_view.xml @@ -18,12 +18,13 @@ android:layout_marginLeft="10dp" android:layout_marginStart="10dp"> - + Updating profile Updating and encrypting profile Profile photo + Too long Using custom: %s @@ -1446,6 +1447,7 @@ Transport icon + diff --git a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java index fcdc34798d..5accf142f6 100644 --- a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java +++ b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java @@ -42,6 +42,7 @@ import org.thoughtcrime.securesms.preferences.AppProtectionPreferenceFragment; import org.thoughtcrime.securesms.preferences.AppearancePreferenceFragment; import org.thoughtcrime.securesms.preferences.CorrectedPreferenceFragment; import org.thoughtcrime.securesms.preferences.NotificationsPreferenceFragment; +import org.thoughtcrime.securesms.preferences.ProfilePreference; import org.thoughtcrime.securesms.preferences.SmsMmsPreferenceFragment; import org.thoughtcrime.securesms.preferences.ChatsPreferenceFragment; import org.thoughtcrime.securesms.service.KeyCachingService; @@ -171,6 +172,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA } private void setCategorySummaries() { + ((ProfilePreference)this.findPreference(PREFERENCE_CATEGORY_PROFILE)).refresh(); + this.findPreference(PREFERENCE_CATEGORY_SMS_MMS) .setSummary(SmsMmsPreferenceFragment.getSummary(getActivity())); this.findPreference(PREFERENCE_CATEGORY_NOTIFICATIONS) @@ -284,7 +287,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA Intent intent = new Intent(preference.getContext(), CreateProfileActivity.class); intent.putExtra(CreateProfileActivity.EXCLUDE_SYSTEM, true); - ((BaseActionBarActivity)getActivity()).startActivitySceneTransition(intent, getActivity().findViewById(R.id.avatar), "avatar"); + getActivity().startActivity(intent); +// ((BaseActionBarActivity)getActivity()).startActivitySceneTransition(intent, getActivity().findViewById(R.id.avatar), "avatar"); return true; } } diff --git a/src/org/thoughtcrime/securesms/CreateProfileActivity.java b/src/org/thoughtcrime/securesms/CreateProfileActivity.java index 568b2da403..502cae79e3 100644 --- a/src/org/thoughtcrime/securesms/CreateProfileActivity.java +++ b/src/org/thoughtcrime/securesms/CreateProfileActivity.java @@ -12,7 +12,9 @@ import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; import android.util.Log; import android.util.Pair; import android.view.KeyEvent; @@ -48,6 +50,7 @@ import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.whispersystems.signalservice.api.SignalServiceAccountManager; +import org.whispersystems.signalservice.api.crypto.ProfileCipher; import org.whispersystems.signalservice.api.util.StreamDetails; import java.io.ByteArrayInputStream; @@ -177,6 +180,23 @@ public class CreateProfileActivity extends PassphraseRequiredActionBarActivity i startActivityForResult(chooserIntent, REQUEST_CODE_AVATAR); }); + this.name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + @Override + public void afterTextChanged(Editable s) { + if (s.toString().getBytes().length > ProfileCipher.NAME_PADDED_LENGTH) { + name.setError(getString(R.string.CreateProfileActivity_too_long)); + finishButton.setEnabled(false); + } else if (name.getError() != null || !finishButton.isEnabled()) { + name.setError(null); + finishButton.setEnabled(true); + } + } + }); + this.finishButton.setOnClickListener(view -> { handleUpload(); }); diff --git a/src/org/thoughtcrime/securesms/contacts/avatars/ContactPhotoFactory.java b/src/org/thoughtcrime/securesms/contacts/avatars/ContactPhotoFactory.java index 7a9ad21601..5cd79b7e4e 100644 --- a/src/org/thoughtcrime/securesms/contacts/avatars/ContactPhotoFactory.java +++ b/src/org/thoughtcrime/securesms/contacts/avatars/ContactPhotoFactory.java @@ -83,6 +83,7 @@ public class ContactPhotoFactory { .load(new AvatarPhotoUri(address)) .asBitmap() .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) .centerCrop() .into(targetSize, targetSize) .get(); diff --git a/src/org/thoughtcrime/securesms/preferences/ProfilePreference.java b/src/org/thoughtcrime/securesms/preferences/ProfilePreference.java index ac975b9dcf..11060d6131 100644 --- a/src/org/thoughtcrime/securesms/preferences/ProfilePreference.java +++ b/src/org/thoughtcrime/securesms/preferences/ProfilePreference.java @@ -2,9 +2,12 @@ package org.thoughtcrime.securesms.preferences; import android.content.Context; +import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.preference.Preference; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.text.TextUtils; import android.util.AttributeSet; @@ -16,11 +19,16 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ContactPhotoFactory; import org.thoughtcrime.securesms.database.Address; +import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; public class ProfilePreference extends Preference { + private ImageView avatarView; + private TextView profileNameView; + private TextView profileNumberView; + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public ProfilePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); @@ -50,27 +58,42 @@ public class ProfilePreference extends Preference { protected void onBindView(View view) { super.onBindView(view); - final ImageView avatar = ViewUtil.findById(view, R.id.avatar); - final TextView profileName = ViewUtil.findById(view, R.id.profile_name); - final TextView profileNumber = ViewUtil.findById(view, R.id.number); - final Address localAddress = Address.fromSerialized(TextSecurePreferences.getLocalNumber(getContext())); + avatarView = ViewUtil.findById(view, R.id.avatar); + profileNameView = ViewUtil.findById(view, R.id.profile_name); + profileNumberView = ViewUtil.findById(view, R.id.number); + + refresh(); + } + + public void refresh() { + if (profileNumberView == null) return; + + final Address localAddress = Address.fromSerialized(TextSecurePreferences.getLocalNumber(getContext())); + final String profileName = TextSecurePreferences.getProfileName(getContext()); - new AsyncTask() { + new AsyncTask() { @Override - protected ContactPhoto doInBackground(Void... params) { - return ContactPhotoFactory.getSignalAvatarContactPhoto(getContext(), localAddress, null, getContext().getResources().getDimensionPixelSize(R.dimen.contact_photo_target_size)); + protected @NonNull Drawable doInBackground(Void... params) { + if (AvatarHelper.getAvatarFile(getContext(), localAddress).exists()) { + return ContactPhotoFactory.getSignalAvatarContactPhoto(getContext(), localAddress, profileName, + getContext().getResources().getDimensionPixelSize(R.dimen.contact_photo_target_size)) + .asDrawable(getContext(), 0); + } else { + return ContactPhotoFactory.getResourceContactPhoto(R.drawable.ic_camera_alt_white_24dp) + .asDrawable(getContext(), getContext().getResources().getColor(R.color.grey_400)); + } } @Override - protected void onPostExecute(ContactPhoto contactPhoto) { - avatar.setImageDrawable(contactPhoto.asDrawable(getContext(), 0)); + protected void onPostExecute(@NonNull Drawable contactPhoto) { + avatarView.setImageDrawable(contactPhoto); } }.execute(); - if (!TextUtils.isEmpty(TextSecurePreferences.getProfileName(getContext()))) { - profileName.setText(TextSecurePreferences.getProfileName(getContext())); + if (!TextUtils.isEmpty(profileName)) { + profileNameView.setText(profileName); } - profileNumber.setText(localAddress.toPhoneString()); + profileNumberView.setText(localAddress.toPhoneString()); } }