diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java index 05a058f5b..5a29d2a70 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java @@ -466,6 +466,29 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable { return getHostID(); } + @Override + public boolean equals(Object obj) { + if (! (obj instanceof ParcelableHkpKeyserver)) { + return false; + } + + ParcelableHkpKeyserver other = (ParcelableHkpKeyserver) obj; + if (other.mUrl == null ^ mUrl == null) { + return false; + } + if (other.mOnion == null ^ mOnion == null) { + return false; + } + if (mUrl != null && !mUrl.equals(other.mUrl)) { + return false; + } + if (mOnion != null && !mOnion.equals(other.mOnion)) { + return false; + } + + return true; + } + /** * Tries to find a server responsible for a given domain * 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 5adb992fd..7004a367f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyWritableRepository.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyWritableRepository.java @@ -1363,4 +1363,11 @@ public class KeyWritableRepository extends KeyRepository { 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/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java index 5d5916211..2e8177d88 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -916,6 +916,19 @@ public class KeychainProvider extends ContentProvider { buildDefaultApiAppsSelection(uri, selection), selectionArgs); break; } + case UPDATED_KEYS: { + if (values.size() != 2 || + !values.containsKey(UpdatedKeys.SEEN_ON_KEYSERVERS) || + !values.containsKey(UpdatedKeys.LAST_UPDATED) || + values.get(UpdatedKeys.LAST_UPDATED) != null || + values.get(UpdatedKeys.SEEN_ON_KEYSERVERS) != null || + selection != null || selectionArgs != null) { + throw new UnsupportedOperationException("can only reset all keys"); + } + + db.update(Tables.UPDATED_KEYS, values, null, null); + break; + } default: { throw new UnsupportedOperationException("Unknown uri: " + uri); } 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 2175b9af9..fd5feef87 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java @@ -18,6 +18,11 @@ package org.sufficientlysecure.keychain.ui; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -38,6 +43,8 @@ import android.widget.ImageView; import android.widget.TextView; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.keyimport.ParcelableHkpKeyserver; +import org.sufficientlysecure.keychain.provider.KeyWritableRepository; import org.sufficientlysecure.keychain.ui.dialog.AddEditKeyserverDialogFragment; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; @@ -45,20 +52,20 @@ import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperAdapt import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperDragCallback; import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperViewHolder; import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener; -import org.sufficientlysecure.keychain.keyimport.ParcelableHkpKeyserver; import org.sufficientlysecure.keychain.util.Preferences; -import java.util.ArrayList; -import java.util.Collections; public class SettingsKeyserverFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener { private static final String ARG_KEYSERVER_ARRAY = "arg_keyserver_array"; private ItemTouchHelper mItemTouchHelper; - private ArrayList mKeyservers; + private ArrayList mKeyserversMutable; + private List mKeyservers; private KeyserverListAdapter mAdapter; + private KeyWritableRepository databaseReadWriteInteractor; + public static SettingsKeyserverFragment newInstance(ArrayList keyservers) { Bundle args = new Bundle(); args.putParcelableArrayList(ARG_KEYSERVER_ARRAY, keyservers); @@ -72,6 +79,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + databaseReadWriteInteractor = KeyWritableRepository.createDatabaseReadWriteInteractor(getContext()); return inflater.inflate(R.layout.settings_keyserver_fragment, null); } @@ -80,9 +88,10 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mKeyservers = getArguments().getParcelableArrayList(ARG_KEYSERVER_ARRAY); + mKeyserversMutable = getArguments().getParcelableArrayList(ARG_KEYSERVER_ARRAY); + mKeyservers = Collections.unmodifiableList(new ArrayList<>(mKeyserversMutable)); - mAdapter = new KeyserverListAdapter(mKeyservers); + mAdapter = new KeyserverListAdapter(mKeyserversMutable); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.keyserver_recycler_view); // recyclerView.setHasFixedSize(true); // the size of the first item changes @@ -143,7 +152,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC if (deleted) { Notify.create(getActivity(), getActivity().getString( - R.string.keyserver_preference_deleted, mKeyservers.get(position)), + R.string.keyserver_preference_deleted, mKeyserversMutable.get(position)), Notify.Style.OK) .show(); deleteKeyserver(position); @@ -187,27 +196,27 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC } private void addKeyserver(ParcelableHkpKeyserver keyserver) { - mKeyservers.add(keyserver); - mAdapter.notifyItemInserted(mKeyservers.size() - 1); + mKeyserversMutable.add(keyserver); + mAdapter.notifyItemInserted(mKeyserversMutable.size() - 1); saveKeyserverList(); } private void editKeyserver(ParcelableHkpKeyserver newKeyserver, int position) { - mKeyservers.set(position, newKeyserver); + mKeyserversMutable.set(position, newKeyserver); mAdapter.notifyItemChanged(position); saveKeyserverList(); } private void deleteKeyserver(int position) { - if (mKeyservers.size() == 1) { + if (mKeyserversMutable.size() == 1) { Notify.create(getActivity(), R.string.keyserver_preference_cannot_delete_last, Notify.Style.ERROR).show(); return; } - mKeyservers.remove(position); + mKeyserversMutable.remove(position); // we use this mAdapter.notifyItemRemoved(position); - if (position == 0 && mKeyservers.size() > 0) { + if (position == 0 && mKeyserversMutable.size() > 0) { // if we deleted the first item, we need the adapter to redraw the new first item mAdapter.notifyItemChanged(0); } @@ -215,13 +224,20 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC } private void saveKeyserverList() { - Preferences.getPreferences(getActivity()).setKeyServers(mKeyservers); + if (mKeyserversMutable.equals(mKeyservers)) { + return; + } + + Preferences.getPreferences(getActivity()).setKeyServers(mKeyserversMutable); + mKeyservers = Collections.unmodifiableList(new ArrayList<>(mKeyserversMutable)); + + databaseReadWriteInteractor.resetAllLastUpdatedTimes(); } @Override public void onItemClick(View view, int position) { startEditKeyserverDialog(AddEditKeyserverDialogFragment.DialogAction.EDIT, - mKeyservers.get(position), position); + mKeyserversMutable.get(position), position); } public class KeyserverListAdapter extends RecyclerView.Adapter