Redesign Import, still some todos and regression bugs
@@ -17,6 +17,7 @@
|
||||
|
||||
package org.sufficientlysecure.keychain.helper;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
@@ -67,4 +68,12 @@ public class OtherHelper {
|
||||
return sb;
|
||||
}
|
||||
|
||||
public static int dpToPx(Context context, int dp) {
|
||||
return (int) ((dp * context.getResources().getDisplayMetrics().density) + 0.5);
|
||||
}
|
||||
|
||||
public static int pxToDp(Context context, int px) {
|
||||
return (int) ((px / context.getResources().getDisplayMetrics().density) + 0.5);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,10 +32,14 @@ import android.os.Messenger;
|
||||
import android.os.Parcelable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentTransaction;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
|
||||
import com.github.johnpersano.supertoasts.SuperCardToast;
|
||||
@@ -45,18 +49,22 @@ import com.github.johnpersano.supertoasts.util.Style;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.helper.OtherHelper;
|
||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
|
||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
||||
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
|
||||
import org.sufficientlysecure.keychain.service.OperationResults.ImportResult;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
|
||||
import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
public class ImportKeysActivity extends ActionBarActivity implements ActionBar.OnNavigationListener {
|
||||
public class ImportKeysActivity extends ActionBarActivity {
|
||||
public static final String ACTION_IMPORT_KEY = Constants.INTENT_PREFIX + "IMPORT_KEY";
|
||||
public static final String ACTION_IMPORT_KEY_FROM_QR_CODE = Constants.INTENT_PREFIX
|
||||
+ "IMPORT_KEY_FROM_QR_CODE";
|
||||
@@ -90,23 +98,18 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
private String[] mNavigationStrings;
|
||||
private Fragment mCurrentFragment;
|
||||
private View mImportButton;
|
||||
private ViewPager mViewPager;
|
||||
private SlidingTabLayout mSlidingTabLayout;
|
||||
private PagerTabStripAdapter mTabsAdapter;
|
||||
|
||||
public static final int VIEW_PAGER_HEIGHT = 64; // dp
|
||||
|
||||
private static final Class[] NAVIGATION_CLASSES = new Class[]{
|
||||
ImportKeysServerFragment.class,
|
||||
ImportKeysFileFragment.class,
|
||||
ImportKeysQrCodeFragment.class,
|
||||
ImportKeysClipboardFragment.class,
|
||||
ImportKeysNFCFragment.class,
|
||||
ImportKeysKeybaseFragment.class
|
||||
};
|
||||
private static final int NAV_SERVER = 0;
|
||||
private static final int NAV_FILE = 1;
|
||||
private static final int NAV_QR_CODE = 2;
|
||||
private static final int NAV_CLIPBOARD = 3;
|
||||
private static final int NAV_NFC = 4;
|
||||
private static final int NAV_KEYBASE = 5;
|
||||
private static final int NAV_QR_CODE = 1;
|
||||
private static final int NAV_FILE = 2;
|
||||
private static final int NAV_KEYBASE = 3;
|
||||
|
||||
private int mCurrentNavPosition = -1;
|
||||
private int mSwitchToTab = NAV_SERVER;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -114,6 +117,9 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
|
||||
setContentView(R.layout.import_keys_activity);
|
||||
|
||||
mViewPager = (ViewPager) findViewById(R.id.import_pager);
|
||||
mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.import_sliding_tab_layout);
|
||||
|
||||
mImportButton = findViewById(R.id.import_import);
|
||||
mImportButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
@@ -127,18 +133,55 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) {
|
||||
setTitle(R.string.nav_import);
|
||||
} else {
|
||||
getSupportActionBar().setDisplayShowTitleEnabled(false);
|
||||
|
||||
// set drop down navigation
|
||||
Context context = getSupportActionBar().getThemedContext();
|
||||
ArrayAdapter<CharSequence> navigationAdapter = ArrayAdapter.createFromResource(context,
|
||||
R.array.import_action_list, android.R.layout.simple_spinner_dropdown_item);
|
||||
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
|
||||
getSupportActionBar().setListNavigationCallbacks(navigationAdapter, this);
|
||||
initTabs();
|
||||
}
|
||||
|
||||
handleActions(savedInstanceState, getIntent());
|
||||
}
|
||||
|
||||
private void initTabs() {
|
||||
mTabsAdapter = new PagerTabStripAdapter(this);
|
||||
mViewPager.setAdapter(mTabsAdapter);
|
||||
mSlidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
// resize view pager back to 64 if keyserver settings have been collapsed
|
||||
if (getViewPagerHeight() > VIEW_PAGER_HEIGHT) {
|
||||
resizeViewPager(VIEW_PAGER_HEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
}
|
||||
});
|
||||
|
||||
Bundle serverBundle = new Bundle();
|
||||
// serverBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
|
||||
mTabsAdapter.addTab(ImportKeysServerFragment.class,
|
||||
serverBundle, getString(R.string.import_tab_keyserver));
|
||||
|
||||
Bundle qrCodeBundle = new Bundle();
|
||||
// importBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
|
||||
mTabsAdapter.addTab(ImportKeysQrCodeFragment.class,
|
||||
qrCodeBundle, getString(R.string.import_tab_qr_code));
|
||||
|
||||
Bundle fileBundle = new Bundle();
|
||||
// importBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
|
||||
mTabsAdapter.addTab(ImportKeysFileFragment.class,
|
||||
fileBundle, getString(R.string.import_tab_direct));
|
||||
|
||||
Bundle keybaseBundle = new Bundle();
|
||||
// keybaseBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
|
||||
mTabsAdapter.addTab(ImportKeysKeybaseFragment.class,
|
||||
keybaseBundle, getString(R.string.import_tab_keybase));
|
||||
|
||||
// update layout after operations
|
||||
mSlidingTabLayout.setViewPager(mViewPager);
|
||||
}
|
||||
|
||||
protected void handleActions(Bundle savedInstanceState, Intent intent) {
|
||||
@@ -164,7 +207,7 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
/* Keychain's own Actions */
|
||||
|
||||
// display file fragment
|
||||
loadNavFragment(NAV_FILE, null);
|
||||
mViewPager.setCurrentItem(NAV_FILE);
|
||||
|
||||
if (dataUri != null) {
|
||||
// action: directly load data
|
||||
@@ -199,7 +242,9 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
// display keyserver fragment with query
|
||||
Bundle args = new Bundle();
|
||||
args.putString(ImportKeysServerFragment.ARG_QUERY, query);
|
||||
loadNavFragment(NAV_SERVER, args);
|
||||
// loadNavFragment(NAV_SERVER, args);
|
||||
//TODO: load afterwards!
|
||||
mSwitchToTab = NAV_SERVER;
|
||||
|
||||
// action: search immediately
|
||||
startListFragment(savedInstanceState, null, null, query);
|
||||
@@ -223,9 +268,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
return;
|
||||
}
|
||||
} else if (ACTION_IMPORT_KEY_FROM_FILE.equals(action)) {
|
||||
|
||||
// NOTE: this only displays the appropriate fragment, no actions are taken
|
||||
loadNavFragment(NAV_FILE, null);
|
||||
mSwitchToTab = NAV_FILE;
|
||||
|
||||
// no immediate actions!
|
||||
startListFragment(savedInstanceState, null, null, null);
|
||||
@@ -233,26 +277,28 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
// also exposed in AndroidManifest
|
||||
|
||||
// NOTE: this only displays the appropriate fragment, no actions are taken
|
||||
loadNavFragment(NAV_QR_CODE, null);
|
||||
mSwitchToTab = NAV_QR_CODE;
|
||||
|
||||
// no immediate actions!
|
||||
startListFragment(savedInstanceState, null, null, null);
|
||||
} else if (ACTION_IMPORT_KEY_FROM_NFC.equals(action)) {
|
||||
|
||||
// NOTE: this only displays the appropriate fragment, no actions are taken
|
||||
loadNavFragment(NAV_NFC, null);
|
||||
mSwitchToTab = NAV_QR_CODE;
|
||||
|
||||
// no immediate actions!
|
||||
startListFragment(savedInstanceState, null, null, null);
|
||||
} else if (ACTION_IMPORT_KEY_FROM_KEYBASE.equals(action)) {
|
||||
// NOTE: this only displays the appropriate fragment, no actions are taken
|
||||
loadNavFragment(NAV_KEYBASE, null);
|
||||
mSwitchToTab = NAV_KEYBASE;
|
||||
|
||||
// no immediate actions!
|
||||
startListFragment(savedInstanceState, null, null, null);
|
||||
} else {
|
||||
startListFragment(savedInstanceState, null, null, null);
|
||||
}
|
||||
|
||||
mViewPager.setCurrentItem(mSwitchToTab);
|
||||
}
|
||||
|
||||
private void startListFragment(Bundle savedInstanceState, byte[] bytes, Uri dataUri, String serverQuery) {
|
||||
@@ -275,54 +321,16 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
getSupportFragmentManager().executePendingTransactions();
|
||||
}
|
||||
|
||||
/**
|
||||
* "Basically, when using a list navigation, onNavigationItemSelected() is automatically
|
||||
* called when your activity is created/re-created, whether you like it or not. To prevent
|
||||
* your Fragment's onCreateView() from being called twice, this initial automatic call to
|
||||
* onNavigationItemSelected() should check whether the Fragment is already in existence
|
||||
* inside your Activity."
|
||||
* <p/>
|
||||
* from http://stackoverflow.com/a/14295474
|
||||
* <p/>
|
||||
* In our case, if we start ImportKeysActivity with parameters to directly search using a fingerprint,
|
||||
* the fragment would be loaded twice resulting in the query being empty after the second load.
|
||||
* <p/>
|
||||
* Our solution:
|
||||
* To prevent that a fragment will be loaded again even if it was already loaded loadNavFragment
|
||||
* checks against mCurrentNavPosition.
|
||||
*
|
||||
* @param itemPosition
|
||||
* @param itemId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
|
||||
Log.d(Constants.TAG, "onNavigationItemSelected");
|
||||
|
||||
loadNavFragment(itemPosition, null);
|
||||
|
||||
return true;
|
||||
public void resizeViewPager(int dp) {
|
||||
ViewGroup.LayoutParams params = mViewPager.getLayoutParams();
|
||||
params.height = OtherHelper.dpToPx(this, dp);
|
||||
// update layout after operations
|
||||
mSlidingTabLayout.setViewPager(mViewPager);
|
||||
}
|
||||
|
||||
private void loadNavFragment(int itemPosition, Bundle args) {
|
||||
if (mCurrentNavPosition != itemPosition) {
|
||||
if (ActionBar.NAVIGATION_MODE_LIST == getSupportActionBar().getNavigationMode()) {
|
||||
getSupportActionBar().setSelectedNavigationItem(itemPosition);
|
||||
}
|
||||
loadFragment(NAVIGATION_CLASSES[itemPosition], args, mNavigationStrings[itemPosition]);
|
||||
mCurrentNavPosition = itemPosition;
|
||||
}
|
||||
}
|
||||
|
||||
private void loadFragment(Class<?> clss, Bundle args, String tag) {
|
||||
mCurrentFragment = Fragment.instantiate(this, clss.getName(), args);
|
||||
|
||||
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
// Replace whatever is in the fragment container with this fragment
|
||||
// and give the fragment a tag name equal to the string at the position selected
|
||||
ft.replace(R.id.import_navigation_fragment, mCurrentFragment, tag);
|
||||
// Apply changes
|
||||
ft.commit();
|
||||
public int getViewPagerHeight() {
|
||||
ViewGroup.LayoutParams params = mViewPager.getLayoutParams();
|
||||
return OtherHelper.pxToDp(this, params.height);
|
||||
}
|
||||
|
||||
public void loadFromFingerprintUri(Bundle savedInstanceState, Uri dataUri) {
|
||||
@@ -349,7 +357,9 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
Bundle args = new Bundle();
|
||||
args.putString(ImportKeysServerFragment.ARG_QUERY, query);
|
||||
args.putBoolean(ImportKeysServerFragment.ARG_DISABLE_QUERY_EDIT, true);
|
||||
loadNavFragment(NAV_SERVER, args);
|
||||
// loadNavFragment(NAV_SERVER, args);
|
||||
|
||||
//TODO
|
||||
|
||||
// action: search directly
|
||||
startListFragment(savedInstanceState, null, null, query);
|
||||
@@ -437,15 +447,16 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
toast.setButtonTextColor(getResources().getColor(R.color.black));
|
||||
toast.setTextColor(getResources().getColor(R.color.black));
|
||||
toast.setOnClickWrapper(new OnClickWrapper("supercardtoast",
|
||||
new SuperToast.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view, Parcelable token) {
|
||||
Intent intent = new Intent(
|
||||
ImportKeysActivity.this, LogDisplayActivity.class);
|
||||
intent.putExtra(LogDisplayFragment.EXTRA_RESULT, result);
|
||||
startActivity(intent);
|
||||
new SuperToast.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view, Parcelable token) {
|
||||
Intent intent = new Intent(
|
||||
ImportKeysActivity.this, LogDisplayActivity.class);
|
||||
intent.putExtra(LogDisplayFragment.EXTRA_RESULT, result);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
}));
|
||||
));
|
||||
toast.show();
|
||||
|
||||
/*
|
||||
@@ -560,9 +571,12 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
|
||||
super.onResume();
|
||||
|
||||
// Check to see if the Activity started due to an Android Beam
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
|
||||
&& NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
|
||||
handleActionNdefDiscovered(getIntent());
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
|
||||
handleActionNdefDiscovered(getIntent());
|
||||
} else {
|
||||
Log.d(Constants.TAG, "NFC: No NDEF discovered!");
|
||||
}
|
||||
} else {
|
||||
Log.e(Constants.TAG, "Android Beam not supported by Android < 4.1");
|
||||
}
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013-2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class ImportKeysClipboardFragment extends Fragment {
|
||||
|
||||
private ImportKeysActivity mImportActivity;
|
||||
private BootstrapButton mButton;
|
||||
|
||||
/**
|
||||
* Creates new instance of this fragment
|
||||
*/
|
||||
public static ImportKeysClipboardFragment newInstance() {
|
||||
ImportKeysClipboardFragment frag = new ImportKeysClipboardFragment();
|
||||
|
||||
Bundle args = new Bundle();
|
||||
frag.setArguments(args);
|
||||
|
||||
return frag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inflate the layout for this fragment
|
||||
*/
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.import_keys_clipboard_fragment, container, false);
|
||||
|
||||
mButton = (BootstrapButton) view.findViewById(R.id.import_clipboard_button);
|
||||
mButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
CharSequence clipboardText = ClipboardReflection.getClipboardText(getActivity());
|
||||
String sendText = "";
|
||||
if (clipboardText != null) {
|
||||
sendText = clipboardText.toString();
|
||||
if (sendText.toLowerCase(Locale.ENGLISH).startsWith(Constants.FINGERPRINT_SCHEME)) {
|
||||
mImportActivity.loadFromFingerprintUri(null, Uri.parse(sendText));
|
||||
return;
|
||||
}
|
||||
}
|
||||
mImportActivity.loadCallback(sendText.getBytes(), null, null, null, null);
|
||||
}
|
||||
});
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) getActivity();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,21 +19,24 @@ package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
|
||||
import org.sufficientlysecure.keychain.helper.FileHelper;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class ImportKeysFileFragment extends Fragment {
|
||||
private ImportKeysActivity mImportActivity;
|
||||
private BootstrapButton mBrowse;
|
||||
private View mBrowse;
|
||||
private View mClipboardButton;
|
||||
|
||||
public static final int REQUEST_CODE_FILE = 0x00007003;
|
||||
|
||||
@@ -56,26 +59,45 @@ public class ImportKeysFileFragment extends Fragment {
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.import_keys_file_fragment, container, false);
|
||||
|
||||
mBrowse = (BootstrapButton) view.findViewById(R.id.import_keys_file_browse);
|
||||
mBrowse = view.findViewById(R.id.import_keys_file_browse);
|
||||
|
||||
mBrowse.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
// open .asc or .gpg files
|
||||
// setting it to text/plain prevents Cynaogenmod's file manager from selecting asc
|
||||
// setting it to text/plain prevents Cyanogenmod's file manager from selecting asc
|
||||
// or gpg types!
|
||||
FileHelper.openFile(ImportKeysFileFragment.this, Constants.Path.APP_DIR + "/",
|
||||
"*/*", REQUEST_CODE_FILE);
|
||||
}
|
||||
});
|
||||
|
||||
mClipboardButton = view.findViewById(R.id.import_clipboard_button);
|
||||
mClipboardButton.setOnClickListener(new View.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
CharSequence clipboardText = ClipboardReflection.getClipboardText(getActivity());
|
||||
String sendText = "";
|
||||
if (clipboardText != null) {
|
||||
sendText = clipboardText.toString();
|
||||
if (sendText.toLowerCase(Locale.ENGLISH).startsWith(Constants.FINGERPRINT_SCHEME)) {
|
||||
mImportActivity.loadFromFingerprintUri(null, Uri.parse(sendText));
|
||||
return;
|
||||
}
|
||||
}
|
||||
mImportActivity.loadCallback(sendText.getBytes(), null, null, null, null);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) getActivity();
|
||||
mImportActivity = (ImportKeysActivity) activity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
@@ -29,8 +30,6 @@ import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
|
||||
/**
|
||||
@@ -40,7 +39,7 @@ import org.sufficientlysecure.keychain.R;
|
||||
public class ImportKeysKeybaseFragment extends Fragment {
|
||||
|
||||
private ImportKeysActivity mImportActivity;
|
||||
private BootstrapButton mSearchButton;
|
||||
private View mSearchButton;
|
||||
private EditText mQueryEditText;
|
||||
|
||||
public static final String ARG_QUERY = "query";
|
||||
@@ -66,7 +65,7 @@ public class ImportKeysKeybaseFragment extends Fragment {
|
||||
|
||||
mQueryEditText = (EditText) view.findViewById(R.id.import_keybase_query);
|
||||
|
||||
mSearchButton = (BootstrapButton) view.findViewById(R.id.import_keybase_search);
|
||||
mSearchButton = view.findViewById(R.id.import_keybase_search);
|
||||
mSearchButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -101,8 +100,6 @@ public class ImportKeysKeybaseFragment extends Fragment {
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) getActivity();
|
||||
|
||||
// set displayed values
|
||||
if (getArguments() != null) {
|
||||
if (getArguments().containsKey(ARG_QUERY)) {
|
||||
@@ -112,6 +109,13 @@ public class ImportKeysKeybaseFragment extends Fragment {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) activity;
|
||||
}
|
||||
|
||||
private void search(String query) {
|
||||
mImportActivity.loadCallback(null, null, null, null, query);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
|
||||
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader;
|
||||
import org.sufficientlysecure.keychain.util.InputData;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
import org.sufficientlysecure.keychain.util.Notify;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -97,7 +98,7 @@ public class ImportKeysListFragment extends ListFragment implements
|
||||
|
||||
public ArrayList<ParcelableKeyRing> getSelectedData() {
|
||||
ArrayList<ParcelableKeyRing> result = new ArrayList<ParcelableKeyRing>();
|
||||
for(ImportKeysListEntry entry : getSelectedEntries()) {
|
||||
for (ImportKeysListEntry entry : getSelectedEntries()) {
|
||||
result.add(mCachedKeyData.get(entry.getKeyId()));
|
||||
}
|
||||
return result;
|
||||
@@ -273,17 +274,15 @@ public class ImportKeysListFragment extends ListFragment implements
|
||||
// No error
|
||||
mCachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings();
|
||||
} else if (error instanceof ImportKeysListLoader.FileHasNoContent) {
|
||||
AppMsg.makeText(getActivity(), R.string.error_import_file_no_content,
|
||||
AppMsg.STYLE_ALERT).show();
|
||||
Notify.showNotify(getActivity(), R.string.error_import_file_no_content, Notify.Style.ERROR);
|
||||
} else if (error instanceof ImportKeysListLoader.NonPgpPart) {
|
||||
AppMsg.makeText(getActivity(),
|
||||
Notify.showNotify(getActivity(),
|
||||
((ImportKeysListLoader.NonPgpPart) error).getCount() + " " + getResources().
|
||||
getQuantityString(R.plurals.error_import_non_pgp_part,
|
||||
((ImportKeysListLoader.NonPgpPart) error).getCount()),
|
||||
new AppMsg.Style(AppMsg.LENGTH_LONG, R.color.confirm)).show();
|
||||
Notify.Style.OK);
|
||||
} else {
|
||||
AppMsg.makeText(getActivity(), R.string.error_generic_report_bug,
|
||||
new AppMsg.Style(AppMsg.LENGTH_LONG, R.color.alert)).show();
|
||||
Notify.showNotify(getActivity(), R.string.error_generic_report_bug, Notify.Style.ERROR);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -292,23 +291,17 @@ public class ImportKeysListFragment extends ListFragment implements
|
||||
|
||||
// TODO: possibly fine-tune message building for these two cases
|
||||
if (error == null) {
|
||||
AppMsg.makeText(
|
||||
getActivity(), getResources().getQuantityString(R.plurals.keys_found,
|
||||
mAdapter.getCount(), mAdapter.getCount()),
|
||||
AppMsg.STYLE_INFO
|
||||
).show();
|
||||
// No error
|
||||
} else if (error instanceof Keyserver.QueryTooShortException) {
|
||||
AppMsg.makeText(getActivity(), R.string.error_keyserver_insufficient_query,
|
||||
AppMsg.STYLE_ALERT).show();
|
||||
Notify.showNotify(getActivity(), R.string.error_keyserver_insufficient_query, Notify.Style.ERROR);
|
||||
} else if (error instanceof Keyserver.TooManyResponsesException) {
|
||||
AppMsg.makeText(getActivity(), R.string.error_keyserver_too_many_responses,
|
||||
AppMsg.STYLE_ALERT).show();
|
||||
Notify.showNotify(getActivity(), R.string.error_keyserver_too_many_responses, Notify.Style.ERROR);
|
||||
} else if (error instanceof Keyserver.QueryFailedException) {
|
||||
Log.d(Constants.TAG,
|
||||
"Unrecoverable keyserver query error: " + error.getLocalizedMessage());
|
||||
String alert = getActivity().getString(R.string.error_searching_keys);
|
||||
alert = alert + " (" + error.getLocalizedMessage() + ")";
|
||||
AppMsg.makeText(getActivity(), alert, AppMsg.STYLE_ALERT).show();
|
||||
Notify.showNotify(getActivity(), alert, Notify.Style.ERROR);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2013-2014 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
|
||||
public class ImportKeysNFCFragment extends Fragment {
|
||||
|
||||
private BootstrapButton mButton;
|
||||
|
||||
/**
|
||||
* Creates new instance of this fragment
|
||||
*/
|
||||
public static ImportKeysNFCFragment newInstance() {
|
||||
ImportKeysNFCFragment frag = new ImportKeysNFCFragment();
|
||||
|
||||
Bundle args = new Bundle();
|
||||
frag.setArguments(args);
|
||||
|
||||
return frag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inflate the layout for this fragment
|
||||
*/
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.import_keys_nfc_fragment, container, false);
|
||||
|
||||
mButton = (BootstrapButton) view.findViewById(R.id.import_nfc_button);
|
||||
mButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// show nfc help
|
||||
Intent intent = new Intent(getActivity(), HelpActivity.class);
|
||||
intent.putExtra(HelpActivity.EXTRA_SELECTED_TAB, HelpActivity.TAB_NFC);
|
||||
startActivityForResult(intent, 0);
|
||||
}
|
||||
});
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,47 +17,47 @@
|
||||
|
||||
package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
import com.devspark.appmsg.AppMsg;
|
||||
import com.google.zxing.integration.android.IntentResult;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
import org.sufficientlysecure.keychain.util.Notify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
public class ImportKeysQrCodeFragment extends Fragment {
|
||||
|
||||
private ImportKeysActivity mImportActivity;
|
||||
private BootstrapButton mButton;
|
||||
private TextView mText;
|
||||
private ProgressBar mProgress;
|
||||
private View mNfcButton;
|
||||
|
||||
private String[] mScannedContent;
|
||||
private View mQrCodeButton;
|
||||
private TextView mQrCodeText;
|
||||
private ProgressBar mQrCodeProgress;
|
||||
|
||||
private String[] mQrCodeContent;
|
||||
|
||||
/**
|
||||
* Creates new instance of this fragment
|
||||
*/
|
||||
public static ImportKeysQrCodeFragment newInstance() {
|
||||
ImportKeysQrCodeFragment frag = new ImportKeysQrCodeFragment();
|
||||
public static ImportKeysFileFragment newInstance() {
|
||||
ImportKeysFileFragment frag = new ImportKeysFileFragment();
|
||||
|
||||
Bundle args = new Bundle();
|
||||
frag.setArguments(args);
|
||||
|
||||
frag.setArguments(args);
|
||||
return frag;
|
||||
}
|
||||
|
||||
@@ -68,11 +68,23 @@ public class ImportKeysQrCodeFragment extends Fragment {
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.import_keys_qr_code_fragment, container, false);
|
||||
|
||||
mButton = (BootstrapButton) view.findViewById(R.id.import_qrcode_button);
|
||||
mText = (TextView) view.findViewById(R.id.import_qrcode_text);
|
||||
mProgress = (ProgressBar) view.findViewById(R.id.import_qrcode_progress);
|
||||
mNfcButton = view.findViewById(R.id.import_nfc_button);
|
||||
mNfcButton.setOnClickListener(new View.OnClickListener() {
|
||||
|
||||
mButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// show nfc help
|
||||
Intent intent = new Intent(getActivity(), HelpActivity.class);
|
||||
intent.putExtra(HelpActivity.EXTRA_SELECTED_TAB, HelpActivity.TAB_NFC);
|
||||
startActivityForResult(intent, 0);
|
||||
}
|
||||
});
|
||||
|
||||
mQrCodeButton = view.findViewById(R.id.import_qrcode_button);
|
||||
mQrCodeText = (TextView) view.findViewById(R.id.import_qrcode_text);
|
||||
mQrCodeProgress = (ProgressBar) view.findViewById(R.id.import_qrcode_progress);
|
||||
|
||||
mQrCodeButton.setOnClickListener(new View.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -85,10 +97,10 @@ public class ImportKeysQrCodeFragment extends Fragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) getActivity();
|
||||
mImportActivity = (ImportKeysActivity) activity;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -122,8 +134,7 @@ public class ImportKeysQrCodeFragment extends Fragment {
|
||||
}
|
||||
|
||||
// fail...
|
||||
AppMsg.makeText(getActivity(), R.string.import_qr_code_wrong, AppMsg.STYLE_ALERT)
|
||||
.show();
|
||||
Notify.showNotify(getActivity(), R.string.import_qr_code_wrong, Notify.Style.ERROR);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -136,6 +147,7 @@ public class ImportKeysQrCodeFragment extends Fragment {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void importFingerprint(Uri dataUri) {
|
||||
mImportActivity.loadFromFingerprintUri(null, dataUri);
|
||||
}
|
||||
@@ -151,32 +163,31 @@ public class ImportKeysQrCodeFragment extends Fragment {
|
||||
|
||||
// first qr code -> setup
|
||||
if (counter == 0) {
|
||||
mScannedContent = new String[size];
|
||||
mProgress.setMax(size);
|
||||
mProgress.setVisibility(View.VISIBLE);
|
||||
mText.setVisibility(View.VISIBLE);
|
||||
mQrCodeContent = new String[size];
|
||||
mQrCodeProgress.setMax(size);
|
||||
mQrCodeProgress.setVisibility(View.VISIBLE);
|
||||
mQrCodeText.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
if (mScannedContent == null || counter > mScannedContent.length) {
|
||||
AppMsg.makeText(getActivity(), R.string.import_qr_code_start_with_one, AppMsg.STYLE_ALERT)
|
||||
.show();
|
||||
if (mQrCodeContent == null || counter > mQrCodeContent.length) {
|
||||
Notify.showNotify(getActivity(), R.string.import_qr_code_start_with_one, Notify.Style.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
// save scanned content
|
||||
mScannedContent[counter] = content;
|
||||
mQrCodeContent[counter] = content;
|
||||
|
||||
// get missing numbers
|
||||
ArrayList<Integer> missing = new ArrayList<Integer>();
|
||||
for (int i = 0; i < mScannedContent.length; i++) {
|
||||
if (mScannedContent[i] == null) {
|
||||
for (int i = 0; i < mQrCodeContent.length; i++) {
|
||||
if (mQrCodeContent[i] == null) {
|
||||
missing.add(i);
|
||||
}
|
||||
}
|
||||
|
||||
// update progress and text
|
||||
int alreadyScanned = mScannedContent.length - missing.size();
|
||||
mProgress.setProgress(alreadyScanned);
|
||||
int alreadyScanned = mQrCodeContent.length - missing.size();
|
||||
mQrCodeProgress.setProgress(alreadyScanned);
|
||||
|
||||
String missingString = "";
|
||||
for (int m : missing) {
|
||||
@@ -188,17 +199,16 @@ public class ImportKeysQrCodeFragment extends Fragment {
|
||||
|
||||
String missingText = getResources().getQuantityString(R.plurals.import_qr_code_missing,
|
||||
missing.size(), missingString);
|
||||
mText.setText(missingText);
|
||||
mQrCodeText.setText(missingText);
|
||||
|
||||
// finished!
|
||||
if (missing.size() == 0) {
|
||||
mText.setText(R.string.import_qr_code_finished);
|
||||
mQrCodeText.setText(R.string.import_qr_code_finished);
|
||||
String result = "";
|
||||
for (String in : mScannedContent) {
|
||||
for (String in : mQrCodeContent) {
|
||||
result += in;
|
||||
}
|
||||
mImportActivity.loadCallback(result.getBytes(), null, null, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
package org.sufficientlysecure.keychain.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
@@ -32,8 +33,6 @@ import android.widget.EditText;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.helper.Preferences;
|
||||
@@ -46,8 +45,10 @@ public class ImportKeysServerFragment extends Fragment {
|
||||
|
||||
private ImportKeysActivity mImportActivity;
|
||||
|
||||
private BootstrapButton mSearchButton;
|
||||
private View mSearchButton;
|
||||
private EditText mQueryEditText;
|
||||
private View mConfigButton;
|
||||
private View mConfigLayout;
|
||||
private Spinner mServerSpinner;
|
||||
private ArrayAdapter<String> mServerAdapter;
|
||||
|
||||
@@ -73,14 +74,17 @@ public class ImportKeysServerFragment extends Fragment {
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.import_keys_server_fragment, container, false);
|
||||
|
||||
mSearchButton = (BootstrapButton) view.findViewById(R.id.import_server_search);
|
||||
mSearchButton = view.findViewById(R.id.import_server_search);
|
||||
mQueryEditText = (EditText) view.findViewById(R.id.import_server_query);
|
||||
mConfigButton = view.findViewById(R.id.import_server_config_button);
|
||||
mConfigLayout = view.findViewById(R.id.import_server_config);
|
||||
mServerSpinner = (Spinner) view.findViewById(R.id.import_server_spinner);
|
||||
|
||||
// add keyservers to spinner
|
||||
mServerAdapter = new ArrayAdapter<String>(getActivity(),
|
||||
android.R.layout.simple_spinner_item, Preferences.getPreferences(getActivity())
|
||||
.getKeyServers());
|
||||
.getKeyServers()
|
||||
);
|
||||
mServerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
mServerSpinner.setAdapter(mServerAdapter);
|
||||
if (mServerAdapter.getCount() > 0) {
|
||||
@@ -118,6 +122,17 @@ public class ImportKeysServerFragment extends Fragment {
|
||||
}
|
||||
});
|
||||
|
||||
mConfigButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mImportActivity.getViewPagerHeight() > ImportKeysActivity.VIEW_PAGER_HEIGHT) {
|
||||
mImportActivity.resizeViewPager(ImportKeysActivity.VIEW_PAGER_HEIGHT);
|
||||
} else {
|
||||
mImportActivity.resizeViewPager(ImportKeysActivity.VIEW_PAGER_HEIGHT + 41);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@@ -125,8 +140,6 @@ public class ImportKeysServerFragment extends Fragment {
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) getActivity();
|
||||
|
||||
// set displayed values
|
||||
if (getArguments() != null) {
|
||||
if (getArguments().containsKey(ARG_QUERY)) {
|
||||
@@ -150,6 +163,13 @@ public class ImportKeysServerFragment extends Fragment {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
mImportActivity = (ImportKeysActivity) activity;
|
||||
}
|
||||
|
||||
private void search(String query, String keyServer) {
|
||||
mImportActivity.loadCallback(null, null, query, keyServer, null);
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ public class ViewKeyActivity extends ActionBarActivity implements
|
||||
Bundle shareBundle = new Bundle();
|
||||
shareBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
|
||||
mTabsAdapter.addTab(ViewKeyShareFragment.class,
|
||||
mainBundle, getString(R.string.key_view_tab_share));
|
||||
shareBundle, getString(R.string.key_view_tab_share));
|
||||
|
||||
// update layout after operations
|
||||
mSlidingTabLayout.setViewPager(mViewPager);
|
||||
|
||||
@@ -133,7 +133,7 @@ public class ImportKeysListLoader
|
||||
|
||||
// read all available blocks... (asc files can contain many blocks with BEGIN END)
|
||||
while (bufferedInput.available() > 0) {
|
||||
// todo deal with non-keyring objects?
|
||||
// TODO: deal with non-keyring objects?
|
||||
List<UncachedKeyRing> rings = UncachedKeyRing.fromStream(bufferedInput);
|
||||
for(UncachedKeyRing key : rings) {
|
||||
ImportKeysListEntry item = new ImportKeysListEntry(getContext(), key);
|
||||
|
||||
BIN
OpenKeychain/src/main/res/drawable-hdpi/ic_action_collection.png
Normal file
|
After Width: | Height: | Size: 422 B |
BIN
OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
OpenKeychain/src/main/res/drawable-mdpi/ic_action_collection.png
Normal file
|
After Width: | Height: | Size: 336 B |
BIN
OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 496 B |
BIN
OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 650 B |
BIN
OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
@@ -3,7 +3,7 @@
|
||||
android:id="@+id/content_frame"
|
||||
android:layout_marginLeft="@dimen/drawer_content_padding"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
@@ -12,21 +12,38 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/import_navigation_fragment"
|
||||
<org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout
|
||||
android:id="@+id/import_sliding_tab_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" />
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<android.support.v4.view.ViewPager
|
||||
android:id="@+id/import_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dp"
|
||||
android:background="@android:color/white" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="2dip"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="16dp" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="2dip"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/import_keys_list_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_weight="0.9" />
|
||||
android:layout_weight="1"
|
||||
android:background="@android:color/white" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/import_footer"
|
||||
@@ -34,7 +51,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp">
|
||||
android:paddingRight="16dp"
|
||||
android:background="@android:color/white">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<com.beardedhen.androidbootstrap.BootstrapButton
|
||||
android:id="@+id/import_clipboard_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="70dp"
|
||||
android:text="@string/import_clipboard_button"
|
||||
bootstrapbutton:bb_icon_left="fa-clipboard"
|
||||
bootstrapbutton:bb_size="default"
|
||||
bootstrapbutton:bb_type="default" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -1,21 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.beardedhen.androidbootstrap.BootstrapButton
|
||||
<LinearLayout
|
||||
android:id="@+id/import_keys_file_browse"
|
||||
android:paddingLeft="8dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="70dp"
|
||||
android:text="@string/filemanager_title_open"
|
||||
android:contentDescription="@string/filemanager_title_open"
|
||||
bootstrapbutton:bb_icon_left="fa-folder-open"
|
||||
bootstrapbutton:bb_size="default"
|
||||
bootstrapbutton:bb_type="default" />
|
||||
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||
android:clickable="true"
|
||||
style="@style/SelectableItem"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="8dp"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="match_parent"
|
||||
android:text="@string/filemanager_title_open"
|
||||
android:layout_weight="1"
|
||||
android:drawableRight="@drawable/ic_action_collection"
|
||||
android:drawablePadding="8dp"
|
||||
android:gravity="center_vertical" />
|
||||
|
||||
<View
|
||||
android:layout_width="1dip"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="right"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/import_clipboard_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="8dp"
|
||||
android:src="@drawable/ic_action_paste"
|
||||
android:layout_gravity="center_vertical"
|
||||
style="@style/SelectableItem" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/import_qrcode_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingTop="8dp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/import_qrcode_progress"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:progress="0"
|
||||
android:visibility="gone" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -1,16 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
|
||||
<EditText
|
||||
android:id="@+id/import_keybase_query"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
@@ -22,17 +18,24 @@
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:minLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:layout_gravity="center_vertical" />
|
||||
|
||||
<com.beardedhen.androidbootstrap.BootstrapButton
|
||||
<View
|
||||
android:layout_width="1dip"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="right"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/import_keybase_search"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp"
|
||||
android:src="@drawable/ic_action_search"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="8dp"
|
||||
bootstrapbutton:bb_icon_left="fa-search"
|
||||
bootstrapbutton:bb_roundedCorners="true"
|
||||
bootstrapbutton:bb_size="default"
|
||||
bootstrapbutton:bb_type="default" />
|
||||
style="@style/SelectableItem" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -17,9 +17,13 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:orientation="horizontal"
|
||||
android:paddingRight="?android:attr/scrollbarSize"
|
||||
android:singleLine="true">
|
||||
android:singleLine="true"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="4dp">
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/selected"
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<com.beardedhen.androidbootstrap.BootstrapButton
|
||||
android:id="@+id/import_nfc_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="70dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:text="@string/import_nfc_help_button"
|
||||
bootstrapbutton:bb_icon_left="fa-question"
|
||||
bootstrapbutton:bb_size="default"
|
||||
bootstrapbutton:bb_type="default" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toLeftOf="@+id/import_nfc_button"
|
||||
android:text="@string/import_nfc_text" />
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -1,21 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.beardedhen.androidbootstrap.BootstrapButton
|
||||
<LinearLayout
|
||||
android:id="@+id/import_qrcode_button"
|
||||
android:paddingLeft="8dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="70dp"
|
||||
android:text="@string/import_qr_scan_button"
|
||||
bootstrapbutton:bb_icon_left="fa-barcode"
|
||||
bootstrapbutton:bb_size="default"
|
||||
bootstrapbutton:bb_type="default" />
|
||||
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||
android:clickable="true"
|
||||
style="@style/SelectableItem"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="8dp"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="match_parent"
|
||||
android:text="@string/import_qr_code_button"
|
||||
android:layout_weight="1"
|
||||
android:drawableRight="@drawable/ic_action_qr_code"
|
||||
android:drawablePadding="8dp"
|
||||
android:gravity="center_vertical" />
|
||||
|
||||
<View
|
||||
android:layout_width="1dip"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="right"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/import_nfc_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="8dp"
|
||||
android:text="NFC?"
|
||||
android:layout_gravity="center_vertical"
|
||||
style="@style/SelectableItem" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/import_qrcode_text"
|
||||
|
||||
@@ -1,20 +1,13 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:custom="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/import_server_spinner"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="8dp"
|
||||
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<EditText
|
||||
@@ -30,18 +23,63 @@
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:minLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:layout_gravity="center_vertical" />
|
||||
|
||||
<com.beardedhen.androidbootstrap.BootstrapButton
|
||||
<View
|
||||
android:layout_width="1dip"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="right"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/import_server_search"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp"
|
||||
android:src="@drawable/ic_action_search"
|
||||
android:layout_gravity="center_vertical"
|
||||
style="@style/SelectableItem" />
|
||||
|
||||
<View
|
||||
android:layout_width="1dip"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="right"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/import_server_config_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="8dp"
|
||||
android:src="@drawable/ic_action_settings"
|
||||
android:layout_gravity="center_vertical"
|
||||
style="@style/SelectableItem" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/import_server_config"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dip"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/import_server_spinner"
|
||||
android:layout_marginLeft="8dp"
|
||||
bootstrapbutton:bb_icon_left="fa-search"
|
||||
bootstrapbutton:bb_roundedCorners="true"
|
||||
bootstrapbutton:bb_size="default"
|
||||
bootstrapbutton:bb_type="default" />
|
||||
android:layout_marginRight="8dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -24,8 +24,7 @@
|
||||
<LinearLayout
|
||||
android:id="@+id/view_key_action_fingerprint_share"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||
android:clickable="true"
|
||||
style="@style/SelectableItem"
|
||||
android:orientation="horizontal">
|
||||
@@ -63,7 +62,6 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dip"
|
||||
@@ -90,8 +88,7 @@
|
||||
<LinearLayout
|
||||
android:id="@+id/view_key_action_key_share"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||
android:clickable="true"
|
||||
style="@style/SelectableItem"
|
||||
android:orientation="horizontal">
|
||||
@@ -135,8 +132,7 @@
|
||||
<LinearLayout
|
||||
android:id="@+id/view_key_action_nfc_help"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||
android:clickable="true"
|
||||
style="@style/SelectableItem"
|
||||
android:orientation="horizontal"
|
||||
|
||||
@@ -324,10 +324,8 @@
|
||||
<string name="progress_verifying_integrity">Integrität wird überprüft…</string>
|
||||
<string name="progress_deleting_securely">\'%s\' wird sicher gelöscht…</string>
|
||||
<!--action strings-->
|
||||
<string name="hint_public_keys">Öffentliche Schlüssel suchen</string>
|
||||
<string name="hint_secret_keys">Private Schlüssel suchen</string>
|
||||
<string name="action_share_key_with">Teile Schlüssel über…</string>
|
||||
<string name="hint_keybase_search">Durchsuche Keybase.io</string>
|
||||
<!--key bit length selections-->
|
||||
<string name="key_size_512">512</string>
|
||||
<string name="key_size_768">768</string>
|
||||
|
||||
@@ -75,16 +75,11 @@
|
||||
<!-- menu -->
|
||||
<string name="menu_preferences">Settings</string>
|
||||
<string name="menu_help">Help</string>
|
||||
<string name="menu_import_from_file">Import from file</string>
|
||||
<string name="menu_import_from_qr_code">Import from QR Code</string>
|
||||
<string name="menu_import_from_nfc">Import from NFC</string>
|
||||
<string name="menu_export_key">Export to file</string>
|
||||
<string name="menu_delete_key">Delete key</string>
|
||||
<string name="menu_create_key">Create key</string>
|
||||
<string name="menu_create_key_expert">Create key (expert)</string>
|
||||
<string name="menu_search">Search</string>
|
||||
<string name="menu_import_from_key_server">Keyserver</string>
|
||||
<string name="menu_import_from_keybase">Import from Keybase.io</string>
|
||||
<string name="menu_key_server">Keyserver…</string>
|
||||
<string name="menu_update_key">Update from keyserver</string>
|
||||
<string name="menu_export_key_to_server">Upload to key server</string>
|
||||
@@ -229,11 +224,6 @@
|
||||
<string name="key_creation_weak_rsa_info">Note: generating RSA key with length 1024-bit and less is considered unsafe and it\'s disabled for generating new keys.</string>
|
||||
<string name="key_not_found">Couldn\'t find key %08X.</string>
|
||||
|
||||
<plurals name="keys_found">
|
||||
<item quantity="one">Found %d key.</item>
|
||||
<item quantity="other">Found %d keys.</item>
|
||||
</plurals>
|
||||
|
||||
<plurals name="bad_keys_encountered">
|
||||
<item quantity="one">%d bad secret key ignored. Perhaps you exported with the option\n --export-secret-subkeys\nMake sure you export with\n --export-secret-keys\ninstead.</item>
|
||||
<item quantity="other">%d bad secret keys ignored. Perhaps you exported with the option\n --export-secret-subkeys\nMake sure you export with\n --export-secret-keys\ninstead.</item>
|
||||
@@ -278,11 +268,11 @@
|
||||
<string name="error_only_files_are_supported">Direct binary data without actual file in filesystem is not supported.</string>
|
||||
<string name="error_jelly_bean_needed">You need Android 4.1 to use Android\'s NFC Beam feature!</string>
|
||||
<string name="error_nfc_needed">NFC is not available on your device!</string>
|
||||
<string name="error_nothing_import">Nothing to import!</string>
|
||||
<string name="error_nothing_import">No keys found!</string>
|
||||
<string name="error_keyserver_insufficient_query">Key search query too short</string>
|
||||
<string name="error_searching_keys">Unrecoverable error searching for keys at server</string>
|
||||
<string name="error_keyserver_too_many_responses">Key search query returned too many candidates; Please refine query</string>
|
||||
<string name="error_import_file_no_content">File has no content</string>
|
||||
<string name="error_import_file_no_content">File/Clipboard is empty</string>
|
||||
<string name="error_generic_report_bug">A generic error occurred, please create a new bug report for OpenKeychain.</string>
|
||||
<plurals name="error_import_non_pgp_part">
|
||||
<item quantity="one">part of the loaded file is a valid OpenPGP object but not a OpenPGP key</item>
|
||||
@@ -339,10 +329,10 @@
|
||||
<string name="progress_deleting_securely">deleting \'%s\' securely…</string>
|
||||
|
||||
<!-- action strings -->
|
||||
<string name="hint_public_keys">Search Public Keys</string>
|
||||
<string name="hint_public_keys">Name/Email/Key ID…</string>
|
||||
<string name="hint_secret_keys">Search Secret Keys</string>
|
||||
<string name="action_share_key_with">Share Key with…</string>
|
||||
<string name="hint_keybase_search">Search Keybase.io</string>
|
||||
<string name="hint_keybase_search">Name/Keybase.io username…</string>
|
||||
|
||||
<!-- key bit length selections -->
|
||||
<string name="key_size_512">512</string>
|
||||
@@ -372,6 +362,10 @@
|
||||
<string name="help_about_version">Version:</string>
|
||||
|
||||
<!-- Import -->
|
||||
<string name="import_tab_keyserver">Keyserver</string>
|
||||
<string name="import_tab_direct">File/Clipboard</string>
|
||||
<string name="import_tab_qr_code">QR Code/NFC</string>
|
||||
<string name="import_tab_keybase">Keybase.io</string>
|
||||
<string name="import_import">Import selected keys</string>
|
||||
<string name="import_from_clipboard">Import from clipboard</string>
|
||||
|
||||
@@ -387,6 +381,7 @@
|
||||
<string name="import_qr_scan_button">Scan QR Code with \'Barcode Scanner\'</string>
|
||||
<string name="import_nfc_text">To receive keys via NFC, the device needs to be unlocked.</string>
|
||||
<string name="import_nfc_help_button">Help</string>
|
||||
<string name="import_qr_code_button">Scan QR Code…</string>
|
||||
<string name="import_clipboard_button">Get key from clipboard</string>
|
||||
<string name="import_keybase_button">Get key from Keybase.io</string>
|
||||
|
||||
|
||||