diff --git a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java index 9e55810f50..f9309eaf83 100644 --- a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java +++ b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java @@ -42,6 +42,7 @@ import android.widget.Toast; import org.jetbrains.annotations.NotNull; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; +import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.loki.DeviceLinkingDialog; import org.thoughtcrime.securesms.loki.DeviceLinkingDialogDelegate; import org.thoughtcrime.securesms.loki.DeviceLinkingView; @@ -192,10 +193,20 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA .setOnPreferenceClickListener(new CategoryClickListener(getContext(), PREFERENCE_CATEGORY_QR_CODE)); Preference linkDevicePreference = this.findPreference(PREFERENCE_CATEGORY_LINK_DEVICE); - // Hide if this is a slave device - linkDevicePreference.setVisible(isMasterDevice); linkDevicePreference.setOnPreferenceClickListener(new CategoryClickListener(getContext(), PREFERENCE_CATEGORY_LINK_DEVICE)); + // Disable if we hit the cap of 1 linked device + if (isMasterDevice) { + Context context = getContext(); + String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context); + boolean isDeviceLinkingEnabled = DatabaseFactory.getLokiAPIDatabase(context).getPairingAuthorisations(userHexEncodedPublicKey).size() <= 1; + linkDevicePreference.setEnabled(isDeviceLinkingEnabled); + linkDevicePreference.getIcon().setAlpha(isDeviceLinkingEnabled ? 255 : 124); + } else { + // Hide if this is a slave device + linkDevicePreference.setVisible(false); + } + Preference seedPreference = this.findPreference(PREFERENCE_CATEGORY_SEED); // Hide if this is a slave device seedPreference.setVisible(isMasterDevice); diff --git a/src/org/thoughtcrime/securesms/components/AvatarImageView.java b/src/org/thoughtcrime/securesms/components/AvatarImageView.java index 6eae6b42aa..28598f4700 100644 --- a/src/org/thoughtcrime/securesms/components/AvatarImageView.java +++ b/src/org/thoughtcrime/securesms/components/AvatarImageView.java @@ -104,38 +104,22 @@ public class AvatarImageView extends AppCompatImageView { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - if (w == 0 || h == 0 || recipient == null) { return; } - - Drawable image; - Context context = this.getContext(); - if (recipient.isGroupRecipient()) { - - - String name = Optional.fromNullable(recipient.getName()).or(Optional.fromNullable(TextSecurePreferences.getProfileName(context))).or(""); - MaterialColor fallbackColor = recipient.getColor(); - - if (fallbackColor == ContactColors.UNKNOWN_COLOR && !TextUtils.isEmpty(name)) { - fallbackColor = ContactColors.generateFor(name); - } - - image = new GeneratedContactPhoto(name, R.drawable.ic_profile_default).asDrawable(context, fallbackColor.toAvatarColor(context)); - } else { - // Default to primary device image - String ourPublicKey = TextSecurePreferences.getLocalNumber(context); - String ourPrimaryDevice = TextSecurePreferences.getMasterHexEncodedPublicKey(context); - String recipientAddress = recipient.getAddress().serialize(); - String profileAddress = (ourPrimaryDevice != null && ourPublicKey.equals(recipientAddress)) ? ourPrimaryDevice : recipientAddress; - image = new JazzIdenticonDrawable(w, h, profileAddress.toLowerCase()); - } - setImageDrawable(image); + updateImage(w, h); } public void update(String hexEncodedPublicKey) { - this.recipient = Recipient.from(getContext(), Address.fromSerialized(hexEncodedPublicKey), false); + Address address = Address.fromSerialized(hexEncodedPublicKey); + if (!address.equals(recipient.getAddress())) { + this.recipient = Recipient.from(getContext(), address, false); + updateImage(); + } } public void setAvatar(@NonNull GlideRequests requestManager, @Nullable Recipient recipient, boolean quickContactEnabled) { - this.recipient = recipient; + if (this.recipient == null || !this.recipient.equals(recipient)) { + this.recipient = recipient; + updateImage(); + } /* if (recipient != null) { requestManager.load(recipient.getContactPhoto()) @@ -170,4 +154,32 @@ public class AvatarImageView extends AppCompatImageView { } } + private void updateImage() { updateImage(getWidth(), getHeight()); } + + private void updateImage(int w, int h) { + if (w == 0 || h == 0 || recipient == null) { return; } + + Drawable image; + Context context = this.getContext(); + + if (recipient.isGroupRecipient()) { + String name = Optional.fromNullable(recipient.getName()).or(Optional.fromNullable(TextSecurePreferences.getProfileName(context))).or(""); + MaterialColor fallbackColor = recipient.getColor(); + + if (fallbackColor == ContactColors.UNKNOWN_COLOR && !TextUtils.isEmpty(name)) { + fallbackColor = ContactColors.generateFor(name); + } + + image = new GeneratedContactPhoto(name, R.drawable.ic_profile_default).asDrawable(context, fallbackColor.toAvatarColor(context)); + } else { + // Default to primary device image + String ourPublicKey = TextSecurePreferences.getLocalNumber(context); + String ourPrimaryDevice = TextSecurePreferences.getMasterHexEncodedPublicKey(context); + String recipientAddress = recipient.getAddress().serialize(); + String profileAddress = (ourPrimaryDevice != null && ourPublicKey.equals(recipientAddress)) ? ourPrimaryDevice : recipientAddress; + image = new JazzIdenticonDrawable(w, h, profileAddress.toLowerCase()); + } + setImageDrawable(image); + } + }