preserve state in KeySpinner, and some lint fixes

This commit is contained in:
Vincent Breitmoser 2015-05-27 22:07:34 +02:00
parent 8f3e0a9110
commit 7c20c8df93
5 changed files with 48 additions and 22 deletions

View File

@ -58,7 +58,7 @@ public class AccountSettingsFragment extends Fragment {
this.mAccSettings = accountSettings;
mAccNameView.setText(accountSettings.getAccountName());
mSelectKeySpinner.setSelectedKeyId(accountSettings.getKeyId());
mSelectKeySpinner.setPreSelectedKeyId(accountSettings.getKeyId());
}
/**
@ -107,7 +107,7 @@ public class AccountSettingsFragment extends Fragment {
if (resultCode == Activity.RESULT_OK) {
if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
EditKeyResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
mSelectKeySpinner.setSelectedKeyId(result.mMasterKeyId);
mSelectKeySpinner.setPreSelectedKeyId(result.mMasterKeyId);
} else {
Log.e(Constants.TAG, "missing result!");
}

View File

@ -60,7 +60,6 @@ import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.widget.CertifyKeySpinner;
import org.sufficientlysecure.keychain.ui.widget.KeySpinner;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
@ -113,7 +112,7 @@ public class CertifyKeyFragment extends CryptoOperationFragment
try {
CachedPublicKeyRing key = (new ProviderHelper(getActivity())).getCachedPublicKeyRing(certifyKeyId);
if (key.canCertify()) {
mCertifyKeySpinner.setSelectedKeyId(certifyKeyId);
mCertifyKeySpinner.setPreSelectedKeyId(certifyKeyId);
}
} catch (PgpKeyNotFoundException e) {
Log.e(Constants.TAG, "certify certify check failed", e);

View File

@ -84,12 +84,17 @@ public class EncryptModeAsymmetricFragment extends EncryptModeFragment {
super.onActivityCreated(savedInstanceState);
mProviderHelper = new ProviderHelper(getActivity());
// preselect keys given
long signatureKeyId = getArguments().getLong(ARG_SINGATURE_KEY_ID);
long[] encryptionKeyIds = getArguments().getLongArray(ARG_ENCRYPTION_KEY_IDS);
// preselect keys given, from state or arguments
long signatureKeyId, encryptionKeyIds[];
if (savedInstanceState == null) {
signatureKeyId = getArguments().getLong(ARG_SINGATURE_KEY_ID);
encryptionKeyIds = getArguments().getLongArray(ARG_ENCRYPTION_KEY_IDS);
preselectKeys(signatureKeyId, encryptionKeyIds);
}
}
/**
* If an Intent gives a signatureMasterKeyId and/or encryptionMasterKeyIds, preselect those!
*/
@ -99,7 +104,7 @@ public class EncryptModeAsymmetricFragment extends EncryptModeFragment {
CachedPublicKeyRing keyring = mProviderHelper.getCachedPublicKeyRing(
KeyRings.buildUnifiedKeyRingUri(signatureKeyId));
if (keyring.hasAnySecret()) {
mSignKeySpinner.setSelectedKeyId(signatureKeyId);
mSignKeySpinner.setPreSelectedKeyId(signatureKeyId);
}
} catch (PgpKeyNotFoundException e) {
Log.e(Constants.TAG, "key not found!", e);

View File

@ -98,7 +98,7 @@ public class CertifyKeySpinner extends KeySpinner {
// - there are actually keys (not just "none" entry)
// Then:
// - select key that is capable of certifying, but only if there is only one key capable of it
if (mSelectedKeyId == Constants.key.none && mAdapter.getCount() > 1) {
if (mPreSelectedKeyId == Constants.key.none && mAdapter.getCount() > 1) {
// preselect if key can certify
int selection = -1;
while (data.moveToNext()) {

View File

@ -17,6 +17,7 @@
package org.sufficientlysecure.keychain.ui.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
@ -52,13 +53,13 @@ public abstract class KeySpinner extends AppCompatSpinner implements
LoaderManager.LoaderCallbacks<Cursor> {
public static final String ARG_SUPER_STATE = "super_state";
public static final String ARG_SELECTED_KEY_ID = "select_key_id";
public static final String ARG_KEY_ID = "key_id";
public interface OnKeyChangedListener {
void onKeyChanged(long masterKeyId);
}
protected long mSelectedKeyId = Constants.key.none;
protected long mPreSelectedKeyId = Constants.key.none;
protected SelectKeyAdapter mAdapter = new SelectKeyAdapter();
protected OnKeyChangedListener mListener;
@ -85,17 +86,15 @@ public abstract class KeySpinner extends AppCompatSpinner implements
super.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mSelectedKeyId = id;
if (mListener != null) {
mListener.onKeyChanged(mSelectedKeyId);
mListener.onKeyChanged(id);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
mSelectedKeyId = Constants.key.none;
if (mListener != null) {
mListener.onKeyChanged(mSelectedKeyId);
mListener.onKeyChanged(Constants.key.none);
}
}
});
@ -139,11 +138,11 @@ public abstract class KeySpinner extends AppCompatSpinner implements
}
public long getSelectedKeyId() {
return mSelectedKeyId;
return getSelectedItemId();
}
public void setSelectedKeyId(long selectedKeyId) {
mSelectedKeyId = selectedKeyId;
public void setPreSelectedKeyId(long selectedKeyId) {
mPreSelectedKeyId = selectedKeyId;
}
protected class SelectKeyAdapter extends BaseAdapter implements SpinnerAdapter {
@ -232,10 +231,10 @@ public abstract class KeySpinner extends AppCompatSpinner implements
mIndexMasterKeyId = newCursor.getColumnIndex(KeychainContract.KeyRings.MASTER_KEY_ID);
mIndexCreationDate = newCursor.getColumnIndex(KeychainContract.KeyRings.CREATION);
// pre-select key if mSelectedKeyId is given
if (mSelectedKeyId != Constants.key.none && newCursor.moveToFirst()) {
// pre-select key if mPreSelectedKeyId is given
if (mPreSelectedKeyId != Constants.key.none && newCursor.moveToFirst()) {
do {
if (newCursor.getLong(mIndexMasterKeyId) == mSelectedKeyId) {
if (newCursor.getLong(mIndexMasterKeyId) == mPreSelectedKeyId) {
setSelection(newCursor.getPosition() + 1);
}
} while (newCursor.moveToNext());
@ -260,6 +259,7 @@ public abstract class KeySpinner extends AppCompatSpinner implements
return inner.getItemId(position - 1);
}
@SuppressLint("ViewHolder") // inflate call is for the preview only
@Override
public View getView(int position, View convertView, ViewGroup parent) {
try {
@ -304,4 +304,26 @@ public abstract class KeySpinner extends AppCompatSpinner implements
return true;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
Bundle bundle = (Bundle) state;
mPreSelectedKeyId = bundle.getLong(ARG_KEY_ID);
// restore super state
super.onRestoreInstanceState(bundle.getParcelable(ARG_SUPER_STATE));
}
@NonNull
@Override
public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
// save super state
bundle.putParcelable(ARG_SUPER_STATE, super.onSaveInstanceState());
bundle.putLong(ARG_KEY_ID, getSelectedKeyId());
return bundle;
}
}