Fix long text in Safety Number Change dialog.

fork-5.53.8
Cody Henthorne 2022-05-16 10:15:56 -04:00
rodzic ff4311d114
commit ec3540e200
10 zmienionych plików z 211 dodań i 13 usunięć

Wyświetl plik

@ -541,6 +541,9 @@ dependencies {
androidTestImplementation testLibs.androidx.test.ext.junit
androidTestImplementation testLibs.espresso.core
androidTestImplementation testLibs.androidx.test.core
androidTestImplementation testLibs.androidx.test.core.ktx
androidTestImplementation testLibs.androidx.test.ext.junit.ktx
testImplementation testLibs.espresso.core

Wyświetl plik

@ -0,0 +1,40 @@
package org.thoughtcrime.securesms.conversation
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
import org.thoughtcrime.securesms.database.IdentityDatabase
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.profiles.ProfileName
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.testing.SignalActivityRule
/**
* Android test to help show SNC dialog quickly with custom data to make sure it displays properly.
*/
@RunWith(AndroidJUnit4::class)
class SafetyNumberChangeDialogPreviewer {
@get:Rule val harness = SignalActivityRule()
@Test
fun testShowLongName() {
val other: Recipient = Recipient.resolved(harness.others.first())
SignalDatabase.recipients.setProfileName(other.id, ProfileName.fromParts("Super really long name like omg", "But seriously it's long like really really long"))
harness.setVerified(other, IdentityDatabase.VerifiedStatus.VERIFIED)
harness.changeIdentityKey(other)
val scenario: ActivityScenario<ConversationActivity> = harness.launchActivity { putExtra("recipient_id", other.id.serialize()) }
scenario.onActivity {
SafetyNumberChangeDialog.show(it.supportFragmentManager, other.id)
}
// Uncomment to make dialog stay on screen, otherwise will show/dismiss immediately
// ThreadUtil.sleep(15000)
}
}

Wyświetl plik

@ -0,0 +1,119 @@
package org.thoughtcrime.securesms.testing
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.preference.PreferenceManager
import androidx.test.core.app.ActivityScenario
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.rules.ExternalResource
import org.signal.libsignal.protocol.IdentityKey
import org.signal.libsignal.protocol.SignalProtocolAddress
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.crypto.MasterSecretUtil
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil
import org.thoughtcrime.securesms.database.IdentityDatabase
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor
import org.thoughtcrime.securesms.profiles.ProfileName
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.registration.RegistrationData
import org.thoughtcrime.securesms.registration.RegistrationRepository
import org.thoughtcrime.securesms.registration.RegistrationUtil
import org.thoughtcrime.securesms.util.Util
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile
import org.whispersystems.signalservice.api.push.ACI
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse
import java.util.UUID
/**
* Test rule to use that sets up the application in a mostly registered state. Enough so that most
* activities should be launchable directly.
*
* To use: `@get:Rule val harness = SignalActivityRule()`
*/
class SignalActivityRule : ExternalResource() {
val application: Application = ApplicationDependencies.getApplication()
lateinit var context: Context
private set
lateinit var self: Recipient
private set
lateinit var others: List<RecipientId>
private set
override fun before() {
context = InstrumentationRegistry.getInstrumentation().targetContext
self = setupSelf()
others = setupOthers()
}
private fun setupSelf(): Recipient {
DeviceTransferBlockingInterceptor.getInstance().blockNetwork()
PreferenceManager.getDefaultSharedPreferences(application).edit().putBoolean("pref_prompted_push_registration", true).commit()
val masterSecret = MasterSecretUtil.generateMasterSecret(application, MasterSecretUtil.UNENCRYPTED_PASSPHRASE)
MasterSecretUtil.generateAsymmetricMasterSecret(application, masterSecret)
val preferences: SharedPreferences = application.getSharedPreferences(MasterSecretUtil.PREFERENCES_NAME, 0)
preferences.edit().putBoolean("passphrase_initialized", true).commit()
val registrationRepository = RegistrationRepository(application)
registrationRepository.registerAccountWithoutRegistrationLock(
RegistrationData(
code = "123123",
e164 = "+15554045550101",
password = Util.getSecret(18),
registrationId = registrationRepository.registrationId,
profileKey = registrationRepository.getProfileKey("+15554045550101"),
fcmToken = null
),
VerifyAccountResponse(UUID.randomUUID().toString(), UUID.randomUUID().toString(), false)
).blockingGet()
SignalStore.kbsValues().optOut()
RegistrationUtil.maybeMarkRegistrationComplete(application)
SignalDatabase.recipients.setProfileName(Recipient.self().id, ProfileName.fromParts("Tester", "McTesterson"))
return Recipient.self()
}
private fun setupOthers(): List<RecipientId> {
val others = mutableListOf<RecipientId>()
for (i in 0..4) {
val aci = ACI.from(UUID.randomUUID())
val recipientId = RecipientId.from(aci, "+1555555101$i")
SignalDatabase.recipients.setProfileName(recipientId, ProfileName.fromParts("Buddy", "#$i"))
SignalDatabase.recipients.setProfileKeyIfAbsent(recipientId, ProfileKeyUtil.createNew())
SignalDatabase.recipients.setCapabilities(recipientId, SignalServiceProfile.Capabilities(true, true, true, true, true, true, true))
SignalDatabase.recipients.setProfileSharing(recipientId, true)
ApplicationDependencies.getProtocolStore().aci().saveIdentity(SignalProtocolAddress(aci.toString(), 0), IdentityKeyUtil.generateIdentityKeyPair().publicKey)
others += recipientId
}
return others
}
inline fun <reified T : Activity> launchActivity(initIntent: Intent.() -> Unit): ActivityScenario<T> {
return androidx.test.core.app.launchActivity(Intent(context, T::class.java).apply(initIntent))
}
fun changeIdentityKey(recipient: Recipient, identityKey: IdentityKey = IdentityKeyUtil.generateIdentityKeyPair().publicKey) {
ApplicationDependencies.getProtocolStore().aci().saveIdentity(SignalProtocolAddress(recipient.requireServiceId().toString(), 0), identityKey)
}
fun getIdentity(recipient: Recipient): IdentityKey {
return ApplicationDependencies.getProtocolStore().aci().identities().getIdentity(SignalProtocolAddress(recipient.requireServiceId().toString(), 0))
}
fun setVerified(recipient: Recipient, status: IdentityDatabase.VerifiedStatus) {
ApplicationDependencies.getProtocolStore().aci().identities().setVerified(recipient.id, getIdentity(recipient), IdentityDatabase.VerifiedStatus.VERIFIED)
}
}

Wyświetl plik

@ -16,6 +16,8 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.components.FromTextView;
import org.thoughtcrime.securesms.database.model.IdentityRecord;
import org.thoughtcrime.securesms.util.ContextUtil;
import org.thoughtcrime.securesms.util.DrawableUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.adapter.AlwaysChangedDiffUtil;
@ -62,11 +64,9 @@ final class SafetyNumberChangeAdapter extends ListAdapter<ChangedRecipient, Safe
if (changedRecipient.isUnverified() || changedRecipient.isVerified()) {
subtitle.setText(R.string.safety_number_change_dialog__previous_verified);
Drawable check = ContextCompat.getDrawable(itemView.getContext(), R.drawable.check);
if (check != null) {
check.setBounds(0, 0, ViewUtil.dpToPx(12), ViewUtil.dpToPx(12));
subtitle.setCompoundDrawables(check, null, null, null);
}
Drawable check = DrawableUtil.tint(ContextUtil.requireDrawable(itemView.getContext(), R.drawable.check), ContextCompat.getColor(itemView.getContext(), R.color.signal_text_secondary));
check.setBounds(0, 0, ViewUtil.dpToPx(12), ViewUtil.dpToPx(12));
subtitle.setCompoundDrawables(check, null, null, null);
} else if (changedRecipient.getRecipient().hasAUserSetDisplayName(itemView.getContext())) {
subtitle.setText(changedRecipient.getRecipient().getE164().orElse(""));
subtitle.setCompoundDrawables(null, null, null, null);

Wyświetl plik

@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.conversation.ui.error;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
@ -18,7 +19,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -155,10 +156,11 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa
long messageId = getArguments().getLong(MESSAGE_ID_EXTRA, -1);
String messageType = getArguments().getString(MESSAGE_TYPE_EXTRA, null);
viewModel = ViewModelProviders.of(this, new SafetyNumberChangeViewModel.Factory(recipientIds, (messageId != -1) ? messageId : null, messageType)).get(SafetyNumberChangeViewModel.class);
viewModel = new ViewModelProvider(this, new SafetyNumberChangeViewModel.Factory(recipientIds, (messageId != -1) ? messageId : null, messageType)).get(SafetyNumberChangeViewModel.class);
viewModel.getChangedRecipients().observe(getViewLifecycleOwner(), adapter::submitList);
}
@SuppressLint("InflateParams")
@Override
public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
int continueText = requireArguments().getInt(CONTINUE_TEXT_RESOURCE_EXTRA, android.R.string.ok);

Wyświetl plik

@ -26,9 +26,10 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:ellipsize="marquee"
android:singleLine="true"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/signal_text_primary"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toTopOf="@+id/safety_number_change_recipient_subtitle"
app:layout_constraintEnd_toStartOf="@+id/safety_number_change_recipient_view"
app:layout_constraintStart_toEndOf="@+id/safety_number_change_recipient_avatar"
@ -37,13 +38,14 @@
<TextView
android:id="@+id/safety_number_change_recipient_subtitle"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:ellipsize="marquee"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/signal_text_secondary"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/safety_number_change_recipient_view"
app:layout_constraintEnd_toEndOf="@+id/safety_number_change_recipient_name"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="@+id/safety_number_change_recipient_name"
app:layout_constraintTop_toBottomOf="@+id/safety_number_change_recipient_name"

Wyświetl plik

@ -128,7 +128,9 @@ dependencyResolutionManagement {
alias('junit-junit').to('junit:junit:4.13.2')
alias('androidx-test-core').to('androidx.test:core:1.2.0')
alias('androidx-test-core-ktx').to('androidx.test:core-ktx:1.2.0')
alias('androidx-test-ext-junit').to('androidx.test.ext:junit:1.1.1')
alias('androidx-test-ext-junit-ktx').to('androidx.test.ext:junit-ktx:1.1.1')
alias('espresso-core').to('androidx.test.espresso:espresso-core:3.2.0')
alias('mockito-core').to('org.mockito:mockito-inline:4.4.0')
alias('mockito-kotlin').to('org.mockito.kotlin:mockito-kotlin:4.0.0')

Wyświetl plik

@ -737,6 +737,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="c88b739b1c499afb792374be19b9cf829e89567f26441a74f664c0cf8de158a4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test" name="core-ktx" version="1.2.0">
<artifact name="core-ktx-1.2.0.aar">
<sha256 value="eed46eca8d497f9d3211695620521263a0daf9afe9e50a2ca3eeef37cf176a8b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test" name="monitor" version="1.2.0">
<artifact name="monitor-1.2.0.aar">
<sha256 value="fc97ca3f00f8ca30b7d5167fbd8736756048e2cc4f8e92dc891106751a5baeef" origin="Generated by Gradle"/>
@ -777,6 +782,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="449df418d2916a0f86fe7dafb1edb09480fafb6e995d5c751c7d0d1970d4ae72" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test.ext" name="junit-ktx" version="1.1.1">
<artifact name="junit-ktx-1.1.1.aar">
<sha256 value="53990566c0638c1603655cfd680396c4c0aec5000f58015883034491273c7c0e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test.services" name="test-services" version="1.4.0">
<artifact name="test-services-1.4.0.apk">
<sha256 value="10d1ef389ba4e8ec009995a59802e3a74b144fa780166af6420e40658dd4a2c7" origin="Generated by Gradle"/>

Wyświetl plik

@ -206,6 +206,16 @@ public class SignalServiceProfile {
@JsonCreator
public Capabilities() {}
public Capabilities(boolean storage, boolean gv1Migration, boolean senderKey, boolean announcementGroup, boolean changeNumber, boolean stories, boolean giftBadges) {
this.storage = storage;
this.gv1Migration = gv1Migration;
this.senderKey = senderKey;
this.announcementGroup = announcementGroup;
this.changeNumber = changeNumber;
this.stories = stories;
this.giftBadges = giftBadges;
}
public boolean isStorage() {
return storage;
}

Wyświetl plik

@ -1,5 +1,6 @@
package org.whispersystems.signalservice.internal.push;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class VerifyAccountResponse {
@ -12,6 +13,15 @@ public class VerifyAccountResponse {
@JsonProperty
private boolean storageCapable;
@JsonCreator
public VerifyAccountResponse() {}
public VerifyAccountResponse(String uuid, String pni, boolean storageCapable) {
this.uuid = uuid;
this.pni = pni;
this.storageCapable = storageCapable;
}
public String getUuid() {
return uuid;
}