ImportKeys: Refactoring
This commit is contained in:
parent
9f7320b857
commit
5e93b68b6e
|
@ -1,4 +0,0 @@
|
|||
package org.sufficientlysecure.keychain.keyimport.loader;
|
||||
|
||||
public interface LoaderState {
|
||||
}
|
|
@ -15,7 +15,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.keyimport.loader;
|
||||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.sufficientlysecure.keychain.keyimport.loader;
|
||||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
import android.net.Uri;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.sufficientlysecure.keychain.keyimport.loader;
|
||||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
import org.sufficientlysecure.keychain.util.Preferences;
|
||||
|
|
@ -15,7 +15,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.keyimport.loader;
|
||||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.annotation.Nullable;
|
|
@ -15,7 +15,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.keyimport.loader;
|
||||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
|
||||
import java.io.BufferedInputStream;
|
|
@ -0,0 +1,11 @@
|
|||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
|
||||
public interface ImportKeysListener {
|
||||
|
||||
void loadKeys(LoaderState loaderState);
|
||||
void importKeys();
|
||||
void handleResult(ImportKeyResult result);
|
||||
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
|
||||
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ImportKeysOperationCallback implements
|
||||
CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
|
||||
|
||||
private ImportKeysListener mResultListener;
|
||||
private String mKeyserver;
|
||||
private ArrayList<ParcelableKeyRing> mKeyList;
|
||||
|
||||
public ImportKeysOperationCallback(
|
||||
ImportKeysListener resultListener,
|
||||
String keyserver,
|
||||
ArrayList<ParcelableKeyRing> keyList
|
||||
) {
|
||||
this.mResultListener = resultListener;
|
||||
this.mKeyserver = keyserver;
|
||||
this.mKeyList = keyList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImportKeyringParcel createOperationInput() {
|
||||
return new ImportKeyringParcel(mKeyList, mKeyserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCryptoOperationSuccess(ImportKeyResult result) {
|
||||
mResultListener.handleResult(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCryptoOperationCancelled() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCryptoOperationError(ImportKeyResult result) {
|
||||
mResultListener.handleResult(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCryptoSetProgress(String msg, int progress, int max) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
package org.sufficientlysecure.keychain.keyimport.processing;
|
||||
|
||||
public interface LoaderState {
|
||||
}
|
|
@ -21,9 +21,7 @@ import android.content.Intent;
|
|||
import android.os.Bundle;
|
||||
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.remote.CryptoInputParcelCacheService;
|
||||
import org.sufficientlysecure.keychain.ui.ImportKeysActivity;
|
||||
import org.sufficientlysecure.keychain.ui.SecurityTokenOperationActivity;
|
||||
|
||||
public class RemoteImportKeysActivity extends ImportKeysActivity {
|
||||
|
||||
|
@ -39,7 +37,7 @@ public class RemoteImportKeysActivity extends ImportKeysActivity {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void handleResult(ImportKeyResult result) {
|
||||
public void handleResult(ImportKeyResult result) {
|
||||
setResult(RESULT_OK, mPendingIntentData);
|
||||
finish();
|
||||
}
|
||||
|
|
|
@ -18,10 +18,6 @@
|
|||
package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
@ -36,6 +32,7 @@ import android.widget.TextView;
|
|||
import org.bouncycastle.util.encoders.Hex;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
|
||||
|
@ -44,10 +41,13 @@ import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
|
|||
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
|
||||
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.SecurityTokenListenerFragment;
|
||||
import org.sufficientlysecure.keychain.ui.base.QueueingCryptoOperationFragment;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
import org.sufficientlysecure.keychain.util.Preferences;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
public class CreateSecurityTokenImportResetFragment
|
||||
extends QueueingCryptoOperationFragment<ImportKeyringParcel, ImportKeyResult>
|
||||
|
@ -211,7 +211,7 @@ public class CreateSecurityTokenImportResetFragment
|
|||
}
|
||||
|
||||
public void refreshSearch() {
|
||||
mListFragment.loadNew(new CloudLoaderState("0x" + mTokenFingerprint,
|
||||
mListFragment.loadState(new CloudLoaderState("0x" + mTokenFingerprint,
|
||||
Preferences.getPreferences(getActivity()).getCloudSearchPrefs()));
|
||||
}
|
||||
|
||||
|
|
|
@ -33,26 +33,26 @@ import org.sufficientlysecure.keychain.intents.OpenKeychainIntents;
|
|||
import org.sufficientlysecure.keychain.keyimport.FacebookKeyserver;
|
||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.BytesLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysOperationCallback;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.LoaderState;
|
||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
|
||||
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
|
||||
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.BytesLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.LoaderState;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
import org.sufficientlysecure.keychain.ui.util.Notify;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
import org.sufficientlysecure.keychain.util.ParcelableFileCache;
|
||||
import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
|
||||
import org.sufficientlysecure.keychain.util.Preferences;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ImportKeysActivity extends BaseActivity
|
||||
implements CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
|
||||
public class ImportKeysActivity extends BaseActivity implements ImportKeysListener {
|
||||
|
||||
public static final String ACTION_IMPORT_KEY = OpenKeychainIntents.IMPORT_KEY;
|
||||
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER = OpenKeychainIntents.IMPORT_KEY_FROM_KEYSERVER;
|
||||
|
@ -81,14 +81,10 @@ public class ImportKeysActivity extends BaseActivity
|
|||
public static final String TAG_FRAG_LIST = "frag_list";
|
||||
public static final String TAG_FRAG_TOP = "frag_top";
|
||||
|
||||
// for CryptoOperationHelper.Callback
|
||||
private String mKeyserver;
|
||||
private ArrayList<ParcelableKeyRing> mKeyList;
|
||||
private boolean mFreshIntent;
|
||||
|
||||
private CryptoOperationHelper<ImportKeyringParcel, ImportKeyResult> mOperationHelper;
|
||||
|
||||
private boolean mFreshIntent;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
@ -322,72 +318,6 @@ public class ImportKeysActivity extends BaseActivity
|
|||
}
|
||||
}
|
||||
|
||||
public void loadCallback(LoaderState loaderState) {
|
||||
FragmentManager fragMan = getSupportFragmentManager();
|
||||
ImportKeysListFragment keyListFragment = (ImportKeysListFragment) fragMan.findFragmentByTag(TAG_FRAG_LIST);
|
||||
keyListFragment.loadNew(loaderState);
|
||||
}
|
||||
|
||||
public void importAllKeys() {
|
||||
FragmentManager fragMan = getSupportFragmentManager();
|
||||
ImportKeysListFragment keyListFragment = (ImportKeysListFragment) fragMan.findFragmentByTag(TAG_FRAG_LIST);
|
||||
|
||||
if (keyListFragment.getEntries().size() == 0) {
|
||||
Notify.create(this, R.string.error_nothing_import_selected, Notify.Style.ERROR)
|
||||
.show((ViewGroup) findViewById(R.id.import_snackbar));
|
||||
return;
|
||||
}
|
||||
|
||||
mOperationHelper = new CryptoOperationHelper<>(
|
||||
1, this, this, R.string.progress_importing
|
||||
);
|
||||
|
||||
LoaderState ls = keyListFragment.getLoaderState();
|
||||
if (ls instanceof BytesLoaderState) {
|
||||
Log.d(Constants.TAG, "importKeys started");
|
||||
|
||||
// get DATA from selected key entries
|
||||
IteratorWithSize<ParcelableKeyRing> entries = keyListFragment.getData();
|
||||
|
||||
// instead of giving the entries by Intent extra, cache them into a
|
||||
// file to prevent Java Binder problems on heavy imports
|
||||
// read FileImportCache for more info.
|
||||
try {
|
||||
// We parcel this iteratively into a file - anything we can
|
||||
// display here, we should be able to import.
|
||||
ParcelableFileCache<ParcelableKeyRing> cache =
|
||||
new ParcelableFileCache<>(this, "key_import.pcl");
|
||||
cache.writeCache(entries);
|
||||
} catch (IOException e) {
|
||||
Log.e(Constants.TAG, "Problem writing cache file", e);
|
||||
Notify.create(this, "Problem writing cache file!", Notify.Style.ERROR)
|
||||
.show((ViewGroup) findViewById(R.id.import_snackbar));
|
||||
return;
|
||||
}
|
||||
|
||||
mKeyList = null;
|
||||
mKeyserver = null;
|
||||
} else if (ls instanceof CloudLoaderState) {
|
||||
CloudLoaderState sls = (CloudLoaderState) ls;
|
||||
|
||||
// get selected key entries
|
||||
ArrayList<ParcelableKeyRing> keys = new ArrayList<>();
|
||||
{
|
||||
// change the format into ParcelableKeyRing
|
||||
List<ImportKeysListEntry> entries = keyListFragment.getEntries();
|
||||
for (ImportKeysListEntry entry : entries) {
|
||||
keys.add(new ParcelableKeyRing(entry.getFingerprintHex(),
|
||||
entry.getKeyIdHex(), entry.getKeybaseName(), entry.getFbUsername()));
|
||||
}
|
||||
}
|
||||
|
||||
mKeyList = keys;
|
||||
mKeyserver = sls.mCloudPrefs.keyserver;
|
||||
}
|
||||
|
||||
mOperationHelper.cryptoOperation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (mOperationHelper != null &&
|
||||
|
@ -397,18 +327,81 @@ public class ImportKeysActivity extends BaseActivity
|
|||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines how the result of this activity is returned.
|
||||
* Is overwritten in RemoteImportKeysActivity
|
||||
*/
|
||||
protected void handleResult(ImportKeyResult result) {
|
||||
@Override
|
||||
public void loadKeys(LoaderState loaderState) {
|
||||
FragmentManager fM = getSupportFragmentManager();
|
||||
ImportKeysListFragment listFragment = (ImportKeysListFragment) fM.findFragmentByTag(TAG_FRAG_LIST);
|
||||
|
||||
listFragment.loadState(loaderState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void importKeys() {
|
||||
FragmentManager fM = getSupportFragmentManager();
|
||||
ImportKeysListFragment listFragment = (ImportKeysListFragment) fM.findFragmentByTag(TAG_FRAG_LIST);
|
||||
|
||||
if (listFragment.getEntries().size() == 0) {
|
||||
Notify.create(this, R.string.error_nothing_import_selected, Notify.Style.ERROR).show();
|
||||
return;
|
||||
}
|
||||
|
||||
String keyserver = null;
|
||||
ArrayList<ParcelableKeyRing> keyList = null;
|
||||
LoaderState loaderState = listFragment.getState();
|
||||
|
||||
Log.d(Constants.TAG, "importKeys started");
|
||||
if (loaderState instanceof BytesLoaderState) {
|
||||
// get DATA from selected key entries
|
||||
ParcelableFileCache.IteratorWithSize<ParcelableKeyRing> entries = listFragment.getData();
|
||||
|
||||
// instead of giving the entries by Intent extra, cache them into a
|
||||
// file to prevent Java Binder problems on heavy imports
|
||||
// read FileImportCache for more info.
|
||||
try {
|
||||
// We parcel this iteratively into a file - anything we can
|
||||
// display here, we should be able to import.
|
||||
ParcelableFileCache<ParcelableKeyRing> cache = new ParcelableFileCache<>(this, "key_import.pcl");
|
||||
cache.writeCache(entries);
|
||||
} catch (IOException e) {
|
||||
Log.e(Constants.TAG, "Problem writing cache file", e);
|
||||
Notify.create(this, "Problem writing cache file!", Notify.Style.ERROR).show();
|
||||
return;
|
||||
}
|
||||
|
||||
keyList = null;
|
||||
keyserver = null;
|
||||
} else if (loaderState instanceof CloudLoaderState) {
|
||||
CloudLoaderState sls = (CloudLoaderState) loaderState;
|
||||
|
||||
// get selected key entries
|
||||
ArrayList<ParcelableKeyRing> keys = new ArrayList<>();
|
||||
|
||||
// change the format into ParcelableKeyRing
|
||||
List<ImportKeysListEntry> entries = listFragment.getEntries();
|
||||
for (ImportKeysListEntry entry : entries) {
|
||||
keys.add(new ParcelableKeyRing(entry.getFingerprintHex(),
|
||||
entry.getKeyIdHex(), entry.getKeybaseName(), entry.getFbUsername()));
|
||||
}
|
||||
|
||||
keyList = keys;
|
||||
keyserver = sls.mCloudPrefs.keyserver;
|
||||
}
|
||||
|
||||
ImportKeysOperationCallback callback = new ImportKeysOperationCallback(this, keyserver, keyList);
|
||||
mOperationHelper = new CryptoOperationHelper(1, this, callback, R.string.progress_importing);
|
||||
|
||||
mOperationHelper.cryptoOperation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleResult(ImportKeyResult result) {
|
||||
String intentAction = getIntent().getAction();
|
||||
|
||||
if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(intentAction)
|
||||
|| ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(intentAction)) {
|
||||
if (ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(intentAction)
|
||||
|| ImportKeysActivity.ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(intentAction)) {
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra(ImportKeyResult.EXTRA_RESULT, result);
|
||||
setResult(RESULT_OK, intent);
|
||||
setResult(Activity.RESULT_OK, intent);
|
||||
finish();
|
||||
} else if (result.isOkNew() || result.isOkUpdated()) {
|
||||
// User has successfully imported a key, hide first time dialog
|
||||
|
@ -419,35 +412,8 @@ public class ImportKeysActivity extends BaseActivity
|
|||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||
startActivity(intent);
|
||||
} else {
|
||||
result.createNotify(ImportKeysActivity.this)
|
||||
.show((ViewGroup) findViewById(R.id.import_snackbar));
|
||||
result.createNotify(this).show();
|
||||
}
|
||||
}
|
||||
|
||||
// methods from CryptoOperationHelper.Callback
|
||||
|
||||
@Override
|
||||
public ImportKeyringParcel createOperationInput() {
|
||||
return new ImportKeyringParcel(mKeyList, mKeyserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCryptoOperationSuccess(ImportKeyResult result) {
|
||||
handleResult(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCryptoOperationCancelled() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCryptoOperationError(ImportKeyResult result) {
|
||||
handleResult(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCryptoSetProgress(String msg, int progress, int max) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,8 @@ import android.widget.TextView;
|
|||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.util.ContactHelper;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
import org.sufficientlysecure.keychain.util.Preferences;
|
||||
|
@ -50,11 +51,13 @@ import java.util.List;
|
|||
* Consists of the search bar, search button, and search settings button
|
||||
*/
|
||||
public class ImportKeysCloudFragment extends Fragment {
|
||||
|
||||
public static final String ARG_QUERY = "query";
|
||||
public static final String ARG_DISABLE_QUERY_EDIT = "disable_query_edit";
|
||||
public static final String ARG_CLOUD_SEARCH_PREFS = "cloud_search_prefs";
|
||||
|
||||
private ImportKeysActivity mImportActivity;
|
||||
private Activity mActivity;
|
||||
private ImportKeysListener mCallback;
|
||||
|
||||
private AutoCompleteTextView mQueryEditText;
|
||||
|
||||
|
@ -154,7 +157,14 @@ public class ImportKeysCloudFragment extends Fragment {
|
|||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) activity;
|
||||
mActivity = activity;
|
||||
|
||||
try {
|
||||
mCallback = (ImportKeysListener) activity;
|
||||
} catch (ClassCastException e) {
|
||||
throw new ClassCastException(activity.toString()
|
||||
+ " must implement ImportKeysListener");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -167,7 +177,7 @@ public class ImportKeysCloudFragment extends Fragment {
|
|||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.import_cloud_settings:
|
||||
Intent intent = new Intent(mImportActivity, SettingsActivity.class);
|
||||
Intent intent = new Intent(mActivity, SettingsActivity.class);
|
||||
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, SettingsActivity.CloudSearchPrefsFragment.class.getName());
|
||||
startActivity(intent);
|
||||
return true;
|
||||
|
@ -185,7 +195,7 @@ public class ImportKeysCloudFragment extends Fragment {
|
|||
cloudSearchPrefs = Preferences.getPreferences(getActivity()).getCloudSearchPrefs();
|
||||
}
|
||||
|
||||
mImportActivity.loadCallback(new CloudLoaderState(query, cloudSearchPrefs));
|
||||
mCallback.loadKeys(new CloudLoaderState(query, cloudSearchPrefs));
|
||||
toggleKeyboard(false);
|
||||
}
|
||||
|
||||
|
|
|
@ -39,8 +39,9 @@ import android.widget.Toast;
|
|||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.BytesLoaderState;
|
||||
import org.sufficientlysecure.keychain.pgp.PgpHelper;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.BytesLoaderState;
|
||||
import org.sufficientlysecure.keychain.ui.util.Notify;
|
||||
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
|
||||
import org.sufficientlysecure.keychain.util.FileHelper;
|
||||
|
@ -49,7 +50,10 @@ import org.sufficientlysecure.keychain.util.Log;
|
|||
import java.io.IOException;
|
||||
|
||||
public class ImportKeysFileFragment extends Fragment {
|
||||
private ImportKeysActivity mImportActivity;
|
||||
|
||||
private Activity mActivity;
|
||||
private ImportKeysListener mCallback;
|
||||
|
||||
private View mBrowse;
|
||||
private View mClipboardButton;
|
||||
|
||||
|
@ -78,7 +82,6 @@ public class ImportKeysFileFragment extends Fragment {
|
|||
View view = inflater.inflate(R.layout.import_keys_file_fragment, container, false);
|
||||
|
||||
mBrowse = view.findViewById(R.id.import_keys_file_browse);
|
||||
|
||||
mBrowse.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
// open .asc or .gpg files
|
||||
|
@ -100,10 +103,10 @@ public class ImportKeysFileFragment extends Fragment {
|
|||
sendText = clipboardText.toString();
|
||||
sendText = PgpHelper.getPgpKeyContent(sendText);
|
||||
if (sendText == null) {
|
||||
Notify.create(mImportActivity, R.string.error_bad_data, Style.ERROR).show();
|
||||
Notify.create(mActivity, R.string.error_bad_data, Style.ERROR).show();
|
||||
return;
|
||||
}
|
||||
mImportActivity.loadCallback(new BytesLoaderState(sendText.getBytes(), null));
|
||||
mCallback.loadKeys(new BytesLoaderState(sendText.getBytes(), null));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -117,7 +120,14 @@ public class ImportKeysFileFragment extends Fragment {
|
|||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) activity;
|
||||
mActivity = activity;
|
||||
|
||||
try {
|
||||
mCallback = (ImportKeysListener) activity;
|
||||
} catch (ClassCastException e) {
|
||||
throw new ClassCastException(activity.toString()
|
||||
+ " must implement ImportKeysListener");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -130,7 +140,7 @@ public class ImportKeysFileFragment extends Fragment {
|
|||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.import_all_keys:
|
||||
mImportActivity.importAllKeys();
|
||||
mCallback.importKeys();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -161,30 +171,30 @@ public class ImportKeysFileFragment extends Fragment {
|
|||
private void startImportingKeys() {
|
||||
boolean isEncrypted;
|
||||
try {
|
||||
isEncrypted = FileHelper.isEncryptedFile(mImportActivity, mCurrentUri);
|
||||
isEncrypted = FileHelper.isEncryptedFile(mActivity, mCurrentUri);
|
||||
} catch (IOException e) {
|
||||
Log.e(Constants.TAG, "Error opening file", e);
|
||||
|
||||
Notify.create(mImportActivity, R.string.error_bad_data, Style.ERROR).show();
|
||||
Notify.create(mActivity, R.string.error_bad_data, Style.ERROR).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if (isEncrypted) {
|
||||
Intent intent = new Intent(mImportActivity, DecryptActivity.class);
|
||||
Intent intent = new Intent(mActivity, DecryptActivity.class);
|
||||
intent.setAction(Intent.ACTION_VIEW);
|
||||
intent.setData(mCurrentUri);
|
||||
startActivity(intent);
|
||||
} else {
|
||||
mImportActivity.loadCallback(new BytesLoaderState(null, mCurrentUri));
|
||||
mCallback.loadKeys(new BytesLoaderState(null, mCurrentUri));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Request READ_EXTERNAL_STORAGE permission on Android >= 6.0 to read content from "file" Uris.
|
||||
* <p/>
|
||||
* <p>
|
||||
* This method returns true on Android < 6, or if permission is already granted. It
|
||||
* requests the permission and returns false otherwise.
|
||||
* <p/>
|
||||
* <p>
|
||||
* see https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html
|
||||
*/
|
||||
private boolean checkAndRequestReadPermission(final Uri uri) {
|
||||
|
@ -225,9 +235,9 @@ public class ImportKeysFileFragment extends Fragment {
|
|||
if (permissionWasGranted) {
|
||||
startImportingKeys();
|
||||
} else {
|
||||
Toast.makeText(getActivity(), R.string.error_denied_storage_permission, Toast.LENGTH_LONG).show();
|
||||
getActivity().setResult(Activity.RESULT_CANCELED);
|
||||
getActivity().finish();
|
||||
Toast.makeText(mActivity, R.string.error_denied_storage_permission, Toast.LENGTH_LONG).show();
|
||||
mActivity.setResult(Activity.RESULT_CANCELED);
|
||||
mActivity.finish();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -46,15 +46,15 @@ import org.sufficientlysecure.keychain.R;
|
|||
import org.sufficientlysecure.keychain.databinding.ImportKeysListFragmentBinding;
|
||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.AsyncTaskResultWrapper;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.BytesLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListCloudLoader;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListLoader;
|
||||
import org.sufficientlysecure.keychain.keyimport.processing.LoaderState;
|
||||
import org.sufficientlysecure.keychain.operations.results.GetKeyResult;
|
||||
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.AsyncTaskResultWrapper;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.BytesLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.CloudLoaderState;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.ImportKeysListCloudLoader;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.ImportKeysListLoader;
|
||||
import org.sufficientlysecure.keychain.keyimport.loader.LoaderState;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
|
||||
import org.sufficientlysecure.keychain.util.ParcelableProxy;
|
||||
|
@ -77,6 +77,7 @@ public class ImportKeysListFragment extends Fragment implements
|
|||
private static final int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 12;
|
||||
|
||||
private FragmentActivity mActivity;
|
||||
|
||||
private ImportKeysListFragmentBinding binding;
|
||||
private ParcelableProxy mParcelableProxy;
|
||||
|
||||
|
@ -92,16 +93,10 @@ public class ImportKeysListFragment extends Fragment implements
|
|||
|
||||
private static final int LOADER_ID_BYTES = 0;
|
||||
private static final int LOADER_ID_CLOUD = 1;
|
||||
|
||||
private LongSparseArray<ParcelableKeyRing> mCachedKeyData;
|
||||
|
||||
private boolean mShowingOrbotDialog;
|
||||
|
||||
|
||||
public LoaderState getLoaderState() {
|
||||
return mLoaderState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an Iterator (with size) of the selected data items.
|
||||
* This iterator is sort of a tradeoff, it's slightly more complex than an
|
||||
|
@ -287,7 +282,11 @@ public class ImportKeysListFragment extends Fragment implements
|
|||
}
|
||||
}
|
||||
|
||||
public void loadNew(LoaderState loaderState) {
|
||||
public LoaderState getState() {
|
||||
return mLoaderState;
|
||||
}
|
||||
|
||||
public void loadState(LoaderState loaderState) {
|
||||
mLoaderState = loaderState;
|
||||
|
||||
if (mLoaderState instanceof BytesLoaderState) {
|
||||
|
@ -301,17 +300,6 @@ public class ImportKeysListFragment extends Fragment implements
|
|||
restartLoaders();
|
||||
}
|
||||
|
||||
public void destroyLoader() {
|
||||
LoaderManager loaderManager = getLoaderManager();
|
||||
|
||||
if (loaderManager.getLoader(LOADER_ID_BYTES) != null) {
|
||||
loaderManager.destroyLoader(LOADER_ID_BYTES);
|
||||
}
|
||||
if (loaderManager.getLoader(LOADER_ID_CLOUD) != null) {
|
||||
loaderManager.destroyLoader(LOADER_ID_CLOUD);
|
||||
}
|
||||
}
|
||||
|
||||
private void restartLoaders() {
|
||||
LoaderManager loaderManager = getLoaderManager();
|
||||
|
||||
|
|
Loading…
Reference in a new issue