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(); 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 * 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); 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); buildDefaultApiAppsSelection(uri, selection), selectionArgs);
break; 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: { default: {
throw new UnsupportedOperationException("Unknown uri: " + uri); throw new UnsupportedOperationException("Unknown uri: " + uri);
} }

View File

@@ -18,6 +18,11 @@
package org.sufficientlysecure.keychain.ui; package org.sufficientlysecure.keychain.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
@@ -38,6 +43,8 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.sufficientlysecure.keychain.R; 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.dialog.AddEditKeyserverDialogFragment;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify; 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.ItemTouchHelperDragCallback;
import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperViewHolder; import org.sufficientlysecure.keychain.ui.util.recyclerview.ItemTouchHelperViewHolder;
import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener; import org.sufficientlysecure.keychain.ui.util.recyclerview.RecyclerItemClickListener;
import org.sufficientlysecure.keychain.keyimport.ParcelableHkpKeyserver;
import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.Preferences;
import java.util.ArrayList;
import java.util.Collections;
public class SettingsKeyserverFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener { public class SettingsKeyserverFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener {
private static final String ARG_KEYSERVER_ARRAY = "arg_keyserver_array"; private static final String ARG_KEYSERVER_ARRAY = "arg_keyserver_array";
private ItemTouchHelper mItemTouchHelper; private ItemTouchHelper mItemTouchHelper;
private ArrayList<ParcelableHkpKeyserver> mKeyservers; private ArrayList<ParcelableHkpKeyserver> mKeyserversMutable;
private List<ParcelableHkpKeyserver> mKeyservers;
private KeyserverListAdapter mAdapter; private KeyserverListAdapter mAdapter;
private KeyWritableRepository databaseReadWriteInteractor;
public static SettingsKeyserverFragment newInstance(ArrayList<ParcelableHkpKeyserver> keyservers) { public static SettingsKeyserverFragment newInstance(ArrayList<ParcelableHkpKeyserver> keyservers) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putParcelableArrayList(ARG_KEYSERVER_ARRAY, keyservers); args.putParcelableArrayList(ARG_KEYSERVER_ARRAY, keyservers);
@@ -72,6 +79,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) { savedInstanceState) {
databaseReadWriteInteractor = KeyWritableRepository.createDatabaseReadWriteInteractor(getContext());
return inflater.inflate(R.layout.settings_keyserver_fragment, null); 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) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, 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 recyclerView = (RecyclerView) view.findViewById(R.id.keyserver_recycler_view);
// recyclerView.setHasFixedSize(true); // the size of the first item changes // recyclerView.setHasFixedSize(true); // the size of the first item changes
@@ -143,7 +152,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC
if (deleted) { if (deleted) {
Notify.create(getActivity(), Notify.create(getActivity(),
getActivity().getString( getActivity().getString(
R.string.keyserver_preference_deleted, mKeyservers.get(position)), R.string.keyserver_preference_deleted, mKeyserversMutable.get(position)),
Notify.Style.OK) Notify.Style.OK)
.show(); .show();
deleteKeyserver(position); deleteKeyserver(position);
@@ -187,27 +196,27 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC
} }
private void addKeyserver(ParcelableHkpKeyserver keyserver) { private void addKeyserver(ParcelableHkpKeyserver keyserver) {
mKeyservers.add(keyserver); mKeyserversMutable.add(keyserver);
mAdapter.notifyItemInserted(mKeyservers.size() - 1); mAdapter.notifyItemInserted(mKeyserversMutable.size() - 1);
saveKeyserverList(); saveKeyserverList();
} }
private void editKeyserver(ParcelableHkpKeyserver newKeyserver, int position) { private void editKeyserver(ParcelableHkpKeyserver newKeyserver, int position) {
mKeyservers.set(position, newKeyserver); mKeyserversMutable.set(position, newKeyserver);
mAdapter.notifyItemChanged(position); mAdapter.notifyItemChanged(position);
saveKeyserverList(); saveKeyserverList();
} }
private void deleteKeyserver(int position) { private void deleteKeyserver(int position) {
if (mKeyservers.size() == 1) { if (mKeyserversMutable.size() == 1) {
Notify.create(getActivity(), R.string.keyserver_preference_cannot_delete_last, Notify.create(getActivity(), R.string.keyserver_preference_cannot_delete_last,
Notify.Style.ERROR).show(); Notify.Style.ERROR).show();
return; return;
} }
mKeyservers.remove(position); mKeyserversMutable.remove(position);
// we use this // we use this
mAdapter.notifyItemRemoved(position); 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 // if we deleted the first item, we need the adapter to redraw the new first item
mAdapter.notifyItemChanged(0); mAdapter.notifyItemChanged(0);
} }
@@ -215,13 +224,20 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC
} }
private void saveKeyserverList() { 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 @Override
public void onItemClick(View view, int position) { public void onItemClick(View view, int position) {
startEditKeyserverDialog(AddEditKeyserverDialogFragment.DialogAction.EDIT, startEditKeyserverDialog(AddEditKeyserverDialogFragment.DialogAction.EDIT,
mKeyservers.get(position), position); mKeyserversMutable.get(position), position);
} }
public class KeyserverListAdapter extends RecyclerView.Adapter<KeyserverListAdapter.ViewHolder> public class KeyserverListAdapter extends RecyclerView.Adapter<KeyserverListAdapter.ViewHolder>