mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-27 03:55:16 +00:00
Removing unrequired APi checks
This commit is contained in:
parent
1a4e94e57a
commit
72e1c3f344
@ -39,7 +39,9 @@ import androidx.appcompat.app.AlertDialog;
|
|||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.view.ActionMode;
|
import androidx.appcompat.view.ActionMode;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||||
import androidx.loader.app.LoaderManager;
|
import androidx.loader.app.LoaderManager;
|
||||||
@ -421,11 +423,13 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity {
|
|||||||
mode.getMenuInflater().inflate(R.menu.media_overview_context, menu);
|
mode.getMenuInflater().inflate(R.menu.media_overview_context, menu);
|
||||||
mode.setTitle("1");
|
mode.setTitle("1");
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
FragmentActivity activity = getActivity();
|
||||||
Window window = getActivity().getWindow();
|
if (activity == null) return false;
|
||||||
originalStatusBarColor = window.getStatusBarColor();
|
|
||||||
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
|
Window window = activity.getWindow();
|
||||||
}
|
originalStatusBarColor = window.getStatusBarColor();
|
||||||
|
window.setStatusBarColor(ContextCompat.getColor(activity, R.color.action_mode_status_bar));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,11 +459,12 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity {
|
|||||||
public void onDestroyActionMode(ActionMode mode) {
|
public void onDestroyActionMode(ActionMode mode) {
|
||||||
actionMode = null;
|
actionMode = null;
|
||||||
getListAdapter().clearSelection();
|
getListAdapter().clearSelection();
|
||||||
((MediaOverviewActivity) getActivity()).onExitMultiSelect();
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
MediaOverviewActivity activity = ((MediaOverviewActivity) getActivity());
|
||||||
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
|
if(activity == null) return;
|
||||||
}
|
|
||||||
|
activity.onExitMultiSelect();
|
||||||
|
activity.getWindow().setStatusBarColor(originalStatusBarColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,19 @@
|
|||||||
package org.thoughtcrime.securesms.audio;
|
package org.thoughtcrime.securesms.audio;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.media.AudioFormat;
|
import android.media.AudioFormat;
|
||||||
import android.media.AudioRecord;
|
import android.media.AudioRecord;
|
||||||
import android.media.MediaCodec;
|
import android.media.MediaCodec;
|
||||||
import android.media.MediaCodecInfo;
|
import android.media.MediaCodecInfo;
|
||||||
import android.media.MediaFormat;
|
import android.media.MediaFormat;
|
||||||
import android.media.MediaRecorder;
|
import android.media.MediaRecorder;
|
||||||
import android.os.Build;
|
|
||||||
import org.session.libsignal.utilities.Log;
|
|
||||||
|
|
||||||
import org.session.libsession.utilities.Util;
|
import org.session.libsession.utilities.Util;
|
||||||
|
import org.session.libsignal.utilities.Log;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
|
|
||||||
public class AudioCodec {
|
public class AudioCodec {
|
||||||
|
|
||||||
private static final String TAG = AudioCodec.class.getSimpleName();
|
private static final String TAG = AudioCodec.class.getSimpleName();
|
||||||
|
@ -46,7 +46,7 @@ public class AudioSlidePlayer implements SensorEventListener {
|
|||||||
private final @NonNull Handler progressEventHandler;
|
private final @NonNull Handler progressEventHandler;
|
||||||
private final @NonNull AudioManager audioManager;
|
private final @NonNull AudioManager audioManager;
|
||||||
private final @NonNull SensorManager sensorManager;
|
private final @NonNull SensorManager sensorManager;
|
||||||
private final @NonNull Sensor proximitySensor;
|
private final Sensor proximitySensor;
|
||||||
private final @Nullable WakeLock wakeLock;
|
private final @Nullable WakeLock wakeLock;
|
||||||
|
|
||||||
private @NonNull WeakReference<Listener> listener;
|
private @NonNull WeakReference<Listener> listener;
|
||||||
@ -83,11 +83,7 @@ public class AudioSlidePlayer implements SensorEventListener {
|
|||||||
this.sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
|
this.sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
|
||||||
this.proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
this.proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
this.wakeLock = ServiceUtil.getPowerManager(context).newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
|
||||||
this.wakeLock = ServiceUtil.getPowerManager(context).newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
|
|
||||||
} else {
|
|
||||||
this.wakeLock = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void play(final double progress) throws IOException {
|
public void play(final double progress) throws IOException {
|
||||||
@ -137,7 +133,9 @@ public class AudioSlidePlayer implements SensorEventListener {
|
|||||||
mediaPlayer.seekTo((long) (mediaPlayer.getDuration() * progress));
|
mediaPlayer.seekTo((long) (mediaPlayer.getDuration() * progress));
|
||||||
}
|
}
|
||||||
|
|
||||||
sensorManager.registerListener(AudioSlidePlayer.this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
|
if(proximitySensor != null) {
|
||||||
|
sensorManager.registerListener(AudioSlidePlayer.this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
setPlaying(AudioSlidePlayer.this);
|
setPlaying(AudioSlidePlayer.this);
|
||||||
}
|
}
|
||||||
@ -163,9 +161,7 @@ public class AudioSlidePlayer implements SensorEventListener {
|
|||||||
sensorManager.unregisterListener(AudioSlidePlayer.this);
|
sensorManager.unregisterListener(AudioSlidePlayer.this);
|
||||||
|
|
||||||
if (wakeLock != null && wakeLock.isHeld()) {
|
if (wakeLock != null && wakeLock.isHeld()) {
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
wakeLock.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
|
||||||
wakeLock.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,9 +186,7 @@ public class AudioSlidePlayer implements SensorEventListener {
|
|||||||
sensorManager.unregisterListener(AudioSlidePlayer.this);
|
sensorManager.unregisterListener(AudioSlidePlayer.this);
|
||||||
|
|
||||||
if (wakeLock != null && wakeLock.isHeld()) {
|
if (wakeLock != null && wakeLock.isHeld()) {
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
wakeLock.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
|
||||||
wakeLock.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +325,11 @@ public class AudioSlidePlayer implements SensorEventListener {
|
|||||||
|
|
||||||
int streamType;
|
int streamType;
|
||||||
|
|
||||||
if (event.values[0] < 5f && event.values[0] != proximitySensor.getMaximumRange()) {
|
if (
|
||||||
|
proximitySensor != null &&
|
||||||
|
event.values[0] < 5f &&
|
||||||
|
event.values[0] != proximitySensor.getMaximumRange()
|
||||||
|
) {
|
||||||
streamType = AudioManager.STREAM_VOICE_CALL;
|
streamType = AudioManager.STREAM_VOICE_CALL;
|
||||||
} else {
|
} else {
|
||||||
streamType = AudioManager.STREAM_MUSIC;
|
streamType = AudioManager.STREAM_MUSIC;
|
||||||
|
@ -126,25 +126,19 @@ public class AttachmentTypeSelector extends PopupWindow {
|
|||||||
public void onGlobalLayout() {
|
public void onGlobalLayout() {
|
||||||
getContentView().getViewTreeObserver().removeGlobalOnLayoutListener(this);
|
getContentView().getViewTreeObserver().removeGlobalOnLayoutListener(this);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
animateWindowInCircular(anchor, getContentView());
|
||||||
animateWindowInCircular(anchor, getContentView());
|
|
||||||
} else {
|
|
||||||
animateWindowInTranslate(getContentView());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
animateButtonIn(imageButton, ANIMATION_DURATION / 2);
|
||||||
animateButtonIn(imageButton, ANIMATION_DURATION / 2);
|
animateButtonIn(cameraButton, ANIMATION_DURATION / 2);
|
||||||
animateButtonIn(cameraButton, ANIMATION_DURATION / 2);
|
|
||||||
|
|
||||||
animateButtonIn(audioButton, ANIMATION_DURATION / 3);
|
animateButtonIn(audioButton, ANIMATION_DURATION / 3);
|
||||||
animateButtonIn(locationButton, ANIMATION_DURATION / 3);
|
animateButtonIn(locationButton, ANIMATION_DURATION / 3);
|
||||||
animateButtonIn(documentButton, ANIMATION_DURATION / 4);
|
animateButtonIn(documentButton, ANIMATION_DURATION / 4);
|
||||||
animateButtonIn(gifButton, ANIMATION_DURATION / 4);
|
animateButtonIn(gifButton, ANIMATION_DURATION / 4);
|
||||||
animateButtonIn(contactButton, 0);
|
animateButtonIn(contactButton, 0);
|
||||||
animateButtonIn(closeButton, 0);
|
animateButtonIn(closeButton, 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateHeight() {
|
private void updateHeight() {
|
||||||
@ -159,11 +153,7 @@ public class AttachmentTypeSelector extends PopupWindow {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dismiss() {
|
public void dismiss() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
animateWindowOutCircular(currentAnchor, getContentView());
|
||||||
animateWindowOutCircular(currentAnchor, getContentView());
|
|
||||||
} else {
|
|
||||||
animateWindowOutTranslate(getContentView());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setListener(@Nullable AttachmentClickedListener listener) {
|
public void setListener(@Nullable AttachmentClickedListener listener) {
|
||||||
|
@ -136,7 +136,6 @@ public class ComposeText extends EmojiEditText {
|
|||||||
editorInfo.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
|
editorInfo.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < 21) return inputConnection;
|
|
||||||
if (mediaListener == null) return inputConnection;
|
if (mediaListener == null) return inputConnection;
|
||||||
if (inputConnection == null) return null;
|
if (inputConnection == null) return null;
|
||||||
|
|
||||||
|
@ -94,15 +94,11 @@ public class SearchToolbar extends LinearLayout {
|
|||||||
|
|
||||||
searchItem.expandActionView();
|
searchItem.expandActionView();
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, 0, getWidth());
|
||||||
Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, 0, getWidth());
|
animator.setDuration(400);
|
||||||
animator.setDuration(400);
|
|
||||||
|
|
||||||
setVisibility(View.VISIBLE);
|
setVisibility(View.VISIBLE);
|
||||||
animator.start();
|
animator.start();
|
||||||
} else {
|
|
||||||
setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,19 +112,15 @@ public class SearchToolbar extends LinearLayout {
|
|||||||
|
|
||||||
if (listener != null) listener.onSearchClosed();
|
if (listener != null) listener.onSearchClosed();
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, getWidth(), 0);
|
||||||
Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, getWidth(), 0);
|
animator.setDuration(400);
|
||||||
animator.setDuration(400);
|
animator.addListener(new AnimationCompleteListener() {
|
||||||
animator.addListener(new AnimationCompleteListener() {
|
@Override
|
||||||
@Override
|
public void onAnimationEnd(Animator animation) {
|
||||||
public void onAnimationEnd(Animator animation) {
|
setVisibility(View.INVISIBLE);
|
||||||
setVisibility(View.INVISIBLE);
|
}
|
||||||
}
|
});
|
||||||
});
|
animator.start();
|
||||||
animator.start();
|
|
||||||
} else {
|
|
||||||
setVisibility(View.INVISIBLE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,11 +148,8 @@ class InputBarButton : RelativeLayout {
|
|||||||
|
|
||||||
private fun onDown(event: MotionEvent) {
|
private fun onDown(event: MotionEvent) {
|
||||||
expand()
|
expand()
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||||
performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
|
||||||
} else {
|
|
||||||
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
|
|
||||||
}
|
|
||||||
longPressCallback?.let { gestureHandler.removeCallbacks(it) }
|
longPressCallback?.let { gestureHandler.removeCallbacks(it) }
|
||||||
val newLongPressCallback = Runnable { onLongPress?.invoke() }
|
val newLongPressCallback = Runnable { onLongPress?.invoke() }
|
||||||
this.longPressCallback = newLongPressCallback
|
this.longPressCallback = newLongPressCallback
|
||||||
|
@ -59,25 +59,17 @@ public class AttachmentSecretProvider {
|
|||||||
{
|
{
|
||||||
AttachmentSecret attachmentSecret = AttachmentSecret.fromString(unencryptedSecret);
|
AttachmentSecret attachmentSecret = AttachmentSecret.fromString(unencryptedSecret);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(attachmentSecret.serialize().getBytes());
|
||||||
return attachmentSecret;
|
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(attachmentSecret.serialize().getBytes());
|
|
||||||
|
|
||||||
TextSecurePreferences.setAttachmentEncryptedSecret(context, encryptedSecret.serialize());
|
TextSecurePreferences.setAttachmentEncryptedSecret(context, encryptedSecret.serialize());
|
||||||
TextSecurePreferences.setAttachmentUnencryptedSecret(context, null);
|
TextSecurePreferences.setAttachmentUnencryptedSecret(context, null);
|
||||||
|
|
||||||
return attachmentSecret;
|
return attachmentSecret;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AttachmentSecret getEncryptedAttachmentSecret(@NonNull String serializedEncryptedSecret) {
|
private AttachmentSecret getEncryptedAttachmentSecret(@NonNull String serializedEncryptedSecret) {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.SealedData.fromString(serializedEncryptedSecret);
|
||||||
throw new AssertionError("OS downgrade not supported. KeyStore sealed data exists on platform < M!");
|
return AttachmentSecret.fromString(new String(KeyStoreHelper.unseal(encryptedSecret)));
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.SealedData.fromString(serializedEncryptedSecret);
|
|
||||||
return AttachmentSecret.fromString(new String(KeyStoreHelper.unseal(encryptedSecret)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AttachmentSecret createAndStoreAttachmentSecret(@NonNull Context context) {
|
private AttachmentSecret createAndStoreAttachmentSecret(@NonNull Context context) {
|
||||||
@ -91,12 +83,8 @@ public class AttachmentSecretProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void storeAttachmentSecret(@NonNull Context context, @NonNull AttachmentSecret attachmentSecret) {
|
private void storeAttachmentSecret(@NonNull Context context, @NonNull AttachmentSecret attachmentSecret) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(attachmentSecret.serialize().getBytes());
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(attachmentSecret.serialize().getBytes());
|
TextSecurePreferences.setAttachmentEncryptedSecret(context, encryptedSecret.serialize());
|
||||||
TextSecurePreferences.setAttachmentEncryptedSecret(context, encryptedSecret.serialize());
|
|
||||||
} else {
|
|
||||||
TextSecurePreferences.setAttachmentUnencryptedSecret(context, attachmentSecret.serialize());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,28 +36,20 @@ public class DatabaseSecretProvider {
|
|||||||
try {
|
try {
|
||||||
DatabaseSecret databaseSecret = new DatabaseSecret(unencryptedSecret);
|
DatabaseSecret databaseSecret = new DatabaseSecret(unencryptedSecret);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(databaseSecret.asBytes());
|
||||||
return databaseSecret;
|
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(databaseSecret.asBytes());
|
|
||||||
|
|
||||||
TextSecurePreferences.setDatabaseEncryptedSecret(context, encryptedSecret.serialize());
|
TextSecurePreferences.setDatabaseEncryptedSecret(context, encryptedSecret.serialize());
|
||||||
TextSecurePreferences.setDatabaseUnencryptedSecret(context, null);
|
TextSecurePreferences.setDatabaseUnencryptedSecret(context, null);
|
||||||
|
|
||||||
return databaseSecret;
|
return databaseSecret;
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private DatabaseSecret getEncryptedDatabaseSecret(@NonNull String serializedEncryptedSecret) {
|
private DatabaseSecret getEncryptedDatabaseSecret(@NonNull String serializedEncryptedSecret) {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.SealedData.fromString(serializedEncryptedSecret);
|
||||||
throw new AssertionError("OS downgrade not supported. KeyStore sealed data exists on platform < M!");
|
return new DatabaseSecret(KeyStoreHelper.unseal(encryptedSecret));
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.SealedData.fromString(serializedEncryptedSecret);
|
|
||||||
return new DatabaseSecret(KeyStoreHelper.unseal(encryptedSecret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DatabaseSecret createAndStoreDatabaseSecret(@NonNull Context context) {
|
private DatabaseSecret createAndStoreDatabaseSecret(@NonNull Context context) {
|
||||||
@ -66,12 +58,8 @@ public class DatabaseSecretProvider {
|
|||||||
|
|
||||||
DatabaseSecret databaseSecret = new DatabaseSecret(secret);
|
DatabaseSecret databaseSecret = new DatabaseSecret(secret);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(databaseSecret.asBytes());
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(databaseSecret.asBytes());
|
TextSecurePreferences.setDatabaseEncryptedSecret(context, encryptedSecret.serialize());
|
||||||
TextSecurePreferences.setDatabaseEncryptedSecret(context, encryptedSecret.serialize());
|
|
||||||
} else {
|
|
||||||
TextSecurePreferences.setDatabaseUnencryptedSecret(context, databaseSecret.asString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return databaseSecret;
|
return databaseSecret;
|
||||||
}
|
}
|
||||||
|
@ -129,27 +129,19 @@ public class IdentityKeyUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String getUnencryptedSecret(String key, String unencryptedSecret, Context context) {
|
private static String getUnencryptedSecret(String key, String unencryptedSecret, Context context) {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(unencryptedSecret.getBytes());
|
||||||
return unencryptedSecret;
|
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(unencryptedSecret.getBytes());
|
|
||||||
|
|
||||||
// save the encrypted suffix secret "key_encrypted"
|
// save the encrypted suffix secret "key_encrypted"
|
||||||
save(context,key+ENCRYPTED_SUFFIX,encryptedSecret.serialize());
|
save(context,key+ENCRYPTED_SUFFIX,encryptedSecret.serialize());
|
||||||
// delete the regular secret "key"
|
// delete the regular secret "key"
|
||||||
delete(context,key);
|
delete(context,key);
|
||||||
|
|
||||||
return unencryptedSecret;
|
return unencryptedSecret;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getEncryptedSecret(String encryptedSecret) {
|
private static String getEncryptedSecret(String encryptedSecret) {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData sealedData = KeyStoreHelper.SealedData.fromString(encryptedSecret);
|
||||||
throw new AssertionError("OS downgrade not supported. KeyStore sealed data exists on platform < M!");
|
return new String(KeyStoreHelper.unseal(sealedData));
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData sealedData = KeyStoreHelper.SealedData.fromString(encryptedSecret);
|
|
||||||
return new String(KeyStoreHelper.unseal(sealedData));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -157,17 +149,14 @@ public class IdentityKeyUtil {
|
|||||||
SharedPreferences preferences = context.getSharedPreferences(MASTER_SECRET_UTIL_PREFERENCES_NAME, 0);
|
SharedPreferences preferences = context.getSharedPreferences(MASTER_SECRET_UTIL_PREFERENCES_NAME, 0);
|
||||||
Editor preferencesEditor = preferences.edit();
|
Editor preferencesEditor = preferences.edit();
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
boolean isEncryptedSuffix = key.endsWith(ENCRYPTED_SUFFIX);
|
||||||
boolean isEncryptedSuffix = key.endsWith(ENCRYPTED_SUFFIX);
|
if (isEncryptedSuffix) {
|
||||||
if (isEncryptedSuffix) {
|
|
||||||
preferencesEditor.putString(key, value);
|
|
||||||
} else {
|
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(value.getBytes());
|
|
||||||
preferencesEditor.putString(key+ENCRYPTED_SUFFIX, encryptedSecret.serialize());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
preferencesEditor.putString(key, value);
|
preferencesEditor.putString(key, value);
|
||||||
|
} else {
|
||||||
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(value.getBytes());
|
||||||
|
preferencesEditor.putString(key+ENCRYPTED_SUFFIX, encryptedSecret.serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!preferencesEditor.commit()) throw new AssertionError("failed to save identity key/value to shared preferences");
|
if (!preferencesEditor.commit()) throw new AssertionError("failed to save identity key/value to shared preferences");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -966,11 +966,6 @@ public class AttachmentDatabase extends Database {
|
|||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
private ThumbnailData generateVideoThumbnail(AttachmentId attachmentId) {
|
private ThumbnailData generateVideoThumbnail(AttachmentId attachmentId) {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
|
||||||
Log.w(TAG, "Video thumbnails not supported...");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
DataInfo dataInfo = getAttachmentDataFileInfo(attachmentId, DATA);
|
DataInfo dataInfo = getAttachmentDataFileInfo(attachmentId, DATA);
|
||||||
|
|
||||||
if (dataInfo == null) {
|
if (dataInfo == null) {
|
||||||
|
@ -15,6 +15,7 @@ import android.widget.RelativeLayout
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.annotation.ColorRes
|
import androidx.annotation.ColorRes
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
@ -38,7 +39,6 @@ import org.thoughtcrime.securesms.util.disableClipping
|
|||||||
import org.thoughtcrime.securesms.util.fadeIn
|
import org.thoughtcrime.securesms.util.fadeIn
|
||||||
import org.thoughtcrime.securesms.util.fadeOut
|
import org.thoughtcrime.securesms.util.fadeOut
|
||||||
import org.thoughtcrime.securesms.util.getAccentColor
|
import org.thoughtcrime.securesms.util.getAccentColor
|
||||||
import org.thoughtcrime.securesms.util.getColorWithID
|
|
||||||
|
|
||||||
class PathActivity : PassphraseRequiredActionBarActivity() {
|
class PathActivity : PassphraseRequiredActionBarActivity() {
|
||||||
private lateinit var binding: ActivityPathBinding
|
private lateinit var binding: ActivityPathBinding
|
||||||
@ -283,7 +283,7 @@ class PathActivity : PassphraseRequiredActionBarActivity() {
|
|||||||
private fun expand() {
|
private fun expand() {
|
||||||
dotView.animateSizeChange(R.dimen.path_row_dot_size, R.dimen.path_row_expanded_dot_size)
|
dotView.animateSizeChange(R.dimen.path_row_dot_size, R.dimen.path_row_expanded_dot_size)
|
||||||
@ColorRes val startColorID = if (UiModeUtilities.isDayUiMode(context)) R.color.transparent_black_30 else R.color.black
|
@ColorRes val startColorID = if (UiModeUtilities.isDayUiMode(context)) R.color.transparent_black_30 else R.color.black
|
||||||
val startColor = context.resources.getColorWithID(startColorID, context.theme)
|
val startColor = ContextCompat.getColor(context, startColorID)
|
||||||
val endColor = context.getAccentColor()
|
val endColor = context.getAccentColor()
|
||||||
GlowViewUtilities.animateShadowColorChange(dotView, startColor, endColor)
|
GlowViewUtilities.animateShadowColorChange(dotView, startColor, endColor)
|
||||||
}
|
}
|
||||||
@ -292,7 +292,7 @@ class PathActivity : PassphraseRequiredActionBarActivity() {
|
|||||||
dotView.animateSizeChange(R.dimen.path_row_expanded_dot_size, R.dimen.path_row_dot_size)
|
dotView.animateSizeChange(R.dimen.path_row_expanded_dot_size, R.dimen.path_row_dot_size)
|
||||||
@ColorRes val endColorID = if (UiModeUtilities.isDayUiMode(context)) R.color.transparent_black_30 else R.color.black
|
@ColorRes val endColorID = if (UiModeUtilities.isDayUiMode(context)) R.color.transparent_black_30 else R.color.black
|
||||||
val startColor = context.getAccentColor()
|
val startColor = context.getAccentColor()
|
||||||
val endColor = context.resources.getColorWithID(endColorID, context.theme)
|
val endColor = ContextCompat.getColor(context, endColorID)
|
||||||
GlowViewUtilities.animateShadowColorChange(dotView, startColor, endColor)
|
GlowViewUtilities.animateShadowColorChange(dotView, startColor, endColor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ import android.graphics.Paint
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.annotation.ColorInt
|
import androidx.annotation.ColorInt
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.coroutineScope
|
import androidx.lifecycle.coroutineScope
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -17,7 +18,6 @@ import kotlinx.coroutines.withContext
|
|||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
import org.session.libsession.snode.OnionRequestAPI
|
import org.session.libsession.snode.OnionRequestAPI
|
||||||
import org.thoughtcrime.securesms.conversation.v2.ViewUtil
|
import org.thoughtcrime.securesms.conversation.v2.ViewUtil
|
||||||
import org.thoughtcrime.securesms.util.getColorWithID
|
|
||||||
import org.thoughtcrime.securesms.util.toPx
|
import org.thoughtcrime.securesms.util.toPx
|
||||||
|
|
||||||
class PathStatusView : View {
|
class PathStatusView : View {
|
||||||
@ -104,7 +104,7 @@ class PathStatusView : View {
|
|||||||
sessionShadowColor = hasPathsColor
|
sessionShadowColor = hasPathsColor
|
||||||
} else {
|
} else {
|
||||||
setBackgroundResource(R.drawable.paths_building_dot)
|
setBackgroundResource(R.drawable.paths_building_dot)
|
||||||
val pathsBuildingColor = resources.getColorWithID(R.color.paths_building, context.theme)
|
val pathsBuildingColor = ContextCompat.getColor(context, R.color.paths_building)
|
||||||
mainColor = pathsBuildingColor
|
mainColor = pathsBuildingColor
|
||||||
sessionShadowColor = pathsBuildingColor
|
sessionShadowColor = pathsBuildingColor
|
||||||
}
|
}
|
||||||
|
@ -32,24 +32,16 @@ class LogSecretProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] parseEncryptedSecret(String secret) {
|
private static byte[] parseEncryptedSecret(String secret) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.SealedData.fromString(secret);
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.SealedData.fromString(secret);
|
return KeyStoreHelper.unseal(encryptedSecret);
|
||||||
return KeyStoreHelper.unseal(encryptedSecret);
|
|
||||||
} else {
|
|
||||||
throw new AssertionError("OS downgrade not supported. KeyStore sealed data exists on platform < M!");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] createAndStoreSecret(@NonNull Context context) {
|
private static byte[] createAndStoreSecret(@NonNull Context context) {
|
||||||
byte[] secret = new byte[32];
|
byte[] secret = new byte[32];
|
||||||
SECURE_RANDOM.nextBytes(secret);
|
SECURE_RANDOM.nextBytes(secret);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(secret);
|
||||||
KeyStoreHelper.SealedData encryptedSecret = KeyStoreHelper.seal(secret);
|
TextSecurePreferences.setLogEncryptedSecret(context, encryptedSecret.serialize());
|
||||||
TextSecurePreferences.setLogEncryptedSecret(context, encryptedSecret.serialize());
|
|
||||||
} else {
|
|
||||||
TextSecurePreferences.setLogUnencryptedSecret(context, Base64.encodeBytes(secret));
|
|
||||||
}
|
|
||||||
|
|
||||||
return secret;
|
return secret;
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,7 @@ public class FileProviderUtil {
|
|||||||
private static final String AUTHORITY = "network.loki.securesms.fileprovider";
|
private static final String AUTHORITY = "network.loki.securesms.fileprovider";
|
||||||
|
|
||||||
public static Uri getUriFor(@NonNull Context context, @NonNull File file) {
|
public static Uri getUriFor(@NonNull Context context, @NonNull File file) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
return FileProvider.getUriForFile(context, AUTHORITY, file);
|
||||||
return FileProvider.getUriForFile(context, AUTHORITY, file);
|
|
||||||
else
|
|
||||||
return Uri.fromFile(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean delete(@NonNull Context context, @NonNull Uri uri) {
|
public static boolean delete(@NonNull Context context, @NonNull Uri uri) {
|
||||||
|
@ -1,20 +1,9 @@
|
|||||||
package org.thoughtcrime.securesms.util
|
package org.thoughtcrime.securesms.util
|
||||||
|
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.os.Build
|
|
||||||
import androidx.annotation.ColorRes
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kotlin.math.max
|
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
fun Resources.getColorWithID(@ColorRes id: Int, theme: Resources.Theme?): Int {
|
|
||||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
||||||
getColor(id, theme)
|
|
||||||
} else {
|
|
||||||
@Suppress("DEPRECATION") getColor(id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toPx(dp: Int, resources: Resources): Int {
|
fun toPx(dp: Int, resources: Resources): Int {
|
||||||
return toPx(dp.toFloat(), resources).roundToInt()
|
return toPx(dp.toFloat(), resources).roundToInt()
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@ import android.view.animation.AccelerateDecelerateInterpolator
|
|||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
import androidx.annotation.ColorInt
|
import androidx.annotation.ColorInt
|
||||||
import androidx.annotation.ColorRes
|
|
||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@ -22,18 +21,6 @@ interface GlowView {
|
|||||||
|
|
||||||
object GlowViewUtilities {
|
object GlowViewUtilities {
|
||||||
|
|
||||||
fun animateColorIdChange(context: Context, view: GlowView, @ColorRes startColorID: Int, @ColorRes endColorID: Int) {
|
|
||||||
val startColor = context.resources.getColorWithID(startColorID, context.theme)
|
|
||||||
val endColor = context.resources.getColorWithID(endColorID, context.theme)
|
|
||||||
val animation = ValueAnimator.ofObject(ArgbEvaluator(), startColor, endColor)
|
|
||||||
animation.duration = 250
|
|
||||||
animation.addUpdateListener { animator ->
|
|
||||||
val color = animator.animatedValue as Int
|
|
||||||
view.mainColor = color
|
|
||||||
}
|
|
||||||
animation.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun animateColorChange(view: GlowView, @ColorInt startColor: Int, @ColorInt endColor: Int) {
|
fun animateColorChange(view: GlowView, @ColorInt startColor: Int, @ColorInt endColor: Int) {
|
||||||
val animation = ValueAnimator.ofObject(ArgbEvaluator(), startColor, endColor)
|
val animation = ValueAnimator.ofObject(ArgbEvaluator(), startColor, endColor)
|
||||||
animation.duration = 250
|
animation.duration = 250
|
||||||
@ -44,18 +31,6 @@ object GlowViewUtilities {
|
|||||||
animation.start()
|
animation.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun animateShadowColorIdChange(context: Context, view: GlowView, @ColorRes startColorID: Int, @ColorRes endColorID: Int) {
|
|
||||||
val startColor = context.resources.getColorWithID(startColorID, context.theme)
|
|
||||||
val endColor = context.resources.getColorWithID(endColorID, context.theme)
|
|
||||||
val animation = ValueAnimator.ofObject(ArgbEvaluator(), startColor, endColor)
|
|
||||||
animation.duration = 250
|
|
||||||
animation.addUpdateListener { animator ->
|
|
||||||
val color = animator.animatedValue as Int
|
|
||||||
view.sessionShadowColor = color
|
|
||||||
}
|
|
||||||
animation.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun animateShadowColorChange(
|
fun animateShadowColorChange(
|
||||||
view: GlowView,
|
view: GlowView,
|
||||||
@ColorInt startColor: Int,
|
@ColorInt startColor: Int,
|
||||||
|
@ -1,22 +1,20 @@
|
|||||||
package org.thoughtcrime.securesms.video;
|
package org.thoughtcrime.securesms.video;
|
||||||
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.media.MediaDataSource;
|
import android.media.MediaDataSource;
|
||||||
import android.os.Build;
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.session.libsession.utilities.Util;
|
||||||
import org.thoughtcrime.securesms.crypto.AttachmentSecret;
|
import org.thoughtcrime.securesms.crypto.AttachmentSecret;
|
||||||
import org.thoughtcrime.securesms.crypto.ClassicDecryptingPartInputStream;
|
import org.thoughtcrime.securesms.crypto.ClassicDecryptingPartInputStream;
|
||||||
import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream;
|
import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream;
|
||||||
import org.session.libsession.utilities.Util;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.M)
|
|
||||||
public class EncryptedMediaDataSource extends MediaDataSource {
|
public class EncryptedMediaDataSource extends MediaDataSource {
|
||||||
|
|
||||||
private final AttachmentSecret attachmentSecret;
|
private final AttachmentSecret attachmentSecret;
|
||||||
|
Loading…
Reference in New Issue
Block a user