Update AGP to 7.4.2, update SqlDelight to 1.4.2
The adaptations to SqlDelight 1.4.2 leave the type namings *extremely* messy. But it works and is as semantically equivalent as I could make it.
This commit is contained in:
@@ -32,23 +32,23 @@ import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import android.util.Pair;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.PopupMenu;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.Keys;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.ExportResult;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.provider.TemporaryFileProvider;
|
||||
import org.sufficientlysecure.keychain.service.BackupKeyringParcel;
|
||||
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
|
||||
@@ -131,8 +131,8 @@ public class BackupRestoreFragment extends CryptoOperationFragment<BackupKeyring
|
||||
}
|
||||
|
||||
private Long getFirstSubKeyWithPassphrase(long masterKeyId) {
|
||||
for (SubKey subKey : keyRepository.getSubKeysByMasterKeyId(masterKeyId)) {
|
||||
switch (subKey.has_secret()) {
|
||||
for (Keys subKey : keyRepository.getSubKeysByMasterKeyId(masterKeyId)) {
|
||||
switch (subKey.getHas_secret()) {
|
||||
case PASSPHRASE_EMPTY:
|
||||
case DIVERT_TO_CARD:
|
||||
case UNAVAILABLE:
|
||||
@@ -140,7 +140,7 @@ public class BackupRestoreFragment extends CryptoOperationFragment<BackupKeyring
|
||||
case GNU_DUMMY:
|
||||
continue;
|
||||
default: {
|
||||
return subKey.key_id();
|
||||
return subKey.getKey_id();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.keyview.UnifiedKeyInfoViewModel;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ import android.widget.ImageView;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.CertifyResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
|
||||
@@ -26,8 +26,6 @@ import java.util.regex.Pattern;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
@@ -38,18 +36,20 @@ import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import org.bouncycastle.bcpg.sig.KeyFlags;
|
||||
import org.openintents.openpgp.util.OpenPgpUtils;
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.Keys;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
|
||||
import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.UploadResult;
|
||||
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
|
||||
import org.sufficientlysecure.keychain.service.ChangeUnlockParcel;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyChange;
|
||||
@@ -420,9 +420,9 @@ public class CreateKeyFinalFragment extends Fragment {
|
||||
return;
|
||||
}
|
||||
|
||||
List<SubKey> subKeys = keyRepository.getSubKeysByMasterKeyId(saveKeyResult.mMasterKeyId);
|
||||
for (SubKey subKey : subKeys) {
|
||||
builder.addOrReplaceSubkeyChange(SubkeyChange.createMoveToSecurityTokenChange(subKey.key_id()));
|
||||
List<Keys> subKeys = keyRepository.getSubKeysByMasterKeyId(saveKeyResult.mMasterKeyId);
|
||||
for (Keys subKey : subKeys) {
|
||||
builder.addOrReplaceSubkeyChange(SubkeyChange.createMoveToSecurityTokenChange(subKey.getKey_id()));
|
||||
}
|
||||
|
||||
// define new PIN and Admin PIN for the card
|
||||
|
||||
@@ -40,7 +40,7 @@ import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress;
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing.VerificationStatus;
|
||||
|
||||
@@ -37,7 +37,7 @@ import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.DeleteResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.RevokeResult;
|
||||
|
||||
@@ -39,7 +39,7 @@ import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipsInput;
|
||||
import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipsInput.EncryptRecipientChip;
|
||||
import org.sufficientlysecure.keychain.ui.widget.KeySpinner;
|
||||
@@ -121,8 +121,8 @@ public class EncryptModeAsymmetricFragment extends EncryptModeFragment {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
EncryptModeViewModel viewModel = ViewModelProviders.of(this).get(EncryptModeViewModel.class);
|
||||
viewModel.getSignKeyLiveData(requireContext()).observe(this, mSignKeySpinner::setData);
|
||||
viewModel.getEncryptRecipientLiveData(requireContext()).observe(this, mEncryptKeyView::setData);
|
||||
viewModel.getSignKeyLiveData(requireContext()).observe(getViewLifecycleOwner(), mSignKeySpinner::setData);
|
||||
viewModel.getEncryptRecipientLiveData(requireContext()).observe(getViewLifecycleOwner(), mEncryptKeyView::setData);
|
||||
|
||||
// preselect keys given, from state or arguments
|
||||
if (savedInstanceState == null) {
|
||||
|
||||
@@ -58,7 +58,7 @@ import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
|
||||
import org.sufficientlysecure.keychain.daos.DatabaseNotifyManager;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.keysync.KeyserverSyncManager;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.KeySyncParcel;
|
||||
import org.sufficientlysecure.keychain.operations.results.BenchmarkResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
@@ -252,7 +252,7 @@ public class KeyListFragment extends RecyclerFragment<FlexibleAdapter<FlexibleKe
|
||||
|
||||
GenericViewModel viewModel = ViewModelProviders.of(this).get(GenericViewModel.class);
|
||||
LiveData<List<FlexibleKeyItem>> liveData = viewModel.getGenericLiveData(requireContext(), this::loadFlexibleKeyItems);
|
||||
liveData.observe(this, this::onLoadKeyItems);
|
||||
liveData.observe(getViewLifecycleOwner(), this::onLoadKeyItems);
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
|
||||
@@ -21,23 +21,23 @@ package org.sufficientlysecure.keychain.ui;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import android.database.MatrixCursor;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.UserPacket.UserId;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.UserId;
|
||||
import org.sufficientlysecure.keychain.service.CertifyActionsParcel;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.MultiUserIdsAdapter;
|
||||
import timber.log.Timber;
|
||||
@@ -85,7 +85,7 @@ public class MultiUserIdsFragment extends Fragment {
|
||||
KeyRepository keyRepository = KeyRepository.create(activity);
|
||||
LiveData<List<UserId>> userIdLiveData =
|
||||
new GenericLiveData<>(getContext(), () -> keyRepository.getUserIds(pubMasterKeyIds));
|
||||
userIdLiveData.observe(this, this::onUserIdsLoaded);
|
||||
userIdLiveData.observe(getViewLifecycleOwner(), this::onUserIdsLoaded);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ import android.widget.ViewAnimator;
|
||||
import org.openintents.openpgp.util.OpenPgpUtils;
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
|
||||
|
||||
@@ -28,7 +28,7 @@ import android.widget.ImageView;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
|
||||
import org.sufficientlysecure.keychain.ui.keyview.UnifiedKeyInfoViewModel;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
|
||||
@@ -9,19 +9,19 @@ import java.util.TimeZone;
|
||||
import android.content.Context;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.Typeface;
|
||||
import androidx.annotation.StringRes;
|
||||
import android.text.format.DateFormat;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||
import org.sufficientlysecure.keychain.Keys;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Builder;
|
||||
@@ -32,22 +32,22 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
|
||||
|
||||
public class SubKeyItem extends AbstractFlexibleItem<SubKeyItem.SubkeyViewHolder> {
|
||||
final SubKey subkeyInfo;
|
||||
final Keys subkeyInfo;
|
||||
private final SubkeyEditViewModel viewModel;
|
||||
|
||||
SubKeyItem(SubKey subkeyInfo, SubkeyEditViewModel viewModel) {
|
||||
SubKeyItem(Keys subkeyInfo, SubkeyEditViewModel viewModel) {
|
||||
this.subkeyInfo = subkeyInfo;
|
||||
this.viewModel = viewModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return o instanceof SubKeyItem && ((SubKeyItem) o).subkeyInfo.key_id() == subkeyInfo.key_id();
|
||||
return o instanceof SubKeyItem && ((SubKeyItem) o).subkeyInfo.getKey_id() == subkeyInfo.getKey_id();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
long key_id = subkeyInfo.key_id();
|
||||
long key_id = subkeyInfo.getKey_id();
|
||||
return (int) (key_id ^ (key_id >>> 32));
|
||||
}
|
||||
|
||||
@@ -100,13 +100,13 @@ public class SubKeyItem extends AbstractFlexibleItem<SubKeyItem.SubkeyViewHolder
|
||||
vActionCancel = itemView.findViewById(R.id.button_subkey_action_cancel);
|
||||
}
|
||||
|
||||
void bind(SubKey subkeyInfo) {
|
||||
bindKeyId(subkeyInfo.key_id(), subkeyInfo.rank() == 0);
|
||||
bindKeyDetails(subkeyInfo.algorithm(), subkeyInfo.key_size(), subkeyInfo.key_curve_oid(), subkeyInfo.has_secret());
|
||||
bindKeyFlags(subkeyInfo.can_certify(), subkeyInfo.can_sign(), subkeyInfo.can_encrypt(), subkeyInfo.can_authenticate());
|
||||
void bind(Keys subkeyInfo) {
|
||||
bindKeyId(subkeyInfo.getKey_id(), subkeyInfo.getRank() == 0);
|
||||
bindKeyDetails(subkeyInfo.getAlgorithm(), subkeyInfo.getKey_size(), subkeyInfo.getKey_curve_oid(), subkeyInfo.getHas_secret());
|
||||
bindKeyFlags(subkeyInfo.getCan_certify(), subkeyInfo.getCan_sign(), subkeyInfo.getCan_encrypt(), subkeyInfo.getCan_authenticate());
|
||||
|
||||
Date validFrom = new Date(subkeyInfo.validFrom() * 1000);
|
||||
Date expiryDate = subkeyInfo.expires() ? new Date(subkeyInfo.expiry() * 1000) : null;
|
||||
Date validFrom = new Date(subkeyInfo.getValidFrom() * 1000);
|
||||
Date expiryDate = subkeyInfo.getExpiry() != null ? new Date(subkeyInfo.getExpiry() * 1000) : null;
|
||||
bindKeyStatus(validFrom, expiryDate, subkeyInfo.is_revoked(), subkeyInfo.is_secure());
|
||||
}
|
||||
|
||||
@@ -198,14 +198,14 @@ public class SubKeyItem extends AbstractFlexibleItem<SubKeyItem.SubkeyViewHolder
|
||||
vKeyDetails.setText(algorithmStr);
|
||||
}
|
||||
|
||||
private void bindSubkeyAction(SubKey subkeyInfo, Builder saveKeyringParcelBuilder) {
|
||||
private void bindSubkeyAction(Keys subkeyInfo, Builder saveKeyringParcelBuilder) {
|
||||
if (saveKeyringParcelBuilder == null) {
|
||||
itemView.setClickable(false);
|
||||
vActionLayout.setVisibility(View.GONE);
|
||||
return;
|
||||
}
|
||||
boolean isRevokeAction = (saveKeyringParcelBuilder.getMutableRevokeSubKeys().contains(subkeyInfo.key_id()));
|
||||
SubkeyChange change = saveKeyringParcelBuilder.getSubkeyChange(subkeyInfo.key_id());
|
||||
boolean isRevokeAction = (saveKeyringParcelBuilder.getMutableRevokeSubKeys().contains(subkeyInfo.getKey_id()));
|
||||
SubkeyChange change = saveKeyringParcelBuilder.getSubkeyChange(subkeyInfo.getKey_id());
|
||||
boolean hasAction = isRevokeAction || change != null;
|
||||
if (!hasAction) {
|
||||
itemView.setClickable(true);
|
||||
@@ -214,7 +214,7 @@ public class SubKeyItem extends AbstractFlexibleItem<SubKeyItem.SubkeyViewHolder
|
||||
}
|
||||
|
||||
OnClickListener onClickRemoveModificationListener = v -> {
|
||||
saveKeyringParcelBuilder.removeModificationsForSubkey(subkeyInfo.key_id());
|
||||
saveKeyringParcelBuilder.removeModificationsForSubkey(subkeyInfo.getKey_id());
|
||||
mAdapter.notifyItemChanged(getAdapterPosition());
|
||||
};
|
||||
|
||||
|
||||
@@ -42,16 +42,15 @@ import androidx.lifecycle.ViewModelProviders;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
|
||||
import com.astuetz.PagerSlidingTabStrip;
|
||||
import org.sufficientlysecure.keychain.Keys;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UserPacket.UserId;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UserId;
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
|
||||
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
|
||||
import org.sufficientlysecure.keychain.ui.keyview.ViewKeyActivity;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
|
||||
|
||||
@@ -112,7 +111,7 @@ public class ViewKeyAdvActivity extends BaseActivity implements OnPageChangeList
|
||||
public static class ViewKeyAdvViewModel extends ViewModel {
|
||||
private Long masterKeyId;
|
||||
private LiveData<UnifiedKeyInfo> unifiedKeyInfoLiveData;
|
||||
private LiveData<List<SubKey>> subKeyLiveData;
|
||||
private LiveData<List<Keys>> subKeyLiveData;
|
||||
private LiveData<List<UserId>> userIdsLiveData;
|
||||
|
||||
void setMasterKeyId(long masterKeyId) {
|
||||
@@ -134,7 +133,7 @@ public class ViewKeyAdvActivity extends BaseActivity implements OnPageChangeList
|
||||
return unifiedKeyInfoLiveData;
|
||||
}
|
||||
|
||||
LiveData<List<SubKey>> getSubkeyLiveData(Context context) {
|
||||
LiveData<List<Keys>> getSubkeyLiveData(Context context) {
|
||||
if (subKeyLiveData == null) {
|
||||
KeyRepository keyRepository = KeyRepository.create(context);
|
||||
subKeyLiveData = Transformations.switchMap(getUnifiedKeyInfoLiveData(context),
|
||||
|
||||
@@ -45,7 +45,7 @@ import android.widget.TextView;
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.ViewKeyAdvActivity.ViewKeyAdvViewModel;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
import org.sufficientlysecure.keychain.ui.util.Notify;
|
||||
|
||||
@@ -21,18 +21,11 @@ package org.sufficientlysecure.keychain.ui;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.ActionMode;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
@@ -41,13 +34,20 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ViewAnimator;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter.OnItemClickListener;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import org.sufficientlysecure.keychain.Keys;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
||||
@@ -99,8 +99,8 @@ public class ViewKeyAdvSubkeysFragment extends Fragment {
|
||||
subkeysList.setAdapter(subkeysAdapter);
|
||||
|
||||
ViewKeyAdvViewModel viewModel = ViewModelProviders.of(requireActivity()).get(ViewKeyAdvViewModel.class);
|
||||
viewModel.getUnifiedKeyInfoLiveData(requireContext()).observe(this, this::onLoadUnifiedKeyId);
|
||||
viewModel.getSubkeyLiveData(requireContext()).observe(this, this::onLoadSubKeys);
|
||||
viewModel.getUnifiedKeyInfoLiveData(requireContext()).observe(getViewLifecycleOwner(), this::onLoadUnifiedKeyId);
|
||||
viewModel.getSubkeyLiveData(requireContext()).observe(getViewLifecycleOwner(), this::onLoadSubKeys);
|
||||
|
||||
subkeyEditViewModel = ViewModelProviders.of(this).get(SubkeyEditViewModel.class);
|
||||
}
|
||||
@@ -114,9 +114,9 @@ public class ViewKeyAdvSubkeysFragment extends Fragment {
|
||||
subkeyEditViewModel.unifiedKeyInfo = unifiedKeyInfo;
|
||||
}
|
||||
|
||||
private void onLoadSubKeys(List<SubKey> subKeys) {
|
||||
private void onLoadSubKeys(List<Keys> subKeys) {
|
||||
ArrayList<IFlexible> subKeyItems = new ArrayList<>(subKeys.size());
|
||||
for (SubKey subKey : subKeys) {
|
||||
for (Keys subKey : subKeys) {
|
||||
subKeyItems.add(new SubKeyItem(subKey, subkeyEditViewModel));
|
||||
}
|
||||
subkeysAdapter.updateDataSet(subKeyItems);
|
||||
@@ -207,7 +207,7 @@ public class ViewKeyAdvSubkeysFragment extends Fragment {
|
||||
}
|
||||
|
||||
private void editSubkey(int position, SubKeyItem item) {
|
||||
if (subkeyEditViewModel.skpBuilder.hasModificationsForSubkey(item.subkeyInfo.key_id())) {
|
||||
if (subkeyEditViewModel.skpBuilder.hasModificationsForSubkey(item.subkeyInfo.getKey_id())) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -219,8 +219,8 @@ public class ViewKeyAdvSubkeysFragment extends Fragment {
|
||||
editSubkeyExpiry(item);
|
||||
break;
|
||||
case EditSubkeyDialogFragment.MESSAGE_REVOKE:
|
||||
SubKey subKey = item.subkeyInfo;
|
||||
subkeyEditViewModel.skpBuilder.addRevokeSubkey(subKey.key_id());
|
||||
Keys subKey = item.subkeyInfo;
|
||||
subkeyEditViewModel.skpBuilder.addRevokeSubkey(subKey.getKey_id());
|
||||
break;
|
||||
case EditSubkeyDialogFragment.MESSAGE_STRIP: {
|
||||
editSubkeyToggleStrip(item);
|
||||
@@ -241,21 +241,21 @@ public class ViewKeyAdvSubkeysFragment extends Fragment {
|
||||
}
|
||||
|
||||
private void editSubkeyToggleStrip(SubKeyItem item) {
|
||||
SubKey subKey = item.subkeyInfo;
|
||||
if (subKey.has_secret() == SecretKeyType.GNU_DUMMY) {
|
||||
Keys subKey = item.subkeyInfo;
|
||||
if (subKey.getHas_secret() == SecretKeyType.GNU_DUMMY) {
|
||||
// Key is already stripped; this is a no-op.
|
||||
return;
|
||||
}
|
||||
|
||||
subkeyEditViewModel.skpBuilder.addOrReplaceSubkeyChange(SubkeyChange.createStripChange(subKey.key_id()));
|
||||
subkeyEditViewModel.skpBuilder.addOrReplaceSubkeyChange(SubkeyChange.createStripChange(subKey.getKey_id()));
|
||||
}
|
||||
|
||||
private void editSubkeyExpiry(SubKeyItem item) {
|
||||
SubKey subKey = item.subkeyInfo;
|
||||
Keys subKey = item.subkeyInfo;
|
||||
|
||||
final long keyId = subKey.key_id();
|
||||
final Long creationDate = subKey.creation();
|
||||
final Long expiryDate = subKey.expiry();
|
||||
final long keyId = subKey.getKey_id();
|
||||
final Long creationDate = subKey.getCreation();
|
||||
final Long expiryDate = subKey.getExpiry();
|
||||
|
||||
Handler returnHandler = new Handler() {
|
||||
@Override
|
||||
|
||||
@@ -20,15 +20,11 @@ package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import android.view.ActionMode;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
@@ -38,10 +34,14 @@ import android.view.ViewGroup;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ViewAnimator;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UserPacket.UserId;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UserId;
|
||||
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing.VerificationStatus;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
||||
@@ -196,8 +196,8 @@ public class ViewKeyAdvUserIdsFragment extends Fragment {
|
||||
mUserIds.setAdapter(mUserIdsAdapter);
|
||||
|
||||
ViewKeyAdvViewModel viewModel = ViewModelProviders.of(requireActivity()).get(ViewKeyAdvViewModel.class);
|
||||
viewModel.getUnifiedKeyInfoLiveData(requireContext()).observe(this, this::onLoadUnifiedKeyInfo);
|
||||
viewModel.getUserIdLiveData(requireContext()).observe(this, this::onLoadUserIds);
|
||||
viewModel.getUnifiedKeyInfoLiveData(requireContext()).observe(getViewLifecycleOwner(), this::onLoadUnifiedKeyInfo);
|
||||
viewModel.getUserIdLiveData(requireContext()).observe(getViewLifecycleOwner(), this::onLoadUserIds);
|
||||
}
|
||||
|
||||
public void onLoadUnifiedKeyInfo(UnifiedKeyInfo unifiedKeyInfo) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.FlexibleKeyDetailsItem.FlexibleKeyItemViewHolder;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.FlexibleKeyItem.FlexibleSectionableKeyItem;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter;
|
||||
|
||||
@@ -10,7 +10,7 @@ import android.content.res.Resources;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
|
||||
|
||||
public class FlexibleKeyItemFactory {
|
||||
|
||||
@@ -32,9 +32,6 @@ import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.databinding.DataBindingUtil;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.databinding.ImportKeysListItemBinding;
|
||||
@@ -44,7 +41,7 @@ import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysOperationCallback;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysResultListener;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.ImportOperation;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
|
||||
|
||||
@@ -22,7 +22,7 @@ import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.KeyChoiceAdapter.KeyChoiceItem;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter;
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ import android.widget.TextView;
|
||||
import android.widget.ViewAnimator;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.UserPacket.UserId;
|
||||
import org.sufficientlysecure.keychain.model.UserId;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing.VerificationStatus;
|
||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
|
||||
@@ -7,6 +7,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.materialchips.ChipView;
|
||||
import org.sufficientlysecure.materialchips.ChipsInput;
|
||||
import org.sufficientlysecure.materialchips.adapter.ChipsAdapter;
|
||||
@@ -15,7 +16,6 @@ import org.sufficientlysecure.materialchips.util.ViewUtil;
|
||||
import org.sufficientlysecure.materialchips.views.DetailedChipView;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipAdapter.ItemViewHolder;
|
||||
import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipsInput.EncryptRecipientChip;
|
||||
|
||||
@@ -63,7 +63,7 @@ public class EncryptRecipientChipAdapter extends ChipsAdapter<EncryptRecipientCh
|
||||
}
|
||||
}
|
||||
|
||||
private SimpleChip simpleChipFromKeyInfo(SubKey.UnifiedKeyInfo keyInfo) {
|
||||
private SimpleChip simpleChipFromKeyInfo(UnifiedKeyInfo keyInfo) {
|
||||
String name;
|
||||
String email;
|
||||
if (keyInfo.name() == null) {
|
||||
|
||||
@@ -10,7 +10,7 @@ import android.util.AttributeSet;
|
||||
|
||||
import org.sufficientlysecure.materialchips.ChipsInput;
|
||||
import org.sufficientlysecure.materialchips.adapter.FilterableAdapter.FilterableItem;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.chips.EncryptRecipientChipsInput.EncryptRecipientChip;
|
||||
|
||||
|
||||
|
||||
@@ -3,15 +3,15 @@ package org.sufficientlysecure.keychain.ui.keyview;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.Transformations;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import android.content.Context;
|
||||
|
||||
import org.sufficientlysecure.keychain.Key_metadata;
|
||||
import org.sufficientlysecure.keychain.daos.KeyMetadataDao;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.KeyMetadata;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.keyview.loader.IdentityDao;
|
||||
import org.sufficientlysecure.keychain.ui.keyview.loader.IdentityDao.IdentityInfo;
|
||||
import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao;
|
||||
@@ -21,7 +21,7 @@ import org.sufficientlysecure.keychain.ui.keyview.loader.SubkeyStatusDao.KeySubk
|
||||
public class KeyFragmentViewModel extends ViewModel {
|
||||
private LiveData<List<IdentityInfo>> identityInfo;
|
||||
private LiveData<KeySubkeyStatus> subkeyStatus;
|
||||
private LiveData<KeyMetadata> keyserverStatus;
|
||||
private LiveData<Key_metadata> keyserverStatus;
|
||||
|
||||
LiveData<List<IdentityInfo>> getIdentityInfo(Context context, LiveData<UnifiedKeyInfo> unifiedKeyInfoLiveData) {
|
||||
if (identityInfo == null) {
|
||||
@@ -43,7 +43,7 @@ public class KeyFragmentViewModel extends ViewModel {
|
||||
return subkeyStatus;
|
||||
}
|
||||
|
||||
LiveData<KeyMetadata> getKeyserverStatus(Context context, LiveData<UnifiedKeyInfo> unifiedKeyInfoLiveData) {
|
||||
LiveData<Key_metadata> getKeyserverStatus(Context context, LiveData<UnifiedKeyInfo> unifiedKeyInfoLiveData) {
|
||||
if (keyserverStatus == null) {
|
||||
KeyMetadataDao keyMetadataDao = KeyMetadataDao.create(context);
|
||||
keyserverStatus = Transformations.switchMap(unifiedKeyInfoLiveData,
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
package org.sufficientlysecure.keychain.ui.keyview;
|
||||
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import org.sufficientlysecure.keychain.daos.DatabaseNotifyManager;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.livedata.GenericLiveData;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
|
||||
|
||||
public class UnifiedKeyInfoViewModel extends ViewModel {
|
||||
|
||||
@@ -70,7 +70,7 @@ import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository.NotFoundException;
|
||||
import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress;
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
|
||||
@@ -35,11 +35,11 @@ import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import org.sufficientlysecure.keychain.Key_metadata;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
|
||||
import org.sufficientlysecure.keychain.daos.AutocryptPeerDao;
|
||||
import org.sufficientlysecure.keychain.model.KeyMetadata;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.IdentityAdapter;
|
||||
@@ -265,16 +265,16 @@ public class ViewKeyFragment extends Fragment implements OnMenuItemClickListener
|
||||
identitiesAdapter.setData(identityInfos);
|
||||
}
|
||||
|
||||
private void onLoadKeyMetadata(KeyMetadata keyMetadata) {
|
||||
private void onLoadKeyMetadata(Key_metadata keyMetadata) {
|
||||
if (keyMetadata == null) {
|
||||
keyserverStatusView.setDisplayStatusUnknown();
|
||||
} else if (keyMetadata.hasBeenUpdated()) {
|
||||
if (keyMetadata.isPublished()) {
|
||||
} else if (keyMetadata.getLast_updated() != null) {
|
||||
if (keyMetadata.getSeen_on_keyservers() != null && keyMetadata.getSeen_on_keyservers()) {
|
||||
keyserverStatusView.setDisplayStatusPublished();
|
||||
} else {
|
||||
keyserverStatusView.setDisplayStatusNotPublished();
|
||||
}
|
||||
keyserverStatusView.setLastUpdated(keyMetadata.last_updated());
|
||||
keyserverStatusView.setLastUpdated(keyMetadata.getLast_updated());
|
||||
} else {
|
||||
keyserverStatusView.setDisplayStatusUnknown();
|
||||
}
|
||||
|
||||
@@ -22,47 +22,43 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.squareup.sqldelight.SqlDelightQuery;
|
||||
import org.openintents.openpgp.util.OpenPgpApi;
|
||||
import org.sufficientlysecure.keychain.KeychainDatabase;
|
||||
import org.sufficientlysecure.keychain.Autocrypt_peers;
|
||||
import org.sufficientlysecure.keychain.daos.AutocryptPeerDao;
|
||||
import org.sufficientlysecure.keychain.model.AutocryptPeer;
|
||||
import org.sufficientlysecure.keychain.model.UserPacket;
|
||||
import org.sufficientlysecure.keychain.model.UserPacket.UserId;
|
||||
import org.sufficientlysecure.keychain.daos.UserIdDao;
|
||||
import org.sufficientlysecure.keychain.model.UserId;
|
||||
import org.sufficientlysecure.keychain.ui.util.PackageIconGetter;
|
||||
|
||||
|
||||
public class IdentityDao {
|
||||
private final SupportSQLiteDatabase db;
|
||||
private final PackageIconGetter packageIconGetter;
|
||||
private final PackageManager packageManager;
|
||||
private final AutocryptPeerDao autocryptPeerDao;
|
||||
private final UserIdDao userIdDao;
|
||||
|
||||
public static IdentityDao getInstance(Context context) {
|
||||
SupportSQLiteDatabase db = KeychainDatabase.getInstance(context).getWritableDatabase();
|
||||
PackageManager packageManager = context.getPackageManager();
|
||||
PackageIconGetter iconGetter = PackageIconGetter.getInstance(context);
|
||||
AutocryptPeerDao autocryptPeerDao = AutocryptPeerDao.getInstance(context);
|
||||
return new IdentityDao(db, packageManager, iconGetter, autocryptPeerDao);
|
||||
UserIdDao userIdDao = UserIdDao.getInstance(context);
|
||||
return new IdentityDao(packageManager, iconGetter, autocryptPeerDao, userIdDao);
|
||||
}
|
||||
|
||||
private IdentityDao(SupportSQLiteDatabase db,
|
||||
PackageManager packageManager, PackageIconGetter iconGetter,
|
||||
AutocryptPeerDao autocryptPeerDao) {
|
||||
this.db = db;
|
||||
private IdentityDao(PackageManager packageManager,
|
||||
PackageIconGetter iconGetter, AutocryptPeerDao autocryptPeerDao,
|
||||
UserIdDao userIdDao) {
|
||||
this.packageManager = packageManager;
|
||||
this.packageIconGetter = iconGetter;
|
||||
this.autocryptPeerDao = autocryptPeerDao;
|
||||
this.userIdDao = userIdDao;
|
||||
}
|
||||
|
||||
public List<IdentityInfo> getIdentityInfos(long masterKeyId) {
|
||||
@@ -74,29 +70,36 @@ public class IdentityDao {
|
||||
return Collections.unmodifiableList(identities);
|
||||
}
|
||||
|
||||
private void correlateOrAddAutocryptPeers(ArrayList<IdentityInfo> identities, long masterKeyId) {
|
||||
for (AutocryptPeer autocryptPeer : autocryptPeerDao.getAutocryptPeersForKey(masterKeyId)) {
|
||||
String packageName = autocryptPeer.package_name();
|
||||
String autocryptId = autocryptPeer.identifier();
|
||||
private void correlateOrAddAutocryptPeers(ArrayList<IdentityInfo> identities,
|
||||
long masterKeyId) {
|
||||
for (Autocrypt_peers autocryptPeer : autocryptPeerDao.getAutocryptPeersForKey(
|
||||
masterKeyId)) {
|
||||
String packageName = autocryptPeer.getPackage_name();
|
||||
String autocryptId = autocryptPeer.getIdentifier();
|
||||
|
||||
Drawable drawable = packageIconGetter.getDrawableForPackageName(packageName);
|
||||
Intent autocryptPeerIntent = getAutocryptPeerActivityIntentIfResolvable(packageName, autocryptId);
|
||||
Intent autocryptPeerIntent =
|
||||
getAutocryptPeerActivityIntentIfResolvable(packageName, autocryptId);
|
||||
|
||||
UserIdInfo associatedUserIdInfo = findUserIdMatchingAutocryptPeer(identities, autocryptId);
|
||||
UserIdInfo associatedUserIdInfo =
|
||||
findUserIdMatchingAutocryptPeer(identities, autocryptId);
|
||||
if (associatedUserIdInfo != null) {
|
||||
int position = identities.indexOf(associatedUserIdInfo);
|
||||
AutocryptPeerInfo autocryptPeerInfo = AutocryptPeerInfo
|
||||
.create(masterKeyId, associatedUserIdInfo, autocryptId, packageName, drawable, autocryptPeerIntent);
|
||||
.create(masterKeyId, associatedUserIdInfo, autocryptId, packageName,
|
||||
drawable, autocryptPeerIntent);
|
||||
identities.set(position, autocryptPeerInfo);
|
||||
} else {
|
||||
AutocryptPeerInfo autocryptPeerInfo = AutocryptPeerInfo
|
||||
.create(masterKeyId, autocryptId, packageName, drawable, autocryptPeerIntent);
|
||||
.create(masterKeyId, autocryptId, packageName, drawable,
|
||||
autocryptPeerIntent);
|
||||
identities.add(autocryptPeerInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Intent getAutocryptPeerActivityIntentIfResolvable(String packageName, String autocryptPeer) {
|
||||
private Intent getAutocryptPeerActivityIntentIfResolvable(String packageName,
|
||||
String autocryptPeer) {
|
||||
Intent intent = new Intent();
|
||||
intent.setAction("org.autocrypt.PEER_ACTION");
|
||||
intent.setPackage(packageName);
|
||||
@@ -111,7 +114,8 @@ public class IdentityDao {
|
||||
}
|
||||
}
|
||||
|
||||
private static UserIdInfo findUserIdMatchingAutocryptPeer(List<IdentityInfo> identities, String autocryptPeer) {
|
||||
private static UserIdInfo findUserIdMatchingAutocryptPeer(List<IdentityInfo> identities,
|
||||
String autocryptPeer) {
|
||||
for (IdentityInfo identityInfo : identities) {
|
||||
if (identityInfo instanceof UserIdInfo) {
|
||||
UserIdInfo userIdInfo = (UserIdInfo) identityInfo;
|
||||
@@ -123,72 +127,90 @@ public class IdentityDao {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void loadUserIds(ArrayList<IdentityInfo> identities, long... masterKeyId) {
|
||||
SqlDelightQuery query = UserPacket.FACTORY.selectUserIdsByMasterKeyId(masterKeyId);
|
||||
try (Cursor cursor = db.query(query)) {
|
||||
while (cursor.moveToNext()) {
|
||||
UserId userId = UserPacket.USER_ID_MAPPER.map(cursor);
|
||||
|
||||
if (userId.name() != null || userId.email() != null) {
|
||||
IdentityInfo identityInfo = UserIdInfo.create(
|
||||
userId.master_key_id(), userId.rank(), userId.isVerified(), userId.is_primary(), userId.name(), userId.email(), userId.comment());
|
||||
identities.add(identityInfo);
|
||||
}
|
||||
private void loadUserIds(ArrayList<IdentityInfo> identities, long... masterKeyIds) {
|
||||
for (UserId userId : userIdDao.getUserIdsByMasterKeyIds(masterKeyIds)) {
|
||||
if (userId.name() != null || userId.email() != null) {
|
||||
IdentityInfo identityInfo = UserIdInfo.create(
|
||||
userId.master_key_id(), userId.rank(), userId.isVerified(),
|
||||
userId.is_primary(), userId.name(), userId.email(), userId.email());
|
||||
identities.add(identityInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface IdentityInfo {
|
||||
long getMasterKeyId();
|
||||
|
||||
int getRank();
|
||||
|
||||
boolean isVerified();
|
||||
|
||||
boolean isPrimary();
|
||||
}
|
||||
|
||||
@AutoValue
|
||||
public abstract static class UserIdInfo implements IdentityInfo {
|
||||
public abstract long getMasterKeyId();
|
||||
|
||||
public abstract int getRank();
|
||||
|
||||
public abstract boolean isVerified();
|
||||
|
||||
public abstract boolean isPrimary();
|
||||
|
||||
@Nullable
|
||||
public abstract String getName();
|
||||
|
||||
@Nullable
|
||||
public abstract String getEmail();
|
||||
|
||||
@Nullable
|
||||
public abstract String getComment();
|
||||
|
||||
static UserIdInfo create(long masterKeyId, int rank, boolean isVerified, boolean isPrimary, String name, String email,
|
||||
static UserIdInfo create(long masterKeyId, int rank, boolean isVerified, boolean isPrimary,
|
||||
String name, String email,
|
||||
String comment) {
|
||||
return new AutoValue_IdentityDao_UserIdInfo(masterKeyId, rank, isVerified, isPrimary, name, email, comment);
|
||||
return new AutoValue_IdentityDao_UserIdInfo(masterKeyId, rank, isVerified, isPrimary,
|
||||
name, email, comment);
|
||||
}
|
||||
}
|
||||
|
||||
@AutoValue
|
||||
public abstract static class AutocryptPeerInfo implements IdentityInfo {
|
||||
public abstract long getMasterKeyId();
|
||||
|
||||
public abstract int getRank();
|
||||
|
||||
public abstract boolean isVerified();
|
||||
|
||||
public abstract boolean isPrimary();
|
||||
|
||||
public abstract String getIdentity();
|
||||
|
||||
public abstract String getPackageName();
|
||||
|
||||
@Nullable
|
||||
public abstract Drawable getAppIcon();
|
||||
|
||||
@Nullable
|
||||
public abstract UserIdInfo getUserIdInfo();
|
||||
|
||||
@Nullable
|
||||
public abstract Intent getAutocryptPeerIntent();
|
||||
|
||||
static AutocryptPeerInfo create(long masterKeyId, UserIdInfo userIdInfo, String autocryptPeer, String packageName,
|
||||
static AutocryptPeerInfo create(long masterKeyId, UserIdInfo userIdInfo,
|
||||
String autocryptPeer, String packageName,
|
||||
Drawable appIcon, Intent autocryptPeerIntent) {
|
||||
return new AutoValue_IdentityDao_AutocryptPeerInfo(masterKeyId, userIdInfo.getRank(), userIdInfo.isVerified(),
|
||||
userIdInfo.isPrimary(), autocryptPeer, packageName, appIcon, userIdInfo, autocryptPeerIntent);
|
||||
return new AutoValue_IdentityDao_AutocryptPeerInfo(masterKeyId, userIdInfo.getRank(),
|
||||
userIdInfo.isVerified(),
|
||||
userIdInfo.isPrimary(), autocryptPeer, packageName, appIcon, userIdInfo,
|
||||
autocryptPeerIntent);
|
||||
}
|
||||
|
||||
static AutocryptPeerInfo create(long masterKeyId, String autocryptPeer, String packageName, Drawable appIcon, Intent autocryptPeerIntent) {
|
||||
return new AutoValue_IdentityDao_AutocryptPeerInfo(masterKeyId,0, false, false, autocryptPeer, packageName, appIcon, null, autocryptPeerIntent);
|
||||
static AutocryptPeerInfo create(long masterKeyId, String autocryptPeer, String packageName,
|
||||
Drawable appIcon, Intent autocryptPeerIntent) {
|
||||
return new AutoValue_IdentityDao_AutocryptPeerInfo(masterKeyId, 0, false, false,
|
||||
autocryptPeer, packageName, appIcon, null, autocryptPeerIntent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,13 +25,13 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import androidx.annotation.NonNull;
|
||||
import org.sufficientlysecure.keychain.Keys;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.pgp.PgpSecurityConstants;
|
||||
import org.sufficientlysecure.keychain.pgp.SecurityProblem.KeySecurityProblem;
|
||||
import org.sufficientlysecure.keychain.daos.KeyRepository;
|
||||
|
||||
|
||||
public class SubkeyStatusDao {
|
||||
@@ -51,7 +51,7 @@ public class SubkeyStatusDao {
|
||||
SubKeyItem keyCertify = null;
|
||||
ArrayList<SubKeyItem> keysSign = new ArrayList<>();
|
||||
ArrayList<SubKeyItem> keysEncrypt = new ArrayList<>();
|
||||
for (SubKey subKey : keyRepository.getSubKeysByMasterKeyId(masterKeyId)) {
|
||||
for (Keys subKey : keyRepository.getSubKeysByMasterKeyId(masterKeyId)) {
|
||||
SubKeyItem ski = new SubKeyItem(masterKeyId, subKey);
|
||||
|
||||
if (ski.mKeyId == masterKeyId) {
|
||||
@@ -183,23 +183,23 @@ public class SubkeyStatusDao {
|
||||
final boolean mCanCertify, mCanSign, mCanEncrypt;
|
||||
public final KeySecurityProblem mSecurityProblem;
|
||||
|
||||
SubKeyItem(long masterKeyId, SubKey subKey) {
|
||||
mKeyId = subKey.key_id();
|
||||
mCreation = new Date(subKey.creation() * 1000);
|
||||
SubKeyItem(long masterKeyId, Keys subKey) {
|
||||
mKeyId = subKey.getKey_id();
|
||||
mCreation = new Date(subKey.getCreation() * 1000);
|
||||
|
||||
mSecretKeyType = subKey.has_secret();
|
||||
mSecretKeyType = subKey.getHas_secret();
|
||||
|
||||
mIsRevoked = subKey.is_revoked();
|
||||
mExpiry = subKey.expiry() == null ? null : new Date(subKey.expiry() * 1000);
|
||||
mExpiry = subKey.getExpiry() == null ? null : new Date(subKey.getExpiry() * 1000);
|
||||
mIsExpired = mExpiry != null && mExpiry.before(new Date());
|
||||
|
||||
mCanCertify = subKey.can_certify();
|
||||
mCanSign = subKey.can_sign();
|
||||
mCanEncrypt = subKey.can_encrypt();
|
||||
mCanCertify = subKey.getCan_certify();
|
||||
mCanSign = subKey.getCan_sign();
|
||||
mCanEncrypt = subKey.getCan_encrypt();
|
||||
|
||||
int algorithm = subKey.algorithm();
|
||||
Integer bitStrength = subKey.key_size();
|
||||
String curveOid = subKey.key_curve_oid();
|
||||
int algorithm = subKey.getAlgorithm();
|
||||
Integer bitStrength = subKey.getKey_size();
|
||||
String curveOid = subKey.getKey_curve_oid();
|
||||
|
||||
mSecurityProblem = PgpSecurityConstants.getKeySecurityProblem(
|
||||
masterKeyId, mKeyId, algorithm, bitStrength, curveOid);
|
||||
|
||||
@@ -10,8 +10,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -150,7 +149,7 @@ public class KeyInfoFormatter {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private String getSecretKeyReadableTime(Context context, SubKey.UnifiedKeyInfo keyInfo) {
|
||||
private String getSecretKeyReadableTime(Context context, UnifiedKeyInfo keyInfo) {
|
||||
long creationMillis = keyInfo.creation() * 1000;
|
||||
|
||||
boolean allowRelativeTimestamp = keyInfo.has_duplicate();
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Schürmann & Breitmoser GbR
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.ui.widget;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ViewAnimator;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.Certification.CertDetails;
|
||||
|
||||
public class CertListWidget extends ViewAnimator {
|
||||
private TextView vCollapsed;
|
||||
private ListView vExpanded;
|
||||
private View vExpandButton;
|
||||
|
||||
public CertListWidget(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
View root = getRootView();
|
||||
vCollapsed = root.findViewById(R.id.cert_collapsed_list);
|
||||
vExpanded = root.findViewById(R.id.cert_expanded_list);
|
||||
vExpandButton = root.findViewById(R.id.cert_expand_button);
|
||||
|
||||
// for now
|
||||
vExpandButton.setVisibility(View.GONE);
|
||||
vExpandButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
toggleExpanded();
|
||||
}
|
||||
});
|
||||
|
||||
// vExpanded.setAdapter(null);
|
||||
|
||||
}
|
||||
|
||||
void toggleExpanded() {
|
||||
setDisplayedChild(getDisplayedChild() == 1 ? 0 : 1);
|
||||
}
|
||||
|
||||
void setExpanded(boolean expanded) {
|
||||
setDisplayedChild(expanded ? 1 : 0);
|
||||
}
|
||||
|
||||
public void setData(CertDetails certDetails, boolean isSecret) {
|
||||
if (certDetails != null) {
|
||||
CharSequence relativeTimeStr = DateUtils
|
||||
.getRelativeTimeSpanString(certDetails.creation(), System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_ALL);
|
||||
if (isSecret) {
|
||||
vCollapsed.setText("You created this identity " + relativeTimeStr + ".");
|
||||
} else {
|
||||
vCollapsed.setText("You verified and confirmed this identity " + relativeTimeStr + ".");
|
||||
}
|
||||
} else {
|
||||
vCollapsed.setText("This identity is not yet verified or confirmed.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,7 +11,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyInfoFormatter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -31,7 +31,7 @@ import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.model.SubKey.UnifiedKeyInfo;
|
||||
import org.sufficientlysecure.keychain.model.UnifiedKeyInfo;
|
||||
|
||||
public class KeySpinner extends AppCompatSpinner {
|
||||
public static final String ARG_SUPER_STATE = "super_state";
|
||||
|
||||
Reference in New Issue
Block a user