reset last updated and keyserver status on change of keyserver preference

This commit is contained in:
Vincent Breitmoser
2017-07-24 12:11:56 +02:00
parent ef6921210c
commit bff6b98e0b
4 changed files with 74 additions and 15 deletions

View File

@@ -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
*

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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<ParcelableHkpKeyserver> mKeyservers;
private ArrayList<ParcelableHkpKeyserver> mKeyserversMutable;
private List<ParcelableHkpKeyserver> mKeyservers;
private KeyserverListAdapter mAdapter;
private KeyWritableRepository databaseReadWriteInteractor;
public static SettingsKeyserverFragment newInstance(ArrayList<ParcelableHkpKeyserver> 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<KeyserverListAdapter.ViewHolder>