diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33c4770b0d..708b45450f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -316,9 +316,6 @@ android:name="org.thoughtcrime.securesms.PassphraseChangeActivity" android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" android:label="@string/AndroidManifest__change_passphrase" /> - () - { - @Override - protected Void doInBackground(Void... params) { - synchronized (SESSION_LOCK) { - SignalProtocolAddress mismatchAddress = new SignalProtocolAddress(address.toPhoneString(), 1); - TextSecureIdentityKeyStore identityKeyStore = new TextSecureIdentityKeyStore(getContext()); - - identityKeyStore.saveIdentity(mismatchAddress, mismatch.getIdentityKey(), true); - } - - processMessageRecord(messageRecord); - processPendingMessageRecords(messageRecord.getThreadId(), mismatch); - - return null; - } - - private void processMessageRecord(MessageRecord messageRecord) { - if (messageRecord.isOutgoing()) processOutgoingMessageRecord(messageRecord); - else processIncomingMessageRecord(messageRecord); - } - - private void processPendingMessageRecords(long threadId, IdentityKeyMismatch mismatch) { - MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(getContext()); - Cursor cursor = mmsSmsDatabase.getIdentityConflictMessagesForThread(threadId); - MmsSmsDatabase.Reader reader = mmsSmsDatabase.readerFor(cursor); - MessageRecord record; - - try { - while ((record = reader.getNext()) != null) { - for (IdentityKeyMismatch recordMismatch : record.getIdentityKeyMismatches()) { - if (mismatch.equals(recordMismatch)) { - processMessageRecord(record); - } - } - } - } finally { - if (reader != null) - reader.close(); - } - } - - private void processOutgoingMessageRecord(MessageRecord messageRecord) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(getContext()); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(getContext()); - - if (messageRecord.isMms()) { - mmsDatabase.removeMismatchedIdentity(messageRecord.getId(), - mismatch.getAddress(), - mismatch.getIdentityKey()); - - if (messageRecord.getRecipient().isPushGroupRecipient()) { - MessageSender.resendGroupMessage(getContext(), messageRecord, mismatch.getAddress()); - } else { - MessageSender.resend(getContext(), messageRecord); - } - } else { - smsDatabase.removeMismatchedIdentity(messageRecord.getId(), - mismatch.getAddress(), - mismatch.getIdentityKey()); - - MessageSender.resend(getContext(), messageRecord); - } - } - - private void processIncomingMessageRecord(MessageRecord messageRecord) { - try { - PushDatabase pushDatabase = DatabaseFactory.getPushDatabase(getContext()); - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(getContext()); - - smsDatabase.removeMismatchedIdentity(messageRecord.getId(), - mismatch.getAddress(), - mismatch.getIdentityKey()); - - boolean legacy = !messageRecord.isContentBundleKeyExchange(); - - SignalServiceEnvelope envelope = new SignalServiceEnvelope(SignalServiceProtos.Envelope.Type.PREKEY_BUNDLE_VALUE, - messageRecord.getIndividualRecipient().getAddress().toPhoneString(), - messageRecord.getRecipientDeviceId(), - messageRecord.getDateSent(), - legacy ? Base64.decode(messageRecord.getBody()) : null, - !legacy ? Base64.decode(messageRecord.getBody()) : null, - 0, null); - - long pushId = pushDatabase.insert(envelope); - - ApplicationContext.getInstance(getContext()) - .getJobManager() - .add(new PushDecryptJob(getContext(), pushId, messageRecord.getId())); - } catch (IOException e) { - throw new AssertionError(e); - } - } - - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - - if (callback != null) callback.onClick(null, 0); - } - } - - private class CancelListener implements OnClickListener { - @Override - public void onClick(DialogInterface dialog, int which) { - if (callback != null) callback.onClick(null, 0); - } - } - -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java b/app/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java deleted file mode 100644 index 7ea88eb0ce..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright (C) 2016-2017 Open Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.thoughtcrime.securesms; - -import android.Manifest; -import android.animation.TypeEvaluator; -import android.animation.ValueAnimator; -import android.annotation.SuppressLint; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.PorterDuff; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ColorDrawable; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.os.Vibrator; -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentTransaction; -import androidx.appcompat.widget.SwitchCompat; -import android.text.Html; -import android.text.TextUtils; -import android.text.method.LinkMovementMethod; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.AnticipateInterpolator; -import android.view.animation.OvershootInterpolator; -import android.view.animation.ScaleAnimation; -import android.widget.CompoundButton; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import org.thoughtcrime.securesms.color.MaterialColor; -import org.thoughtcrime.securesms.components.camera.CameraView; -import org.thoughtcrime.securesms.crypto.IdentityKeyParcelable; -import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; -import org.thoughtcrime.securesms.database.Address; -import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.IdentityDatabase.VerifiedStatus; -import org.thoughtcrime.securesms.logging.Log; -import org.thoughtcrime.securesms.permissions.Permissions; -import org.thoughtcrime.securesms.qr.QrCode; -import org.thoughtcrime.securesms.qr.ScanListener; -import org.thoughtcrime.securesms.qr.ScanningThread; -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.recipients.RecipientModifiedListener; -import org.thoughtcrime.securesms.util.DynamicLanguage; -import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.IdentityUtil; -import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.ViewUtil; -import org.session.libsignal.libsignal.IdentityKey; -import org.session.libsignal.libsignal.fingerprint.Fingerprint; -import org.session.libsignal.libsignal.fingerprint.FingerprintParsingException; -import org.session.libsignal.libsignal.fingerprint.FingerprintVersionMismatchException; -import org.session.libsignal.libsignal.fingerprint.NumericFingerprintGenerator; - -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; - -import network.loki.messenger.R; - -import static org.session.libsignal.libsignal.SessionCipher.SESSION_LOCK; - -/** - * Activity for verifying identity keys. - * - * @author Moxie Marlinspike - */ -@SuppressLint("StaticFieldLeak") -public class VerifyIdentityActivity extends PassphraseRequiredActionBarActivity implements RecipientModifiedListener, ScanListener, View.OnClickListener { - - private static final String TAG = VerifyIdentityActivity.class.getSimpleName(); - - public static final String ADDRESS_EXTRA = "address"; - public static final String IDENTITY_EXTRA = "recipient_identity"; - public static final String VERIFIED_EXTRA = "verified_state"; - - private final DynamicTheme dynamicTheme = new DynamicTheme(); - private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); - - private VerifyDisplayFragment displayFragment = new VerifyDisplayFragment(); - private VerifyScanFragment scanFragment = new VerifyScanFragment(); - - @Override - public void onPreCreate() { - dynamicTheme.onCreate(this); - dynamicLanguage.onCreate(this); - } - - @Override - protected void onCreate(Bundle state, boolean ready) { - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(R.string.AndroidManifest__verify_safety_number); - - Recipient recipient = Recipient.from(this, (Address)getIntent().getParcelableExtra(ADDRESS_EXTRA), true); - recipient.addListener(this); - - setActionBarNotificationBarColor(recipient.getColor()); - - Bundle extras = new Bundle(); - extras.putParcelable(VerifyDisplayFragment.REMOTE_ADDRESS, getIntent().getParcelableExtra(ADDRESS_EXTRA)); - extras.putParcelable(VerifyDisplayFragment.REMOTE_IDENTITY, getIntent().getParcelableExtra(IDENTITY_EXTRA)); - extras.putString(VerifyDisplayFragment.REMOTE_NUMBER, recipient.getAddress().toPhoneString()); - extras.putParcelable(VerifyDisplayFragment.LOCAL_IDENTITY, new IdentityKeyParcelable(IdentityKeyUtil.getIdentityKey(this))); - extras.putString(VerifyDisplayFragment.LOCAL_NUMBER, TextSecurePreferences.getLocalNumber(this)); - extras.putBoolean(VerifyDisplayFragment.VERIFIED_STATE, getIntent().getBooleanExtra(VERIFIED_EXTRA, false)); - - scanFragment.setScanListener(this); - displayFragment.setClickListener(this); - - initFragment(android.R.id.content, displayFragment, dynamicLanguage.getCurrentLocale(), extras); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: finish(); return true; - } - - return false; - } - - @Override - public void onModified(final Recipient recipient) { - Util.runOnMain(() -> setActionBarNotificationBarColor(recipient.getColor())); - } - - @Override - public void onQrDataFound(final String data) { - Util.runOnMain(() -> { - ((Vibrator)getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50); - - getSupportFragmentManager().popBackStack(); - displayFragment.setScannedFingerprint(data); - }); - } - - @Override - public void onClick(View v) { - Permissions.with(this) - .request(Manifest.permission.CAMERA) - .withPermanentDenialDialog(getString(R.string.VerifyIdentityActivity_signal_needs_the_camera_permission_in_order_to_scan_a_qr_code_but_it_has_been_permanently_denied)) - .onAllGranted(() -> { - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.setCustomAnimations(R.anim.slide_from_top, R.anim.slide_to_bottom, - R.anim.slide_from_bottom, R.anim.slide_to_top); - - transaction.replace(android.R.id.content, scanFragment) - .addToBackStack(null) - .commitAllowingStateLoss(); - }) - .onAnyDenied(() -> Toast.makeText(this, R.string.VerifyIdentityActivity_unable_to_scan_qr_code_without_camera_permission, Toast.LENGTH_LONG).show()) - .execute(); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); - } - - private void setActionBarNotificationBarColor(MaterialColor color) { - getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color.toActionBarColor(this))); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getWindow().setStatusBarColor(color.toStatusBarColor(this)); - } - } - - public static class VerifyDisplayFragment extends Fragment implements RecipientModifiedListener, CompoundButton.OnCheckedChangeListener { - - public static final String REMOTE_ADDRESS = "remote_address"; - public static final String REMOTE_NUMBER = "remote_number"; - public static final String REMOTE_IDENTITY = "remote_identity"; - public static final String LOCAL_IDENTITY = "local_identity"; - public static final String LOCAL_NUMBER = "local_number"; - public static final String VERIFIED_STATE = "verified_state"; - - private Recipient recipient; - private String localNumber; - private String remoteNumber; - - private IdentityKey localIdentity; - private IdentityKey remoteIdentity; - - private Fingerprint fingerprint; - - private View container; - private View numbersContainer; - private ImageView qrCode; - private ImageView qrVerified; - private TextView tapLabel; - private TextView description; - private View.OnClickListener clickListener; - private SwitchCompat verified; - - private TextView[] codes = new TextView[12]; - private boolean animateSuccessOnDraw = false; - private boolean animateFailureOnDraw = false; - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { - this.container = ViewUtil.inflate(inflater, viewGroup, R.layout.verify_display_fragment); - this.numbersContainer = ViewUtil.findById(container, R.id.number_table); - this.qrCode = ViewUtil.findById(container, R.id.qr_code); - this.verified = ViewUtil.findById(container, R.id.verified_switch); - this.qrVerified = ViewUtil.findById(container, R.id.qr_verified); - this.description = ViewUtil.findById(container, R.id.description); - this.tapLabel = ViewUtil.findById(container, R.id.tap_label); - this.codes[0] = ViewUtil.findById(container, R.id.code_first); - this.codes[1] = ViewUtil.findById(container, R.id.code_second); - this.codes[2] = ViewUtil.findById(container, R.id.code_third); - this.codes[3] = ViewUtil.findById(container, R.id.code_fourth); - this.codes[4] = ViewUtil.findById(container, R.id.code_fifth); - this.codes[5] = ViewUtil.findById(container, R.id.code_sixth); - this.codes[6] = ViewUtil.findById(container, R.id.code_seventh); - this.codes[7] = ViewUtil.findById(container, R.id.code_eighth); - this.codes[8] = ViewUtil.findById(container, R.id.code_ninth); - this.codes[9] = ViewUtil.findById(container, R.id.code_tenth); - this.codes[10] = ViewUtil.findById(container, R.id.code_eleventh); - this.codes[11] = ViewUtil.findById(container, R.id.code_twelth); - - this.qrCode.setOnClickListener(clickListener); - this.registerForContextMenu(numbersContainer); - - this.verified.setChecked(getArguments().getBoolean(VERIFIED_STATE, false)); - this.verified.setOnCheckedChangeListener(this); - - return container; - } - - @Override - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - - Address address = getArguments().getParcelable(REMOTE_ADDRESS); - IdentityKeyParcelable localIdentityParcelable = getArguments().getParcelable(LOCAL_IDENTITY); - IdentityKeyParcelable remoteIdentityParcelable = getArguments().getParcelable(REMOTE_IDENTITY); - - if (address == null) throw new AssertionError("Address required"); - if (localIdentityParcelable == null) throw new AssertionError("local identity required"); - if (remoteIdentityParcelable == null) throw new AssertionError("remote identity required"); - - this.localNumber = getArguments().getString(LOCAL_NUMBER); - this.localIdentity = localIdentityParcelable.get(); - this.remoteNumber = getArguments().getString(REMOTE_NUMBER); - this.recipient = Recipient.from(getActivity(), address, true); - this.remoteIdentity = remoteIdentityParcelable.get(); - - this.recipient.addListener(this); - - new AsyncTask() { - @Override - protected Fingerprint doInBackground(Void... params) { - return new NumericFingerprintGenerator(5200).createFor(localNumber, localIdentity, - remoteNumber, remoteIdentity); - } - - @Override - protected void onPostExecute(Fingerprint fingerprint) { - VerifyDisplayFragment.this.fingerprint = fingerprint; - setFingerprintViews(fingerprint, true); - getActivity().supportInvalidateOptionsMenu(); - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - - setHasOptionsMenu(true); - } - - @Override - public void onModified(final Recipient recipient) { - Util.runOnMain(() -> setRecipientText(recipient)); - } - - @Override - public void onResume() { - super.onResume(); - - setRecipientText(recipient); - - if (fingerprint != null) { - setFingerprintViews(fingerprint, false); - } - - if (animateSuccessOnDraw) { - animateSuccessOnDraw = false; - animateVerifiedSuccess(); - } else if (animateFailureOnDraw) { - animateFailureOnDraw = false; - animateVerifiedFailure(); - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - recipient.removeListener(this); - } - - @Override - public void onCreateContextMenu(ContextMenu menu, View view, - ContextMenuInfo menuInfo) - { - super.onCreateContextMenu(menu, view, menuInfo); - - if (fingerprint != null) { - MenuInflater inflater = getActivity().getMenuInflater(); - inflater.inflate(R.menu.verify_display_fragment_context_menu, menu); - } - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - if (fingerprint == null) return super.onContextItemSelected(item); - - switch (item.getItemId()) { - case R.id.menu_copy: handleCopyToClipboard(fingerprint, codes.length); return true; - case R.id.menu_compare: handleCompareWithClipboard(fingerprint); return true; - default: return super.onContextItemSelected(item); - } - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - - if (fingerprint != null) { - inflater.inflate(R.menu.verify_identity, menu); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.verify_identity__share: handleShare(fingerprint, codes.length); return true; - } - - return false; - } - - public void setScannedFingerprint(String scanned) { - try { - if (fingerprint.getScannableFingerprint().compareTo(scanned.getBytes("ISO-8859-1"))) { - this.animateSuccessOnDraw = true; - } else { - this.animateFailureOnDraw = true; - } - } catch (FingerprintVersionMismatchException e) { - Log.w(TAG, e); - if (e.getOurVersion() < e.getTheirVersion()) { - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal, Toast.LENGTH_LONG).show(); - } else { - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal, Toast.LENGTH_LONG).show(); - } - } catch (FingerprintParsingException e) { - Log.w(TAG, e); - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number, Toast.LENGTH_LONG).show(); - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); - } - } - - public void setClickListener(View.OnClickListener listener) { - this.clickListener = listener; - } - - private @NonNull String getFormattedSafetyNumbers(@NonNull Fingerprint fingerprint, int segmentCount) { - String[] segments = getSegments(fingerprint, segmentCount); - StringBuilder result = new StringBuilder(); - - for (int i = 0; i < segments.length; i++) { - result.append(segments[i]); - - if (i != segments.length - 1) { - if (((i+1) % 4) == 0) result.append('\n'); - else result.append(' '); - } - } - - return result.toString(); - } - - private void handleCopyToClipboard(Fingerprint fingerprint, int segmentCount) { - Util.writeTextToClipboard(getActivity(), getFormattedSafetyNumbers(fingerprint, segmentCount)); - } - - private void handleCompareWithClipboard(Fingerprint fingerprint) { - String clipboardData = Util.readTextFromClipboard(getActivity()); - - if (clipboardData == null) { - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard, Toast.LENGTH_LONG).show(); - return; - } - - String numericClipboardData = clipboardData.replaceAll("\\D", ""); - - if (TextUtils.isEmpty(numericClipboardData) || numericClipboardData.length() != 60) { - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard, Toast.LENGTH_LONG).show(); - return; - } - - if (fingerprint.getDisplayableFingerprint().getDisplayText().equals(numericClipboardData)) { - animateVerifiedSuccess(); - } else { - animateVerifiedFailure(); - } - } - - private void handleShare(@NonNull Fingerprint fingerprint, int segmentCount) { - String shareString = - getString(R.string.VerifyIdentityActivity_our_signal_safety_number) + "\n" + - getFormattedSafetyNumbers(fingerprint, segmentCount) + "\n"; - - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, shareString); - intent.setType("text/plain"); - - try { - startActivity(Intent.createChooser(intent, getString(R.string.VerifyIdentityActivity_share_safety_number_via))); - } catch (ActivityNotFoundException e) { - Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_no_app_to_share_to, Toast.LENGTH_LONG).show(); - } - } - - private void setRecipientText(Recipient recipient) { - description.setText(Html.fromHtml(String.format(getActivity().getString(R.string.verify_display_fragment__if_you_wish_to_verify_the_security_of_your_end_to_end_encryption_with_s), recipient.toShortString()))); - description.setMovementMethod(LinkMovementMethod.getInstance()); - } - - private void setFingerprintViews(Fingerprint fingerprint, boolean animate) { - String[] segments = getSegments(fingerprint, codes.length); - - for (int i=0;i() { - public Integer evaluate(float fraction, Integer startValue, Integer endValue) { - return Math.round(startValue + (endValue - startValue) * fraction); - } - }); - - valueAnimator.setDuration(1000); - valueAnimator.start(); - } - - private String[] getSegments(Fingerprint fingerprint, int segmentCount) { - String[] segments = new String[segmentCount]; - String digits = fingerprint.getDisplayableFingerprint().getDisplayText(); - int partSize = digits.length() / segmentCount; - - for (int i=0;i() { - @Override - protected Void doInBackground(Recipient... params) { - synchronized (SESSION_LOCK) { - if (isChecked) { - Log.i(TAG, "Saving identity: " + params[0].getAddress()); - DatabaseFactory.getIdentityDatabase(getActivity()) - .saveIdentity(params[0].getAddress(), - remoteIdentity, - VerifiedStatus.VERIFIED, false, - System.currentTimeMillis(), true); - } else { - DatabaseFactory.getIdentityDatabase(getActivity()) - .setVerified(params[0].getAddress(), - remoteIdentity, - VerifiedStatus.DEFAULT); - } - - IdentityUtil.markIdentityVerified(getActivity(), recipient, isChecked, false); - } - return null; - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, recipient); - } - } - - public static class VerifyScanFragment extends Fragment { - - private View container; - private CameraView cameraView; - private ScanningThread scanningThread; - private ScanListener scanListener; - - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { - this.container = ViewUtil.inflate(inflater, viewGroup, R.layout.verify_scan_fragment); - this.cameraView = ViewUtil.findById(container, R.id.scanner); - - return container; - } - - @Override - public void onResume() { - super.onResume(); - this.scanningThread = new ScanningThread(); - this.scanningThread.setScanListener(scanListener); - this.scanningThread.setCharacterSet("ISO-8859-1"); - this.cameraView.onResume(); - this.cameraView.setPreviewCallback(scanningThread); - this.scanningThread.start(); - } - - @Override - public void onPause() { - super.onPause(); - this.cameraView.onPause(); - this.scanningThread.stopScanning(); - } - - @Override - public void onConfigurationChanged(Configuration newConfiguration) { - super.onConfigurationChanged(newConfiguration); - this.cameraView.onPause(); - this.cameraView.onResume(); - this.cameraView.setPreviewCallback(scanningThread); - } - - public void setScanListener(ScanListener listener) { - if (this.scanningThread != null) scanningThread.setScanListener(listener); - this.scanListener = listener; - } - - } - -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt index 671f0a508b..6d232a61cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt @@ -1,52 +1,52 @@ -package org.thoughtcrime.securesms.attachments - -import android.content.Context -import com.google.protobuf.ByteString -import org.session.libsession.database.dto.DatabaseAttachmentDTO -import org.session.libsession.database.MessageDataProvider -import org.session.libsignal.service.internal.push.SignalServiceProtos -import org.thoughtcrime.securesms.database.Database -import org.thoughtcrime.securesms.database.DatabaseFactory -import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper -import org.thoughtcrime.securesms.util.MediaUtil - -class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), MessageDataProvider { - override fun getAttachment(uniqueID: String): DatabaseAttachmentDTO? { - - val attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context) - val uniqueID = uniqueID.toLongOrNull() ?: return null - val attachmentID = AttachmentId(0, uniqueID) - val databaseAttachment = attachmentDatabase.getAttachment(attachmentID) ?: return null - - return databaseAttachment.toDTO() - } - -} - -// Extension to DatabaseAttachment class - -fun DatabaseAttachment.toDTO(): DatabaseAttachmentDTO { - var databaseAttachmentDTO = DatabaseAttachmentDTO() - databaseAttachmentDTO.contentType = this.contentType - databaseAttachmentDTO.fileName = this.fileName - databaseAttachmentDTO.caption = this.caption - - databaseAttachmentDTO.size = this.size.toInt() - databaseAttachmentDTO.key = ByteString.copyFrom(this.key?.toByteArray()) - databaseAttachmentDTO.digest = ByteString.copyFrom(this.digest) - databaseAttachmentDTO.flags = if (this.isVoiceNote) SignalServiceProtos.AttachmentPointer.Flags.VOICE_MESSAGE.number else 0 - - databaseAttachmentDTO.url = this.url - - if (this.shouldHaveImageSize()) { - databaseAttachmentDTO.shouldHaveImageSize = true - databaseAttachmentDTO.width = this.width - databaseAttachmentDTO.height = this.height - } - - return databaseAttachmentDTO -} - -fun DatabaseAttachment.shouldHaveImageSize(): Boolean { - return (MediaUtil.isVideo(this) || MediaUtil.isImage(this) || MediaUtil.isGif(this)); -} \ No newline at end of file +//package org.thoughtcrime.securesms.attachments +// +//import android.content.Context +//import com.google.protobuf.ByteString +//import org.session.libsession.database.dto.DatabaseAttachmentDTO +//import org.session.libsession.database.MessageDataProvider +//import org.session.libsignal.service.internal.push.SignalServiceProtos +//import org.thoughtcrime.securesms.database.Database +//import org.thoughtcrime.securesms.database.DatabaseFactory +//import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper +//import org.thoughtcrime.securesms.util.MediaUtil +// +//class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), MessageDataProvider { +// override fun getAttachment(uniqueID: String): DatabaseAttachmentDTO? { +// +// val attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context) +// val uniqueID = uniqueID.toLongOrNull() ?: return null +// val attachmentID = AttachmentId(0, uniqueID) +// val databaseAttachment = attachmentDatabase.getAttachment(attachmentID) ?: return null +// +// return databaseAttachment.toDTO() +// } +// +//} +// +//// Extension to DatabaseAttachment class +// +//fun DatabaseAttachment.toDTO(): DatabaseAttachmentDTO { +// var databaseAttachmentDTO = DatabaseAttachmentDTO() +// databaseAttachmentDTO.contentType = this.contentType +// databaseAttachmentDTO.fileName = this.fileName +// databaseAttachmentDTO.caption = this.caption +// +// databaseAttachmentDTO.size = this.size.toInt() +// databaseAttachmentDTO.key = ByteString.copyFrom(this.key?.toByteArray()) +// databaseAttachmentDTO.digest = ByteString.copyFrom(this.digest) +// databaseAttachmentDTO.flags = if (this.isVoiceNote) SignalServiceProtos.AttachmentPointer.Flags.VOICE_MESSAGE.number else 0 +// +// databaseAttachmentDTO.url = this.url +// +// if (this.shouldHaveImageSize()) { +// databaseAttachmentDTO.shouldHaveImageSize = true +// databaseAttachmentDTO.width = this.width +// databaseAttachmentDTO.height = this.height +// } +// +// return databaseAttachmentDTO +//} +// +//fun DatabaseAttachment.shouldHaveImageSize(): Boolean { +// return (MediaUtil.isVideo(this) || MediaUtil.isImage(this) || MediaUtil.isGif(this)); +//} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index ec6ac9b152..cb3ecfbdd7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -16,7 +16,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.BindableConversationItem; -import org.thoughtcrime.securesms.VerifyIdentityActivity; import org.thoughtcrime.securesms.crypto.IdentityKeyParcelable; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java b/app/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java deleted file mode 100644 index 436d7432db..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.thoughtcrime.securesms.util; - -import android.content.Context; -import android.content.Intent; -import androidx.annotation.NonNull; -import android.text.style.ClickableSpan; -import android.view.View; - -import org.thoughtcrime.securesms.VerifyIdentityActivity; -import org.thoughtcrime.securesms.crypto.IdentityKeyParcelable; -import org.thoughtcrime.securesms.database.Address; -import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; -import org.session.libsignal.libsignal.IdentityKey; - -public class VerifySpan extends ClickableSpan { - - private final Context context; - private final Address address; - private final IdentityKey identityKey; - - public VerifySpan(@NonNull Context context, @NonNull IdentityKeyMismatch mismatch) { - this.context = context; - this.address = mismatch.getAddress(); - this.identityKey = mismatch.getIdentityKey(); - } - - public VerifySpan(@NonNull Context context, @NonNull Address address, @NonNull IdentityKey identityKey) { - this.context = context; - this.address = address; - this.identityKey = identityKey; - } - - @Override - public void onClick(@NonNull View widget) { - Intent intent = new Intent(context, VerifyIdentityActivity.class); - intent.putExtra(VerifyIdentityActivity.ADDRESS_EXTRA, address); - intent.putExtra(VerifyIdentityActivity.IDENTITY_EXTRA, new IdentityKeyParcelable(identityKey)); - intent.putExtra(VerifyIdentityActivity.VERIFIED_EXTRA, false); - context.startActivity(intent); - } -} diff --git a/app/src/main/res/layout/verify_display_fragment.xml b/app/src/main/res/layout/verify_display_fragment.xml deleted file mode 100644 index b6c867d465..0000000000 --- a/app/src/main/res/layout/verify_display_fragment.xml +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file