Screen lock service updated to match the landing workflow.

This commit is contained in:
Anton Chekulaev 2020-12-15 17:16:05 +11:00
parent 124632823e
commit c0847fc563
3 changed files with 44 additions and 16 deletions

View File

@ -47,7 +47,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences;
import network.loki.messenger.R;
//TODO Rename to screen lock activity and refactor to Kotlin.
//TODO Rename to ScreenLockActivity and refactor to Kotlin.
public class PassphrasePromptActivity extends BaseActionBarActivity {
private static final String TAG = PassphrasePromptActivity.class.getSimpleName();

View File

@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.loki.utilities.push
import org.thoughtcrime.securesms.loki.utilities.setUpActionBarSessionLogo
import org.thoughtcrime.securesms.loki.views.FakeChatView
import org.thoughtcrime.securesms.service.KeyCachingService
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.thoughtcrime.securesms.util.Util
@ -37,6 +38,9 @@ class LandingActivity : BaseActionBarActivity() {
TextSecurePreferences.setPasswordDisabled(this, true)
TextSecurePreferences.setReadReceiptsEnabled(this, true)
TextSecurePreferences.setTypingIndicatorsEnabled(this, true)
//AC: This is a temporary workaround to trick the old code that the screen is unlocked.
KeyCachingService.setMasterSecret(applicationContext, Object())
}
private fun register() {

View File

@ -21,8 +21,10 @@ import android.app.AlarmManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
@ -49,7 +51,8 @@ import network.loki.messenger.R;
*
* @author Moxie Marlinspike
*/
//TODO AC: This service does only serve one purpose now - to track the screen lock state and handle the timer.
// We need to refactor it and cleanup from all the old Signal code.
public class KeyCachingService extends Service {
private static final String TAG = KeyCachingService.class.getSimpleName();
@ -57,12 +60,12 @@ public class KeyCachingService extends Service {
public static final int SERVICE_RUNNING_ID = 4141;
public static final String KEY_PERMISSION = "network.loki.messenger.ACCESS_SESSION_SECRETS";
public static final String NEW_KEY_EVENT = "org.thoughtcrime.securesms.service.action.NEW_KEY_EVENT";
// public static final String NEW_KEY_EVENT = "org.thoughtcrime.securesms.service.action.NEW_KEY_EVENT";
public static final String CLEAR_KEY_EVENT = "org.thoughtcrime.securesms.service.action.CLEAR_KEY_EVENT";
public static final String LOCK_TOGGLED_EVENT = "org.thoughtcrime.securesms.service.action.LOCK_ENABLED_EVENT";
private static final String PASSPHRASE_EXPIRED_EVENT = "org.thoughtcrime.securesms.service.action.PASSPHRASE_EXPIRED_EVENT";
public static final String CLEAR_KEY_ACTION = "org.thoughtcrime.securesms.service.action.CLEAR_KEY";
public static final String DISABLE_ACTION = "org.thoughtcrime.securesms.service.action.DISABLE";
// public static final String DISABLE_ACTION = "org.thoughtcrime.securesms.service.action.DISABLE";
private final IBinder binder = new KeySetBinder();
@ -70,6 +73,29 @@ public class KeyCachingService extends Service {
// This field only indicates if the app was unlocked or not (null means locked).
private static Object masterSecret;
/**
* A temporal utility method to quickly call {@link KeyCachingService#setMasterSecret(Object)}
* without explicitly binding to the service.
*/
public static void setMasterSecret(Context context, Object masterSecret) {
// Start and bind to the KeyCachingService instance.
Intent bindIntent = new Intent(context, KeyCachingService.class);
context.startService(bindIntent);
context.bindService(bindIntent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
KeyCachingService service = ((KeySetBinder) binder).getService();
service.setMasterSecret(masterSecret);
context.unbindService(this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}, Context.BIND_AUTO_CREATE);
}
public KeyCachingService() {}
public static synchronized boolean isLocked(Context context) {
@ -84,7 +110,6 @@ public class KeyCachingService extends Service {
startTimeoutIfAppropriate(context);
}
//TODO AC: Delete
public static synchronized @Nullable Object getMasterSecret(Context context) {
// if (masterSecret == null && (TextSecurePreferences.isPasswordDisabled(context) && !TextSecurePreferences.isScreenLockEnabled(context))) {
// try {
@ -97,14 +122,13 @@ public class KeyCachingService extends Service {
return masterSecret;
}
//TODO AC: Delete
@SuppressLint("StaticFieldLeak")
public void setMasterSecret(final Object masterSecret) {
synchronized (KeyCachingService.class) {
KeyCachingService.masterSecret = masterSecret;
foregroundService();
broadcastNewSecret();
// broadcastNewSecret();
startTimeoutIfAppropriate(this);
new AsyncTask<Void, Void, Void>() {
@ -128,7 +152,7 @@ public class KeyCachingService extends Service {
switch (intent.getAction()) {
case CLEAR_KEY_ACTION: handleClearKey(); break;
case PASSPHRASE_EXPIRED_EVENT: handleClearKey(); break;
case DISABLE_ACTION: handleDisableService(); break;
// case DISABLE_ACTION: handleDisableService(); break;
case LOCK_TOGGLED_EVENT: handleLockToggled(); break;
}
}
@ -259,14 +283,14 @@ public class KeyCachingService extends Service {
startForeground(SERVICE_RUNNING_ID, builder.build());
}
private void broadcastNewSecret() {
Log.i(TAG, "Broadcasting new secret...");
Intent intent = new Intent(NEW_KEY_EVENT);
intent.setPackage(getApplicationContext().getPackageName());
sendBroadcast(intent, KEY_PERMISSION);
}
// private void broadcastNewSecret() {
// Log.i(TAG, "Broadcasting new secret...");
//
// Intent intent = new Intent(NEW_KEY_EVENT);
// intent.setPackage(getApplicationContext().getPackageName());
//
// sendBroadcast(intent, KEY_PERMISSION);
// }
private PendingIntent buildLockIntent() {
Intent intent = new Intent(this, KeyCachingService.class);