aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/OtherHelper.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java190
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java88
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java38
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java16
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java27
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysNFCFragment.java70
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java82
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java34
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java2
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_collection.pngbin0 -> 422 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.pngbin0 -> 2680 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_collection.pngbin0 -> 336 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.pngbin0 -> 2388 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collection.pngbin0 -> 496 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.pngbin0 -> 3339 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collection.pngbin0 -> 650 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.pngbin0 -> 3458 bytes
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_activity.xml38
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_clipboard_fragment.xml20
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_file_fragment.xml67
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml27
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_list_entry.xml8
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_nfc_fragment.xml30
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml49
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_server_fragment.xml72
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_share_fragment.xml10
-rw-r--r--OpenKeychain/src/main/res/values-de/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml23
-rw-r--r--README.md5
-rw-r--r--Resources/graphics/ic_action_qr_code.pngbin0 -> 5377 bytes
-rw-r--r--Resources/graphics/ic_action_qr_code.svg753
-rwxr-xr-xResources/graphics/update-icon.sh2
34 files changed, 1204 insertions, 460 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/OtherHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/OtherHelper.java
index d64587578..f04d84315 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/OtherHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/OtherHelper.java
@@ -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);
+ }
+
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index f389726ff..54186e380 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -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;
- }
-
- 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;
- }
+ 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 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");
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
deleted file mode 100644
index f331358fa..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
+++ /dev/null
@@ -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();
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
index 51f961aab..060e9bab2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
@@ -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
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
index a639fe0e0..9264829ea 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
@@ -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);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index d91c55da3..7d8dc4a6c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -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;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysNFCFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysNFCFragment.java
deleted file mode 100644
index 45f464b1c..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysNFCFragment.java
+++ /dev/null
@@ -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;
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
index 22b56e1ab..0cbb51c77 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
@@ -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 View mQrCodeButton;
+ private TextView mQrCodeText;
+ private ProgressBar mQrCodeProgress;
- private String[] mScannedContent;
+ 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() {
+
+ @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);
- mButton.setOnClickListener(new OnClickListener() {
+ 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);
}
}
-
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
index 9e3d88ff5..eabc8348c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
@@ -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);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 463c800d2..c3ca0334f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -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);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
index 03a82696d..c2712e89e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
@@ -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);
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_collection.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_collection.png
new file mode 100644
index 000000000..8de91173c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_collection.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png
new file mode 100644
index 000000000..e15a055db
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_collection.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_collection.png
new file mode 100644
index 000000000..b89ea93ff
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_collection.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png
new file mode 100644
index 000000000..1c65e5af8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collection.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collection.png
new file mode 100644
index 000000000..88240fd30
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collection.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png
new file mode 100644
index 000000000..c56b128e4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collection.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collection.png
new file mode 100644
index 000000000..c41ca8c8b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collection.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png
new file mode 100644
index 000000000..c718aee0b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/layout/import_keys_activity.xml b/OpenKeychain/src/main/res/layout/import_keys_activity.xml
index 0486b6bd6..fc9d21e23 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_activity.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_activity.xml
@@ -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"
diff --git a/OpenKeychain/src/main/res/layout/import_keys_clipboard_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_clipboard_fragment.xml
deleted file mode 100644
index 739c34fba..000000000
--- a/OpenKeychain/src/main/res/layout/import_keys_clipboard_fragment.xml
+++ /dev/null
@@ -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> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_file_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_file_fragment.xml
index c07d2bb40..b1056dab3 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_file_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_file_fragment.xml
@@ -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> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
index ceba0e1ce..bf00b77e7 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
@@ -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> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
index c91335a5b..56f34e2eb 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
@@ -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"
diff --git a/OpenKeychain/src/main/res/layout/import_keys_nfc_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_nfc_fragment.xml
deleted file mode 100644
index 8c0a80e4e..000000000
--- a/OpenKeychain/src/main/res/layout/import_keys_nfc_fragment.xml
+++ /dev/null
@@ -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> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml
index 590f7f797..09a31b4a8 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml
@@ -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"
diff --git a/OpenKeychain/src/main/res/layout/import_keys_server_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_server_fragment.xml
index e17dbe783..7562eaa9b 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_server_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_server_fragment.xml
@@ -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> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
index 67c2e241a..1cd2b9f1b 100644
--- a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
@@ -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"
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 3485846ad..d5cf037c8 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -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>
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 5a2c38419..1b0b1ad03 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -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>
diff --git a/README.md b/README.md
index 231dc7f16..f940e04f6 100644
--- a/README.md
+++ b/README.md
@@ -227,8 +227,11 @@ Some parts and some libraries are Apache License v2, MIT X11 License (see below)
* icon.svg
modified version of kgpg_key2_kopete.svgz
-* Menu icons
+* Actionbar icons
http://developer.android.com/design/downloads/index.html#action-bar-icon-pack
+
+* QR Code Actionbar icon
+ https://github.com/openintents/openintents/blob/master/extensions/qrcode_ext/icons/ic_menu_qr_code/ic_menu_qr_code_holo_light/ic_menu_qr_code.svg
* Purple color scheme
http://android-holo-colors.com/
diff --git a/Resources/graphics/ic_action_qr_code.png b/Resources/graphics/ic_action_qr_code.png
new file mode 100644
index 000000000..3c311c7df
--- /dev/null
+++ b/Resources/graphics/ic_action_qr_code.png
Binary files differ
diff --git a/Resources/graphics/ic_action_qr_code.svg b/Resources/graphics/ic_action_qr_code.svg
new file mode 100644
index 000000000..da7d0f97c
--- /dev/null
+++ b/Resources/graphics/ic_action_qr_code.svg
@@ -0,0 +1,753 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="48px"
+ height="48px"
+ viewBox="0 0 48 48"
+ enable-background="new 0 0 48 48"
+ xml:space="preserve"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="ic_menu_qr_code.svg"><metadata
+ id="metadata231"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs229">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1918"
+ inkscape:window-height="1179"
+ id="namedview227"
+ showgrid="false"
+ inkscape:zoom="8.4558186"
+ inkscape:cx="-17.080652"
+ inkscape:cy="14.446251"
+ inkscape:window-x="0"
+ inkscape:window-y="19"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" />
+<rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect25"
+ height="5.0662165"
+ width="1.6889851"
+ y="9.6451044"
+ x="9.6451044" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect39"
+ height="5.0662165"
+ width="1.6889851"
+ y="9.6451044"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect55"
+ height="5.0662165"
+ width="1.6882463"
+ y="9.6451044"
+ x="13.023813" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect33"
+ height="5.0662165"
+ width="1.6889851"
+ y="33.287201"
+ x="9.6451044" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect49"
+ height="5.0662165"
+ width="1.6889851"
+ y="33.287201"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect61"
+ height="5.0662165"
+ width="1.6882463"
+ y="33.287201"
+ x="13.023813" /><rect
+ y="6.2678733"
+ x="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect5"
+ height="11.821418"
+ width="1.6882463" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect13"
+ height="1.6882463"
+ width="1.6889851"
+ x="7.9561195" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect15"
+ height="1.6889851"
+ width="1.6889851"
+ y="16.400307"
+ x="7.9561195" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect23"
+ height="1.6882463"
+ width="1.6889851"
+ x="9.6451044" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect27"
+ height="1.6889851"
+ width="1.6889851"
+ y="16.400307"
+ x="9.6451044" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect37"
+ height="1.6882463"
+ width="1.6889851"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect41"
+ height="1.6889851"
+ width="1.6889851"
+ y="16.400307"
+ x="11.334089" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect53"
+ height="1.6882463"
+ width="1.6882463"
+ x="13.023813" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect57"
+ height="1.6889851"
+ width="1.6882463"
+ y="16.400307"
+ x="13.023813" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect65"
+ height="1.6882463"
+ width="1.6882463"
+ x="14.712059" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect67"
+ height="1.6889851"
+ width="1.6882463"
+ y="16.400307"
+ x="14.712059" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect75"
+ height="11.821418"
+ width="1.6889851"
+ x="16.400307" /><rect
+ x="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect11"
+ height="11.821418"
+ width="1.6882463"
+ y="29.910709" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect19"
+ height="1.6882463"
+ width="1.6889851"
+ y="29.910709"
+ x="7.9561195" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect21"
+ height="1.6889851"
+ width="1.6889851"
+ y="40.04314"
+ x="7.9561195" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect31"
+ height="1.6882463"
+ width="1.6889851"
+ y="29.910709"
+ x="9.6451044" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect35"
+ height="1.6889851"
+ width="1.6889851"
+ y="40.04314"
+ x="9.6451044" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect47"
+ height="1.6882463"
+ width="1.6889851"
+ y="29.910709"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect51"
+ height="1.6889851"
+ width="1.6889851"
+ y="40.04314"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect59"
+ height="1.6882463"
+ width="1.6882463"
+ y="29.910709"
+ x="13.023813" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect63"
+ height="1.6889851"
+ width="1.6882463"
+ y="40.04314"
+ x="13.023813" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect71"
+ height="1.6882463"
+ width="1.6882463"
+ y="29.910709"
+ x="14.712059" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect73"
+ height="1.6889851"
+ width="1.6882463"
+ y="40.04314"
+ x="14.712059" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect83"
+ height="11.821418"
+ width="1.6889851"
+ y="29.910709"
+ x="16.400307" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect163"
+ height="5.0662165"
+ width="1.6897238"
+ y="9.6451044"
+ x="33.287201" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect177"
+ height="5.0662165"
+ width="1.6882463"
+ y="9.6451044"
+ x="34.976925" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect191"
+ height="5.0662165"
+ width="1.6897238"
+ y="9.6451044"
+ x="36.665913" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect141"
+ height="11.821418"
+ width="1.6882463"
+ x="29.910709" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect151"
+ height="1.6882463"
+ width="1.6882463"
+ x="31.598955" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect153"
+ height="1.6889851"
+ width="1.6882463"
+ y="16.400307"
+ x="31.598955" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect161"
+ height="1.6882463"
+ width="1.6897238"
+ x="33.287201" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect165"
+ height="1.6889851"
+ width="1.6897238"
+ y="16.400307"
+ x="33.287201" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect175"
+ height="1.6882463"
+ width="1.6882463"
+ x="34.976925" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect179"
+ height="1.6889851"
+ width="1.6882463"
+ y="16.400307"
+ x="34.976925" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect189"
+ height="1.6882463"
+ width="1.6897238"
+ x="36.665913" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect193"
+ height="1.6889851"
+ width="1.6897238"
+ y="16.400307"
+ x="36.665913" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect203"
+ height="1.6882463"
+ width="1.6875074"
+ x="38.355633" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect205"
+ height="1.6889851"
+ width="1.6875074"
+ y="16.400307"
+ x="38.355633" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect217"
+ height="11.821418"
+ width="1.6889851"
+ x="40.04314" /><rect
+ x="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect7"
+ height="3.3779702"
+ width="1.6882463"
+ y="19.777536" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect17"
+ height="1.6897238"
+ width="1.6889851"
+ y="26.53274"
+ x="7.9561195" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect29"
+ height="5.0654774"
+ width="1.6889851"
+ y="21.466522"
+ x="9.6451044" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect43"
+ height="1.6889851"
+ width="1.6889851"
+ y="21.466522"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect45"
+ height="3.3779702"
+ width="1.6889851"
+ y="24.844492"
+ x="11.334089" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect69"
+ height="1.6889851"
+ width="1.6882463"
+ y="23.155508"
+ x="14.712059" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect77"
+ height="1.6889851"
+ width="1.6889851"
+ y="19.777536"
+ x="16.400307" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect79"
+ height="1.6889851"
+ width="1.6889851"
+ y="23.155508"
+ x="16.400307" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect81"
+ height="1.6897238"
+ width="1.6889851"
+ y="26.53274"
+ x="16.400307" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect85"
+ height="3.3779702"
+ width="1.6889851"
+ y="21.466522"
+ x="18.089291" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect87"
+ height="5.0662165"
+ width="1.6889851"
+ y="7.9561195"
+ x="19.778276" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect89"
+ height="13.510403"
+ width="1.6889851"
+ y="16.400307"
+ x="19.778276" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect91"
+ height="1.6889851"
+ width="1.6889851"
+ y="40.04314"
+ x="19.778276" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect93"
+ height="1.6882463"
+ width="1.6882463"
+ x="21.467262" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect95"
+ height="1.6889851"
+ width="1.6882463"
+ y="13.023074"
+ x="21.467262" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect97"
+ height="5.0662165"
+ width="1.6882463"
+ y="24.844492"
+ x="21.467262" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect99"
+ height="1.6882463"
+ width="1.6882463"
+ y="31.598955"
+ x="21.467262" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect101"
+ height="6.7552013"
+ width="1.6882463"
+ y="34.976925"
+ x="21.467262" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect103"
+ height="1.6882463"
+ width="1.6889851"
+ y="11.334089"
+ x="23.155508" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect107"
+ height="5.0662165"
+ width="1.6889851"
+ y="19.777536"
+ x="23.155508" /><rect
+ y="6.2678733"
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect113"
+ height="1.6882463"
+ width="1.6882463"
+ x="24.844492" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect117"
+ height="1.6882463"
+ width="1.6882463"
+ y="18.089291"
+ x="24.844492" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect119"
+ height="1.6889851"
+ width="1.6882463"
+ y="23.155508"
+ x="24.844492" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect121"
+ height="1.6882463"
+ width="1.6882463"
+ y="28.222464"
+ x="24.844492" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect123"
+ height="1.6882463"
+ width="1.6882463"
+ y="31.598955"
+ x="24.844492" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect125"
+ height="1.6889851"
+ width="1.6882463"
+ y="40.04314"
+ x="24.844492" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect127"
+ height="3.3779702"
+ width="1.6889851"
+ y="7.9561195"
+ x="26.53274" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect129"
+ height="10.133172"
+ width="1.6889851"
+ y="13.023074"
+ x="26.53274" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect131"
+ height="8.4434481"
+ width="1.6889851"
+ y="28.222464"
+ x="26.53274" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect135"
+ height="3.3779702"
+ width="1.6889851"
+ y="26.53274"
+ x="28.221725" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect137"
+ height="1.6882463"
+ width="1.6889851"
+ y="31.598955"
+ x="28.221725" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect139"
+ height="1.6889851"
+ width="1.6889851"
+ y="40.04314"
+ x="28.221725" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect145"
+ height="1.6889851"
+ width="1.6882463"
+ y="23.155508"
+ x="29.910709" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect149"
+ height="1.6897238"
+ width="1.6882463"
+ y="36.665913"
+ x="29.910709" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect155"
+ height="5.0654774"
+ width="1.6882463"
+ y="21.466522"
+ x="31.598955" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect157"
+ height="3.3779702"
+ width="1.6882463"
+ y="31.598955"
+ x="31.598955" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect169"
+ height="1.6897238"
+ width="1.6897238"
+ y="26.53274"
+ x="33.287201" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect171"
+ height="3.3764925"
+ width="1.6897238"
+ y="29.910709"
+ x="33.287201" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect173"
+ height="6.7552013"
+ width="1.6897238"
+ y="34.976925"
+ x="33.287201" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect181"
+ height="1.6889851"
+ width="1.6882463"
+ y="19.777536"
+ x="34.976925" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect183"
+ height="3.3764925"
+ width="1.6882463"
+ y="23.155508"
+ x="34.976925" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect185"
+ height="1.6882463"
+ width="1.6882463"
+ y="31.598955"
+ x="34.976925" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect187"
+ height="1.6875074"
+ width="1.6882463"
+ y="38.355633"
+ x="34.976925" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect195"
+ height="6.7552013"
+ width="1.6897238"
+ y="19.777536"
+ x="36.665913" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect197"
+ height="1.6882463"
+ width="1.6897238"
+ y="28.222464"
+ x="36.665913" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect199"
+ height="1.6882463"
+ width="1.6897238"
+ y="31.598955"
+ x="36.665913" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect201"
+ height="5.0647388"
+ width="1.6897238"
+ y="34.976925"
+ x="36.665913" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect207"
+ height="1.6889851"
+ width="1.6875074"
+ y="19.777536"
+ x="38.355633" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect209"
+ height="5.0662165"
+ width="1.6875074"
+ y="23.155508"
+ x="38.355633" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect211"
+ height="1.6882463"
+ width="1.6875074"
+ y="29.910709"
+ x="38.355633" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect215"
+ height="1.6889851"
+ width="1.6875074"
+ y="40.04314"
+ x="38.355633" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect219"
+ height="1.6882463"
+ width="1.6889851"
+ y="24.844492"
+ x="40.04314" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect223"
+ height="3.3779702"
+ width="1.6889851"
+ y="31.598955"
+ x="40.04314" /><rect
+ style="opacity:0.6;fill:#333333;fill-opacity:1"
+ id="rect225"
+ height="1.6897238"
+ width="1.6889851"
+ y="36.665913"
+ x="40.04314" />
+</svg> \ No newline at end of file
diff --git a/Resources/graphics/update-icon.sh b/Resources/graphics/update-icon.sh
index 3df587a21..05b80e6b3 100755
--- a/Resources/graphics/update-icon.sh
+++ b/Resources/graphics/update-icon.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-APP_DIR=../../OpenPGP-Keychain/src/main
+APP_DIR=../../OpenKeychain/src/main
LDPI_DIR=$APP_DIR/res/drawable-ldpi
MDPI_DIR=$APP_DIR/res/drawable-mdpi
HDPI_DIR=$APP_DIR/res/drawable-hdpi