From 57a4cecbfb30215ddb337ef624c0c3992812e437 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 23 Sep 2017 16:24:45 +0200 Subject: [PATCH] extract LastUpdateInteractor from KeyRepository --- .../keychain/operations/EditKeyOperation.java | 7 +- .../keychain/operations/ImportOperation.java | 12 ++- .../keychain/provider/KeyRepository.java | 26 ------- .../provider/KeyWritableRepository.java | 22 ------ .../provider/LastUpdateInteractor.java | 74 +++++++++++++++++++ .../ui/SettingsKeyserverFragment.java | 8 +- 6 files changed, 94 insertions(+), 55 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/LastUpdateInteractor.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java index ae8b93d36..52855e3f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java @@ -37,6 +37,7 @@ import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.provider.KeyRepository.NotFoundException; import org.sufficientlysecure.keychain.provider.KeyWritableRepository; +import org.sufficientlysecure.keychain.provider.LastUpdateInteractor; import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.UploadKeyringParcel; @@ -56,10 +57,14 @@ import org.sufficientlysecure.keychain.util.ProgressScaler; * */ public class EditKeyOperation extends BaseReadWriteOperation { + private final LastUpdateInteractor lastUpdateInteractor; + public EditKeyOperation(Context context, KeyWritableRepository databaseInteractor, Progressable progressable, AtomicBoolean cancelled) { super(context, databaseInteractor, progressable, cancelled); + + this.lastUpdateInteractor = LastUpdateInteractor.create(context); } /** @@ -167,7 +172,7 @@ public class EditKeyOperation extends BaseReadWriteOperation log.add(saveResult, 1); if (isNewKey) { - mKeyWritableRepository.renewKeyLastUpdatedTime(ring.getMasterKeyId(), saveParcel.isShouldUpload()); + lastUpdateInteractor.renewKeyLastUpdatedTime(ring.getMasterKeyId(), saveParcel.isShouldUpload()); } // If the save operation didn't succeed, exit here diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java index e57e4a3bf..1bee1c825 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportOperation.java @@ -55,6 +55,7 @@ import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.provider.KeyWritableRepository; +import org.sufficientlysecure.keychain.provider.LastUpdateInteractor; import org.sufficientlysecure.keychain.service.ContactSyncAdapterService; import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; @@ -88,16 +89,23 @@ public class ImportOperation extends BaseReadWriteOperation private static final int MAX_THREADS = 10; public static final String CACHE_FILE_NAME = "key_import.pcl"; + + private final LastUpdateInteractor lastUpdateInteractor; + private FacebookKeyserverClient facebookServer; private KeybaseKeyserverClient keybaseServer; public ImportOperation(Context context, KeyWritableRepository databaseInteractor, Progressable progressable) { super(context, databaseInteractor, progressable); + + this.lastUpdateInteractor = LastUpdateInteractor.create(context); } public ImportOperation(Context context, KeyWritableRepository databaseInteractor, Progressable progressable, AtomicBoolean cancelled) { super(context, databaseInteractor, progressable, cancelled); + + this.lastUpdateInteractor = LastUpdateInteractor.create(context); } // Overloaded functions for using progressable supplied in constructor during import @@ -192,7 +200,7 @@ public class ImportOperation extends BaseReadWriteOperation byte[] fingerprintHex = entry.getExpectedFingerprint(); if (fingerprintHex != null) { - mKeyWritableRepository.renewKeyLastUpdatedTime( + lastUpdateInteractor.renewKeyLastUpdatedTime( KeyFormattingUtils.getKeyIdFromFingerprint(fingerprintHex), false); } continue; @@ -242,7 +250,7 @@ public class ImportOperation extends BaseReadWriteOperation } if (!skipSave) { - mKeyWritableRepository.renewKeyLastUpdatedTime(key.getMasterKeyId(), keyWasDownloaded); + lastUpdateInteractor.renewKeyLastUpdatedTime(key.getMasterKeyId(), keyWasDownloaded); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java index fbe765ac9..ac71b52b2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java @@ -304,32 +304,6 @@ public class KeyRepository { return lastUpdateTime; } - @Nullable - Boolean getSeenOnKeyservers(long masterKeyId) { - Cursor cursor = mContentResolver.query( - UpdatedKeys.CONTENT_URI, - new String[] { UpdatedKeys.SEEN_ON_KEYSERVERS }, - UpdatedKeys.MASTER_KEY_ID + " = ?", - new String[] { "" + masterKeyId }, - null - ); - if (cursor == null) { - return null; - } - - Boolean seenOnKeyservers; - try { - if (!cursor.moveToNext()) { - return null; - } - seenOnKeyservers = cursor.isNull(0) ? null : cursor.getInt(0) != 0; - } finally { - cursor.close(); - } - return seenOnKeyservers; - } - - public final byte[] loadPublicKeyRingData(long masterKeyId) throws NotFoundException { byte[] data = (byte[]) getGenericDataOrNull(KeyRingData.buildPublicKeyRingUri(masterKeyId), KeyRingData.KEY_RING_DATA, FIELD_TYPE_BLOB); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyWritableRepository.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyWritableRepository.java index 42ea211e8..8507d943a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyWritableRepository.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyWritableRepository.java @@ -1126,26 +1126,4 @@ public class KeyWritableRepository extends KeyRepository { return ContentProviderOperation.newInsert(uri).withValues(values).build(); } - public Uri renewKeyLastUpdatedTime(long masterKeyId, boolean seenOnKeyservers) { - boolean isFirstKeyserverStatusCheck = getSeenOnKeyservers(masterKeyId) == null; - - ContentValues values = new ContentValues(); - values.put(UpdatedKeys.MASTER_KEY_ID, masterKeyId); - values.put(UpdatedKeys.LAST_UPDATED, GregorianCalendar.getInstance().getTimeInMillis() / 1000); - if (seenOnKeyservers || isFirstKeyserverStatusCheck) { - values.put(UpdatedKeys.SEEN_ON_KEYSERVERS, seenOnKeyservers); - } - - // this will actually update/replace, doing the right thing™ for seenOnKeyservers value - // see `KeychainProvider.insert()` - return mContentResolver.insert(UpdatedKeys.CONTENT_URI, values); - } - - public void resetAllLastUpdatedTimes() { - ContentValues values = new ContentValues(); - values.putNull(UpdatedKeys.LAST_UPDATED); - values.putNull(UpdatedKeys.SEEN_ON_KEYSERVERS); - mContentResolver.update(UpdatedKeys.CONTENT_URI, values, null, null); - } - } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/LastUpdateInteractor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/LastUpdateInteractor.java new file mode 100644 index 000000000..7a2c49419 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/LastUpdateInteractor.java @@ -0,0 +1,74 @@ +package org.sufficientlysecure.keychain.provider; + + +import java.util.GregorianCalendar; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.support.annotation.Nullable; + +import org.sufficientlysecure.keychain.provider.KeychainContract.UpdatedKeys; + + +public class LastUpdateInteractor { + private final ContentResolver contentResolver; + + + public static LastUpdateInteractor create(Context context) { + return new LastUpdateInteractor(context.getContentResolver()); + } + + private LastUpdateInteractor(ContentResolver contentResolver) { + this.contentResolver = contentResolver; + } + + @Nullable + private Boolean getSeenOnKeyservers(long masterKeyId) { + Cursor cursor = contentResolver.query( + UpdatedKeys.CONTENT_URI, + new String[] { UpdatedKeys.SEEN_ON_KEYSERVERS }, + UpdatedKeys.MASTER_KEY_ID + " = ?", + new String[] { "" + masterKeyId }, + null + ); + if (cursor == null) { + return null; + } + + Boolean seenOnKeyservers; + try { + if (!cursor.moveToNext()) { + return null; + } + seenOnKeyservers = cursor.isNull(0) ? null : cursor.getInt(0) != 0; + } finally { + cursor.close(); + } + return seenOnKeyservers; + } + + public void resetAllLastUpdatedTimes() { + ContentValues values = new ContentValues(); + values.putNull(UpdatedKeys.LAST_UPDATED); + values.putNull(UpdatedKeys.SEEN_ON_KEYSERVERS); + contentResolver.update(UpdatedKeys.CONTENT_URI, values, null, null); + } + + public Uri renewKeyLastUpdatedTime(long masterKeyId, boolean seenOnKeyservers) { + boolean isFirstKeyserverStatusCheck = getSeenOnKeyservers(masterKeyId) == null; + + ContentValues values = new ContentValues(); + values.put(UpdatedKeys.MASTER_KEY_ID, masterKeyId); + values.put(UpdatedKeys.LAST_UPDATED, GregorianCalendar.getInstance().getTimeInMillis() / 1000); + if (seenOnKeyservers || isFirstKeyserverStatusCheck) { + values.put(UpdatedKeys.SEEN_ON_KEYSERVERS, seenOnKeyservers); + } + + // this will actually update/replace, doing the right thing™ for seenOnKeyservers value + // see `KeychainProvider.insert()` + return contentResolver.insert(UpdatedKeys.CONTENT_URI, values); + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java index 977e80c2c..5b20987fc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java @@ -43,7 +43,7 @@ import android.widget.TextView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; -import org.sufficientlysecure.keychain.provider.KeyWritableRepository; +import org.sufficientlysecure.keychain.provider.LastUpdateInteractor; import org.sufficientlysecure.keychain.ui.dialog.AddEditKeyserverDialogFragment; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; @@ -63,7 +63,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC private List mKeyservers; private KeyserverListAdapter mAdapter; - private KeyWritableRepository databaseReadWriteInteractor; + private LastUpdateInteractor lastUpdateInteractor; public static SettingsKeyserverFragment newInstance(ArrayList keyservers) { Bundle args = new Bundle(); @@ -78,7 +78,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - databaseReadWriteInteractor = KeyWritableRepository.create(getContext()); + lastUpdateInteractor = LastUpdateInteractor.create(getContext()); return inflater.inflate(R.layout.settings_keyserver_fragment, null); } @@ -230,7 +230,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC Preferences.getPreferences(getActivity()).setKeyServers(mKeyserversMutable); mKeyservers = Collections.unmodifiableList(new ArrayList<>(mKeyserversMutable)); - databaseReadWriteInteractor.resetAllLastUpdatedTimes(); + lastUpdateInteractor.resetAllLastUpdatedTimes(); } @Override