Skip to content

Commit

Permalink
Update conditions for PIN megaphone.
Browse files Browse the repository at this point in the history
Handles additional corner cases.
- Shows megaphone when you register with a v1 pin.
- Show fullscreen when you fail to set a PIN during registration.
  • Loading branch information
greyson-signal committed Feb 3, 2020
1 parent 40383f3 commit 2d24c8c
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import androidx.annotation.VisibleForTesting;

import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;

import java.util.concurrent.TimeUnit;
Expand All @@ -19,6 +21,10 @@ class PinsForAllSchedule implements MegaphoneSchedule {
private final MegaphoneSchedule schedule = new RecurringSchedule(TimeUnit.DAYS.toMillis(2));

static boolean shouldDisplayFullScreen(long firstVisible, long currentTime) {
if (pinCreationFailedDuringRegistration()) {
return true;
}

if (firstVisible == 0L) {
return false;
} else {
Expand Down Expand Up @@ -46,10 +52,33 @@ public boolean shouldDisplay(int seenCount, long lastSeen, long firstVisible, lo
}

private static boolean isEnabled() {
if (FeatureFlags.pinsForAllMegaphoneKillSwitch() || SignalStore.registrationValues().pinWasRequiredAtRegistration()) {
if (FeatureFlags.pinsForAllMegaphoneKillSwitch()) {
return false;
}

if (pinCreationFailedDuringRegistration()) {
return true;
}

if (newlyRegisteredV1PinUser()) {
return true;
}

if (SignalStore.registrationValues().pinWasRequiredAtRegistration()) {
return false;
}

return FeatureFlags.pinsForAll();
}

private static boolean pinCreationFailedDuringRegistration() {
return SignalStore.registrationValues().pinWasRequiredAtRegistration() &&
!SignalStore.kbsValues().isV2RegistrationLockEnabled() &&
!TextSecurePreferences.isV1RegistrationLockEnabled(ApplicationDependencies.getApplication());
}

private static final boolean newlyRegisteredV1PinUser() {
return SignalStore.registrationValues().pinWasRequiredAtRegistration() && TextSecurePreferences.isV1RegistrationLockEnabled(ApplicationDependencies.getApplication());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,6 @@ private static void verifyAccount(@NonNull Context context,
TextSecurePreferences.setDeprecatedRegistrationLockPin(context, pin);
//noinspection deprecation Only acceptable place to write the old pin enabled state.
TextSecurePreferences.setV1RegistrationLockEnabled(context, pin != null);
if (pin != null) {
Log.i(TAG, "Pin V1 successfully entered during registration, scheduling a migration to Pin V2");
ApplicationDependencies.getJobManager().add(new RegistrationPinV2MigrationJob());
}
} else {
SignalStore.kbsValues().setRegistrationLockMasterKey(kbsData, PinHashing.localPinHash(pin));
repostPinToResetTries(context, pin, kbsData);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,40 @@
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.keyvalue.KbsValues;
import org.thoughtcrime.securesms.keyvalue.RegistrationValues;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.TextSecurePreferences;

import java.util.concurrent.TimeUnit;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;

@RunWith(PowerMockRunner.class)
@PrepareForTest({SignalStore.class, FeatureFlags.class, RegistrationValues.class})
@PrepareForTest({ApplicationDependencies.class, SignalStore.class, FeatureFlags.class, RegistrationValues.class, KbsValues.class, TextSecurePreferences.class})
public class PinsForAllScheduleTest {

private final PinsForAllSchedule testSubject = new PinsForAllSchedule();
private final RegistrationValues registrationValues = mock(RegistrationValues.class);
private final KbsValues kbsValues = mock(KbsValues.class);

@Before
public void setUp() {
mockStatic(ApplicationDependencies.class);
mockStatic(SignalStore.class);
mockStatic(FeatureFlags.class);
mockStatic(TextSecurePreferences.class);
when(SignalStore.registrationValues()).thenReturn(registrationValues);
when(SignalStore.kbsValues()).thenReturn(kbsValues);
when(TextSecurePreferences.isV1RegistrationLockEnabled(any())).thenReturn(false);
}

@Test
Expand Down Expand Up @@ -155,6 +164,7 @@ public void givenFirstVisibleIsAMonthAgo_whenIGetDaysRemaining_thenIExpectZero()
public void whenUserIsANewInstallAndFlagIsDisabled_whenIShouldDisplay_thenIExpectFalse() {
// GIVEN
when(registrationValues.pinWasRequiredAtRegistration()).thenReturn(true);
when(kbsValues.isV2RegistrationLockEnabled()).thenReturn(true);
when(FeatureFlags.pinsForAll()).thenReturn(false);

// WHEN
Expand All @@ -168,6 +178,7 @@ public void whenUserIsANewInstallAndFlagIsDisabled_whenIShouldDisplay_thenIExpec
public void whenUserIsANewInstallAndFlagIsEnabled_whenIShouldDisplay_thenIExpectFalse() {
// GIVEN
when(registrationValues.pinWasRequiredAtRegistration()).thenReturn(true);
when(kbsValues.isV2RegistrationLockEnabled()).thenReturn(true);
when(FeatureFlags.pinsForAll()).thenReturn(true);

// WHEN
Expand Down

0 comments on commit 2d24c8c

Please sign in to comment.