diff options
Diffstat (limited to 'OpenKeychain')
113 files changed, 3896 insertions, 814 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index 5615b59c4..eabcfadee 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -56,6 +56,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; import org.sufficientlysecure.keychain.util.HkpKeyServer; import org.sufficientlysecure.keychain.util.InputData; +import org.sufficientlysecure.keychain.util.KeybaseKeyServer; import org.sufficientlysecure.keychain.util.KeychainServiceListener; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ProgressScaler; @@ -103,6 +104,7 @@ public class KeychainIntentService extends IntentService public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING"; public static final String ACTION_DOWNLOAD_AND_IMPORT_KEYS = Constants.INTENT_PREFIX + "QUERY_KEYRING"; + public static final String ACTION_IMPORT_KEYBASE_KEYS = Constants.INTENT_PREFIX + "DOWNLOAD_KEYBASE"; public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING"; @@ -739,6 +741,55 @@ public class KeychainIntentService extends IntentService } catch (Exception e) { sendErrorToHandler(e); } + } else if (ACTION_IMPORT_KEYBASE_KEYS.equals(action)) { + ArrayList<ImportKeysListEntry> entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST); + + try { + KeybaseKeyServer server = new KeybaseKeyServer(); + for (ImportKeysListEntry entry : entries) { + // the keybase handle is in userId(1) + String keybaseID = entry.getUserIds().get(1); + byte[] downloadedKeyBytes = server.get(keybaseID).getBytes(); + + // create PGPKeyRing object based on downloaded armored key + PGPKeyRing downloadedKey = null; + BufferedInputStream bufferedInput = + new BufferedInputStream(new ByteArrayInputStream(downloadedKeyBytes)); + if (bufferedInput.available() > 0) { + InputStream in = PGPUtil.getDecoderStream(bufferedInput); + PGPObjectFactory objectFactory = new PGPObjectFactory(in); + + // get first object in block + Object obj; + if ((obj = objectFactory.nextObject()) != null) { + + if (obj instanceof PGPKeyRing) { + downloadedKey = (PGPKeyRing) obj; + } else { + throw new PgpGeneralException("Object not recognized as PGPKeyRing!"); + } + } + } + + // save key bytes in entry object for doing the + // actual import afterwards + entry.setBytes(downloadedKey.getEncoded()); + } + + Intent importIntent = new Intent(this, KeychainIntentService.class); + importIntent.setAction(ACTION_IMPORT_KEYRING); + Bundle importData = new Bundle(); + importData.putParcelableArrayList(IMPORT_KEY_LIST, entries); + importIntent.putExtra(EXTRA_DATA, importData); + importIntent.putExtra(EXTRA_MESSENGER, mMessenger); + + // now import it with this service + onHandleIntent(importIntent); + + // result is handled in ACTION_IMPORT_KEYRING + } catch (Exception e) { + sendErrorToHandler(e); + } } else if (ACTION_DOWNLOAD_AND_IMPORT_KEYS.equals(action)) { try { ArrayList<ImportKeysListEntry> entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST); @@ -767,7 +818,6 @@ public class KeychainIntentService extends IntentService // get first object in block Object obj; if ((obj = objectFactory.nextObject()) != null) { - Log.d(Constants.TAG, "Found class: " + obj.getClass()); if (obj instanceof PGPKeyRing) { downloadedKey = (PGPKeyRing) obj; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java index fbcbbb0c3..2d31e0de8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java @@ -147,7 +147,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements } Log.e(Constants.TAG, "uri: " + mDataUri); - mUserIds = (ListView) findViewById(R.id.user_ids); + mUserIds = (ListView) findViewById(R.id.view_key_user_ids); mUserIdsAdapter = new ViewKeyUserIdsAdapter(this, null, 0, true); mUserIds.setAdapter(mUserIdsAdapter); @@ -203,7 +203,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements byte[] fingerprintBlob = data.getBlob(INDEX_FINGERPRINT); String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob); - ((TextView) findViewById(R.id.fingerprint)) + ((TextView) findViewById(R.id.view_key_fingerprint)) .setText(PgpKeyHelper.colorizeFingerprint(fingerprint)); } break; 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 0fccd668f..650e51069 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -62,6 +62,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O + "IMPORT_KEY_FROM_KEYSERVER"; public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN = Constants.INTENT_PREFIX + "IMPORT_KEY_FROM_KEY_SERVER_AND_RETURN"; + public static final String ACTION_IMPORT_KEY_FROM_KEYBASE = Constants.INTENT_PREFIX + + "IMPORT_KEY_FROM_KEYBASE"; // Actions for internal use only: public static final String ACTION_IMPORT_KEY_FROM_FILE = Constants.INTENT_PREFIX @@ -92,13 +94,15 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O ImportKeysFileFragment.class, ImportKeysQrCodeFragment.class, ImportKeysClipboardFragment.class, - ImportKeysNFCFragment.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 int mCurrentNavPosition = -1; @@ -238,6 +242,12 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O // 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); + + // no immediate actions! + startListFragment(savedInstanceState, null, null, null); } else { startListFragment(savedInstanceState, null, null, null); } @@ -340,8 +350,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O startListFragment(savedInstanceState, null, null, query); } - public void loadCallback(byte[] importData, Uri dataUri, String serverQuery, String keyServer) { - mListFragment.loadNew(importData, dataUri, serverQuery, keyServer); + public void loadCallback(byte[] importData, Uri dataUri, String serverQuery, String keyServer, String keybaseQuery) { + mListFragment.loadNew(importData, dataUri, serverQuery, keyServer, keybaseQuery); } /** @@ -449,6 +459,31 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O // start service with intent startService(intent); + } else if (mListFragment.getKeybaseQuery() != null) { + // Send all information needed to service to query keys in other thread + Intent intent = new Intent(this, KeychainIntentService.class); + + intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYBASE_KEYS); + + // fill values for this action + Bundle data = new Bundle(); + + // get selected key entries + ArrayList<ImportKeysListEntry> selectedEntries = mListFragment.getSelectedData(); + data.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, selectedEntries); + + intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(saveHandler); + intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + + // show progress dialog + saveHandler.showProgressDialog(this); + + // start service with intent + startService(intent); + } else { AppMsg.makeText(this, R.string.error_nothing_import, AppMsg.STYLE_ALERT).show(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java index 412fbddd8..f331358fa 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java @@ -71,7 +71,7 @@ public class ImportKeysClipboardFragment extends Fragment { return; } } - mImportActivity.loadCallback(sendText.getBytes(), null, null, null); + mImportActivity.loadCallback(sendText.getBytes(), null, null, null, null); } }); 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 dc5333a8f..51f961aab 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java @@ -85,7 +85,7 @@ public class ImportKeysFileFragment extends Fragment { if (resultCode == Activity.RESULT_OK && data != null) { // load data - mImportActivity.loadCallback(null, data.getData(), null, null); + mImportActivity.loadCallback(null, data.getData(), null, null, null); } break; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java new file mode 100644 index 000000000..a996079c9 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 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.Context; +import android.support.v4.app.Fragment; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.TextView; + +import com.beardedhen.androidbootstrap.BootstrapButton; + +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.util.Log; + +/** + * Import public keys from the Keybase.io directory. First cut: just raw search. + * TODO: make a pick list of the people you’re following on keybase + */ +public class ImportKeysKeybaseFragment extends Fragment { + + private ImportKeysActivity mImportActivity; + private BootstrapButton mSearchButton; + private EditText mQueryEditText; + + public static final String ARG_QUERY = "query"; + + /** + * Creates new instance of this fragment + */ + public static ImportKeysKeybaseFragment newInstance() { + ImportKeysKeybaseFragment frag = new ImportKeysKeybaseFragment(); + + 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_keybase_fragment, container, false); + + mQueryEditText = (EditText) view.findViewById(R.id.import_keybase_query); + + mSearchButton = (BootstrapButton) view.findViewById(R.id.import_keybase_search); + mSearchButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String query = mQueryEditText.getText().toString(); + search(query); + + // close keyboard after pressing search + InputMethodManager imm = + (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(mQueryEditText.getWindowToken(), 0); + } + }); + + mQueryEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + String query = mQueryEditText.getText().toString(); + search(query); + + // Don't return true to let the keyboard close itself after pressing search + return false; + } + return false; + } + }); + + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + mImportActivity = (ImportKeysActivity) getActivity(); + + // set displayed values + if (getArguments() != null) { + if (getArguments().containsKey(ARG_QUERY)) { + String query = getArguments().getString(ARG_QUERY); + mQueryEditText.setText(query, TextView.BufferType.EDITABLE); + } + } + } + + 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 3a6c384e8..c1aa8a1f2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -34,6 +34,7 @@ import org.sufficientlysecure.keychain.helper.Preferences; import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; +import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListKeybaseLoader; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader; import org.sufficientlysecure.keychain.util.InputData; @@ -60,9 +61,11 @@ public class ImportKeysListFragment extends ListFragment implements private Uri mDataUri; private String mServerQuery; private String mKeyServer; + private String mKeybaseQuery; private static final int LOADER_ID_BYTES = 0; private static final int LOADER_ID_SERVER_QUERY = 1; + private static final int LOADER_ID_KEYBASE = 2; public byte[] getKeyBytes() { return mKeyBytes; @@ -76,6 +79,10 @@ public class ImportKeysListFragment extends ListFragment implements return mServerQuery; } + public String getKeybaseQuery() { + return mKeybaseQuery; + } + public String getKeyServer() { return mKeyServer; } @@ -148,6 +155,16 @@ public class ImportKeysListFragment extends ListFragment implements // give arguments to onCreateLoader() getLoaderManager().initLoader(LOADER_ID_SERVER_QUERY, null, this); } + + if (mKeybaseQuery != null) { + // Start out with a progress indicator. + setListShown(false); + + // Prepare the loader. Either re-connect with an existing one, + // or start a new one. + // give arguments to onCreateLoader() + getLoaderManager().initLoader(LOADER_ID_KEYBASE, null, this); + } } @Override @@ -157,16 +174,18 @@ public class ImportKeysListFragment extends ListFragment implements // Select checkbox! // Update underlying data and notify adapter of change. The adapter will // update the view automatically. + ImportKeysListEntry entry = mAdapter.getItem(position); entry.setSelected(!entry.isSelected()); mAdapter.notifyDataSetChanged(); } - public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer) { + public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer, String keybaseQuery) { mKeyBytes = keyBytes; mDataUri = dataUri; mServerQuery = serverQuery; mKeyServer = keyServer; + mKeybaseQuery = keybaseQuery; if (mKeyBytes != null || mDataUri != null) { // Start out with a progress indicator. @@ -181,6 +200,13 @@ public class ImportKeysListFragment extends ListFragment implements getLoaderManager().restartLoader(LOADER_ID_SERVER_QUERY, null, this); } + + if (mKeybaseQuery != null) { + // Start out with a progress indicator. + setListShown(false); + + getLoaderManager().restartLoader(LOADER_ID_KEYBASE, null, this); + } } @Override @@ -194,6 +220,9 @@ public class ImportKeysListFragment extends ListFragment implements case LOADER_ID_SERVER_QUERY: { return new ImportKeysListServerLoader(getActivity(), mServerQuery, mKeyServer); } + case LOADER_ID_KEYBASE: { + return new ImportKeysListKeybaseLoader(getActivity(), mKeybaseQuery); + } default: return null; @@ -248,7 +277,7 @@ public class ImportKeysListFragment extends ListFragment implements if (error == null) { AppMsg.makeText( getActivity(), getResources().getQuantityString(R.plurals.keys_found, - mAdapter.getCount(), mAdapter.getCount()), + mAdapter.getCount(), mAdapter.getCount()), AppMsg.STYLE_INFO ).show(); } else if (error instanceof KeyServer.InsufficientQuery) { @@ -263,6 +292,19 @@ public class ImportKeysListFragment extends ListFragment implements } break; + case LOADER_ID_KEYBASE: + + if (error == null) { + AppMsg.makeText( + getActivity(), getResources().getQuantityString(R.plurals.keys_found, + mAdapter.getCount(), mAdapter.getCount()), + AppMsg.STYLE_INFO + ).show(); + } else if (error instanceof KeyServer.QueryException) { + AppMsg.makeText(getActivity(), R.string.error_keyserver_query, + AppMsg.STYLE_ALERT).show(); + } + default: break; } @@ -279,6 +321,10 @@ public class ImportKeysListFragment extends ListFragment implements // Clear the data in the adapter. mAdapter.clear(); break; + case LOADER_ID_KEYBASE: + // Clear the data in the adapter. + mAdapter.clear(); + break; default: break; } 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 65d463456..22b56e1ab 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java @@ -117,7 +117,7 @@ public class ImportKeysQrCodeFragment extends Fragment { // is this a full key encoded as qr code? if (scannedContent.startsWith("-----BEGIN PGP")) { - mImportActivity.loadCallback(scannedContent.getBytes(), null, null, null); + mImportActivity.loadCallback(scannedContent.getBytes(), null, null, null, null); return; } @@ -197,7 +197,7 @@ public class ImportKeysQrCodeFragment extends Fragment { for (String in : mScannedContent) { result += in; } - mImportActivity.loadCallback(result.getBytes(), null, null, null); + 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 82fe2fc4c..9e3d88ff5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java @@ -151,7 +151,7 @@ public class ImportKeysServerFragment extends Fragment { } private void search(String query, String keyServer) { - mImportActivity.loadCallback(null, null, query, 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 e595c1889..56aaba57b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.ui; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; +import android.database.Cursor; import android.net.Uri; import android.nfc.NdefMessage; import android.nfc.NdefRecord; @@ -31,6 +32,9 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; @@ -42,20 +46,19 @@ import com.devspark.appmsg.AppMsg; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; import org.sufficientlysecure.keychain.helper.ExportHelper; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter; -import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment; +import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter; import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.SlidingTabLayout; import java.io.IOException; import java.util.HashMap; -public class ViewKeyActivity extends ActionBarActivity { +public class ViewKeyActivity extends ActionBarActivity implements + LoaderManager.LoaderCallbacks<Cursor> { ExportHelper mExportHelper; ProviderHelper mProviderHelper; @@ -63,9 +66,15 @@ public class ViewKeyActivity extends ActionBarActivity { protected Uri mDataUri; public static final String EXTRA_SELECTED_TAB = "selectedTab"; + public static final int TAB_MAIN = 0; + public static final int TAB_SHARE = 1; + public static final int TAB_KEYS = 2; + public static final int TAB_CERTS = 3; - ViewPager mViewPager; - TabsAdapter mTabsAdapter; + // view + private ViewPager mViewPager; + private SlidingTabLayout mSlidingTabLayout; + private PagerTabStripAdapter mTabsAdapter; public static final int REQUEST_CODE_LOOKUP_KEY = 0x00007006; @@ -76,6 +85,9 @@ public class ViewKeyActivity extends ActionBarActivity { private byte[] mNfcKeyringBytes; private static final int NFC_SENT = 1; + private static final int LOADER_ID_UNIFIED = 0; + + @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); @@ -89,33 +101,67 @@ public class ViewKeyActivity extends ActionBarActivity { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setIcon(android.R.color.transparent); actionBar.setHomeButtonEnabled(true); - actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); setContentView(R.layout.view_key_activity); - mViewPager = (ViewPager) findViewById(R.id.pager); + mViewPager = (ViewPager) findViewById(R.id.view_key_pager); + mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.view_key_sliding_tab_layout); - mTabsAdapter = new TabsAdapter(this, mViewPager); + mTabsAdapter = new PagerTabStripAdapter(this); + mViewPager.setAdapter(mTabsAdapter); - int selectedTab = 0; + int switchToTab = TAB_MAIN; Intent intent = getIntent(); if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) { - selectedTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB); + switchToTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB); + } + + Uri dataUri = getIntent().getData(); + if (dataUri == null) { + Log.e(Constants.TAG, "Data missing. Should be Uri of key!"); + finish(); + return; } - mDataUri = getIntent().getData(); + loadData(dataUri); - initNfc(mDataUri); + initNfc(dataUri); Bundle mainBundle = new Bundle(); - mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, mDataUri); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.key_view_tab_main)), - ViewKeyMainFragment.class, mainBundle, (selectedTab == 0)); + mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri); + mTabsAdapter.addTab(ViewKeyMainFragment.class, + mainBundle, getString(R.string.key_view_tab_main)); + + Bundle shareBundle = new Bundle(); + shareBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri); + mTabsAdapter.addTab(ViewKeyShareFragment.class, + mainBundle, getString(R.string.key_view_tab_share)); + + Bundle keyDetailsBundle = new Bundle(); + keyDetailsBundle.putParcelable(ViewKeyKeysFragment.ARG_DATA_URI, dataUri); + mTabsAdapter.addTab(ViewKeyKeysFragment.class, + keyDetailsBundle, getString(R.string.key_view_tab_keys_details)); Bundle certBundle = new Bundle(); - certBundle.putParcelable(ViewKeyCertsFragment.ARG_DATA_URI, mDataUri); - mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.key_view_tab_certs)), - ViewKeyCertsFragment.class, certBundle, (selectedTab == 1)); + certBundle.putParcelable(ViewKeyCertsFragment.ARG_DATA_URI, dataUri); + mTabsAdapter.addTab(ViewKeyCertsFragment.class, + certBundle, getString(R.string.key_view_tab_certs)); + + // NOTE: must be after adding the tabs! + mSlidingTabLayout.setViewPager(mViewPager); + + // switch to tab selected by extra + mViewPager.setCurrentItem(switchToTab); + } + + private void loadData(Uri dataUri) { + mDataUri = dataUri; + + Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString()); + + // Prepare the loaders. Either re-connect with an existing ones, + // or start new ones. + getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this); } @Override @@ -143,24 +189,6 @@ public class ViewKeyActivity extends ActionBarActivity { case R.id.menu_key_view_export_file: exportToFile(mDataUri, mExportHelper, mProviderHelper); return true; - case R.id.menu_key_view_share_default_fingerprint: - shareKey(mDataUri, true, mProviderHelper); - return true; - case R.id.menu_key_view_share_default: - shareKey(mDataUri, false, mProviderHelper); - return true; - case R.id.menu_key_view_share_qr_code_fingerprint: - shareKeyQrCode(mDataUri, true); - return true; - case R.id.menu_key_view_share_qr_code: - shareKeyQrCode(mDataUri, false); - return true; - case R.id.menu_key_view_share_nfc: - shareNfc(); - return true; - case R.id.menu_key_view_share_clipboard: - copyToClipboard(mDataUri, mProviderHelper); - return true; case R.id.menu_key_view_delete: { deleteKey(mDataUri, mExportHelper); return true; @@ -209,84 +237,6 @@ public class ViewKeyActivity extends ActionBarActivity { startActivityForResult(queryIntent, REQUEST_CODE_LOOKUP_KEY); } - private void shareKey(Uri dataUri, boolean fingerprintOnly, ProviderHelper providerHelper) - throws ProviderHelper.NotFoundException { - String content = null; - if (fingerprintOnly) { - byte[] data = (byte[]) providerHelper.getGenericData( - KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri), - KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB); - if (data != null) { - String fingerprint = PgpKeyHelper.convertFingerprintToHex(data); - content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint; - } else { - AppMsg.makeText(this, "Bad key selected!", - AppMsg.STYLE_ALERT).show(); - return; - } - } else { - // get public keyring as ascii armored string - try { - Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri); - content = providerHelper.getKeyRingAsArmoredString(uri); - - // Android will fail with android.os.TransactionTooLargeException if key is too big - // see http://www.lonestarprod.com/?p=34 - if (content.length() >= 86389) { - AppMsg.makeText(this, R.string.key_too_big_for_sharing, - AppMsg.STYLE_ALERT).show(); - return; - } - } catch (IOException e) { - Log.e(Constants.TAG, "error processing key!", e); - AppMsg.makeText(this, R.string.error_invalid_data, AppMsg.STYLE_ALERT).show(); - } catch (ProviderHelper.NotFoundException e) { - Log.e(Constants.TAG, "key not found!", e); - AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show(); - } - } - - if (content != null) { - // let user choose application - Intent sendIntent = new Intent(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, content); - sendIntent.setType("text/plain"); - startActivity(Intent.createChooser(sendIntent, - getResources().getText(R.string.action_share_key_with))); - } else { - Log.e(Constants.TAG, "content is null!"); - } - } - - private void shareKeyQrCode(Uri dataUri, boolean fingerprintOnly) { - ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(dataUri, - fingerprintOnly); - dialog.show(getSupportFragmentManager(), "shareQrCodeDialog"); - } - - private void copyToClipboard(Uri dataUri, ProviderHelper providerHelper) { - // get public keyring as ascii armored string - try { - Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri); - String keyringArmored = providerHelper.getKeyRingAsArmoredString(uri); - - ClipboardReflection.copyToClipboard(this, keyringArmored); - AppMsg.makeText(this, R.string.key_copied_to_clipboard, AppMsg.STYLE_INFO) - .show(); - } catch (IOException e) { - Log.e(Constants.TAG, "error processing key!", e); - AppMsg.makeText(this, R.string.error_key_processing, AppMsg.STYLE_ALERT).show(); - } catch (ProviderHelper.NotFoundException e) { - Log.e(Constants.TAG, "key not found!", e); - AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show(); - } - } - - private void shareNfc() { - ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance(); - dialog.show(getSupportFragmentManager(), "shareNfcDialog"); - } - private void deleteKey(Uri dataUri, ExportHelper exportHelper) { // Message is received after key is deleted Handler returnHandler = new Handler() { @@ -409,4 +359,63 @@ public class ViewKeyActivity extends ActionBarActivity { } }; + static final String[] UNIFIED_PROJECTION = new String[]{ + KeychainContract.KeyRings._ID, + KeychainContract.KeyRings.MASTER_KEY_ID, + KeychainContract.KeyRings.USER_ID, + + }; + static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; + static final int INDEX_UNIFIED_USER_ID = 2; + + @Override + public Loader<Cursor> onCreateLoader(int id, Bundle args) { + switch (id) { + case LOADER_ID_UNIFIED: { + Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(mDataUri); + return new CursorLoader(this, baseUri, UNIFIED_PROJECTION, null, null, null); + } + + default: + return null; + } + } + + @Override + public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + /* TODO better error handling? May cause problems when a key is deleted, + * because the notification triggers faster than the activity closes. + */ + // Avoid NullPointerExceptions... + if (data.getCount() == 0) { + return; + } + // Swap the new cursor in. (The framework will take care of closing the + // old cursor once we return.) + switch (loader.getId()) { + case LOADER_ID_UNIFIED: { + if (data.moveToFirst()) { + // get name, email, and comment from USER_ID + String[] mainUserId = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_USER_ID)); + if (mainUserId[0] != null) { + setTitle(mainUserId[0]); + } else { + setTitle(R.string.user_id_no_name); + } + + // get key id from MASTER_KEY_ID + long masterKeyId = data.getLong(INDEX_UNIFIED_MASTER_KEY_ID); + String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId); + getSupportActionBar().setSubtitle(keyIdStr); + + break; + } + } + } + } + + @Override + public void onLoaderReset(Loader<Cursor> loader) { + + } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java index 3c4135715..e1c2013ea 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java @@ -75,6 +75,9 @@ public class ViewKeyCertsFragment extends Fragment private Uri mDataUri; + // starting with 4 for this fragment + private static final int LOADER_ID = 4; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.view_key_certs_fragment, container, false); @@ -112,7 +115,7 @@ public class ViewKeyCertsFragment extends Fragment mAdapter = new CertListAdapter(getActivity(), null); mStickyList.setAdapter(mAdapter); - getLoaderManager().initLoader(0, null, this); + getLoaderManager().initLoader(LOADER_ID, null, this); } @Override @@ -208,11 +211,18 @@ public class ViewKeyCertsFragment extends Fragment // set name and stuff, common to both key types TextView wSignerKeyId = (TextView) view.findViewById(R.id.signerKeyId); - TextView wSignerUserId = (TextView) view.findViewById(R.id.signerUserId); + TextView wSignerName = (TextView) view.findViewById(R.id.signerName); TextView wSignStatus = (TextView) view.findViewById(R.id.signStatus); String signerKeyId = PgpKeyHelper.convertKeyIdToHex(cursor.getLong(mIndexSignerKeyId)); - String signerUserId = cursor.getString(mIndexSignerUserId); + String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexSignerUserId)); + if (userId[0] != null) { + wSignerName.setText(userId[0]); + } else { + wSignerName.setText(R.string.user_id_no_name); + } + wSignerKeyId.setText(signerKeyId); + switch (cursor.getInt(mIndexType)) { case PGPSignature.DEFAULT_CERTIFICATION: // 0x10 wSignStatus.setText(R.string.cert_default); @@ -231,8 +241,6 @@ public class ViewKeyCertsFragment extends Fragment break; } - wSignerUserId.setText(signerUserId); - wSignerKeyId.setText(signerKeyId); view.setTag(R.id.tag_mki, cursor.getLong(mIndexMasterKeyId)); view.setTag(R.id.tag_rank, cursor.getLong(mIndexRank)); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java new file mode 100644 index 000000000..bb0e4b23a --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java @@ -0,0 +1,238 @@ +/* + * Copyright (C) 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.database.Cursor; +import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; +import android.text.format.DateFormat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; + +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; +import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; +import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; +import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter; +import org.sufficientlysecure.keychain.util.Log; + +import java.util.Date; + + +public class ViewKeyKeysFragment extends Fragment implements + LoaderManager.LoaderCallbacks<Cursor> { + + public static final String ARG_DATA_URI = "uri"; + + private LinearLayout mContainer; + private TextView mAlgorithm; + private TextView mKeyId; + private TextView mExpiry; + private TextView mCreation; + private TextView mFingerprint; + private TextView mSecretKey; + + private ListView mKeys; + + private static final int LOADER_ID_UNIFIED = 0; + private static final int LOADER_ID_KEYS = 1; + + private ViewKeyKeysAdapter mKeysAdapter; + + private Uri mDataUri; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.view_key_keys_fragment, container, false); + + mContainer = (LinearLayout) view.findViewById(R.id.container); + mKeyId = (TextView) view.findViewById(R.id.key_id); + mAlgorithm = (TextView) view.findViewById(R.id.algorithm); + mCreation = (TextView) view.findViewById(R.id.creation); + mExpiry = (TextView) view.findViewById(R.id.expiry); + mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint); + mSecretKey = (TextView) view.findViewById(R.id.secret_key); + mKeys = (ListView) view.findViewById(R.id.keys); + + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + Uri dataUri = getArguments().getParcelable(ARG_DATA_URI); + if (dataUri == null) { + Log.e(Constants.TAG, "Data missing. Should be Uri of key!"); + getActivity().finish(); + return; + } + + loadData(dataUri); + } + + private void loadData(Uri dataUri) { + getActivity().setProgressBarIndeterminateVisibility(true); + mContainer.setVisibility(View.GONE); + + mDataUri = dataUri; + + Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString()); + + mKeysAdapter = new ViewKeyKeysAdapter(getActivity(), null, 0); + mKeys.setAdapter(mKeysAdapter); + + // Prepare the loaders. Either re-connect with an existing ones, + // or start new ones. + getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this); + getLoaderManager().initLoader(LOADER_ID_KEYS, null, this); + } + + static final String[] UNIFIED_PROJECTION = new String[] { + KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET, + KeyRings.USER_ID, KeyRings.FINGERPRINT, + KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY, + + }; + static final int INDEX_UNIFIED_MKI = 1; + static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2; + static final int INDEX_UNIFIED_UID = 3; + static final int INDEX_UNIFIED_FINGERPRINT = 4; + static final int INDEX_UNIFIED_ALGORITHM = 5; + static final int INDEX_UNIFIED_KEY_SIZE = 6; + static final int INDEX_UNIFIED_CREATION = 7; + static final int INDEX_UNIFIED_EXPIRY = 8; + + static final String[] KEYS_PROJECTION = new String[] { + Keys._ID, + Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET, + Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED, + Keys.CREATION, Keys.EXPIRY, Keys.FINGERPRINT + }; + static final int KEYS_INDEX_CAN_ENCRYPT = 7; + + public Loader<Cursor> onCreateLoader(int id, Bundle args) { + switch (id) { + case LOADER_ID_UNIFIED: { + Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri); + return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null); + } + case LOADER_ID_KEYS: { + Uri baseUri = Keys.buildKeysUri(mDataUri); + return new CursorLoader(getActivity(), baseUri, KEYS_PROJECTION, null, null, null); + } + + default: + return null; + } + } + + public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + /* TODO better error handling? May cause problems when a key is deleted, + * because the notification triggers faster than the activity closes. + */ + // Avoid NullPointerExceptions... + if(data.getCount() == 0) { + return; + } + // Swap the new cursor in. (The framework will take care of closing the + // old cursor once we return.) + switch (loader.getId()) { + case LOADER_ID_UNIFIED: { + if (data.moveToFirst()) { + if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) { + mSecretKey.setTextColor(getResources().getColor(R.color.emphasis)); + mSecretKey.setText(R.string.secret_key_yes); + } else { + mSecretKey.setTextColor(Color.BLACK); + mSecretKey.setText(getResources().getString(R.string.secret_key_no)); + } + + // get key id from MASTER_KEY_ID + long masterKeyId = data.getLong(INDEX_UNIFIED_MKI); + String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId); + mKeyId.setText(keyIdStr); + + // get creation date from CREATION + if (data.isNull(INDEX_UNIFIED_CREATION)) { + mCreation.setText(R.string.none); + } else { + Date creationDate = new Date(data.getLong(INDEX_UNIFIED_CREATION) * 1000); + + mCreation.setText( + DateFormat.getDateFormat(getActivity().getApplicationContext()).format( + creationDate)); + } + + // get expiry date from EXPIRY + if (data.isNull(INDEX_UNIFIED_EXPIRY)) { + mExpiry.setText(R.string.none); + } else { + Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000); + + mExpiry.setText( + DateFormat.getDateFormat(getActivity().getApplicationContext()).format( + expiryDate)); + } + + String algorithmStr = PgpKeyHelper.getAlgorithmInfo( + getActivity(), + data.getInt(INDEX_UNIFIED_ALGORITHM), + data.getInt(INDEX_UNIFIED_KEY_SIZE) + ); + mAlgorithm.setText(algorithmStr); + + byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT); + String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob); + mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint)); + + break; + } + } + + case LOADER_ID_KEYS: + mKeysAdapter.swapCursor(data); + break; + } + getActivity().setProgressBarIndeterminateVisibility(false); + mContainer.setVisibility(View.VISIBLE); + } + + /** + * This is called when the last Cursor provided to onLoadFinished() above is about to be closed. + * We need to make sure we are no longer using it. + */ + public void onLoaderReset(Loader<Cursor> loader) { + switch (loader.getId()) { + case LOADER_ID_KEYS: + mKeysAdapter.swapCursor(null); + break; + } + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java index ef4da3010..43e484ffe 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java @@ -19,66 +19,46 @@ package org.sufficientlysecure.keychain.ui; import android.content.Intent; import android.database.Cursor; -import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; -import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.ListView; -import android.widget.TextView; - -import com.beardedhen.androidbootstrap.BootstrapButton; import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; -import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData; +import org.sufficientlysecure.keychain.R;import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter; import org.sufficientlysecure.keychain.ui.adapter.ViewKeyUserIdsAdapter; import org.sufficientlysecure.keychain.util.Log; -import java.util.Date; - - public class ViewKeyMainFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { public static final String ARG_DATA_URI = "uri"; private LinearLayout mContainer; - private TextView mName; - private TextView mEmail; - private TextView mComment; - private TextView mAlgorithm; - private TextView mKeyId; - private TextView mExpiry; - private TextView mCreation; - private TextView mFingerprint; - private TextView mSecretKey; - private BootstrapButton mActionEdit; - private BootstrapButton mActionEncrypt; - private BootstrapButton mActionCertify; + private View mActionEdit; + private View mActionEditDivider; + private View mActionEncrypt; + private View mActionCertify; + private View mActionCertifyDivider; private ListView mUserIds; - private ListView mKeys; private static final int LOADER_ID_UNIFIED = 0; private static final int LOADER_ID_USER_IDS = 1; private static final int LOADER_ID_KEYS = 2; private ViewKeyUserIdsAdapter mUserIdsAdapter; - private ViewKeyKeysAdapter mKeysAdapter; private Uri mDataUri; @@ -87,20 +67,12 @@ public class ViewKeyMainFragment extends Fragment implements View view = inflater.inflate(R.layout.view_key_main_fragment, container, false); mContainer = (LinearLayout) view.findViewById(R.id.container); - mName = (TextView) view.findViewById(R.id.name); - mEmail = (TextView) view.findViewById(R.id.email); - mComment = (TextView) view.findViewById(R.id.comment); - mKeyId = (TextView) view.findViewById(R.id.key_id); - mAlgorithm = (TextView) view.findViewById(R.id.algorithm); - mCreation = (TextView) view.findViewById(R.id.creation); - mExpiry = (TextView) view.findViewById(R.id.expiry); - mFingerprint = (TextView) view.findViewById(R.id.fingerprint); - mSecretKey = (TextView) view.findViewById(R.id.secret_key); - mUserIds = (ListView) view.findViewById(R.id.user_ids); - mKeys = (ListView) view.findViewById(R.id.keys); - mActionEdit = (BootstrapButton) view.findViewById(R.id.action_edit); - mActionEncrypt = (BootstrapButton) view.findViewById(R.id.action_encrypt); - mActionCertify = (BootstrapButton) view.findViewById(R.id.action_certify); + mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids); + mActionEdit = view.findViewById(R.id.view_key_action_edit); + mActionEditDivider = view.findViewById(R.id.view_key_action_edit_divider); + mActionEncrypt = view.findViewById(R.id.view_key_action_encrypt); + mActionCertify = view.findViewById(R.id.view_key_action_certify); + mActionCertifyDivider = view.findViewById(R.id.view_key_action_certify_divider); return view; } @@ -120,11 +92,6 @@ public class ViewKeyMainFragment extends Fragment implements } private void loadData(Uri dataUri) { - if (dataUri.equals(mDataUri)) { - Log.d(Constants.TAG, "Same URI, no need to load the data again!"); - return; - } - getActivity().setProgressBarIndeterminateVisibility(true); mContainer.setVisibility(View.GONE); @@ -135,44 +102,46 @@ public class ViewKeyMainFragment extends Fragment implements mActionEncrypt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - encryptToContact(mDataUri); + encrypt(mDataUri); } }); mActionCertify.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { - certifyKey(mDataUri); + certify(mDataUri); + } + }); + mActionEdit.setOnClickListener(new View.OnClickListener() { + public void onClick(View view) { + editKey(mDataUri); } }); mUserIdsAdapter = new ViewKeyUserIdsAdapter(getActivity(), null, 0); mUserIds.setAdapter(mUserIdsAdapter); - mKeysAdapter = new ViewKeyKeysAdapter(getActivity(), null, 0); - mKeys.setAdapter(mKeysAdapter); - // Prepare the loaders. Either re-connect with an existing ones, // or start new ones. - getActivity().getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this); - getActivity().getSupportLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this); - getActivity().getSupportLoaderManager().initLoader(LOADER_ID_KEYS, null, this); + getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this); + getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this); + getLoaderManager().initLoader(LOADER_ID_KEYS, null, this); } - static final String[] UNIFIED_PROJECTION = new String[] { - KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET, + static final String[] UNIFIED_PROJECTION = new String[]{ + KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET, KeyRings.USER_ID, KeyRings.FINGERPRINT, KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY, }; - static final int INDEX_UNIFIED_MKI = 1; + static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2; - static final int INDEX_UNIFIED_UID = 3; + static final int INDEX_UNIFIED_USER_ID = 3; static final int INDEX_UNIFIED_FINGERPRINT = 4; static final int INDEX_UNIFIED_ALGORITHM = 5; static final int INDEX_UNIFIED_KEY_SIZE = 6; static final int INDEX_UNIFIED_CREATION = 7; static final int INDEX_UNIFIED_EXPIRY = 8; - static final String[] KEYS_PROJECTION = new String[] { + static final String[] KEYS_PROJECTION = new String[]{ Keys._ID, Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET, Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED, @@ -205,7 +174,7 @@ public class ViewKeyMainFragment extends Fragment implements * because the notification triggers faster than the activity closes. */ // Avoid NullPointerExceptions... - if(data.getCount() == 0) { + if (data.getCount() == 0) { return; } // Swap the new cursor in. (The framework will take care of closing the @@ -213,81 +182,24 @@ public class ViewKeyMainFragment extends Fragment implements switch (loader.getId()) { case LOADER_ID_UNIFIED: { if (data.moveToFirst()) { - // get name, email, and comment from USER_ID - String[] mainUserId = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_UID)); - if (mainUserId[0] != null) { - getActivity().setTitle(mainUserId[0]); - mName.setText(mainUserId[0]); - } else { - getActivity().setTitle(R.string.user_id_no_name); - mName.setText(R.string.user_id_no_name); - } - mEmail.setText(mainUserId[1]); - mComment.setText(mainUserId[2]); - if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) { - mSecretKey.setTextColor(getResources().getColor(R.color.emphasis)); - mSecretKey.setText(R.string.secret_key_yes); + // certify button + mActionCertify.setVisibility(View.GONE); + mActionCertifyDivider.setVisibility(View.GONE); // edit button mActionEdit.setVisibility(View.VISIBLE); - mActionEdit.setOnClickListener(new View.OnClickListener() { - public void onClick(View view) { - Intent editIntent = new Intent(getActivity(), EditKeyActivity.class); - editIntent.setData( - KeyRingData.buildSecretKeyRingUri(mDataUri)); - editIntent.setAction(EditKeyActivity.ACTION_EDIT_KEY); - startActivityForResult(editIntent, 0); - } - }); + mActionEditDivider.setVisibility(View.VISIBLE); } else { - mSecretKey.setTextColor(Color.BLACK); - mSecretKey.setText(getResources().getString(R.string.secret_key_no)); - // certify button mActionCertify.setVisibility(View.VISIBLE); + mActionCertifyDivider.setVisibility(View.VISIBLE); + // edit button mActionEdit.setVisibility(View.GONE); + mActionEditDivider.setVisibility(View.GONE); } - // get key id from MASTER_KEY_ID - long masterKeyId = data.getLong(INDEX_UNIFIED_MKI); - String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId); - mKeyId.setText(keyIdStr); - - // get creation date from CREATION - if (data.isNull(INDEX_UNIFIED_CREATION)) { - mCreation.setText(R.string.none); - } else { - Date creationDate = new Date(data.getLong(INDEX_UNIFIED_CREATION) * 1000); - - mCreation.setText( - DateFormat.getDateFormat(getActivity().getApplicationContext()).format( - creationDate)); - } - - // get expiry date from EXPIRY - if (data.isNull(INDEX_UNIFIED_EXPIRY)) { - mExpiry.setText(R.string.none); - } else { - Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000); - - mExpiry.setText( - DateFormat.getDateFormat(getActivity().getApplicationContext()).format( - expiryDate)); - } - - String algorithmStr = PgpKeyHelper.getAlgorithmInfo( - getActivity(), - data.getInt(INDEX_UNIFIED_ALGORITHM), - data.getInt(INDEX_UNIFIED_KEY_SIZE) - ); - mAlgorithm.setText(algorithmStr); - - byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT); - String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob); - mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint)); - break; } } @@ -307,11 +219,12 @@ public class ViewKeyMainFragment extends Fragment implements break; } } while (data.moveToNext()); - if (!canEncrypt) { + if (canEncrypt) { + mActionEncrypt.setVisibility(View.VISIBLE); + } else { mActionEncrypt.setVisibility(View.GONE); } - mKeysAdapter.swapCursor(data); break; } getActivity().setProgressBarIndeterminateVisibility(false); @@ -327,16 +240,13 @@ public class ViewKeyMainFragment extends Fragment implements case LOADER_ID_USER_IDS: mUserIdsAdapter.swapCursor(null); break; - case LOADER_ID_KEYS: - mKeysAdapter.swapCursor(null); - break; } } - private void encryptToContact(Uri dataUri) { + private void encrypt(Uri dataUri) { try { long keyId = new ProviderHelper(getActivity()).extractOrGetMasterKeyId(dataUri); - long[] encryptionKeyIds = new long[]{ keyId }; + long[] encryptionKeyIds = new long[]{keyId}; Intent intent = new Intent(getActivity(), EncryptActivity.class); intent.setAction(EncryptActivity.ACTION_ENCRYPT); intent.putExtra(EncryptActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds); @@ -347,10 +257,17 @@ public class ViewKeyMainFragment extends Fragment implements } } - private void certifyKey(Uri dataUri) { + private void certify(Uri dataUri) { Intent signIntent = new Intent(getActivity(), CertifyKeyActivity.class); signIntent.setData(dataUri); startActivity(signIntent); } + private void editKey(Uri dataUri) { + Intent editIntent = new Intent(getActivity(), EditKeyActivity.class); + editIntent.setData(KeychainContract.KeyRingData.buildSecretKeyRingUri(dataUri)); + editIntent.setAction(EditKeyActivity.ACTION_EDIT_KEY); + startActivityForResult(editIntent, 0); + } + } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java new file mode 100644 index 000000000..aacf30429 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java @@ -0,0 +1,313 @@ +/* + * Copyright (C) 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.annotation.TargetApi; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.support.v4.app.Fragment; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.devspark.appmsg.AppMsg; + +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; +import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; +import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; +import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; +import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment; +import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment; +import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.QrCodeUtils; + +import java.io.IOException; + + +public class ViewKeyShareFragment extends Fragment implements + LoaderManager.LoaderCallbacks<Cursor> { + + public static final String ARG_DATA_URI = "uri"; + + private LinearLayout mContainer; + private TextView mFingerprint; + private ImageView mFingerprintQrCode; + private View mFingerprintShareButton; + private View mFingerprintClipboardButton; + private View mKeyShareButton; + private View mKeyClipboardButton; + private View mNfcHelpButton; + private View mNfcPrefsButton; + + ProviderHelper mProviderHelper; + + private static final int QR_CODE_SIZE = 1000; + + private static final int LOADER_ID_UNIFIED = 0; + + private Uri mDataUri; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.view_key_share_fragment, container, false); + + mProviderHelper = new ProviderHelper(ViewKeyShareFragment.this.getActivity()); + + mContainer = (LinearLayout) view.findViewById(R.id.container); + mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint); + mFingerprintQrCode = (ImageView) view.findViewById(R.id.view_key_fingerprint_qr_code_image); + mFingerprintShareButton = view.findViewById(R.id.view_key_action_fingerprint_share); + mFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard); + mKeyShareButton = view.findViewById(R.id.view_key_action_key_share); + mKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard); + mNfcHelpButton = view.findViewById(R.id.view_key_action_nfc_help); + mNfcPrefsButton = view.findViewById(R.id.view_key_action_nfc_prefs); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + mNfcPrefsButton.setVisibility(View.VISIBLE); + } else { + mNfcPrefsButton.setVisibility(View.GONE); + } + + mFingerprintQrCode.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showQrCodeDialog(); + } + }); + + mFingerprintShareButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + share(mDataUri, mProviderHelper, true, false); + } + }); + mFingerprintClipboardButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + share(mDataUri, mProviderHelper, true, true); + } + }); + mKeyShareButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + share(mDataUri, mProviderHelper, false, false); + } + }); + mKeyClipboardButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + share(mDataUri, mProviderHelper, false, true); + } + }); + mNfcHelpButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showNfcHelpDialog(); + } + }); + mNfcPrefsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showNfcPrefs(); + } + }); + + return view; + } + + private void share(Uri dataUri, ProviderHelper providerHelper, boolean fingerprintOnly, + boolean toClipboard) { + try { + String content; + if (fingerprintOnly) { + byte[] data = (byte[]) providerHelper.getGenericData( + KeyRings.buildUnifiedKeyRingUri(dataUri), + Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB); + String fingerprint = PgpKeyHelper.convertFingerprintToHex(data); + content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint; + } else { + // get public keyring as ascii armored string + Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri); + content = providerHelper.getKeyRingAsArmoredString(uri); + } + + if (toClipboard) { + ClipboardReflection.copyToClipboard(getActivity(), content); + String message; + if (fingerprintOnly) { + message = getResources().getString(R.string.fingerprint_copied_to_clipboard); + } else { + message = getResources().getString(R.string.key_copied_to_clipboard); + } + AppMsg.makeText(getActivity(), message, AppMsg.STYLE_INFO).show(); + } else { + // Android will fail with android.os.TransactionTooLargeException if key is too big + // see http://www.lonestarprod.com/?p=34 + if (content.length() >= 86389) { + AppMsg.makeText(getActivity(), R.string.key_too_big_for_sharing, + AppMsg.STYLE_ALERT).show(); + return; + } + + // let user choose application + Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, content); + sendIntent.setType("text/plain"); + String title; + if (fingerprintOnly) { + title = getResources().getString(R.string.title_share_fingerprint_with); + } else { + title = getResources().getString(R.string.title_share_key_with); + } + startActivity(Intent.createChooser(sendIntent, title)); + } + } catch (IOException e) { + Log.e(Constants.TAG, "error processing key!", e); + AppMsg.makeText(getActivity(), R.string.error_key_processing, AppMsg.STYLE_ALERT).show(); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show(); + } + } + + private void showQrCodeDialog() { + ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(mDataUri, + true); + dialog.show(ViewKeyShareFragment.this.getActivity().getSupportFragmentManager(), "shareQrCodeDialog"); + } + + private void showNfcHelpDialog() { + ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance(); + dialog.show(getActivity().getSupportFragmentManager(), "shareNfcDialog"); + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + private void showNfcPrefs() { + Intent intentSettings = new Intent( + Settings.ACTION_NFCSHARING_SETTINGS); + startActivity(intentSettings); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + Uri dataUri = getArguments().getParcelable(ARG_DATA_URI); + if (dataUri == null) { + Log.e(Constants.TAG, "Data missing. Should be Uri of key!"); + getActivity().finish(); + return; + } + + loadData(dataUri); + } + + private void loadData(Uri dataUri) { + getActivity().setProgressBarIndeterminateVisibility(true); + mContainer.setVisibility(View.GONE); + + mDataUri = dataUri; + + Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString()); + + // Prepare the loaders. Either re-connect with an existing ones, + // or start new ones. + getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this); + } + + static final String[] UNIFIED_PROJECTION = new String[]{ + KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET, + KeyRings.USER_ID, KeyRings.FINGERPRINT, + KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY, + + }; + static final int INDEX_UNIFIED_MASTER_KEY_ID = 1; + static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2; + static final int INDEX_UNIFIED_USER_ID = 3; + static final int INDEX_UNIFIED_FINGERPRINT = 4; + static final int INDEX_UNIFIED_ALGORITHM = 5; + static final int INDEX_UNIFIED_KEY_SIZE = 6; + static final int INDEX_UNIFIED_CREATION = 7; + static final int INDEX_UNIFIED_EXPIRY = 8; + + public Loader<Cursor> onCreateLoader(int id, Bundle args) { + switch (id) { + case LOADER_ID_UNIFIED: { + Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri); + return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null); + } + + default: + return null; + } + } + + public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + /* TODO better error handling? May cause problems when a key is deleted, + * because the notification triggers faster than the activity closes. + */ + // Avoid NullPointerExceptions... + if (data.getCount() == 0) { + return; + } + // Swap the new cursor in. (The framework will take care of closing the + // old cursor once we return.) + switch (loader.getId()) { + case LOADER_ID_UNIFIED: { + if (data.moveToFirst()) { + + byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT); + String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob); + mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint)); + + String qrCodeContent = Constants.FINGERPRINT_SCHEME + ":" + fingerprint; + mFingerprintQrCode.setImageBitmap( + QrCodeUtils.getQRCodeBitmap(qrCodeContent, QR_CODE_SIZE) + ); + + break; + } + } + + } + getActivity().setProgressBarIndeterminateVisibility(false); + mContainer.setVisibility(View.VISIBLE); + } + + /** + * This is called when the last Cursor provided to onLoadFinished() above is about to be closed. + * We need to make sure we are no longer using it. + */ + public void onLoaderReset(Loader<Cursor> loader) { + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java index f4fa7f3bf..c9070c897 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java @@ -28,7 +28,6 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.LinearLayout; -import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; import org.sufficientlysecure.keychain.R; @@ -106,7 +105,7 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> { holder.mainUserId = (TextView) convertView.findViewById(R.id.mainUserId); holder.mainUserIdRest = (TextView) convertView.findViewById(R.id.mainUserIdRest); holder.keyId = (TextView) convertView.findViewById(R.id.keyId); - holder.fingerprint = (TextView) convertView.findViewById(R.id.fingerprint); + holder.fingerprint = (TextView) convertView.findViewById(R.id.view_key_fingerprint); holder.algorithm = (TextView) convertView.findViewById(R.id.algorithm); holder.status = (TextView) convertView.findViewById(R.id.status); holder.userIdsList = (LinearLayout) convertView.findViewById(R.id.user_ids_list); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java index b06852af4..1610bfeab 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java @@ -203,7 +203,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable { * Constructor for later querying from keyserver */ public ImportKeysListEntry() { - // keys from keyserver are always public keys + // keys from keyserver are always public keys; from keybase too secretKey = false; // do not select by default mSelected = false; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java new file mode 100644 index 000000000..e66032482 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 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.adapter; + +import android.content.Context; +import android.support.v4.content.AsyncTaskLoader; + +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.util.KeyServer; +import org.sufficientlysecure.keychain.util.KeybaseKeyServer; +import org.sufficientlysecure.keychain.util.Log; + +import java.util.ArrayList; + +public class ImportKeysListKeybaseLoader + extends AsyncTaskLoader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> { + Context mContext; + + String mKeybaseQuery; + + private ArrayList<ImportKeysListEntry> mEntryList = new ArrayList<ImportKeysListEntry>(); + private AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> mEntryListWrapper; + + public ImportKeysListKeybaseLoader(Context context, String keybaseQuery) { + super(context); + mContext = context; + mKeybaseQuery = keybaseQuery; + } + + @Override + public AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> loadInBackground() { + + mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null); + + if (mKeybaseQuery == null) { + Log.e(Constants.TAG, "mKeybaseQery is null!"); + return mEntryListWrapper; + } + + queryServer(mKeybaseQuery); + + return mEntryListWrapper; + } + + @Override + protected void onReset() { + super.onReset(); + + // Ensure the loader is stopped + onStopLoading(); + } + + @Override + protected void onStartLoading() { + forceLoad(); + } + + @Override + protected void onStopLoading() { + cancelLoad(); + } + + @Override + public void deliverResult(AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> data) { + super.deliverResult(data); + } + + /** + * Query keybase + */ + private void queryServer(String query) { + + KeybaseKeyServer server = new KeybaseKeyServer(); + try { + ArrayList<ImportKeysListEntry> searchResult = server.search(query); + + mEntryList.clear(); + + mEntryList.addAll(searchResult); + mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null); + } catch (KeyServer.InsufficientQuery e) { + mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e); + } catch (KeyServer.QueryException e) { + mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e); + } catch (KeyServer.TooManyResponses e) { + mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e); + } + + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java index 838aeefee..65810064c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java @@ -116,13 +116,10 @@ public class ImportKeysListServerLoader } mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null); } catch (KeyServer.InsufficientQuery e) { - Log.e(Constants.TAG, "InsufficientQuery", e); mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e); } catch (KeyServer.QueryException e) { - Log.e(Constants.TAG, "QueryException", e); mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e); } catch (KeyServer.TooManyResponses e) { - Log.e(Constants.TAG, "TooManyResponses", e); mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java index fd864eb09..977740567 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java @@ -17,7 +17,7 @@ package org.sufficientlysecure.keychain.ui.adapter; -import android.content.Context; +import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; @@ -26,8 +26,8 @@ import android.support.v7.app.ActionBarActivity; import java.util.ArrayList; public class PagerTabStripAdapter extends FragmentPagerAdapter { - private final Context mContext; - private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); + protected final Activity mActivity; + protected final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); static final class TabInfo { public final Class<?> clss; @@ -43,7 +43,7 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter { public PagerTabStripAdapter(ActionBarActivity activity) { super(activity.getSupportFragmentManager()); - mContext = activity; + mActivity = activity; } public void addTab(Class<?> clss, Bundle args, String title) { @@ -60,7 +60,7 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter { @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); - return Fragment.instantiate(mContext, info.clss.getName(), info.args); + return Fragment.instantiate(mActivity, info.clss.getName(), info.args); } @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java index 52e6dec92..05f8f8860 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java @@ -27,6 +27,7 @@ import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import org.sufficientlysecure.keychain.R; @@ -106,40 +107,55 @@ public class ViewKeyUserIdsAdapter extends CursorAdapter implements AdapterView. @Override public void bindView(View view, Context context, Cursor cursor) { - TextView vRank = (TextView) view.findViewById(R.id.rank); - TextView vUserId = (TextView) view.findViewById(R.id.userId); + TextView vName = (TextView) view.findViewById(R.id.userId); TextView vAddress = (TextView) view.findViewById(R.id.address); + TextView vComment = (TextView) view.findViewById(R.id.comment); ImageView vVerified = (ImageView) view.findViewById(R.id.certified); + ImageView vPrimaryUserIdIcon = (ImageView) view.findViewById(R.id.primary_user_id_icon); - if (cursor.getInt(mIsPrimary) > 0) { - vRank.setText("+"); + String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexUserId)); + if (userId[0] != null) { + vName.setText(userId[0]); } else { - vRank.setText(Integer.toString(cursor.getInt(mIndexRank))); + vName.setText(R.string.user_id_no_name); + } + if (userId[1] != null) { + vAddress.setText(userId[1]); + vAddress.setVisibility(View.VISIBLE); + } else { + vAddress.setVisibility(View.GONE); + } + if (userId[2] != null) { + vComment.setText(userId[2]); + vComment.setVisibility(View.VISIBLE); + } else { + vComment.setVisibility(View.GONE); } - String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexUserId)); - if (userId[0] != null) { - vUserId.setText(userId[0]); + // show small star icon for primary user ids + if (cursor.getInt(mIsPrimary) > 0) { + vPrimaryUserIdIcon.setVisibility(View.VISIBLE); } else { - vUserId.setText(R.string.user_id_no_name); + vPrimaryUserIdIcon.setVisibility(View.GONE); } - vAddress.setText(userId[1]); if (cursor.getInt(mIsRevoked) > 0) { - vRank.setText(" "); + // no star icon for revoked user ids! + vPrimaryUserIdIcon.setVisibility(View.GONE); + + // set revocation icon vVerified.setImageResource(R.drawable.key_certify_revoke); // disable and strike through text for revoked user ids - vUserId.setEnabled(false); + vName.setEnabled(false); vAddress.setEnabled(false); - vUserId.setText(OtherHelper.strikeOutText(vUserId.getText())); + vName.setText(OtherHelper.strikeOutText(vName.getText())); vAddress.setText(OtherHelper.strikeOutText(vAddress.getText())); } else { - vUserId.setEnabled(true); + vName.setEnabled(true); vAddress.setEnabled(true); int verified = cursor.getInt(mVerifiedId); - // TODO introduce own resources for this :) switch (verified) { case Certs.VERIFIED_SECRET: vVerified.setImageResource(R.drawable.key_certify_ok_depth0); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java index cf658b0b6..b81fba05d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java @@ -34,7 +34,6 @@ import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; @@ -167,21 +166,6 @@ public class HkpKeyServer extends KeyServer { mPort = port; } - private static String readAll(InputStream in, String encoding) throws IOException { - ByteArrayOutputStream raw = new ByteArrayOutputStream(); - - byte buffer[] = new byte[1 << 16]; - int n = 0; - while ((n = in.read(buffer)) != -1) { - raw.write(buffer, 0, n); - } - - if (encoding == null) { - encoding = "utf8"; - } - return raw.toString(encoding); - } - private String query(String request) throws QueryException, HttpError { InetAddress ips[]; try { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java new file mode 100644 index 000000000..7ae1d8fab --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2014 Tim Bray <tbray@textuality.com> + * + * 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.util; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Minimal hierarchy selector + */ +public class JWalk { + + public static int getInt(JSONObject json, String... path) throws JSONException { + json = walk(json, path); + return json.getInt(path[path.length - 1]); + } + + public static long getLong(JSONObject json, String... path) throws JSONException { + json = walk(json, path); + return json.getLong(path[path.length - 1]); + } + + public static String getString(JSONObject json, String... path) throws JSONException { + json = walk(json, path); + return json.getString(path[path.length - 1]); + } + + public static JSONArray getArray(JSONObject json, String... path) throws JSONException { + json = walk(json, path); + return json.getJSONArray(path[path.length - 1]); + } + + public static JSONObject optObject(JSONObject json, String... path) throws JSONException { + json = walk(json, path); + return json.optJSONObject(path[path.length - 1]); + } + + private static JSONObject walk(JSONObject json, String... path) throws JSONException { + int len = path.length - 1; + int pathIndex = 0; + try { + while (pathIndex < len) { + json = json.getJSONObject(path[pathIndex]); + pathIndex++; + } + } catch (JSONException e) { + // try to give ’em a nice-looking error + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < len; i++) { + sb.append(path[i]).append('.'); + } + sb.append(path[len]); + throw new JSONException("JWalk error at step " + pathIndex + " of " + sb); + } + return json; + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java index 2b97165ac..94c02a773 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java @@ -20,6 +20,9 @@ package org.sufficientlysecure.keychain.util; import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.List; public abstract class KeyServer { @@ -49,4 +52,19 @@ public abstract class KeyServer { abstract String get(String keyIdHex) throws QueryException; abstract void add(String armoredKey) throws AddKeyException; + + public static String readAll(InputStream in, String encoding) throws IOException { + ByteArrayOutputStream raw = new ByteArrayOutputStream(); + + byte buffer[] = new byte[1 << 16]; + int n = 0; + while ((n = in.read(buffer)) != -1) { + raw.write(buffer, 0, n); + } + + if (encoding == null) { + encoding = "utf8"; + } + return raw.toString(encoding); + } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java new file mode 100644 index 000000000..654fe55f8 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2014 Tim Bray <tbray@textuality.com> + * + * 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.util; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.GregorianCalendar; +import java.util.TimeZone; +import java.util.WeakHashMap; + +public class KeybaseKeyServer extends KeyServer { + + private WeakHashMap<String, String> mKeyCache = new WeakHashMap<String, String>(); + + @Override + public ArrayList<ImportKeysListEntry> search(String query) throws QueryException, TooManyResponses, + InsufficientQuery { + ArrayList<ImportKeysListEntry> results = new ArrayList<ImportKeysListEntry>(); + + JSONObject fromQuery = getFromKeybase("_/api/1.0/user/autocomplete.json?q=", query); + try { + + JSONArray matches = JWalk.getArray(fromQuery, "completions"); + for (int i = 0; i < matches.length(); i++) { + JSONObject match = matches.getJSONObject(i); + + // only list them if they have a key + if (JWalk.optObject(match, "components", "key_fingerprint") != null) { + results.add(makeEntry(match)); + } + } + } catch (Exception e) { + throw new QueryException("Unexpected structure in keybase search result: " + e.getMessage()); + } + + return results; + } + + private JSONObject getUser(String keybaseID) throws QueryException { + try { + return getFromKeybase("_/api/1.0/user/lookup.json?username=", keybaseID); + } catch (Exception e) { + String detail = ""; + if (keybaseID != null) { + detail = ". Query was for user '" + keybaseID + "'"; + } + throw new QueryException(e.getMessage() + detail); + } + } + + private ImportKeysListEntry makeEntry(JSONObject match) throws QueryException, JSONException { + + String keybaseID = JWalk.getString(match, "components", "username", "val"); + String key_fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val"); + key_fingerprint = key_fingerprint.replace(" ", "").toUpperCase(); + match = getUser(keybaseID); + + final ImportKeysListEntry entry = new ImportKeysListEntry(); + + // TODO: Fix; have suggested keybase provide this value to avoid search-time crypto calls + entry.setBitStrength(4096); + entry.setAlgorithm("RSA"); + entry.setKeyIdHex("0x" + key_fingerprint); + entry.setRevoked(false); + + // ctime + final long creationDate = JWalk.getLong(match, "them", "public_keys", "primary", "ctime"); + final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + tmpGreg.setTimeInMillis(creationDate * 1000); + entry.setDate(tmpGreg.getTime()); + + // key bits + // we have to fetch the user object to construct the search-result list, so we might as + // well (weakly) remember the key, in case they try to import it + mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle")); + + // String displayName = JWalk.getString(match, "them", "profile", "full_name"); + ArrayList<String> userIds = new ArrayList<String>(); + String name = "keybase.io/" + keybaseID + " <" + keybaseID + "@keybase.io>"; + userIds.add(name); + userIds.add(keybaseID); + entry.setUserIds(userIds); + entry.setPrimaryUserId(name); + return entry; + } + + private JSONObject getFromKeybase(String path, String query) throws QueryException { + try { + String url = "https://keybase.io/" + path + URLEncoder.encode(query, "utf8"); + Log.d(Constants.TAG, "keybase query: " + url); + + URL realUrl = new URL(url); + HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); + conn.setConnectTimeout(5000); // TODO: Reasonable values for keybase + conn.setReadTimeout(25000); + conn.connect(); + int response = conn.getResponseCode(); + if (response >= 200 && response < 300) { + String text = readAll(conn.getInputStream(), conn.getContentEncoding()); + try { + JSONObject json = new JSONObject(text); + if (JWalk.getInt(json, "status", "code") != 0) { + throw new QueryException("Keybase autocomplete search failed"); + } + return json; + } catch (JSONException e) { + throw new QueryException("Keybase.io query returned broken JSON"); + } + } else { + String message = readAll(conn.getErrorStream(), conn.getContentEncoding()); + throw new QueryException("Keybase.io query error (status=" + response + + "): " + message); + } + } catch (Exception e) { + throw new QueryException("Keybase.io query error"); + } + } + + @Override + public String get(String id) throws QueryException { + String key = mKeyCache.get(id); + if (key == null) { + try { + JSONObject user = getUser(id); + key = JWalk.getString(user, "them", "public_keys", "primary", "bundle"); + } catch (Exception e) { + throw new QueryException(e.getMessage()); + } + } + return key; + } + + @Override + public void add(String armoredKey) throws AddKeyException { + throw new AddKeyException(); + } +}
\ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java new file mode 100644 index 000000000..065034be1 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java @@ -0,0 +1,318 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sufficientlysecure.keychain.util; + +import android.content.Context; +import android.graphics.Typeface; +import android.os.Build; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.HorizontalScrollView; +import android.widget.TextView; + +/** + * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html + */ + +/** + * To be used with ViewPager to provide a tab indicator component which give constant feedback as to + * the user's scroll progress. + * <p/> + * To use the component, simply add it to your view hierarchy. Then in your + * {@link android.app.Activity} or {@link android.support.v4.app.Fragment} call + * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for. + * <p/> + * The colors can be customized in two ways. The first and simplest is to provide an array of colors + * via {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)}. The + * alternative is via the {@link TabColorizer} interface which provides you complete control over + * which color is used for any individual position. + * <p/> + * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)}, + * providing the layout ID of your custom layout. + */ +public class SlidingTabLayout extends HorizontalScrollView { + + /** + * Allows complete control over the colors drawn in the tab layout. Set with + * {@link #setCustomTabColorizer(TabColorizer)}. + */ + public interface TabColorizer { + + /** + * @return return the color of the indicator used when {@code position} is selected. + */ + int getIndicatorColor(int position); + + /** + * @return return the color of the divider drawn to the right of {@code position}. + */ + int getDividerColor(int position); + + } + + private static final int TITLE_OFFSET_DIPS = 24; + private static final int TAB_VIEW_PADDING_DIPS = 16; + private static final int TAB_VIEW_TEXT_SIZE_SP = 12; + + private int mTitleOffset; + + private int mTabViewLayoutId; + private int mTabViewTextViewId; + + private ViewPager mViewPager; + private ViewPager.OnPageChangeListener mViewPagerPageChangeListener; + + private final SlidingTabStrip mTabStrip; + + public SlidingTabLayout(Context context) { + this(context, null); + } + + public SlidingTabLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // Disable the Scroll Bar + setHorizontalScrollBarEnabled(false); + // Make sure that the Tab Strips fills this View + setFillViewport(true); + + mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density); + + mTabStrip = new SlidingTabStrip(context); + addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + } + + /** + * Set the custom {@link TabColorizer} to be used. + * <p/> + * If you only require simple custmisation then you can use + * {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)} to achieve + * similar effects. + */ + public void setCustomTabColorizer(TabColorizer tabColorizer) { + mTabStrip.setCustomTabColorizer(tabColorizer); + } + + /** + * Sets the colors to be used for indicating the selected tab. These colors are treated as a + * circular array. Providing one color will mean that all tabs are indicated with the same color. + */ + public void setSelectedIndicatorColors(int... colors) { + mTabStrip.setSelectedIndicatorColors(colors); + } + + /** + * Sets the colors to be used for tab dividers. These colors are treated as a circular array. + * Providing one color will mean that all tabs are indicated with the same color. + */ + public void setDividerColors(int... colors) { + mTabStrip.setDividerColors(colors); + } + + /** + * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are + * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so + * that the layout can update it's scroll position correctly. + * + * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener) + */ + public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { + mViewPagerPageChangeListener = listener; + } + + /** + * Set the custom layout to be inflated for the tab views. + * + * @param layoutResId Layout id to be inflated + * @param textViewId id of the {@link TextView} in the inflated view + */ + public void setCustomTabView(int layoutResId, int textViewId) { + mTabViewLayoutId = layoutResId; + mTabViewTextViewId = textViewId; + } + + /** + * Sets the associated view pager. Note that the assumption here is that the pager content + * (number of tabs and tab titles) does not change after this call has been made. + */ + public void setViewPager(ViewPager viewPager) { + mTabStrip.removeAllViews(); + + mViewPager = viewPager; + if (viewPager != null) { + viewPager.setOnPageChangeListener(new InternalViewPagerListener()); + populateTabStrip(); + } + } + + /** + * Create a default view to be used for tabs. This is called if a custom tab view is not set via + * {@link #setCustomTabView(int, int)}. + */ + protected TextView createDefaultTabView(Context context) { + TextView textView = new TextView(context); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP); + textView.setTypeface(Typeface.DEFAULT_BOLD); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + // If we're running on Honeycomb or newer, then we can use the Theme's + // selectableItemBackground to ensure that the View has a pressed state + TypedValue outValue = new TypedValue(); + getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, + outValue, true); + textView.setBackgroundResource(outValue.resourceId); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style + textView.setAllCaps(true); + } + + int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density); + textView.setPadding(padding, padding, padding, padding); + + return textView; + } + + private void populateTabStrip() { + final PagerAdapter adapter = mViewPager.getAdapter(); + final View.OnClickListener tabClickListener = new TabClickListener(); + + for (int i = 0; i < adapter.getCount(); i++) { + View tabView = null; + TextView tabTitleView = null; + + if (mTabViewLayoutId != 0) { + // If there is a custom tab view layout id set, try and inflate it + tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip, + false); + tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId); + } + + if (tabView == null) { + tabView = createDefaultTabView(getContext()); + } + + if (tabTitleView == null && TextView.class.isInstance(tabView)) { + tabTitleView = (TextView) tabView; + } + + tabTitleView.setText(adapter.getPageTitle(i)); + tabView.setOnClickListener(tabClickListener); + + mTabStrip.addView(tabView); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + if (mViewPager != null) { + scrollToTab(mViewPager.getCurrentItem(), 0); + } + } + + private void scrollToTab(int tabIndex, int positionOffset) { + final int tabStripChildCount = mTabStrip.getChildCount(); + if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { + return; + } + + View selectedChild = mTabStrip.getChildAt(tabIndex); + if (selectedChild != null) { + int targetScrollX = selectedChild.getLeft() + positionOffset; + + if (tabIndex > 0 || positionOffset > 0) { + // If we're not at the first child and are mid-scroll, make sure we obey the offset + targetScrollX -= mTitleOffset; + } + + scrollTo(targetScrollX, 0); + } + } + + private class InternalViewPagerListener implements ViewPager.OnPageChangeListener { + private int mScrollState; + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + int tabStripChildCount = mTabStrip.getChildCount(); + if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { + return; + } + + mTabStrip.onViewPagerPageChanged(position, positionOffset); + + View selectedTitle = mTabStrip.getChildAt(position); + int extraOffset = (selectedTitle != null) + ? (int) (positionOffset * selectedTitle.getWidth()) + : 0; + scrollToTab(position, extraOffset); + + if (mViewPagerPageChangeListener != null) { + mViewPagerPageChangeListener.onPageScrolled(position, positionOffset, + positionOffsetPixels); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + mScrollState = state; + + if (mViewPagerPageChangeListener != null) { + mViewPagerPageChangeListener.onPageScrollStateChanged(state); + } + } + + @Override + public void onPageSelected(int position) { + if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { + mTabStrip.onViewPagerPageChanged(position, 0f); + scrollToTab(position, 0); + } + + if (mViewPagerPageChangeListener != null) { + mViewPagerPageChangeListener.onPageSelected(position); + } + } + + } + + private class TabClickListener implements View.OnClickListener { + @Override + public void onClick(View v) { + for (int i = 0; i < mTabStrip.getChildCount(); i++) { + if (v == mTabStrip.getChildAt(i)) { + mViewPager.setCurrentItem(i); + return; + } + } + } + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java new file mode 100644 index 000000000..4b8c7e75d --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sufficientlysecure.keychain.util; + +import android.R; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.widget.LinearLayout; + +/** + * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html + */ +class SlidingTabStrip extends LinearLayout { + + private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 2; + private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26; + private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 8; + private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5; + + private static final int DEFAULT_DIVIDER_THICKNESS_DIPS = 1; + private static final byte DEFAULT_DIVIDER_COLOR_ALPHA = 0x20; + private static final float DEFAULT_DIVIDER_HEIGHT = 0.5f; + + private final int mBottomBorderThickness; + private final Paint mBottomBorderPaint; + + private final int mSelectedIndicatorThickness; + private final Paint mSelectedIndicatorPaint; + + private final int mDefaultBottomBorderColor; + + private final Paint mDividerPaint; + private final float mDividerHeight; + + private int mSelectedPosition; + private float mSelectionOffset; + + private SlidingTabLayout.TabColorizer mCustomTabColorizer; + private final SimpleTabColorizer mDefaultTabColorizer; + + SlidingTabStrip(Context context) { + this(context, null); + } + + SlidingTabStrip(Context context, AttributeSet attrs) { + super(context, attrs); + setWillNotDraw(false); + + final float density = getResources().getDisplayMetrics().density; + + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true); + final int themeForegroundColor = outValue.data; + + mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor, + DEFAULT_BOTTOM_BORDER_COLOR_ALPHA); + + mDefaultTabColorizer = new SimpleTabColorizer(); + mDefaultTabColorizer.setIndicatorColors(DEFAULT_SELECTED_INDICATOR_COLOR); + mDefaultTabColorizer.setDividerColors(setColorAlpha(themeForegroundColor, + DEFAULT_DIVIDER_COLOR_ALPHA)); + + mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density); + mBottomBorderPaint = new Paint(); + mBottomBorderPaint.setColor(mDefaultBottomBorderColor); + + mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density); + mSelectedIndicatorPaint = new Paint(); + + mDividerHeight = DEFAULT_DIVIDER_HEIGHT; + mDividerPaint = new Paint(); + mDividerPaint.setStrokeWidth((int) (DEFAULT_DIVIDER_THICKNESS_DIPS * density)); + } + + void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) { + mCustomTabColorizer = customTabColorizer; + invalidate(); + } + + void setSelectedIndicatorColors(int... colors) { + // Make sure that the custom colorizer is removed + mCustomTabColorizer = null; + mDefaultTabColorizer.setIndicatorColors(colors); + invalidate(); + } + + void setDividerColors(int... colors) { + // Make sure that the custom colorizer is removed + mCustomTabColorizer = null; + mDefaultTabColorizer.setDividerColors(colors); + invalidate(); + } + + void onViewPagerPageChanged(int position, float positionOffset) { + mSelectedPosition = position; + mSelectionOffset = positionOffset; + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + final int height = getHeight(); + final int childCount = getChildCount(); + final int dividerHeightPx = (int) (Math.min(Math.max(0f, mDividerHeight), 1f) * height); + final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null + ? mCustomTabColorizer + : mDefaultTabColorizer; + + // Thick colored underline below the current selection + if (childCount > 0) { + View selectedTitle = getChildAt(mSelectedPosition); + int left = selectedTitle.getLeft(); + int right = selectedTitle.getRight(); + int color = tabColorizer.getIndicatorColor(mSelectedPosition); + + if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) { + int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1); + if (color != nextColor) { + color = blendColors(nextColor, color, mSelectionOffset); + } + + // Draw the selection partway between the tabs + View nextTitle = getChildAt(mSelectedPosition + 1); + left = (int) (mSelectionOffset * nextTitle.getLeft() + + (1.0f - mSelectionOffset) * left); + right = (int) (mSelectionOffset * nextTitle.getRight() + + (1.0f - mSelectionOffset) * right); + } + + mSelectedIndicatorPaint.setColor(color); + + canvas.drawRect(left, height - mSelectedIndicatorThickness, right, + height, mSelectedIndicatorPaint); + } + + // Thin underline along the entire bottom edge + canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint); + + // Vertical separators between the titles + int separatorTop = (height - dividerHeightPx) / 2; + for (int i = 0; i < childCount - 1; i++) { + View child = getChildAt(i); + mDividerPaint.setColor(tabColorizer.getDividerColor(i)); + canvas.drawLine(child.getRight(), separatorTop, child.getRight(), + separatorTop + dividerHeightPx, mDividerPaint); + } + } + + /** + * Set the alpha value of the {@code color} to be the given {@code alpha} value. + */ + private static int setColorAlpha(int color, byte alpha) { + return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color)); + } + + /** + * Blend {@code color1} and {@code color2} using the given ratio. + * + * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend, + * 0.0 will return {@code color2}. + */ + private static int blendColors(int color1, int color2, float ratio) { + final float inverseRation = 1f - ratio; + float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation); + float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation); + float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation); + return Color.rgb((int) r, (int) g, (int) b); + } + + private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer { + private int[] mIndicatorColors; + private int[] mDividerColors; + + @Override + public final int getIndicatorColor(int position) { + return mIndicatorColors[position % mIndicatorColors.length]; + } + + @Override + public final int getDividerColor(int position) { + return mDividerColors[position % mDividerColors.length]; + } + + void setIndicatorColors(int... colors) { + mIndicatorColors = colors; + } + + void setDividerColors(int... colors) { + mDividerColors = colors; + } + } +}
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png Binary files differnew file mode 100644 index 000000000..22327391e --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png Binary files differnew file mode 100644 index 000000000..5f7c6eff3 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png Binary files differnew file mode 100644 index 000000000..38051d8d6 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png Binary files differnew file mode 100644 index 000000000..382d314ca --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png Binary files differnew file mode 100644 index 000000000..a1804b2c1 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png Binary files differnew file mode 100644 index 000000000..0eb78f7c7 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png Binary files differnew file mode 100644 index 000000000..713482020 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png Binary files differnew file mode 100644 index 000000000..650b4d899 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png Binary files differnew file mode 100644 index 000000000..13967b30a --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png Binary files differnew file mode 100644 index 000000000..5876cdea4 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png Binary files differnew file mode 100644 index 000000000..11a25b504 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png Binary files differnew file mode 100644 index 000000000..c290e5902 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png Binary files differnew file mode 100644 index 000000000..5ddf15139 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png Binary files differnew file mode 100644 index 000000000..8ab436d87 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png Binary files differnew file mode 100644 index 000000000..0bb45d2c0 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png Binary files differnew file mode 100644 index 000000000..19a9df332 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png Binary files differnew file mode 100644 index 000000000..40ca1572c --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png Binary files differnew file mode 100644 index 000000000..999d0f0d8 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png Binary files differnew file mode 100644 index 000000000..a0508df8c --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png Binary files differnew file mode 100644 index 000000000..f2b2078b0 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png Binary files differnew file mode 100644 index 000000000..fda51ad86 --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png Binary files differnew file mode 100644 index 000000000..c5a34319b --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png Binary files differnew file mode 100644 index 000000000..44754152f --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png Binary files differnew file mode 100644 index 000000000..530227e2d --- /dev/null +++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png diff --git a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml index a2cacf0ad..ed856f281 100644 --- a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml +++ b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <!-- Borderless Buttons for API < 11, see http://stackoverflow.com/a/14663170 --> -<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime"> - <item android:state_pressed="true" android:drawable="@color/emphasis" /> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:drawable="@color/bg_gray" /> <item android:drawable="@android:color/transparent" /> </selector>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/certify_key_activity.xml b/OpenKeychain/src/main/res/layout/certify_key_activity.xml index 0ae46a261..cba73a3c7 100644 --- a/OpenKeychain/src/main/res/layout/certify_key_activity.xml +++ b/OpenKeychain/src/main/res/layout/certify_key_activity.xml @@ -93,7 +93,7 @@ android:text="@string/label_fingerprint" /> <TextView - android:id="@+id/fingerprint" + android:id="@+id/view_key_fingerprint" android:layout_width="match_parent" android:layout_height="wrap_content" android:typeface="monospace" /> @@ -111,7 +111,7 @@ android:text="@string/section_uids_to_sign" /> <org.sufficientlysecure.keychain.ui.widget.FixedListView - android:id="@+id/user_ids" + android:id="@+id/view_key_user_ids" android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" /> diff --git a/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml new file mode 100644 index 000000000..248581342 --- /dev/null +++ b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml @@ -0,0 +1,51 @@ +<?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:orientation="horizontal" > + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <EditText + android:id="@+id/import_keybase_query" + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="top|left" + android:hint="@string/hint_keybase_search" + android:imeOptions="actionSearch" + android:inputType="textNoSuggestions" + android:singleLine="true" + android:lines="1" + android:maxLines="1" + android:minLines="1" + android:layout_gravity="center_vertical" /> + + <com.beardedhen.androidbootstrap.BootstrapButton + android:id="@+id/import_keybase_search" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginLeft="10dp" + bootstrapbutton:bb_icon_left="fa-search" + bootstrapbutton:bb_roundedCorners="true" + bootstrapbutton:bb_size="default" + bootstrapbutton:bb_type="default" /> + </LinearLayout> + + <!-- + <com.beardedhen.androidbootstrap.BootstrapButton + android:id="@+id/import_keybase_button" + android:layout_width="match_parent" + android:layout_height="70dp" + android:layout_margin="10dp" + android:text="@string/import_keybase_button" + 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_list_entry.xml b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml index ba8ff91ca..f5ec71abe 100644 --- a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml +++ b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml @@ -106,7 +106,7 @@ android:typeface="monospace" /> <TextView - android:id="@+id/fingerprint" + android:id="@+id/view_key_fingerprint" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="0000 0000 0000 0000 0000\n0000 0000 0000 0000 0000" diff --git a/OpenKeychain/src/main/res/layout/key_list_item.xml b/OpenKeychain/src/main/res/layout/key_list_item.xml index 4676a624d..db61728c1 100644 --- a/OpenKeychain/src/main/res/layout/key_list_item.xml +++ b/OpenKeychain/src/main/res/layout/key_list_item.xml @@ -52,7 +52,7 @@ android:layout_height="match_parent"> <Button - android:background="@drawable/selector_transparent_button" + style="@style/SelectableItem" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/edit" diff --git a/OpenKeychain/src/main/res/layout/view_key_activity.xml b/OpenKeychain/src/main/res/layout/view_key_activity.xml index 58e4919dc..eed71945b 100644 --- a/OpenKeychain/src/main/res/layout/view_key_activity.xml +++ b/OpenKeychain/src/main/res/layout/view_key_activity.xml @@ -2,11 +2,18 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" > + android:orientation="vertical"> + + <org.sufficientlysecure.keychain.util.SlidingTabLayout + android:id="@+id/view_key_sliding_tab_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> <android.support.v4.view.ViewPager - android:id="@+id/pager" + android:id="@+id/view_key_pager" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="0px" + android:layout_weight="1" + android:background="@android:color/white" /> </LinearLayout>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/view_key_certs_item.xml b/OpenKeychain/src/main/res/layout/view_key_certs_item.xml index de7570818..e84a98cdb 100644 --- a/OpenKeychain/src/main/res/layout/view_key_certs_item.xml +++ b/OpenKeychain/src/main/res/layout/view_key_certs_item.xml @@ -12,22 +12,22 @@ android:focusable="false"> <TextView - android:id="@+id/signerKeyId" + android:id="@+id/signerName" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="signer key id" + android:text="signer name" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView - android:id="@+id/signerUserId" + android:id="@+id/signerKeyId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="<user@example.com>" android:textAppearance="?android:attr/textAppearanceSmall" - android:layout_below="@+id/signerKeyId" + android:layout_below="@+id/signerName" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> @@ -38,7 +38,7 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:text="status" android:visibility="visible" - android:layout_above="@+id/signerUserId" + android:layout_above="@+id/signerKeyId" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_marginRight="10dp" /> diff --git a/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml new file mode 100644 index 000000000..88da26a95 --- /dev/null +++ b/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml @@ -0,0 +1,149 @@ +<ScrollView 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="match_parent"> + + <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331--> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:focusable="true" + android:focusableInTouchMode="true" + android:descendantFocusability="beforeDescendants" + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:id="@+id/container"> + + <TextView + style="@style/SectionHeader" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="4dp" + android:layout_marginTop="14dp" + android:text="@string/section_master_key" /> + + <TableLayout + android:layout_width="wrap_content" + android:paddingLeft="8dp" + android:layout_height="0dp" + android:layout_weight="1" + android:shrinkColumns="1"> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:paddingRight="10dip" + android:text="@string/label_key_id" /> + + <TextView + android:id="@+id/key_id" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingRight="5dip" + android:text="" + android:typeface="monospace" /> + </TableRow> + + <TableRow> + + <TextView + android:id="@+id/label_algorithm" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:paddingRight="10dip" + android:text="@string/label_algorithm" /> + + <TextView + android:id="@+id/algorithm" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingRight="5dip" + android:text="" /> + </TableRow> + + <TableRow + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:id="@+id/tableRow"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:paddingRight="10dip" + android:text="@string/label_fingerprint" /> + + <TextView + android:id="@+id/view_key_fingerprint" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:typeface="monospace" /> + </TableRow> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:paddingRight="10dip" + android:text="@string/label_creation" /> + + <TextView + android:id="@+id/creation" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </TableRow> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:paddingRight="10dip" + android:text="@string/label_expiry" /> + + <TextView + android:id="@+id/expiry" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </TableRow> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:paddingRight="10dip" + android:text="@string/label_secret_key" /> + + <TextView + android:id="@+id/secret_key" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + </TableRow> + </TableLayout> + + <TextView + style="@style/SectionHeader" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="4dp" + android:layout_marginTop="14dp" + android:text="@string/section_keys" /> + + <org.sufficientlysecure.keychain.ui.widget.FixedListView + android:id="@+id/keys" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + </LinearLayout> + +</ScrollView> diff --git a/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml index e3448c39f..884eee430 100644 --- a/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml +++ b/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml @@ -18,247 +18,93 @@ <TextView style="@style/SectionHeader" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="4dp" - android:layout_marginTop="14dp" - android:text="@string/section_master_user_id" /> - - <TableLayout - android:layout_width="wrap_content" android:layout_height="0dp" - android:layout_weight="1" - android:stretchColumns="1"> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="top" - android:paddingRight="10dip" - android:text="@string/label_name" /> - - <TextView - android:id="@+id/name" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="" /> - </TableRow> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="top" - android:paddingRight="10dip" - android:text="@string/label_email" /> - - <TextView - android:id="@+id/email" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="" /> - </TableRow> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="top" - android:paddingRight="10dip" - android:text="@string/label_comment" /> - - <TextView - android:id="@+id/comment" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="" /> - </TableRow> - </TableLayout> - - <TextView - style="@style/SectionHeader" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_marginTop="14dp" - android:text="@string/section_master_key" /> + android:text="@string/section_user_ids" + android:layout_weight="1" /> - <TableLayout - android:layout_width="wrap_content" + <org.sufficientlysecure.keychain.ui.widget.FixedListView + android:id="@+id/view_key_user_ids" + android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" - android:shrinkColumns="1"> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:text="@string/label_key_id" /> - - <TextView - android:id="@+id/key_id" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="" - android:typeface="monospace" /> - </TableRow> - - <TableRow> - - <TextView - android:id="@+id/label_algorithm" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:text="@string/label_algorithm" /> - - <TextView - android:id="@+id/algorithm" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="5dip" - android:text="" /> - </TableRow> - - <TableRow - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:id="@+id/tableRow"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:text="@string/label_fingerprint" /> - - <TextView - android:id="@+id/fingerprint" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:typeface="monospace" /> - </TableRow> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:text="@string/label_creation" /> - - <TextView - android:id="@+id/creation" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - </TableRow> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:text="@string/label_expiry" /> - - <TextView - android:id="@+id/expiry" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - </TableRow> - - <TableRow> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingRight="10dip" - android:text="@string/label_secret_key" /> - - <TextView - android:id="@+id/secret_key" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - </TableRow> - </TableLayout> - - <TextView - style="@style/SectionHeader" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:layout_marginBottom="4dp" - android:layout_marginTop="14dp" - android:text="@string/section_user_ids" /> + android:layout_weight="1" /> - <org.sufficientlysecure.keychain.ui.widget.FixedListView - android:id="@+id/user_ids" + <View + android:id="@+id/view_key_action_certify_divider" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="1dip" + android:background="?android:attr/listDivider" /> - <TextView - style="@style/SectionHeader" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="4dp" - android:layout_marginTop="14dp" - android:text="@string/section_keys" /> - - <org.sufficientlysecure.keychain.ui.widget.FixedListView - android:id="@+id/keys" + <LinearLayout + android:id="@+id/view_key_action_certify" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:minHeight="?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/key_view_action_certify" + android:layout_weight="1" + android:drawableRight="@drawable/ic_action_good" + android:drawablePadding="8dp" + android:gravity="center_vertical" /> + + </LinearLayout> <TextView style="@style/SectionHeader" android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_height="0dp" android:layout_marginTop="14dp" - android:text="@string/section_actions" /> + android:text="@string/section_actions" + android:layout_weight="1" /> - <com.beardedhen.androidbootstrap.BootstrapButton - android:id="@+id/action_edit" + <TextView + android:id="@+id/view_key_action_edit" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="match_parent" - android:layout_height="50dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeight" + android:clickable="true" + style="@style/SelectableItem" android:text="@string/key_view_action_edit" - bootstrapbutton:bb_icon_left="fa-key" - bootstrapbutton:bb_type="info" - android:visibility="gone" /> + android:layout_weight="1" + android:drawableRight="@drawable/ic_action_edit" + android:drawablePadding="8dp" + android:gravity="center_vertical" /> - <com.beardedhen.androidbootstrap.BootstrapButton - android:id="@+id/action_encrypt" + <View + android:id="@+id/view_key_action_edit_divider" android:layout_width="match_parent" - android:layout_height="50dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" - android:text="@string/key_view_action_encrypt" - bootstrapbutton:bb_icon_left="fa-lock" - bootstrapbutton:bb_type="info" /> + android:layout_height="1dip" + android:background="?android:attr/listDivider" /> - <com.beardedhen.androidbootstrap.BootstrapButton - android:id="@+id/action_certify" + <TextView + android:id="@+id/view_key_action_encrypt" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="match_parent" - android:layout_height="50dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" - android:text="@string/key_view_action_certify" - bootstrapbutton:bb_icon_left="fa-pencil" - bootstrapbutton:bb_type="info" /> + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeight" + android:clickable="true" + style="@style/SelectableItem" + android:text="@string/key_view_action_encrypt" + android:layout_weight="1" + android:drawableRight="@drawable/ic_action_secure" + android:drawablePadding="8dp" + android:gravity="center_vertical" /> </LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml new file mode 100644 index 000000000..ae6b750b2 --- /dev/null +++ b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml @@ -0,0 +1,179 @@ +<ScrollView 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="match_parent"> + + <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331--> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:focusable="true" + android:focusableInTouchMode="true" + android:descendantFocusability="beforeDescendants" + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:id="@+id/container"> + + <TextView + style="@style/SectionHeader" + android:layout_width="wrap_content" + android:layout_height="0dp" + android:layout_marginTop="14dp" + android:text="@string/section_fingerprint" + android:layout_weight="1" /> + + <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:clickable="true" + style="@style/SelectableItem" + android:orientation="horizontal"> + + <TextView + android:id="@+id/view_key_fingerprint" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:textAppearance="?android:attr/textAppearanceSmall" + android:layout_width="0dip" + android:layout_height="match_parent" + android:text="" + android:layout_weight="1" + android:typeface="monospace" + android:drawableRight="@drawable/ic_action_share" + 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/view_key_action_fingerprint_clipboard" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:padding="8dp" + android:src="@drawable/ic_action_copy" + android:layout_gravity="center_vertical" + style="@style/SelectableItem" /> + + </LinearLayout> + + + <View + android:layout_width="match_parent" + android:layout_height="1dip" + android:background="?android:attr/listDivider" /> + + <ImageView + android:id="@+id/view_key_fingerprint_qr_code_image" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:layout_width="match_parent" + android:layout_height="200dp" + android:layout_gravity="center_horizontal" + android:layout_weight="1" + style="@style/SelectableItem" /> + + <TextView + style="@style/SectionHeader" + android:layout_width="wrap_content" + android:layout_height="0dp" + android:layout_marginTop="14dp" + android:text="@string/section_share_key" + android:layout_weight="1" /> + + <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: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/key_view_action_share_with" + android:layout_weight="1" + android:drawableRight="@drawable/ic_action_share" + 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/view_key_action_key_clipboard" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:padding="8dp" + android:src="@drawable/ic_action_copy" + android:layout_gravity="center_vertical" + style="@style/SelectableItem" /> + + </LinearLayout> + + <View + android:layout_width="match_parent" + android:layout_height="1dip" + android:background="?android:attr/listDivider" /> + + <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: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/key_view_action_share_nfc" + android:layout_weight="1" + android:drawableRight="@drawable/ic_action_help" + 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/view_key_action_nfc_prefs" + 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> + +</ScrollView> diff --git a/OpenKeychain/src/main/res/layout/view_key_userids_item.xml b/OpenKeychain/src/main/res/layout/view_key_userids_item.xml index e56355ff3..5552757ef 100644 --- a/OpenKeychain/src/main/res/layout/view_key_userids_item.xml +++ b/OpenKeychain/src/main/res/layout/view_key_userids_item.xml @@ -2,6 +2,7 @@ <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="3dip" android:singleLine="true"> @@ -13,24 +14,43 @@ android:clickable="false" android:focusable="false" /> - <TextView - android:id="@+id/rank" + <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceSmall" - android:text="0" - android:paddingLeft="10dp" - android:paddingRight="10dp" + android:layout_marginLeft="8dp" android:layout_gravity="center_vertical" - android:width="30sp" /> + android:orientation="vertical"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/certified" + android:src="@drawable/key_certify_ok_self" /> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="gone" + android:id="@+id/primary_user_id_icon" + android:src="@drawable/ic_action_important_small" /> + </LinearLayout> <LinearLayout android:orientation="vertical" + android:layout_gravity="center_vertical" android:layout_width="0dip" + android:layout_marginLeft="8dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView + android:id="@+id/address" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="alice@example.com" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView android:id="@+id/userId" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -38,20 +58,13 @@ android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView - android:id="@+id/address" + android:id="@+id/comment" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="alice@example.com" + android:textColor="@color/tertiary_text_light" + android:text="comment" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> - <ImageView - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:id="@+id/certified" - android:src="@drawable/key_certify_ok_self" - android:layout_marginLeft="5dp" - android:layout_marginRight="5dp" /> - </LinearLayout> diff --git a/OpenKeychain/src/main/res/menu/key_view.xml b/OpenKeychain/src/main/res/menu/key_view.xml index 2f5697a0f..864016801 100644 --- a/OpenKeychain/src/main/res/menu/key_view.xml +++ b/OpenKeychain/src/main/res/menu/key_view.xml @@ -3,53 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <item - android:id="@+id/menu_key_view_share" - android:icon="@drawable/ic_action_share" - app:showAsAction="always" - android:title="@string/menu_share"> - <menu> - <item - android:id="@+id/menu_key_view_share_fingerprint_title" - app:showAsAction="never" - android:title="@string/menu_share_title_fingerprint"> - <menu> - <item - android:id="@+id/menu_key_view_share_default_fingerprint" - app:showAsAction="never" - android:title="@string/menu_share_default_fingerprint" /> - <item - android:id="@+id/menu_key_view_share_qr_code_fingerprint" - app:showAsAction="never" - android:title="@string/menu_share_qr_code_fingerprint" /> - </menu> - </item> - <item - android:id="@+id/menu_key_view_share_title" - app:showAsAction="never" - android:title="@string/menu_share_title"> - <menu> - <item - android:id="@+id/menu_key_view_share_default" - app:showAsAction="never" - android:title="@string/menu_share_default" /> - <item - android:id="@+id/menu_key_view_share_qr_code" - app:showAsAction="never" - android:title="@string/menu_share_qr_code" /> - <item - android:id="@+id/menu_key_view_share_nfc" - app:showAsAction="never" - android:title="@string/menu_share_nfc" /> - <item - android:id="@+id/menu_key_view_share_clipboard" - app:showAsAction="never" - android:title="@string/menu_copy_to_clipboard" /> - </menu> - </item> - </menu> - </item> - - <item android:id="@+id/menu_key_keyserver" android:icon="@drawable/ic_action_cloud" app:showAsAction="always" @@ -69,13 +22,13 @@ <item android:id="@+id/menu_key_view_export_file" android:icon="@drawable/ic_action_import_export" - app:showAsAction="ifRoom" + app:showAsAction="never" android:title="@string/menu_export_key" /> <item android:id="@+id/menu_key_view_delete" android:icon="@drawable/ic_action_discard" - app:showAsAction="ifRoom" + app:showAsAction="never" android:title="@string/menu_delete_key" /> </menu>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html b/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-de/help_about.html b/OpenKeychain/src/main/res/raw-de/help_about.html index b356c9897..c40267e73 100644 --- a/OpenKeychain/src/main/res/raw-de/help_about.html +++ b/OpenKeychain/src/main/res/raw-de/help_about.html @@ -22,7 +22,7 @@ </ul> <h2>Entwickler APG 1.x</h2> <ul> -<li>Thialfihar (Lead developer)</li> +<li>Thialfihar (Hauptentwickler)</li> <li>'Senecaso' (QR-Code, Schlüssel signtieren, Schlüssel hochladen)</li> <li>Markus Doits</li> </ul> diff --git a/OpenKeychain/src/main/res/raw-de/help_changelog.html b/OpenKeychain/src/main/res/raw-de/help_changelog.html index 22821caca..550596ca9 100644 --- a/OpenKeychain/src/main/res/raw-de/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-de/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> @@ -53,7 +57,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa <ul> <li>new design with navigation drawer</li> <li>Neus Design für die Liste der öffentlichen Schlüssel</li> -<li>new public key view</li> +<li>Neue Ansicht für öffentliche Schlüssel</li> <li>Fehler beim Schlüsselimport behoben</li> <li>key cross-certification (thanks to Ash Hughes)</li> <li>handle UTF-8 passwords properly (thanks to Ash Hughes)</li> @@ -78,7 +82,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa <li>Schlüssel signieren</li> <li>Schlüssel auf den Server hochladen</li> <li>Importprobleme behoben</li> -<li>new AIDL API</li> +<li>neue AIDL API</li> </ul> <h2>1.0.8</h2> <ul> @@ -133,7 +137,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa </ul> <h2>1.0.0</h2> <ul> -<li>K-9 Mail integration, APG supporting beta build of K-9 Mail</li> +<li>K-9 Mail integration, APG unterstützt beta build von K-9 Mail</li> <li>Unterstützung von mehr Filemanagern (einschließlich ASTRO)</li> <li>Slowenische Übersetzung</li> <li>Neue Datenbank, viel schneller, weniger Speicherbedarf</li> diff --git a/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html index 88492731c..6fb3d6dd1 100644 --- a/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html +++ b/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html @@ -1,12 +1,12 @@ <html> <head></head> <body> -<h2>How to receive keys</h2> +<h2>Wie werden Schlüssel empfangen</h2> <ol> -<li>Go to your partners contacts and open the contact you want to share.</li> -<li>Hold the two devices back to back (they have to be almost touching) and you’ll feel a vibration.</li> +<li>Gehen Sie zu Ihren Kontakten und öffnen Sie den Kontakt, den Sie teilen wollen.</li> +<li>Halten sie die zwei Geräte Rückseitig aneinander (sie müssen sich fast berühren) und sie werden ein Vibrieren fühlen.</li> <li>After it vibrates you’ll see the content on your partners device turn into a card-like object with Star Trek warp speed-looking animation in the background.</li> -<li>Tap the card and the content will then load on the your device.</li> +<li>Tippen sie die Karte an und der Inhalt wird dann auf Ihr Gerät geladen.</li> </ol> </body> </html> diff --git a/OpenKeychain/src/main/res/raw-el/help_changelog.html b/OpenKeychain/src/main/res/raw-el/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-el/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-el/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-es/help_changelog.html b/OpenKeychain/src/main/res/raw-es/help_changelog.html index f710c3e53..4398e086d 100644 --- a/OpenKeychain/src/main/res/raw-es/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-es/help_changelog.html @@ -1,13 +1,17 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>algunas reparaciones para fallos recurrentes</li> +</ul> <h2>2.6</h2> <ul> -<li>key certifications (thanks to Vincent Breitmoser)</li> -<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li> -<li>new design for signature verification</li> -<li>custom key length (thanks to Greg Witczak)</li> -<li>fix share-functionality from other apps</li> +<li>certificaciones de clave (gracias a Vincent Breitmoser)</li> +<li>soporte para claves secretas parciales de GnuPG (gracias a Vincent Breitmoser)</li> +<li>nuevo diseño para la verificación de firma</li> +<li>tamaño de clave personalizado (gracias a Greg Witczak)</li> +<li>reparada funcionalidad-compartir desde otras aplicaciones</li> </ul> <h2>2.5</h2> <ul> diff --git a/OpenKeychain/src/main/res/raw-es/help_start.html b/OpenKeychain/src/main/res/raw-es/help_start.html index 5ba0b9cb3..eeb6e1535 100644 --- a/OpenKeychain/src/main/res/raw-es/help_start.html +++ b/OpenKeychain/src/main/res/raw-es/help_start.html @@ -2,7 +2,7 @@ <head></head> <body> <h2>Primeros pasos</h2> -<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p> +<p>Primero necesita una clave privada (secreta) personal. Cree una mediante las opciones de menú en "Claves", o importe claves privadas existentes. En adelante puede descargar las claves de sus amigos, o intercambiarlas mediante códigos QR o vía NFC.</p> <p>Es recomendable que instales <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> para una mejor selección de archivos y <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> para escanear los códigos QR generados. Pulsando en los enlaces se abrirá Google Play o F-Droid.</p> diff --git a/OpenKeychain/src/main/res/raw-et/help_changelog.html b/OpenKeychain/src/main/res/raw-et/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-et/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-et/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html b/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-fr/help_changelog.html b/OpenKeychain/src/main/res/raw-fr/help_changelog.html index 05e8ef3e3..698d73df1 100644 --- a/OpenKeychain/src/main/res/raw-fr/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-fr/help_changelog.html @@ -1,10 +1,14 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>quelques correctifs de bogues de régression</li> +</ul> <h2>2.6</h2> <ul> <li>certifications des clefs (merci à Vincent Breitmoser)</li> -<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li> +<li>prise en charge des clefs secrètes partielles de GnuPG (merci à Vincent Breitmoser)</li> <li>nouvelle conception de la vérification des signatures</li> <li>longueur de clef personnalisée (merci à Greg Witczak)</li> <li>correction de la fonctionnalité partagée avec d'autres applis</li> diff --git a/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html b/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html index 19e17616b..cb9443a48 100644 --- a/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>alcune correzioni per i bug di regressione</li> +</ul> <h2>2.6</h2> <ul> <li>certificazioni chiave (grazie a Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-ja/help_changelog.html b/OpenKeychain/src/main/res/raw-ja/help_changelog.html index 9effbd52d..c7f943602 100644 --- a/OpenKeychain/src/main/res/raw-ja/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-ja/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>いくつかのリグレッションバグ修正</li> +</ul> <h2>2.6</h2> <ul> <li>鍵証明 (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-ko/help_about.html b/OpenKeychain/src/main/res/raw-ko/help_about.html new file mode 100644 index 000000000..ae7e16aae --- /dev/null +++ b/OpenKeychain/src/main/res/raw-ko/help_about.html @@ -0,0 +1,49 @@ +<html> +<head></head> +<body> +<p><a href="http://www.openkeychain.org">http://www.openkeychain.org</a></p> +<p><a href="http://www.openkeychain.org">OpenKeychain</a> is an OpenPGP implementation for Android.</p> +<p>License: GPLv3+</p> + +<h2>Developers OpenKeychain</h2> +<ul> +<li>Dominik Schürmann (Lead developer)</li> +<li>Ash Hughes (crypto patches)</li> +<li>Brian C. Barnes</li> +<li>Bahtiar 'kalkin' Gadimov (UI)</li> +<li>Daniel Hammann</li> +<li>Daniel Haß</li> +<li>Greg Witczak</li> +<li>Miroojin Bakshi</li> +<li>Nikhil Peter Raj</li> +<li>Paul Sarbinowski</li> +<li>Sreeram Boyapati</li> +<li>Vincent Breitmoser</li> +</ul> +<h2>Developers APG 1.x</h2> +<ul> +<li>Thialfihar (Lead developer)</li> +<li>'Senecaso' (QRCode, sign key, upload key)</li> +<li>Markus Doits</li> +</ul> +<h2>Libraries</h2> +<ul> +<li> +<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (Apache License v2)</li> +<li> +<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (Apache License v2)</li> +<li> +<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache License v2)</li> +<li> +<a href="https://github.com/Bearded-Hen/Android-Bootstrap">Android-Bootstrap</a> (MIT License)</li> +<li> +<a href="http://code.google.com/p/zxing/">ZXing</a> (Apache License v2)</li> +<li> +<a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (MIT X11 License)</li> +<li> +<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache License v2)</li> +<li> +<a href="https://github.com/johnkil/Android-AppMsg">Android AppMsg Library</a> (Apache License v2)</li> +</ul> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-ko/help_changelog.html b/OpenKeychain/src/main/res/raw-ko/help_changelog.html new file mode 100644 index 000000000..f983e2bb1 --- /dev/null +++ b/OpenKeychain/src/main/res/raw-ko/help_changelog.html @@ -0,0 +1,148 @@ +<html> +<head></head> +<body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> +<h2>2.6</h2> +<ul> +<li>key certifications (thanks to Vincent Breitmoser)</li> +<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li> +<li>new design for signature verification</li> +<li>custom key length (thanks to Greg Witczak)</li> +<li>fix share-functionality from other apps</li> +</ul> +<h2>2.5</h2> +<ul> +<li>fix decryption of symmetric pgp messages/files</li> +<li>refactored edit key screen (thanks to Ash Hughes)</li> +<li>new modern design for encrypt/decrypt screens</li> +<li>OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)</li> +</ul> +<h2>2.4</h2> +<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free! +Besides several small patches, a notable number of patches are made by the following people (in alphabetical order): +Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p> +<ul> +<li>new unified key list</li> +<li>colorized key fingerprint</li> +<li>support for keyserver ports</li> +<li>deactivate possibility to generate weak keys</li> +<li>much more internal work on the API</li> +<li>certify user ids</li> +<li>keyserver query based on machine-readable output</li> +<li>lock navigation drawer on tablets</li> +<li>suggestions for emails on creation of keys</li> +<li>search in public key lists</li> +<li>and much more improvements and fixes…</li> +</ul> +<h2>2.3.1</h2> +<ul> +<li>hotfix for crash when upgrading from old versions</li> +</ul> +<h2>2.3</h2> +<ul> +<li>remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)</li> +<li>fix setting expiry dates on keys (thanks to Ash Hughes)</li> +<li>more internal fixes when editing keys (thanks to Ash Hughes)</li> +<li>querying keyservers directly from the import screen</li> +<li>fix layout and dialog style on Android 2.2-3.0</li> +<li>fix crash on keys with empty user ids</li> +<li>fix crash and empty lists when coming back from signing screen</li> +<li>Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source</li> +<li>fix upload of key from signing screen</li> +</ul> +<h2>2.2</h2> +<ul> +<li>new design with navigation drawer</li> +<li>new public key list design</li> +<li>new public key view</li> +<li>bug fixes for importing of keys</li> +<li>key cross-certification (thanks to Ash Hughes)</li> +<li>handle UTF-8 passwords properly (thanks to Ash Hughes)</li> +<li>first version with new languages (thanks to the contributors on Transifex)</li> +<li>sharing of keys via QR Codes fixed and improved</li> +<li>package signature verification for API</li> +</ul> +<h2>2.1.1</h2> +<ul> +<li>API Updates, preparation for K-9 Mail integration</li> +</ul> +<h2>2.1</h2> +<ul> +<li>lots of bug fixes</li> +<li>new API for developers</li> +<li>PRNG bug fix by Google</li> +</ul> +<h2>2.0</h2> +<ul> +<li>complete redesign</li> +<li>share public keys via qr codes, nfc beam</li> +<li>sign keys</li> +<li>upload keys to server</li> +<li>fixes import issues</li> +<li>new AIDL API</li> +</ul> +<h2>1.0.8</h2> +<ul> +<li>basic keyserver support</li> +<li>app2sd</li> +<li>more choices for pass phrase cache: 1, 2, 4, 8, hours</li> +<li>translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)</li> +<li>bugfixes</li> +<li>optimizations</li> +</ul> +<h2>1.0.7</h2> +<ul> +<li>fixed problem with signature verification of texts with trailing newline</li> +<li>more options for pass phrase cache time to live (20, 40, 60 mins)</li> +</ul> +<h2>1.0.6</h2> +<ul> +<li>account adding crash on Froyo fixed</li> +<li>secure file deletion</li> +<li>option to delete key file after import</li> +<li>stream encryption/decryption (gallery, etc.)</li> +<li>new options (language, force v3 signatures)</li> +<li>interface changes</li> +<li>bugfixes</li> +</ul> +<h2>1.0.5</h2> +<ul> +<li>German and Italian translation</li> +<li>much smaller package, due to reduced BC sources</li> +<li>new preferences GUI</li> +<li>layout adjustment for localization</li> +<li>signature bugfix</li> +</ul> +<h2>1.0.4</h2> +<ul> +<li>fixed another crash caused by some SDK bug with query builder</li> +</ul> +<h2>1.0.3</h2> +<ul> +<li>fixed crashes during encryption/signing and possibly key export</li> +</ul> +<h2>1.0.2</h2> +<ul> +<li>filterable key lists</li> +<li>smarter pre-selection of encryption keys</li> +<li>new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li> +<li>fixes and additional features (key preselection) for K-9 Mail, new beta build available</li> +</ul> +<h2>1.0.1</h2> +<ul> +<li>GMail account listing was broken in 1.0.0, fixed again</li> +</ul> +<h2>1.0.0</h2> +<ul> +<li>K-9 Mail integration, APG supporting beta build of K-9 Mail</li> +<li>support of more file managers (including ASTRO)</li> +<li>Slovenian translation</li> +<li>new database, much faster, less memory usage</li> +<li>defined Intents and content provider for other apps</li> +<li>bugfixes</li> +</ul> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html new file mode 100644 index 000000000..88492731c --- /dev/null +++ b/OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html @@ -0,0 +1,12 @@ +<html> +<head></head> +<body> +<h2>How to receive keys</h2> +<ol> +<li>Go to your partners contacts and open the contact you want to share.</li> +<li>Hold the two devices back to back (they have to be almost touching) and you’ll feel a vibration.</li> +<li>After it vibrates you’ll see the content on your partners device turn into a card-like object with Star Trek warp speed-looking animation in the background.</li> +<li>Tap the card and the content will then load on the your device.</li> +</ol> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-ko/help_start.html b/OpenKeychain/src/main/res/raw-ko/help_start.html new file mode 100644 index 000000000..6c60c1778 --- /dev/null +++ b/OpenKeychain/src/main/res/raw-ko/help_start.html @@ -0,0 +1,19 @@ +<html> +<head></head> +<body> +<h2>Getting started</h2> +<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p> + +<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p> + +<h2>I found a bug in OpenKeychain!</h2> +<p>Please report the bug using the <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">issue tracker of OpenKeychain</a>.</p> + +<h2>Contribute</h2> +<p>If you want to help us developing OpenKeychain by contributing code <a href="https://github.com/openpgp-keychain/openpgp-keychain#contribute-code">follow our small guide on Github</a>.</p> + +<h2>Translations</h2> +<p>Help translating OpenKeychain! Everybody can participate at <a href="https://www.transifex.com/projects/p/openpgp-keychain/">OpenKeychain on Transifex</a>.</p> + +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-ko/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-ko/nfc_beam_share.html new file mode 100644 index 000000000..083e055c7 --- /dev/null +++ b/OpenKeychain/src/main/res/raw-ko/nfc_beam_share.html @@ -0,0 +1,11 @@ +<html> +<head></head> +<body> +<ol> +<li>Make sure that NFC is turned on in Settings > More > NFC and make sure that Android Beam is also on in the same section.</li> +<li>Hold the two devices back to back (they have to be almost touching) and you'll feel a vibration.</li> +<li>After it vibrates you'll see the content on your device turn into a card-like object with Star Trek warp speed-looking animation in the background.</li> +<li>Tap the card and the content will then load on the other person’s device.</li> +</ol> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html b/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-pl/help_changelog.html b/OpenKeychain/src/main/res/raw-pl/help_changelog.html index 5abcabe5b..9c1e65c92 100644 --- a/OpenKeychain/src/main/res/raw-pl/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-pl/help_changelog.html @@ -1,13 +1,17 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>kilka poprawionych błędów regresji</li> +</ul> <h2>2.6</h2> <ul> -<li>key certifications (thanks to Vincent Breitmoser)</li> -<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li> -<li>new design for signature verification</li> -<li>custom key length (thanks to Greg Witczak)</li> -<li>fix share-functionality from other apps</li> +<li>certyfikacja kluczy (podziękowania dla Vincent Breitmoser)</li> +<li>dodano wsparcie dla dzielonych kluczy prywatnych GnuPG (podziękowania dla Vincent Breitmoser)</li> +<li>nowy wygląd dla weryfikacji podpisu</li> +<li>niestandardowa długość klucza (podziękowania dla Greg Witczak)</li> +<li>naprawiono funkcję udostępniania przez inne aplikacje</li> </ul> <h2>2.5</h2> <ul> diff --git a/OpenKeychain/src/main/res/raw-ru/help_changelog.html b/OpenKeychain/src/main/res/raw-ru/help_changelog.html index 2617aace9..c547a1303 100644 --- a/OpenKeychain/src/main/res/raw-ru/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-ru/help_changelog.html @@ -1,13 +1,17 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>исправления найденных ошибок</li> +</ul> <h2>2.6</h2> <ul> -<li>key certifications (thanks to Vincent Breitmoser)</li> -<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li> -<li>new design for signature verification</li> -<li>custom key length (thanks to Greg Witczak)</li> -<li>fix share-functionality from other apps</li> +<li>сертификация ключей (благодаря Vincent Breitmoser)</li> +<li>поддержка частично-секретных ключей GnuPG (благодаря Vincent Breitmoser)</li> +<li>новый дизайн проверки подписи</li> +<li>произв. длина ключей (благодаря Greg Witczak)</li> +<li>исправление ошибки получения данных от других приложений</li> </ul> <h2>2.5</h2> <ul> @@ -27,7 +31,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa <li>отключена возможность создавать слабые ключи</li> <li>ещё больше улучшений работы API</li> <li>сертификация пользовательских данных</li> -<li>keyserver query based on machine-readable output</li> +<li>запрос к серверу ключей основывается на машинном формате вывода</li> <li>фиксация панели на планшетах</li> <li>подсказки email при создании ключей</li> <li>поиск в списках публичных ключей</li> diff --git a/OpenKeychain/src/main/res/raw-ru/help_start.html b/OpenKeychain/src/main/res/raw-ru/help_start.html index b73fff2d9..c0fa7383d 100644 --- a/OpenKeychain/src/main/res/raw-ru/help_start.html +++ b/OpenKeychain/src/main/res/raw-ru/help_start.html @@ -2,7 +2,7 @@ <head></head> <body> <h2>Приступая</h2> -<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p> +<p>Для начала Вас нужен свой секретный ключ. Создайте его в меню раздела "Ключи" или импортируйте ранее созданный ключ. Позже вы сможете поделиться данными своего ключа с друзьями с помощью QR кода или NFC.</p> <p>Рекомендуется установить <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> для удобного выбора файлов и <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> для распознавания QR кодов. Перейдите по ссылкам на соответствующие страницы Google Play или F-Droid для дальнейшей установки.</p> diff --git a/OpenKeychain/src/main/res/raw-sl/help_about.html b/OpenKeychain/src/main/res/raw-sl/help_about.html new file mode 100644 index 000000000..a57b0e26f --- /dev/null +++ b/OpenKeychain/src/main/res/raw-sl/help_about.html @@ -0,0 +1,49 @@ +<html> +<head></head> +<body> +<p><a href="http://www.openkeychain.org">http://www.openkeychain.org</a></p> +<p><a href="http://www.openkeychain.org">OpenKeychain</a> je implementacija OpenPGP za Android.</p> +<p>Licenca: GPLv3+</p> + +<h2>Razvijalci OpenKeychain</h2> +<ul> +<li>Dominik Schürmann (glavni razvijalec)</li> +<li>Ash Hughes (kriptografski popravki)</li> +<li>Brian C. Barnes</li> +<li>Bahtiar 'kalkin' Gadimov (grafični vmesnik)</li> +<li>Daniel Hammann</li> +<li>Daniel Haß</li> +<li>Greg Witczak</li> +<li>Miroojin Bakshi</li> +<li>Nikhil Peter Raj</li> +<li>Paul Sarbinowski</li> +<li>Sreeram Boyapati</li> +<li>Vincent Breitmoser</li> +</ul> +<h2>Razvijalci APG 1.x</h2> +<ul> +<li>Thialfihar (glavni razvijalec)</li> +<li>'Senecaso' (kode QR, podpisovanje ključev, nalaganje ključev na strežnik)</li> +<li>Markus Doits</li> +</ul> +<h2>Knjižnice</h2> +<ul> +<li> +<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (licenca Apache v2)</li> +<li> +<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (licenca Apache v2)</li> +<li> +<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (licenca Apache v2)</li> +<li> +<a href="https://github.com/Bearded-Hen/Android-Bootstrap">Android-Bootstrap</a> (licenca MIT)</li> +<li> +<a href="http://code.google.com/p/zxing/">ZXing</a> (licenca Apache v2)</li> +<li> +<a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (licenca MIT X11)</li> +<li> +<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (licenca Apache v2)</li> +<li> +<a href="https://github.com/johnkil/Android-AppMsg">Android AppMsg Library</a> (licenca Apache v2)</li> +</ul> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-sl/help_changelog.html b/OpenKeychain/src/main/res/raw-sl/help_changelog.html new file mode 100644 index 000000000..8420d43f3 --- /dev/null +++ b/OpenKeychain/src/main/res/raw-sl/help_changelog.html @@ -0,0 +1,148 @@ +<html> +<head></head> +<body> +<h2>2.6.1</h2> +<ul> +<li>popravki hroščev ob posodobitvi iz prejšnjih različic</li> +</ul> +<h2>2.6</h2> +<ul> +<li>overjanje ključev (hvala, Vincent Breitmoser)</li> +<li>podpora delnim zasebnim ključem GnuPG (hvala, Vincent Breitmoser)</li> +<li>nova podoba za preverjanje podpisov</li> +<li>izbirna dolžina ključev (hvala, Greg Witczak)</li> +<li>popravek za deljenje iz drugih aplikacij</li> +</ul> +<h2>2.5</h2> +<ul> +<li>popravek pri dešifriranju simetrično šifriranih sporočil pgp</li> +<li>popravki kode za okno 'uredi ključ' (hvala, Ash Hughes)</li> +<li>nova, sodobnejša podoba za okna 'šifriraj/dešifriraj'</li> +<li>API OpenPGP, verzija 3 (podpora za več API računov, interni popravki, iskanje ključev)</li> +</ul> +<h2>2.4</h2> +<p>Hvala vsem kandidatom za Google Summer of Code 2014, ki so pripomogli k nastanku te vsebinsko bogate različice! +Največje število popravkov je bilo s strani naslednjih ljudi (po abecednem vrstnem redu): +Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p> +<ul> +<li>nov enoten seznam ključev</li> +<li>obarvanje prstnih odtisov ključev</li> +<li>podpora za vrata strežnikov</li> +<li>odstranitev možnosti generiranja šibkih ključev</li> +<li>veliko internega dela na API-ju</li> +<li>overjanje uporabniških ID-jev</li> +<li>iskanje po strežnikih na osnovi strojno berljivih izpisov</li> +<li>zaklep navigacijskega poteznika na tabličnih računalnikih</li> +<li>namigi za izbiro e-poštnih naslovov pri ustvarjanju ključev</li> +<li>iskanje po seznamu javnih ključev</li> +<li>in še veliko drugih izboljšav in popravkov...</li> +</ul> +<h2>2.3.1</h2> +<ul> +<li>sesutje pri nadgraditvi iz starejših različic, hitri popravek</li> +</ul> +<h2>2.3</h2> +<ul> +<li>odprava nepotrebnega hkratnega izvoza javnih ključev ob izvozu zasebnih (hvala, Ash Hughes)</li> +<li>popravek nastavitev datumov poteka ključev (hvala, Ash Hughes)</li> +<li>več internih popravkov pri urejanju ključev (hvala, Ash Hughes)</li> +<li>iskanje strežnikov naravnost iz uvoznega okna</li> +<li>popravki za razporeditev in pogovorna okna na Androidu 2.2-3.0</li> +<li>sesutje pri ključih s praznim uporabniškim ID-jem, popravek</li> +<li>sesutje in prazen seznam ob povratku iz podpisovalnega okna, popravek</li> +<li>Bouncy Castle (kriptografska knjižnica) nadgrajen iz 1.47 na 1.50 in izgrajen iz izvorne kode</li> +<li>nalaganje ključev iz podpisovalnega okna, popravek</li> +</ul> +<h2>2.2</h2> +<ul> +<li>nova podoba za navigacijski poteznik</li> +<li>nova podoba za seznam javnih ključev</li> +<li>nova podoba okna za ogled posameznih javnih ključev</li> +<li>odprava hroščev pri uvozu ključev</li> +<li>navzkrižno overjanje ključev (hvala, Ash Hughes)</li> +<li>pravilno upravljanje gesel v formatu UTF-8 (hvala, Ash Hughes)</li> +<li>prva različica z novimi jeziki (hvala prevajalcem iz portala Transifex)</li> +<li>izbojšave in popravki za deljenje ključev preko kod QR</li> +<li>preverjanje podpisov paketov za API</li> +</ul> +<h2>2.1.1</h2> +<ul> +<li>posodobitve za API, priprava na integracijo z aplikacijo 'K-9 Mail'</li> +</ul> +<h2>2.1</h2> +<ul> +<li>veliko število popravkov hroščev</li> +<li>nov API za razvijalce</li> +<li>popravek za hrošč PRNG, prispeval Google</li> +</ul> +<h2>2.0</h2> +<ul> +<li>kompletna prenova izgleda</li> +<li>deljenje javnih ključev preko kod QR in 'NFC Beam-a'</li> +<li>podpisovanje ključev</li> +<li>nalaganje ključev na strežnik</li> +<li>popravki problemov z uvozom</li> +<li>nov API za AIDL</li> +</ul> +<h2>1.0.8</h2> +<ul> +<li>osnovna podpora za strežnike javnih ključev</li> +<li>podpora app2sd</li> +<li>več možnosti pomnjenja gesla: 1, 2, 4, 8 ur</li> +<li>prevodi: Norveško (hvala, Sander Danielsen), Kitajsko (hvala, Zhang Fredrick)</li> +<li>popravki hroščev</li> +<li>optimizacije</li> +</ul> +<h2>1.0.7</h2> +<ul> +<li>odpravljen problem pri preverjanju podpisov besedil</li> +<li>več možnosti za pomnjenje gesla v spominu (20, 40, 60 min) </li> +</ul> +<h2>1.0.6</h2> +<ul> +<li>sesutje ob dodajanju računa na napravah Froyo, popravek</li> +<li>varno brisanje datotek</li> +<li>možnost izbrisa datoteke s ključem po uvozu v aplikacijo</li> +<li>šifriranje/dešifriranje toka (galerija, itd.)</li> +<li>nove opcije (jezik, vsili podpis v3)</li> +<li>spremembe vmesnika</li> +<li>popravki hroščev</li> +</ul> +<h2>1.0.5</h2> +<ul> +<li>Nemški in Italijanski prevod</li> +<li>veliko manjša velikost paketa</li> +<li>nove nastavitve grafičnega vmesnika</li> +<li>prilagoditev vmesnika za lokalizacije</li> +<li>popravki pri podpisovanju</li> +</ul> +<h2>1.0.4</h2> +<ul> +<li>sesutje zaradi hrošča v SDK, popravek</li> +</ul> +<h2>1.0.3</h2> +<ul> +<li>sesutja ob šifriranju/podpisovanju in verjetno tudi izvozu ključev, popravek</li> +</ul> +<h2>1.0.2</h2> +<ul> +<li>filtriranje seznama ključev</li> +<li>pametnejši predizbor šifrirnih ključev</li> +<li>nov način upravljanja z 'nameni' za 'ODPRI' in 'POŠLJI', omogoča šifriranje/dešifriranje datotek izven upravljalnikov datotek.</li> +<li>popravki in dodatne funkcije (predizbira ključev) za aplikacijo 'K-9 Mail', nova beta različica</li> +</ul> +<h2>1.0.1</h2> +<ul> +<li>seznam računov GMail v različici 1.0.0 je bil okvarjen, popravek</li> +</ul> +<h2>1.0.0</h2> +<ul> +<li>integracija z aplikacijo 'K-9 Mail', APG podpira različico beta te aplikacije</li> +<li>podpora za več upravljalnikov datotek (mdr. Astro)</li> +<li>Slovenski prevod</li> +<li>nova baza podatkov, hitrejše delovanje, manjša raba pomnilnika</li> +<li>definirani 'nameni' in vsebina ponudnikov za druge aplikacije</li> +<li>popravki hroščev</li> +</ul> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-sl/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-sl/help_nfc_beam.html new file mode 100644 index 000000000..8262a2bca --- /dev/null +++ b/OpenKeychain/src/main/res/raw-sl/help_nfc_beam.html @@ -0,0 +1,12 @@ +<html> +<head></head> +<body> +<h2>Kako pridobiti ključe</h2> +<ol> +<li>Na partnerjevi napravi med stiki poiščita tistega, ki bi si ga rada delila.</li> +<li>S hrbtoma približajte dve napravi (vašo ter vašega partnerja - morata se skoraj dotikati) in začutili boste vibracijo.</li> +<li>Po vibraciji se bo vsebina na napravi vašega partnerja spremenila v vizitki podoben objekt s 'Star Trek' animacijo v ozadju.</li> +<li>Tapnite vizitko in njena vsebnina se bo prenesla na vašo napravo.</li> +</ol> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-sl/help_start.html b/OpenKeychain/src/main/res/raw-sl/help_start.html new file mode 100644 index 000000000..7ca44ddb2 --- /dev/null +++ b/OpenKeychain/src/main/res/raw-sl/help_start.html @@ -0,0 +1,19 @@ +<html> +<head></head> +<body> +<h2>Kako začeti</h2> +<p>Najprej potrebujete zasebni šifrirni/podpisovalni ključ. Ustvarite si svojega v poglavju 'Ključi' ali uvozite že obstoječega. V naslednjem koraku lahko uvozite javne ključe svojih stikov ali jih pridobite s strežnika ključev, preko izmenjave kod QR, oziroma storitve NFC.</p> + +<p>Priporočamo, da namestite aplikaciji <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> za boljše delo z datotekami in <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> za skeniranje kod QR. Klik na povezavi bo odprl trgovino Google Play Store ali F-Droid za namestitev.</p> + +<h2>Našel sem 'hrošča' v aplikaciji OpenKeychain!</h2> +<p>Za poročanje o 'hroščih' uporabite <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">sledilnik težav za OpenKeychain</a>.</p> + +<h2>Prispevajte</h2> +<p>Če želite sodelovati pri razvoju aplikacije OpenKeychain in prispevati lastno kodo <a href="https://github.com/openpgp-keychain/openpgp-keychain#contribute-code">prosimo sledite navodilom na Github-u</a>.</p> + +<h2>Prevodi</h2> +<p>Pomagajte nam pri prevajanju aplikacije OpenKeychain! Svoje prevode lahko prispevate tukaj: <a href="https://www.transifex.com/projects/p/openpgp-keychain/">OpenKeychain na Transifex</a>.</p> + +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-sl/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-sl/nfc_beam_share.html new file mode 100644 index 000000000..defdb8884 --- /dev/null +++ b/OpenKeychain/src/main/res/raw-sl/nfc_beam_share.html @@ -0,0 +1,11 @@ +<html> +<head></head> +<body> +<ol> +<li>V poglavju 'Nastavitve > Več > NFC' poskrbite, da bo NFC vključen. Prav tako mora biti vključen tudi 'NFC Beam'.</li> +<li>S hrbtoma približajte dve napravi (vašo ter vašega partnerja - morata se skoraj dotikati) in začutili boste vibracijo.</li> +<li>Po vibraciji se bo vsebina na vaši napravi spremenila v vizitki podoben objekt s 'Star Trek' animacijo v ozadju.</li> +<li>Tapnite na vizitko in njena vsebina se bo prenesla na napravo druge osebe.</li> +</ol> +</body> +</html> diff --git a/OpenKeychain/src/main/res/raw-tr/help_changelog.html b/OpenKeychain/src/main/res/raw-tr/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-tr/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-tr/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/raw-uk/help_changelog.html b/OpenKeychain/src/main/res/raw-uk/help_changelog.html index 2c5a80a51..1c07d1cdc 100644 --- a/OpenKeychain/src/main/res/raw-uk/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-uk/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>сертифікації ключів (завдяки Вінсенту Бреймозеру)</li> diff --git a/OpenKeychain/src/main/res/raw-zh/help_changelog.html b/OpenKeychain/src/main/res/raw-zh/help_changelog.html index 36ec25bab..f983e2bb1 100644 --- a/OpenKeychain/src/main/res/raw-zh/help_changelog.html +++ b/OpenKeychain/src/main/res/raw-zh/help_changelog.html @@ -1,6 +1,10 @@ <html> <head></head> <body> +<h2>2.6.1</h2> +<ul> +<li>some fixes for regression bugs</li> +</ul> <h2>2.6</h2> <ul> <li>key certifications (thanks to Vincent Breitmoser)</li> diff --git a/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml b/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml index 5fe943c7a..204b28c38 100644 --- a/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml +++ b/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml @@ -44,5 +44,6 @@ <!--Key view--> <!--Navigation Drawer--> <!--hints--> + <!--certifications--> <!--unsorted--> </resources> diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml index 28074933c..46c5a0aa6 100644 --- a/OpenKeychain/src/main/res/values-de/strings.xml +++ b/OpenKeychain/src/main/res/values-de/strings.xml @@ -13,6 +13,8 @@ <string name="title_key_server_preference">Schlüsselserver</string> <string name="title_change_passphrase">Passphrase ändern</string> <string name="title_set_passphrase">Passwort setzen</string> + <string name="title_share_fingerprint_with">Teile Fingerabdruck über…</string> + <string name="title_share_key_with">Teile Schlüssel über...</string> <string name="title_share_file">Datei teilen mit…</string> <string name="title_encrypt_to_file">In eine Datei verschlüsseln</string> <string name="title_decrypt_to_file">In eine Datei entschlüsseln</string> @@ -25,22 +27,25 @@ <string name="title_key_details">Schlüsseldetails</string> <string name="title_help">Hilfe</string> <!--section--> - <string name="section_user_ids">Benutzer-IDs</string> + <string name="section_user_ids">Identitäten</string> <string name="section_keys">Schlüssel</string> <string name="section_general">Allgemein</string> <string name="section_defaults">Standardwerte</string> <string name="section_advanced">Fortgeschrittene Einstellungen</string> <string name="section_master_key">Hauptschlüssel</string> - <string name="section_master_user_id">Hauptbenutzer-ID</string> + <string name="section_master_user_id">Hauptidentität</string> <string name="section_actions">Aktionen</string> + <string name="section_share_key">Schlüssel teilen</string> <string name="section_certification_key">Mit diesem Schlüssel beglaubigen</string> <string name="section_upload_key">Schlüssel hochladen</string> <string name="section_key_server">Schlüsselserver</string> <string name="section_encrypt_and_or_sign">Verschlüsseln und/oder Signieren</string> <string name="section_decrypt_verify">Entschlüsseln und Verifizieren</string> + <string name="section_fingerprint">Fingerabdruck</string> <!--button--> <string name="btn_certify">Beglaubigen</string> <string name="btn_decrypt_verify">Entschlüsseln und Verifizieren</string> + <string name="btn_decrypt_verify_clipboard">Aus der Zwischenablage</string> <string name="btn_encrypt_file">Datei verschlüsseln</string> <string name="btn_save">Speichern</string> <string name="btn_do_not_save">Abbrechen</string> @@ -99,7 +104,7 @@ <string name="label_select_public_keys">Empfänger</string> <string name="label_delete_after_encryption">Nach Verschlüsselung löschen</string> <string name="label_delete_after_decryption">Nach Entschlüsselung löschen</string> - <string name="label_share_after_encryption">Nach dem Verschlüsseln teilen</string> + <string name="label_share_after_encryption">Nach Verschlüsselung teilen</string> <string name="label_encryption_algorithm">Verschlüsselungsalgorithmus</string> <string name="label_hash_algorithm">Hash-Algorithmus</string> <string name="label_asymmetric">mit Öffentlichem Schlüssel</string> @@ -108,12 +113,13 @@ <string name="label_message_compression">Nachrichten-Komprimierung</string> <string name="label_file_compression">Datei-Komprimierung</string> <string name="label_force_v3_signature">Erzwinge alte OpenPGPv3-Signaturen</string> + <string name="label_keyservers">Schlüsselserver</string> <string name="label_key_id">Schlüssel-ID</string> <string name="label_creation">Erstellungsdatum</string> <string name="label_expiry">Ablaufdatum</string> <string name="label_usage">Verwendungszweck</string> <string name="label_key_size">Schlüssellänge</string> - <string name="label_main_user_id">Hauptbenutzer-ID</string> + <string name="label_main_user_id">Hauptidentität</string> <string name="label_name">Name</string> <string name="label_comment">Kommentar</string> <string name="label_email">E-Mail</string> @@ -130,8 +136,18 @@ <string name="no_key"><kein Schlüssel></string> <string name="can_encrypt">kann verschlüsseln</string> <string name="can_sign">kann signieren</string> + <string name="can_certify">kann bestätigen</string> + <string name="can_certify_not">kann nicht bestätigen</string> <string name="expired">abgelaufen</string> - <string name="revoked">zurückgezogen</string> + <string name="revoked">widerrufen</string> + <plurals name="n_keys"> + <item quantity="one">1 Schlüssel</item> + <item quantity="other">%d Schlüssel</item> + </plurals> + <plurals name="n_keyservers"> + <item quantity="one">%d Schlüsselserver</item> + <item quantity="other">%d Schlüsselserver</item> + </plurals> <string name="secret_key">Privater Schlüssel:</string> <!--choice--> <string name="choice_none">Keine</string> @@ -170,6 +186,8 @@ <string name="file_delete_confirmation">%s\nwirklich löschen?</string> <string name="file_delete_successful">Erfolgreich gelöscht.</string> <string name="no_file_selected">Zuerst eine Datei auswählen.</string> + <string name="encrypt_sign_successful">Erfolgreich signiert und/oder verschlüsselt.</string> + <string name="encrypt_sign_clipboard_successful">Erfolgreich in die Zwischenablage signiert und/oder verschlüsselt.</string> <string name="enter_passphrase_twice">Das Passwort bitte zweimal eingeben.</string> <string name="select_encryption_key">Mindestens einen Schlüssel zum Verschlüsseln auswählen.</string> <string name="select_encryption_or_signature_key">Mindestens einen Schlüssel zum Verschlüsseln oder einen zum Signieren auswählen.</string> @@ -178,6 +196,8 @@ <string name="specify_file_to_export_to">Bitte angeben, in welche Datei exportiert werden soll.\nWARNUNG: Datei wird überschrieben, wenn sie bereits existiert. </string> <string name="key_deletion_confirmation_multi">Möchtest du wirklich alle ausgewählten öffentlichen Schlüssel löschen?\nDies kann nicht rückgängig gemacht werden!</string> <string name="secret_key_deletion_confirmation">Soll der PRIVATE Schlüssel \'%s\' wirklich gelöscht werden?\nDies kann nicht rückgängig gemacht werden!</string> + <string name="ask_save_changed_key">Es wurden am Schlüsselbund Veränderungen vorgenommen. Sollen dies gespeichert werden?</string> + <string name="ask_empty_id_ok">Es wurde eine leere Identität hinzugefügt. Wirklich fortfahren?</string> <string name="public_key_deletetion_confirmation">Soll der öffentliche Schlüssel \'%s\' wirklich gelöscht werden?\nDies kann nicht rückgängig gemacht werden! </string> <string name="also_export_secret_keys">Private Schlüssel auch exportieren</string> <plurals name="keys_added_and_updated_1"> @@ -212,8 +232,12 @@ <item quantity="other">%d schlechte private Schlüssel ignoriert. Evtl. wurden sie mit folgender Option exportiert:\n --export-secret-subkeys\nUnbedingt mit der Option \n --export-secret-keys\nexportieren.</item> </plurals> <string name="key_send_success">Schlüssel wurde erfolgreich hochgeladen.</string> + <string name="key_certify_success">Schlüssel erfolgreich beglaubigt</string> <string name="list_empty">Diese Liste ist leer!</string> + <string name="nfc_successful">Schlüssel erfolgreich mit NFC-Beam gesendet!</string> <string name="key_copied_to_clipboard">Schlüssel wurde in die Zwischenablage kopiert!</string> + <string name="fingerprint_copied_to_clipboard">Fingerabdruck wurde in die Zwischenablage kopiert!</string> + <string name="key_has_already_been_certified">Schlüssel wurde bereits beglaubigt</string> <string name="select_key_to_sign">Bitte wähle einen Signaturschlüssel!</string> <string name="key_too_big_for_sharing">Schlüssel ist zu groß um so geteilt zu werden!</string> <!--errors @@ -227,8 +251,8 @@ <string name="error_master_key_must_not_be_el_gamal">Der Hauptschlüssel kann kein ElGamal Schlüssel sein</string> <string name="error_unknown_algorithm_choice">Unbekannte Auswahl für Algorithmus</string> <string name="error_user_id_no_email">keine E-Mail gefunden</string> - <string name="error_key_needs_a_user_id">Mindestens eine Benutzer-ID wird benötigt</string> - <string name="error_main_user_id_must_not_be_empty">Hauptbenutzer-ID darf nicht leer sein</string> + <string name="error_key_needs_a_user_id">Mindestens eine Identität wird benötigt</string> + <string name="error_main_user_id_must_not_be_empty">Hauptidentität darf nicht leer sein</string> <string name="error_key_needs_master_key">Mindestens ein Hauptschlüssel wird benötigt</string> <string name="error_no_signature_passphrase">kein Passwort angegeben</string> <string name="error_no_signature_key">kein Signaturschlüssel angegeben</string> @@ -252,7 +276,16 @@ <item quantity="one">Ein Teil der geladenen Datei ist ein gültiges OpenPGP Objekt aber kein OpenPGP Schlüssel</item> <item quantity="other">Teile der geladenen Dateien sind gültige OpenPGP Objekte aber keine OpenPGP Schlüssel</item> </plurals> + <string name="error_change_something_first">Es müssen vorm Speichern erst Veränderungen am Schlüsselbund vorgenommen werden</string> <!--results shown after decryption/verification--> + <string name="decrypt_result_invalid_signature">Ungültige Signatur!</string> + <string name="decrypt_result_signature_unknown_pub_key">Unbekannter öffentlicher Schlüssel</string> + <string name="decrypt_result_signature_uncertified">Gültige Signatur (nicht beglaubigt)</string> + <string name="decrypt_result_signature_certified">Gültige Signatur (beglaubigt)</string> + <string name="decrypt_result_decrypted">Erfolgreich entschlüsselt</string> + <string name="decrypt_result_decrypted_unknown_pub_key">Erfolgreich entschlüsselt, aber unbekannter öffentlicher Schlüssel</string> + <string name="decrypt_result_decrypted_and_signature_uncertified">Erfolgreich entschlüsselt und gültige Signatur (nicht beglaubigt)</string> + <string name="decrypt_result_decrypted_and_signature_certified">Erfolgreich entschlüsselt und gültige Signatur (beglaubigt)</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">Fertig.</string> <string name="progress_cancel">Abbrechen</string> @@ -293,15 +326,24 @@ <string name="action_share_key_with">Teile Schlüssel über…</string> <!--key bit length selections--> <string name="key_size_512">512</string> + <string name="key_size_768">768</string> <string name="key_size_1024">1024</string> + <string name="key_size_1536">1536</string> <string name="key_size_2048">2048</string> + <string name="key_size_3072">3072</string> <string name="key_size_4096">4096</string> + <string name="key_size_8192">8192</string> + <string name="key_size_custom">Benutzerdefinierte Schlüssellänge</string> + <string name="key_size_custom_info">Benutzerdefinierte Schlüssellänge (in Bit):</string> + <string name="key_size_custom_info_rsa">Die RSA-Schlüssellänge muss größer als 1024 sein und höchstens 8192 sein. Auch muss sie ein Mehrfaches von 8 sein.</string> + <string name="key_size_custom_info_dsa">Die DSA-Schlüssellänge muss mindestens 512 und höchstens 1024 sein. Auch muss sie ein Mehrfaches von 64 sein.</string> <!--compression--> <string name="compression_fast">schnell</string> <string name="compression_very_slow">sehr langsam</string> <!--Help--> <string name="help_tab_start">Start</string> <string name="help_tab_faq">FAQ</string> + <string name="help_tab_wot">Web of Trust</string> <string name="help_tab_nfc_beam">NFC-Beam</string> <string name="help_tab_changelog">Changelog</string> <string name="help_tab_about">Über</string> @@ -334,18 +376,21 @@ <string name="api_settings_hide_advanced">Erweiterte Einstellungen ausblenden</string> <string name="api_settings_no_key">Kein Schlüssel ausgewählt</string> <string name="api_settings_select_key">Schlüssel auswählen</string> + <string name="api_settings_create_key">Einen neuen Schlüssel für diesen Account erzeugen</string> <string name="api_settings_save">Speichern</string> <string name="api_settings_cancel">Abbrechen</string> <string name="api_settings_revoke">Zugriff widerufen</string> + <string name="api_settings_delete_account">Account löschen</string> <string name="api_settings_package_name">Paketname</string> <string name="api_settings_package_signature">SHA-256 der Paketsignatur</string> <string name="api_settings_accounts">Konten</string> + <string name="api_settings_accounts_empty">Keine Accounts mit dieser App verknüpft.</string> <string name="api_register_text">Folgende Anwendung beantragt Zugriff auf OpenKeychains API.\nZugriff erlauben?\n\nVORSICHT: Sollten Sie nicht wissen, warum diese Anfrage erscheint, sollten Sie den Zugriff nicht erlauben! Sie können Zugriffe später über das Menü \'Registrierte Anwendungen\' widerrufen.</string> <string name="api_register_allow">Zugriff erlauben</string> <string name="api_register_disallow">Zugriff verbieten</string> <string name="api_register_error_select_key">Bitte einen Schlüssel auswählen!</string> - <string name="api_select_pub_keys_missing_text">Für diese Benutzer-IDs wurden keine öffentlichen Schlüssel gefunden:</string> - <string name="api_select_pub_keys_dublicates_text">Für diese Benutzer-IDs existieren mehrere öffentliche Schlüssel:</string> + <string name="api_select_pub_keys_missing_text">Für diese Identität wurden keine öffentlichen Schlüssel gefunden:</string> + <string name="api_select_pub_keys_dublicates_text">Für diese Identität existieren mehrere öffentliche Schlüssel:</string> <string name="api_select_pub_keys_text">Bitte die Liste der Empfänger überprüfen!</string> <string name="api_error_wrong_signature">Signaturüberprüfung fehlgeschlagen! Haben Sie diese Anwendung aus einer anderen Quelle installiert? Wenn Sie eine Attacke ausschliessen können, sollten Sie die Registrierung der App in OpenKeychain widerrufen und die Anwendung erneut registrieren.</string> <!--Share--> @@ -365,12 +410,17 @@ <string name="key_list_empty_button_create">deinen eigenen Schlüssel erstellst</string> <string name="key_list_empty_button_import">existierende Schlüssel importierst.</string> <!--Key view--> - <string name="key_view_action_edit">Diesen Schlüssel bearbeiten</string> + <string name="key_view_action_edit">Schlüssel bearbeiten</string> <string name="key_view_action_encrypt">Mit diesem Schlüssel verschlüsseln</string> - <string name="key_view_action_certify">Diesen Schlüssel beglaubigen</string> - <string name="key_view_tab_main">Info</string> + <string name="key_view_action_certify">Identitäten beglaubigen</string> + <string name="key_view_action_share_with">über…</string> + <string name="key_view_action_share_nfc">über NFC (Geräte Rückseite an Rückseite halten)</string> + <string name="key_view_tab_main">Informationen</string> + <string name="key_view_tab_share">Teilen</string> + <string name="key_view_tab_keys_details">Schlüsseldetails</string> <string name="key_view_tab_certs">Beglaubigungen</string> <!--Navigation Drawer--> + <string name="nav_keys">Schlüssel</string> <string name="nav_encrypt">Signieren und Verschlüsseln</string> <string name="nav_decrypt">Entschlüsseln und Verifizieren</string> <string name="nav_import">Schlüssel Importieren</string> @@ -383,6 +433,32 @@ <string name="secret_key_yes">verfügbar</string> <string name="secret_key_no">nicht verfügbar</string> <!--hints--> + <string name="encrypt_content_edit_text_hint">Hier die Nachricht schreiben welche verschlüsselt und/oder signiert werden soll...</string> + <string name="decrypt_content_edit_text_hint">Hier den verslüsselten Text eingeben um ihn zu entschlüsseln und/oder zu überprüfen</string> + <!--certifications--> + <string name="cert_default">Grundeinstellung</string> + <string name="cert_none">kein</string> + <string name="cert_casual">einfach überprüft</string> + <string name="cert_positive">positiv</string> + <string name="cert_verify_ok">OK</string> + <string name="cert_verify_failed">fehlgeschlagen!</string> + <string name="cert_verify_error">Fehler!</string> + <string name="cert_verify_unavailable">Schlüssel nicht verfügbar</string> <!--unsorted--> - <string name="section_uids_to_sign">Benutzer-IDs, die beglaubigt werden sollen</string> + <string name="section_signer_id">Unterzeichner</string> + <string name="section_cert">Zertifikatdetails</string> + <string name="label_user_id">Identität</string> + <string name="unknown_uid"><unbekannt></string> + <string name="empty_certs">Keine Beglaubigungen für diesen Schlüssel</string> + <string name="section_uids_to_sign">Zu signierende Identitäten</string> + <string name="label_revocation">Widerrufsgrund</string> + <string name="label_verify_status">Verificationsstatus</string> + <string name="label_cert_type">Typ</string> + <string name="error_key_not_found">Schlüssel nicht gefunden!</string> + <string name="error_key_processing">Fehler bei der Verarbeitung des Schlüssels!</string> + <string name="no_subkey">Unterschlüssel nicht verfügbar</string> + <string name="secret_cannot_multiple">Geheime Schlüssel können nur einzeln gelöscht werden!</string> + <string name="title_view_cert">Zertifikatdetails anzeigen</string> + <string name="unknown_algorithm">unbekannt</string> + <string name="can_sign_not">Kann nicht unterschreiben</string> </resources> diff --git a/OpenKeychain/src/main/res/values-el/strings.xml b/OpenKeychain/src/main/res/values-el/strings.xml index 0a2197b7f..e5ba3e0b9 100644 --- a/OpenKeychain/src/main/res/values-el/strings.xml +++ b/OpenKeychain/src/main/res/values-el/strings.xml @@ -48,5 +48,6 @@ <!--Key view--> <!--Navigation Drawer--> <!--hints--> + <!--certifications--> <!--unsorted--> </resources> diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index e57b6091f..195ce9743 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -13,6 +13,7 @@ <string name="title_key_server_preference">Prioridad del servidor de claves</string> <string name="title_change_passphrase">Cambiar frase de contraseña</string> <string name="title_set_passphrase">Establecer frase de contraseña</string> + <string name="title_share_file">Compartir fichero con...</string> <string name="title_encrypt_to_file">Cifrar hacia archivo</string> <string name="title_decrypt_to_file">Descifrar hacia archivo</string> <string name="title_import_keys">Importar claves</string> @@ -24,13 +25,11 @@ <string name="title_key_details">Detalles de la clave</string> <string name="title_help">Ayuda</string> <!--section--> - <string name="section_user_ids">IDs de usuario</string> <string name="section_keys">Claves</string> <string name="section_general">General</string> <string name="section_defaults">Predeterminados</string> <string name="section_advanced">Avanzado</string> <string name="section_master_key">Clave maestra</string> - <string name="section_master_user_id">ID del usuario principal</string> <string name="section_actions">Acciones</string> <string name="section_certification_key">Tu clave usada para las certificaciones</string> <string name="section_upload_key">Cargar clave</string> @@ -108,12 +107,12 @@ <string name="label_message_compression">Compresión de mensaje</string> <string name="label_file_compression">Compresión de archivo</string> <string name="label_force_v3_signature">Forzar firmas OpenPGPv3 antiguas</string> + <string name="label_keyservers">Servidores de claves</string> <string name="label_key_id">ID de clave</string> <string name="label_creation">Creación</string> <string name="label_expiry">Caducidad</string> <string name="label_usage">Uso</string> <string name="label_key_size">Tamaño de clave</string> - <string name="label_main_user_id">ID del usuario principal</string> <string name="label_name">Nombre</string> <string name="label_comment">Comentario</string> <string name="label_email">Email</string> @@ -130,8 +129,18 @@ <string name="no_key"><sin clave></string> <string name="can_encrypt">se puede cifrar</string> <string name="can_sign">se puede firmar</string> + <string name="can_certify">puede certificarse</string> + <string name="can_certify_not">no puede certificarse</string> <string name="expired">caducado</string> <string name="revoked">revocado</string> + <plurals name="n_keys"> + <item quantity="one">1 clave</item> + <item quantity="other">%d claves</item> + </plurals> + <plurals name="n_keyservers"> + <item quantity="one">%d servidor de claves</item> + <item quantity="other">%d servidores de claves</item> + </plurals> <string name="secret_key">Clave secreta:</string> <!--choice--> <string name="choice_none">Ninguna</string> @@ -170,15 +179,18 @@ <string name="file_delete_confirmation">¿Estás seguro de que quieres borrar\n%s?</string> <string name="file_delete_successful">Borrado satisfactoriamente.</string> <string name="no_file_selected">Selecciona un archivo antes.</string> + <string name="encrypt_sign_successful">Firmado y/o cifrado con éxito.</string> + <string name="encrypt_sign_clipboard_successful">Firmado y/o cifrado del portapapeles con éxito.</string> <string name="enter_passphrase_twice">Introduce la frase de contraseña dos veces.</string> <string name="select_encryption_key">Selecciona al menos una clave de cifrado.</string> <string name="select_encryption_or_signature_key">Selecciona al menos una clave de cifrado o de firma.</string> <string name="specify_file_to_encrypt_to">Por favor, especifica hacia qué archivo quieres cifrar.\nADVERTENCIA: El archivo se sobreescribirá si ya existiese.</string> <string name="specify_file_to_decrypt_to">Por favor, especifica hacia qué archivo quieres descifrar.\nADVERTENCIA: El archivo se sobreescribirá si ya existiese.</string> <string name="specify_file_to_export_to">Por favor, especifica hacia qué archivo quieres exportar.\nADVERTENCIA: El archivo se sobreescribirá si ya existiese.</string> + <string name="key_deletion_confirmation_multi">¿De veras quiere borrar todas las claves públicas seleccionadas?\n¡No puede deshacer esto!</string> <string name="secret_key_deletion_confirmation">¿Quieres realmente borrar la clave SECRETA \'%s\'?\n¡No podrás deshacerlo!</string> <string name="ask_save_changed_key">Has hecho cambios en el almacén de claves, ¿quieres guardarlos?</string> - <string name="ask_empty_id_ok">Has añadido una ID de usuario vacía, ¿Estás seguro que quieres continuar?</string> + <string name="public_key_deletetion_confirmation">¿De veras quiere borrar la clave pública \'%s\'?\n¡No puede deshacer esto!</string> <string name="also_export_secret_keys">¿Exportar también las claves secretas?</string> <plurals name="keys_added_and_updated_1"> <item quantity="one">%d clave añadida satisfactoriamente</item> @@ -212,8 +224,11 @@ <item quantity="other">%d malas claves secretas ignoradas. Quizás hayas exportado con la opción\n--export-secret-subkeys\nAsegúrate de que exportas con\n--export-secret-keys\nen su lugar.</item> </plurals> <string name="key_send_success">Clave cargada al servidor satisfactoriamente</string> + <string name="key_certify_success">Clave certificada con éxito</string> <string name="list_empty">¡Esta lista está vacía!</string> + <string name="nfc_successful">¡Clave enviada con éxito vía NFC Beam (haz NFC)!</string> <string name="key_copied_to_clipboard">¡La clave ha sido copiada al portapapeles!</string> + <string name="key_has_already_been_certified">¡La clave ya ha sido certificada!</string> <string name="select_key_to_sign">¡Por favor, selecciona la clave que se usará para firmar!</string> <string name="key_too_big_for_sharing">¡La clave es demasiado grande para ser compartida de esta forma!</string> <!--errors @@ -227,8 +242,6 @@ <string name="error_master_key_must_not_be_el_gamal">la clave maestra no puede ser una clave ElGamal</string> <string name="error_unknown_algorithm_choice">elegido algoritmo desconocido</string> <string name="error_user_id_no_email">no se ha encontrado un email</string> - <string name="error_key_needs_a_user_id">necesitas al menos una ID de usuario</string> - <string name="error_main_user_id_must_not_be_empty">la ID del usuario principal no puede estar vacía</string> <string name="error_key_needs_master_key">necesitas al menos una clave maestra</string> <string name="error_no_signature_passphrase">no has proporcionado una frase de contraseña</string> <string name="error_no_signature_key">no has proporcionado una clave de firma</string> @@ -239,10 +252,13 @@ <string name="error_could_not_extract_private_key">no se puede extraer la clave privada</string> <string name="error_expiry_must_come_after_creation">la fecha de caducidad debe ser posterior a la fecha de creación</string> <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">Los datos binarios directos sin un fichero existente en el sistema de ficheros no están soportados.</string> + <string name="error_jelly_bean_needed">¡Necesita Android 4.1 para usar la característica NFC Beam (haz NFC) de Android!</string> <string name="error_nfc_needed">¡NFC no está disponible en tu dispositivo!</string> <string name="error_nothing_import">¡Nada que importar!</string> <string name="error_keyserver_insufficient_query">Consulta al servidor insuficiente</string> <string name="error_keyserver_query">La consulta al servidor de claves ha fallado</string> + <string name="error_keyserver_too_many_responses">Demasiadas claves posibles. Por favor ¡refine su consulta!</string> <string name="error_import_file_no_content">El archivo está vacio</string> <string name="error_generic_report_bug">Ha ocurrido un error genérico, por favor, informa de este bug a OpenKeychain</string> <plurals name="error_import_non_pgp_part"> @@ -251,6 +267,14 @@ </plurals> <string name="error_change_something_first">Debes hacer cambios en el almacén de claves antes de que puedas guardarlo</string> <!--results shown after decryption/verification--> + <string name="decrypt_result_invalid_signature">¡Firma no válida!</string> + <string name="decrypt_result_signature_unknown_pub_key">Clave pública desconocida</string> + <string name="decrypt_result_signature_uncertified">Firma válida (no certificada)</string> + <string name="decrypt_result_signature_certified">Firma válida (certificada)</string> + <string name="decrypt_result_decrypted">Descifrado con éxito</string> + <string name="decrypt_result_decrypted_unknown_pub_key">Descifrado con éxito pero clave pública desconocida</string> + <string name="decrypt_result_decrypted_and_signature_uncertified">Descifrado con éxito y firma válida (no certificada)</string> + <string name="decrypt_result_decrypted_and_signature_certified">Descifrado con éxito y firma válida (certificada)</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">Hecho.</string> <string name="progress_cancel">Cancelar</string> @@ -308,6 +332,7 @@ <!--Help--> <string name="help_tab_start">Comenzar</string> <string name="help_tab_faq">FAQ</string> + <string name="help_tab_wot">Web of Trust</string> <string name="help_tab_nfc_beam">NFC Beam</string> <string name="help_tab_changelog">Registro de cambios</string> <string name="help_tab_about">A cerca de</string> @@ -354,8 +379,6 @@ <string name="api_register_allow">Permitir el acceso</string> <string name="api_register_disallow">Denegar el acceso</string> <string name="api_register_error_select_key">¡Por favor, selecciona una clave!</string> - <string name="api_select_pub_keys_missing_text">No se han encontrado claves públicas para estas IDs de usuario:</string> - <string name="api_select_pub_keys_dublicates_text">Existe más de una clave pública para estos IDs de usuario:</string> <string name="api_select_pub_keys_text">¡Por favor, revisa la lista de destinatarios!</string> <string name="api_error_wrong_signature">¡La comprobación de la firma ha fallado! ¿Has instalado esta app desde una fuente distinta? Si estás seguro de que esto no es un ataque, revoca el registro de esta app en OpenKeychain y regístrala de nuevo.</string> <!--Share--> @@ -375,10 +398,10 @@ <string name="key_list_empty_button_create">crear tu propia clave</string> <string name="key_list_empty_button_import">importar claves</string> <!--Key view--> - <string name="key_view_action_edit">Editar esta clave</string> - <string name="key_view_tab_main">Información</string> + <string name="key_view_action_encrypt">Cifrar con esta clave</string> <string name="key_view_tab_certs">Certificaciones</string> <!--Navigation Drawer--> + <string name="nav_keys">Claves</string> <string name="nav_encrypt">Firmar y cifrar</string> <string name="nav_decrypt">Descifrar y verificar</string> <string name="nav_import">Importar claves</string> @@ -393,15 +416,29 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">Escribe aquí el mensaje que quieras cifrar y/o firmar...</string> <string name="decrypt_content_edit_text_hint">Introduce aquí el texto cifrado para descifrarlo y/o verificarlo...</string> - <!--unsorted--> - <string name="section_signer_id">Firmante</string> - <string name="section_cert">Detalles del certificado</string> - <string name="label_user_id">Identificador del usuario</string> - <string name="empty_certs">No hay certificados para esta clave</string> - <string name="section_uids_to_sign">IDs de usuario para firmar</string> + <!--certifications--> <string name="cert_default">predeterminado</string> <string name="cert_none">ninguno</string> <string name="cert_casual">casual</string> <string name="cert_positive">positivo</string> - <string name="cert_revoke">revocar</string> + <string name="cert_verify_ok">correcto</string> + <string name="cert_verify_failed">¡falló!</string> + <string name="cert_verify_error">¡error!</string> + <string name="cert_verify_unavailable">clave no disponible</string> + <!--unsorted--> + <string name="section_signer_id">Firmante</string> + <string name="section_cert">Detalles del certificado</string> + <string name="unknown_uid"><desconocido></string> + <string name="empty_certs">No hay certificados para esta clave</string> + <string name="label_revocation">Razón de la revocación</string> + <string name="label_verify_status">Estado de la verificación</string> + <string name="label_cert_type">Tipo</string> + <string name="error_key_not_found">¡Clave no encontrada!</string> + <string name="error_key_processing">¡Error procesando clave!</string> + <string name="no_subkey">subclave no disponible</string> + <string name="key_stripped">desnudo, sin clave</string> + <string name="secret_cannot_multiple">¡Las claves privadas (secretas) sólo pueden borrarse individualmente!</string> + <string name="title_view_cert">Ver detalles del certificado</string> + <string name="unknown_algorithm">desconocido</string> + <string name="can_sign_not">no puede firmarse</string> </resources> diff --git a/OpenKeychain/src/main/res/values-et/strings.xml b/OpenKeychain/src/main/res/values-et/strings.xml index 6f91c567d..6086fa486 100644 --- a/OpenKeychain/src/main/res/values-et/strings.xml +++ b/OpenKeychain/src/main/res/values-et/strings.xml @@ -19,7 +19,6 @@ <string name="title_send_key">Lae võtmeserverisse</string> <string name="title_help">Abi</string> <!--section--> - <string name="section_user_ids">Kasutaja ID-d</string> <string name="section_keys">Võtmed</string> <string name="section_general">Üldine</string> <string name="section_defaults">Vaikeseaded</string> @@ -103,5 +102,6 @@ <!--Key view--> <!--Navigation Drawer--> <!--hints--> + <!--certifications--> <!--unsorted--> </resources> diff --git a/OpenKeychain/src/main/res/values-fa-rIR/strings.xml b/OpenKeychain/src/main/res/values-fa-rIR/strings.xml index 70242f3b9..10047ae91 100644 --- a/OpenKeychain/src/main/res/values-fa-rIR/strings.xml +++ b/OpenKeychain/src/main/res/values-fa-rIR/strings.xml @@ -26,5 +26,6 @@ <!--Key view--> <!--Navigation Drawer--> <!--hints--> + <!--certifications--> <!--unsorted--> </resources> diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index 1b9bd41b8..19d304276 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -13,7 +13,6 @@ <string name="title_key_server_preference">Préférences du serveur de clefs</string> <string name="title_change_passphrase">Modifier la phrase de passe</string> <string name="title_set_passphrase">Définir la phrase de passe</string> - <string name="title_share_with">Partager avec...</string> <string name="title_share_file">Partager le fichier avec...</string> <string name="title_encrypt_to_file">Chiffrer vers un fichier</string> <string name="title_decrypt_to_file">Déchiffrer vers un fichier</string> @@ -26,13 +25,11 @@ <string name="title_key_details">Détails sur la clef</string> <string name="title_help">Aide</string> <!--section--> - <string name="section_user_ids">IDs utilisateurs</string> <string name="section_keys">Clefs</string> <string name="section_general">Général</string> <string name="section_defaults">Valeurs par défaut</string> <string name="section_advanced">Avancé</string> <string name="section_master_key">Clef maîtresse</string> - <string name="section_master_user_id">ID utilisateur maître</string> <string name="section_actions">Actions</string> <string name="section_certification_key">Votre clef utilisée pour la certification</string> <string name="section_upload_key">Téléverser la clef</string> @@ -116,7 +113,6 @@ <string name="label_expiry">Expiration</string> <string name="label_usage">Utilisation</string> <string name="label_key_size">Taille de la clef</string> - <string name="label_main_user_id">ID utilisateur principal</string> <string name="label_name">Nom</string> <string name="label_comment">Commentaire</string> <string name="label_email">Courriel</string> @@ -133,6 +129,8 @@ <string name="no_key"><pas de clef></string> <string name="can_encrypt">peut chiffrer</string> <string name="can_sign">peut signer</string> + <string name="can_certify">peut certifier</string> + <string name="can_certify_not">ne peut pas certifier</string> <string name="expired">expiré</string> <string name="revoked">révoquée</string> <plurals name="n_keys"> @@ -192,7 +190,6 @@ <string name="key_deletion_confirmation_multi">Voulez-vous vraiment supprimer toutes les clefs publiques choisies ?\nCeci est irréversible !</string> <string name="secret_key_deletion_confirmation">Voulez-vous vraiment supprimer la clef SECRÈTE %s ?\nVous ne pourrez pas la restituer !</string> <string name="ask_save_changed_key">Vous avez apporté des changements au trousseau, voulez-vous l\'enregistrer ?</string> - <string name="ask_empty_id_ok">Vous avez ajouté un ID utilisateur vide, êtes-vous certain de vouloir continuer?</string> <string name="public_key_deletetion_confirmation">Voulez-vous vraiment supprimer la clef publique %s ?\nCeci est irréversible !</string> <string name="also_export_secret_keys">Exporter aussi les clefs secrètes?</string> <plurals name="keys_added_and_updated_1"> @@ -227,8 +224,11 @@ <item quantity="other">%d mauvaises clefs ignorées. Vous avez peut-être exporté avec l\'option\n --export-secret-subkeys\nAssurez-vous d\'exporter plutôt avec\n --export-secret-keys.</item> </plurals> <string name="key_send_success">Clef téléversée vers le serveur avec succès</string> + <string name="key_certify_success">Clef certifiée avec succès</string> <string name="list_empty">Cette liste est vide !</string> + <string name="nfc_successful">Clef envoyée par Beam NFC avec succès |</string> <string name="key_copied_to_clipboard">La clef a été copié vers le presse-papiers !</string> + <string name="key_has_already_been_certified">La clef a déjà été certifiée !</string> <string name="select_key_to_sign">Veuillez choisir une clef a utiliser pour la signature !</string> <string name="key_too_big_for_sharing">La clef est trop grosse pour être partagée ainsi !</string> <!--errors @@ -242,8 +242,6 @@ <string name="error_master_key_must_not_be_el_gamal">la clef maîtresse ne peut être une clef ElGama</string> <string name="error_unknown_algorithm_choice">choix d\'algorhitme inconnu</string> <string name="error_user_id_no_email">aucun courriel trouvé</string> - <string name="error_key_needs_a_user_id">vous avez besoin d\'au moins un ID utilisateur</string> - <string name="error_main_user_id_must_not_be_empty">l\'ID utilisateur principal ne doit pas être vide</string> <string name="error_key_needs_master_key">au moins une clef maîtresse est nécessaire</string> <string name="error_no_signature_passphrase">aucune phrase de passe n\'a été donnée</string> <string name="error_no_signature_key">aucune clef de signature n\'a été donnée</string> @@ -254,10 +252,13 @@ <string name="error_could_not_extract_private_key">impossible d\'extraire la clef privée</string> <string name="error_expiry_must_come_after_creation">la date d\'expiration doit venir après la date de création</string> <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">Les données binaires directes sans fichier dans le système de fichiers ne sont pas prises en charge.</string> + <string name="error_jelly_bean_needed">Il vous faut Android 4.1 pour utiliser la fonction Beam NFC d\'Android !</string> <string name="error_nfc_needed">La NFC n\'est pas disponible sur votre appareil !</string> <string name="error_nothing_import">Rien à importer !</string> <string name="error_keyserver_insufficient_query">Requête serveur insuffisante</string> <string name="error_keyserver_query">Échec lors de l\'interrogation du serveur de clefs</string> + <string name="error_keyserver_too_many_responses">Il y a trop de clefs possibles. Veuillez affiner votre requête !</string> <string name="error_import_file_no_content">Le fichier n\'a pas de contenu</string> <string name="error_generic_report_bug">Une erreur générique est survenue, veuillez créer un nouveau rapport de bogue pour OpenKeychain.</string> <plurals name="error_import_non_pgp_part"> @@ -331,6 +332,7 @@ <!--Help--> <string name="help_tab_start">Commencer</string> <string name="help_tab_faq">FAQ</string> + <string name="help_tab_wot">Toile de confiance</string> <string name="help_tab_nfc_beam">NFC Beam</string> <string name="help_tab_changelog">Journal des changements</string> <string name="help_tab_about">À propos de</string> @@ -377,8 +379,6 @@ <string name="api_register_allow">Permettre l\'accès</string> <string name="api_register_disallow">Enlever l\'accès</string> <string name="api_register_error_select_key">Veuillez choisir une clef !</string> - <string name="api_select_pub_keys_missing_text">Aucune clef publique n\'a été trouvée pour ces IDs utilisateur :</string> - <string name="api_select_pub_keys_dublicates_text">Plus d\'une clef publique existe pour ces IDs utilisateur</string> <string name="api_select_pub_keys_text">Veuillez revoir la liste des destinataires !</string> <string name="api_error_wrong_signature">La vérification de la signature a échoué ! Avez-vous installé cette appli à partir d\'une source différente ? Si vous êtes sûr que ce n\'est pas une attaque, révoquez l\'enregistrement de cette appli dans OpenKeychain et enregistrez-la à nouveau.</string> <!--Share--> @@ -398,10 +398,7 @@ <string name="key_list_empty_button_create">créer votre propre clef</string> <string name="key_list_empty_button_import">Importer des clefs.</string> <!--Key view--> - <string name="key_view_action_edit">Modifier cette clef</string> <string name="key_view_action_encrypt">Chiffrer avec cette clef</string> - <string name="key_view_action_certify">Certifier cette clef</string> - <string name="key_view_tab_main">Infos</string> <string name="key_view_tab_certs">Certifications</string> <!--Navigation Drawer--> <string name="nav_keys">Clefs</string> @@ -419,31 +416,29 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">Écrire ici le message à chiffrer et/ou signer...</string> <string name="decrypt_content_edit_text_hint">Saisir le cryptogramme à déchiffrer et/ou à vérifier ici...</string> - <!--unsorted--> - <string name="section_signer_id">Signataire</string> - <string name="section_cert">Détails du certificat</string> - <string name="label_user_id">ID utilisateur</string> - <string name="empty_certs">Aucun certificat pour cette clef</string> - <string name="section_uids_to_sign">ID utilisateur pour signer</string> + <!--certifications--> <string name="cert_default">valeur par défaut</string> <string name="cert_none">aucun</string> <string name="cert_casual">rapide</string> <string name="cert_positive">positif</string> - <string name="cert_revoke">révoquer</string> - <string name="help_tab_wot">Toile de confiance</string> <string name="cert_verify_ok">ok</string> <string name="cert_verify_failed">échec!</string> <string name="cert_verify_error">erreur!</string> <string name="cert_verify_unavailable">clef non disponible</string> + <!--unsorted--> + <string name="section_signer_id">Signataire</string> + <string name="section_cert">Détails du certificat</string> + <string name="unknown_uid"><inconnu></string> + <string name="empty_certs">Aucun certificat pour cette clef</string> <string name="label_revocation">Raison de la révocation</string> <string name="label_verify_status">État de vérification</string> <string name="label_cert_type">Type</string> - <string name="can_certify">peut certifier</string> - <string name="can_certify_not">ne peut pas certifier</string> <string name="error_key_not_found">Clef introuvable !</string> <string name="error_key_processing">Erreur lors du traitement de la clef !</string> <string name="no_subkey">sous-clef non disponible</string> <string name="key_stripped">dépouillée</string> <string name="secret_cannot_multiple">Les clefs secrètes ne peuvent être supprimées qu\'individuellement !</string> <string name="title_view_cert">Voir les détails du certificat</string> + <string name="unknown_algorithm">inconnu</string> + <string name="can_sign_not">impossible de signer</string> </resources> diff --git a/OpenKeychain/src/main/res/values-it-rIT/strings.xml b/OpenKeychain/src/main/res/values-it-rIT/strings.xml index c744bdda7..d79bc7ee6 100644 --- a/OpenKeychain/src/main/res/values-it-rIT/strings.xml +++ b/OpenKeychain/src/main/res/values-it-rIT/strings.xml @@ -13,7 +13,6 @@ <string name="title_key_server_preference">Preferenze Server delle Chiavi</string> <string name="title_change_passphrase">Cambia Frase Di Accesso</string> <string name="title_set_passphrase">Imposta Frase di Accesso</string> - <string name="title_share_with">Condividi con...</string> <string name="title_share_file">Condividi file con...</string> <string name="title_encrypt_to_file">Codifica File</string> <string name="title_decrypt_to_file">Decodifica File</string> @@ -26,13 +25,11 @@ <string name="title_key_details">Dettagli Chiave</string> <string name="title_help">Aiuto</string> <!--section--> - <string name="section_user_ids">ID Utente</string> <string name="section_keys">Chiavi</string> <string name="section_general">Generale</string> <string name="section_defaults">Predefiniti</string> <string name="section_advanced">Avanzato</string> <string name="section_master_key">Chiave Principale</string> - <string name="section_master_user_id">ID Utente Principale</string> <string name="section_actions">Azioni</string> <string name="section_certification_key">La Tua Chiave usata per la certificazione</string> <string name="section_upload_key">Carica Chiave</string> @@ -116,7 +113,6 @@ <string name="label_expiry">Scadenza</string> <string name="label_usage">Utilizzo</string> <string name="label_key_size">Dimensione Chiave</string> - <string name="label_main_user_id">ID Utente Principale</string> <string name="label_name">Nome</string> <string name="label_comment">Commento</string> <string name="label_email">Email</string> @@ -133,6 +129,8 @@ <string name="no_key"><nessuna chiave></string> <string name="can_encrypt">puo\' codificare</string> <string name="can_sign">puo\' firmare</string> + <string name="can_certify">può certificare</string> + <string name="can_certify_not">non può certificare</string> <string name="expired">scaduto</string> <string name="revoked">revocato</string> <plurals name="n_keys"> @@ -192,7 +190,6 @@ <string name="key_deletion_confirmation_multi">Vuoi veramente eliminare tutte le chiavi pubbliche selezionate?\nNon potrai annullare!</string> <string name="secret_key_deletion_confirmation">Vuoi veramente eliminare la chiave PRIVATA \'%s\'?\nNon potrai annullare!</string> <string name="ask_save_changed_key">Hai apportato modifiche al tuo portachiavi, vuoi salvarlo?</string> - <string name="ask_empty_id_ok">È stato aggiunto un ID utente vuoto, sei sicuro di voler continuare?</string> <string name="public_key_deletetion_confirmation">Vuoi veramente eliminare la chiave pubblica \'%s\'?\nNon potrai annullare!</string> <string name="also_export_secret_keys">Esportare anche le chiavi segrete?</string> <plurals name="keys_added_and_updated_1"> @@ -227,8 +224,11 @@ <item quantity="other">%d chiavi private non valide ignorate. Forse hai esportato con opzione\n--export-secret-subkeys\nAssicurati di esportare con\n--export-secret-keys\ninvece.</item> </plurals> <string name="key_send_success">Chiave caricata con successo sul server</string> + <string name="key_certify_success">Chiave certrificata correttamente</string> <string name="list_empty">Lista vuota!</string> + <string name="nfc_successful">Chiave correttamente inviata tramite NFC Beam!</string> <string name="key_copied_to_clipboard">Chiave copiata negli appunti!</string> + <string name="key_has_already_been_certified">La chiave è già certificata!</string> <string name="select_key_to_sign">Per favore seleziona la chiave per la firma!</string> <string name="key_too_big_for_sharing">Chiave troppo grande per essere condivisa in questo modo!</string> <!--errors @@ -242,8 +242,6 @@ <string name="error_master_key_must_not_be_el_gamal">La chiave principale non puo\' essere ElGamal</string> <string name="error_unknown_algorithm_choice">opzione algoritmo sconosciuta</string> <string name="error_user_id_no_email">Nessuna email trovata</string> - <string name="error_key_needs_a_user_id">necessario almeno un id utente</string> - <string name="error_main_user_id_must_not_be_empty">id utente principale non puo\' essere vuoto</string> <string name="error_key_needs_master_key">necessaria almeno una chiave principale</string> <string name="error_no_signature_passphrase">nessuna frase di accesso inserita</string> <string name="error_no_signature_key">nessuna chiave di firma inserita</string> @@ -254,10 +252,13 @@ <string name="error_could_not_extract_private_key">impossibile estrarre la chiave privata</string> <string name="error_expiry_must_come_after_creation">La data di scadenza deve essere postuma quella di creazione</string> <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">Flusso di dati diretto senza file corrispettivo nel filesystem non e\' supportato.</string> + <string name="error_jelly_bean_needed">Devi avere Android 4.1 per usare Android NFC Beam!</string> <string name="error_nfc_needed">NFC non disponibile nel tuo dispositivo!</string> <string name="error_nothing_import">Niente da importare!</string> <string name="error_keyserver_insufficient_query">Query di server insufficiente</string> <string name="error_keyserver_query">Interrogazione del server delle chiavi fallita</string> + <string name="error_keyserver_too_many_responses">Troppe chiavi corrispondenti. Riformula meglio la ricerca!</string> <string name="error_import_file_no_content">Il File non ha contenuti</string> <string name="error_generic_report_bug">Si è verificato un errore generico, si prega di creare una nuova segnalazione di errore per OpenKeychain.</string> <plurals name="error_import_non_pgp_part"> @@ -331,6 +332,7 @@ <!--Help--> <string name="help_tab_start">Inizia</string> <string name="help_tab_faq">FAQ</string> + <string name="help_tab_wot">Rete di Fiducia</string> <string name="help_tab_nfc_beam">NFC Beam</string> <string name="help_tab_changelog">Novita\'</string> <string name="help_tab_about">Info</string> @@ -377,8 +379,6 @@ <string name="api_register_allow">Permetti accesso</string> <string name="api_register_disallow">Nega accesso</string> <string name="api_register_error_select_key">Per favore selezionare una chiave!</string> - <string name="api_select_pub_keys_missing_text">Nessuna chiave pubblica trovata per id utente:</string> - <string name="api_select_pub_keys_dublicates_text">Esistono piu\' di una chiave pubblica per gli id utenti:</string> <string name="api_select_pub_keys_text">Per favore ricontrolla la lista destinatari!</string> <string name="api_error_wrong_signature">Controllo della firma fallito! Hai installato questa app da una fonte diversa? Se sei sicuro che non sia un attacco, revoca la registrazione di questa app in OpenKeychain e dopo registra di nuovo l\'app.</string> <!--Share--> @@ -398,10 +398,7 @@ <string name="key_list_empty_button_create">creazione della tua chiave</string> <string name="key_list_empty_button_import">importazione chiavi.</string> <!--Key view--> - <string name="key_view_action_edit">Modifica chiave</string> <string name="key_view_action_encrypt">Codifica con questa chiave</string> - <string name="key_view_action_certify">Certifica questa chiave</string> - <string name="key_view_tab_main">Info</string> <string name="key_view_tab_certs">Certificazioni</string> <!--Navigation Drawer--> <string name="nav_keys">Chiavi</string> @@ -419,31 +416,29 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">Scrivi qui il messaggio da codificare e/o firmare...</string> <string name="decrypt_content_edit_text_hint">Inserisci il testo cifrato qui per la decodifica e/o verifica...</string> - <!--unsorted--> - <string name="section_signer_id">Firmatario</string> - <string name="section_cert">Dettagli Certificato</string> - <string name="label_user_id">ID Utente</string> - <string name="empty_certs">Nessun certificato per questa chiave</string> - <string name="section_uids_to_sign">ID Utente da firmare</string> + <!--certifications--> <string name="cert_default">predefiniti</string> <string name="cert_none">nessuno</string> <string name="cert_casual">casuale</string> <string name="cert_positive">positivo</string> - <string name="cert_revoke">revoca</string> - <string name="help_tab_wot">Rete di Fiducia</string> <string name="cert_verify_ok">ok</string> <string name="cert_verify_failed">fallito!</string> <string name="cert_verify_error">errore!</string> <string name="cert_verify_unavailable">chiave non disponibile</string> + <!--unsorted--> + <string name="section_signer_id">Firmatario</string> + <string name="section_cert">Dettagli Certificato</string> + <string name="unknown_uid"><sconosciuto></string> + <string name="empty_certs">Nessun certificato per questa chiave</string> <string name="label_revocation">Ragione della Revoca</string> <string name="label_verify_status">Stato Verifica</string> <string name="label_cert_type">Tipo</string> - <string name="can_certify">può certificare</string> - <string name="can_certify_not">non può certificare</string> <string name="error_key_not_found">Chiave non trovata!</string> <string name="error_key_processing">Errore di elaborazione chiave!</string> <string name="no_subkey">sottochiave non disponibile</string> <string name="key_stripped">ripulito</string> <string name="secret_cannot_multiple">Le chiavi segrete possono essere cancellate solo individualmente!</string> <string name="title_view_cert">Visualizza Dettagli Certificati</string> + <string name="unknown_algorithm">sconosciuto</string> + <string name="can_sign_not">non può firmare</string> </resources> diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index cad362fb1..a6b802152 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -13,7 +13,6 @@ <string name="title_key_server_preference">鍵サーバ設定</string> <string name="title_change_passphrase">パスフレーズの変更</string> <string name="title_set_passphrase">パスフレーズの設定</string> - <string name="title_share_with">...で共有</string> <string name="title_share_file">...でファイルの共有</string> <string name="title_encrypt_to_file">暗号化してファイルに</string> <string name="title_decrypt_to_file">復号化してファイルに</string> @@ -26,13 +25,11 @@ <string name="title_key_details">鍵の概要</string> <string name="title_help">ヘルプ</string> <!--section--> - <string name="section_user_ids">ユーザID</string> <string name="section_keys">鍵</string> <string name="section_general">一般</string> <string name="section_defaults">デフォルト</string> <string name="section_advanced">拡張</string> <string name="section_master_key">主鍵</string> - <string name="section_master_user_id">主ユーザID</string> <string name="section_actions">アクション</string> <string name="section_certification_key">あなたの鍵を証明に利用します</string> <string name="section_upload_key">鍵のアップロード</string> @@ -116,7 +113,6 @@ <string name="label_expiry">満了</string> <string name="label_usage">使い方</string> <string name="label_key_size">鍵サイズ</string> - <string name="label_main_user_id">主ユーザID</string> <string name="label_name">名前</string> <string name="label_comment">コメント</string> <string name="label_email">Eメールアドレス</string> @@ -132,6 +128,8 @@ <string name="no_key"><鍵無し></string> <string name="can_encrypt">暗号化可能</string> <string name="can_sign">署名可能</string> + <string name="can_certify">検証可能</string> + <string name="can_certify_not">検証不能</string> <string name="expired">期限切れ</string> <string name="revoked">破棄</string> <plurals name="n_keys"> @@ -189,7 +187,6 @@ <string name="key_deletion_confirmation_multi">選択したすべての公開鍵を削除して本当に良いのですか?\nこれは元に戻せません!</string> <string name="secret_key_deletion_confirmation">秘密鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string> <string name="ask_save_changed_key">あなたは鍵輪に変更を加えました、これを保存しますか?</string> - <string name="ask_empty_id_ok">あなたは空のユーザーIDを追加しました、このまま続けますか?</string> <string name="public_key_deletetion_confirmation">公開鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string> <string name="also_export_secret_keys">秘密鍵もエクスポートしますか?</string> <plurals name="keys_added_and_updated_1"> @@ -218,8 +215,11 @@ <item quantity="other">%d の問題ある鍵を無視しました。 おそらく次のオプションでエクスポートしています\n --export-secret-subkeys\n代りに次のオプションでエクスポートしてください。\n --export-secret-keys</item> </plurals> <string name="key_send_success">鍵を鍵サーバにアップロードしました</string> + <string name="key_certify_success">鍵を検証しました</string> <string name="list_empty">このリストは空です!</string> + <string name="nfc_successful">NFCビームで鍵を送信しました!</string> <string name="key_copied_to_clipboard">鍵はクリプボードにコピーされました!</string> + <string name="key_has_already_been_certified">鍵はすでに検証されています!</string> <string name="select_key_to_sign">署名に使う鍵を選択して下さい!</string> <string name="key_too_big_for_sharing">この共有方法では鍵が大きすぎます!</string> <!--errors @@ -233,8 +233,6 @@ <string name="error_master_key_must_not_be_el_gamal">主鍵を ElGamal にすることはできません</string> <string name="error_unknown_algorithm_choice">未知のアルゴリズムを選択しています</string> <string name="error_user_id_no_email">メールが見付かりません</string> - <string name="error_key_needs_a_user_id">最低でも1つのユーザIDが必要です</string> - <string name="error_main_user_id_must_not_be_empty">主ユーザIDは空にすることはできません</string> <string name="error_key_needs_master_key">主鍵が最低でも1つ必要です</string> <string name="error_no_signature_passphrase">パスフレーズが与えられていません</string> <string name="error_no_signature_key">署名鍵を与えられていません</string> @@ -245,10 +243,13 @@ <string name="error_could_not_extract_private_key">秘密鍵を取り出すことができません</string> <string name="error_expiry_must_come_after_creation">期限日時は生成日時より後である必要があります</string> <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">ファイルシステムに存在するファイルではないバイナリデータはサポートされません。</string> + <string name="error_jelly_bean_needed">Android NFC Beam機能を使うにはAndroid 4.1 が必要です!</string> <string name="error_nfc_needed">あなたのデバイスにはNFCが存在しません!</string> <string name="error_nothing_import">インポートするものがありません!</string> <string name="error_keyserver_insufficient_query">サーバへのクエリーが不足しています</string> <string name="error_keyserver_query">鍵サーバへのクエリーが失敗</string> + <string name="error_keyserver_too_many_responses">鍵が多すぎます。クエリーを整えてください!</string> <string name="error_import_file_no_content">ファイルに内容がありません</string> <string name="error_generic_report_bug">一般エラーが発生しました、この新しいバグの情報をOpenKeychainプロジェクトに送ってください</string> <plurals name="error_import_non_pgp_part"> @@ -319,6 +320,7 @@ <!--Help--> <string name="help_tab_start">開始</string> <string name="help_tab_faq">FAQ</string> + <string name="help_tab_wot">信頼の輪</string> <string name="help_tab_nfc_beam">NFC Beam</string> <string name="help_tab_changelog">Changelog</string> <string name="help_tab_about">これについて</string> @@ -364,8 +366,6 @@ <string name="api_register_allow">許可されたアクセス</string> <string name="api_register_disallow">許可されないアクセス</string> <string name="api_register_error_select_key">鍵を選択してください!</string> - <string name="api_select_pub_keys_missing_text">このユーザIDについて公開鍵が見付かりません:</string> - <string name="api_select_pub_keys_dublicates_text">このユーザIDについて1つ以上の公開鍵が存在します:</string> <string name="api_select_pub_keys_text">受信者リストを確認してください!</string> <string name="api_error_wrong_signature">署名チェックが失敗! 違うところからこのアプリをインストールしましたか? もし攻撃されてでなくそうであるなら、OpenKeychainにあるこのアプリの登録を破棄し、再度アプリを登録してください。</string> <!--Share--> @@ -384,10 +384,7 @@ <string name="key_list_empty_button_create">あなた所有の鍵を作る</string> <string name="key_list_empty_button_import">鍵のインポート。</string> <!--Key view--> - <string name="key_view_action_edit">この鍵の編集</string> <string name="key_view_action_encrypt">この鍵で暗号化</string> - <string name="key_view_action_certify">この鍵で検証</string> - <string name="key_view_tab_main">情報</string> <string name="key_view_tab_certs">証明</string> <!--Navigation Drawer--> <string name="nav_keys">鍵</string> @@ -405,31 +402,29 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">ここに書いたメッセージを暗号化/署名..</string> <string name="decrypt_content_edit_text_hint">ここに入力された暗号化テキストを復号化/検証...</string> - <!--unsorted--> - <string name="section_signer_id">署名者</string> - <string name="section_cert">証明の詳細</string> - <string name="label_user_id">ユーザーID</string> - <string name="empty_certs">この鍵に証明がない</string> - <string name="section_uids_to_sign">署名に使うユーザーID</string> + <!--certifications--> <string name="cert_default">デフォルト</string> <string name="cert_none">無し</string> <string name="cert_casual">因果</string> <string name="cert_positive">肯定的</string> - <string name="cert_revoke">破棄</string> - <string name="help_tab_wot">信頼の輪</string> <string name="cert_verify_ok">OK</string> <string name="cert_verify_failed">失敗!</string> <string name="cert_verify_error">エラー!</string> <string name="cert_verify_unavailable">鍵がありません</string> + <!--unsorted--> + <string name="section_signer_id">署名者</string> + <string name="section_cert">証明の詳細</string> + <string name="unknown_uid"><不明></string> + <string name="empty_certs">この鍵に証明がない</string> <string name="label_revocation">破棄の理由</string> <string name="label_verify_status">検証ステータス</string> <string name="label_cert_type">種別</string> - <string name="can_certify">検証可能</string> - <string name="can_certify_not">検証不能</string> <string name="error_key_not_found">鍵が見当りません!</string> <string name="error_key_processing">鍵処理のエラー!</string> <string name="no_subkey">副鍵がありません</string> <string name="key_stripped">スリム化</string> <string name="secret_cannot_multiple">秘密鍵は個別にしか削除できません!</string> <string name="title_view_cert">証明の詳細を見る</string> + <string name="unknown_algorithm">不明</string> + <string name="can_sign_not">署名不可</string> </resources> diff --git a/OpenKeychain/src/main/res/values-ko/strings.xml b/OpenKeychain/src/main/res/values-ko/strings.xml new file mode 100644 index 000000000..10047ae91 --- /dev/null +++ b/OpenKeychain/src/main/res/values-ko/strings.xml @@ -0,0 +1,31 @@ +<?xml version='1.0' encoding='UTF-8'?> +<resources> + <!--title--> + <!--section--> + <!--button--> + <!--menu--> + <!--label--> + <!--choice--> + <!--key flags--> + <!--sentences--> + <!--errors + no punctuation, all lowercase, + they will be put after "error_message", e.g. "Error: file not found"--> + <!--errors without preceeding Error:--> + <!--results shown after decryption/verification--> + <!--progress dialogs, usually ending in '…'--> + <!--action strings--> + <!--key bit length selections--> + <!--compression--> + <!--Help--> + <!--Import--> + <!--Intent labels--> + <!--Remote API--> + <!--Share--> + <!--Key list--> + <!--Key view--> + <!--Navigation Drawer--> + <!--hints--> + <!--certifications--> + <!--unsorted--> +</resources> diff --git a/OpenKeychain/src/main/res/values-nl-rNL/strings.xml b/OpenKeychain/src/main/res/values-nl-rNL/strings.xml index ea4414b59..cb099269f 100644 --- a/OpenKeychain/src/main/res/values-nl-rNL/strings.xml +++ b/OpenKeychain/src/main/res/values-nl-rNL/strings.xml @@ -19,7 +19,6 @@ <string name="title_key_not_found">Sleutel niet gevonden</string> <string name="title_help">Help</string> <!--section--> - <string name="section_user_ids">Gebruikers-id\'s</string> <string name="section_keys">Sleutels</string> <string name="section_general">Algemeen</string> <string name="section_defaults">Standaard</string> @@ -65,7 +64,6 @@ <string name="label_expiry">Verlopen</string> <string name="label_usage">Gebruik</string> <string name="label_key_size">Sleutelgrootte</string> - <string name="label_main_user_id">Hoofdgebruikers-id</string> <string name="label_name">Naam</string> <string name="label_comment">Opmerking</string> <string name="label_email">E-mailadres</string> @@ -125,8 +123,6 @@ <string name="error_key_size_minimum512bit">sleutelgrootte moet minstens 512-bits zijn</string> <string name="error_master_key_must_not_be_el_gamal">de hoofdsleutel kan geen ElGamal-sleutel zijn</string> <string name="error_unknown_algorithm_choice">onbekende algoritmekeuze</string> - <string name="error_key_needs_a_user_id">ten minste één gebruiksers-id vereist</string> - <string name="error_main_user_id_must_not_be_empty">hoofdgebruikers-id kan niet leeg zijn</string> <string name="error_key_needs_master_key">ten minste een hoofdsleutel is vereist</string> <string name="error_no_signature_passphrase">geen wachtwoord opgegeven</string> <string name="error_no_signature_key">geen ondertekeningssleutel opgegeven</string> @@ -192,8 +188,6 @@ <string name="api_register_allow">Toegang toestaan</string> <string name="api_register_disallow">Toegang weigeren</string> <string name="api_register_error_select_key">Selecteert u a.u.b. een sleutel</string> - <string name="api_select_pub_keys_missing_text">Geen publieke sleutels gevonden voor deze gebruiker-id\'s:</string> - <string name="api_select_pub_keys_dublicates_text">Meer dan een publieke sleutel gevonden voor deze gebruikers-id\'s:</string> <string name="api_select_pub_keys_text">Bekijkt u a.u.b. de ontvangers</string> <!--Share--> <string name="share_qr_code_dialog_start">U gaat door alle QR-codes met \'Volgende\', en scant ze een voor een.</string> @@ -201,5 +195,6 @@ <!--Key view--> <!--Navigation Drawer--> <!--hints--> + <!--certifications--> <!--unsorted--> </resources> diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml index 6cf4feb20..1d67f2223 100644 --- a/OpenKeychain/src/main/res/values-pl/strings.xml +++ b/OpenKeychain/src/main/res/values-pl/strings.xml @@ -13,6 +13,7 @@ <string name="title_key_server_preference">Właściwości serwera kluczy</string> <string name="title_change_passphrase">Zmień hasło</string> <string name="title_set_passphrase">Ustaw hasło</string> + <string name="title_share_file">Udostępnij plik...</string> <string name="title_encrypt_to_file">Zaszyfruj do pliku</string> <string name="title_decrypt_to_file">Odszyfruj do pliku</string> <string name="title_import_keys">Importuj klucze</string> @@ -24,13 +25,11 @@ <string name="title_key_details">Szczegóły klucza</string> <string name="title_help">Pomoc</string> <!--section--> - <string name="section_user_ids">Identyfikator użytkownika</string> <string name="section_keys">Klucze</string> <string name="section_general">Ogólne</string> <string name="section_defaults">Domyślne</string> <string name="section_advanced">Zaawansowane</string> <string name="section_master_key">Klucz główny</string> - <string name="section_master_user_id">Główny identyfikator użytkownika</string> <string name="section_actions">Działania</string> <string name="section_certification_key">Twój klucz użyty do certyfikacji</string> <string name="section_upload_key">Wyślij klucz</string> @@ -108,12 +107,12 @@ <string name="label_message_compression">Kompresja wiadomości</string> <string name="label_file_compression">Kompresja plików</string> <string name="label_force_v3_signature">Wymuś stare podpisy OpenPGPv3</string> + <string name="label_keyservers">Serwery kluczy</string> <string name="label_key_id">Identyfikator klucza</string> <string name="label_creation">Utworzenia</string> <string name="label_expiry">Wygaśnięcia</string> <string name="label_usage">Wykorzystanie</string> <string name="label_key_size">Rozmiar klucza</string> - <string name="label_main_user_id">Identyfikator głównego użytkownika</string> <string name="label_name">Imię</string> <string name="label_comment">Komentarz</string> <string name="label_email">Adres email</string> @@ -131,8 +130,20 @@ <string name="no_key"><brak klucza></string> <string name="can_encrypt">może szyfrować</string> <string name="can_sign">może podpisywać</string> + <string name="can_certify">może certyfikować</string> + <string name="can_certify_not">nie może certyfikować</string> <string name="expired">wygasły</string> <string name="revoked">unieważniony</string> + <plurals name="n_keys"> + <item quantity="one">1 klucz</item> + <item quantity="few">%d klucze</item> + <item quantity="other">%d kluczy</item> + </plurals> + <plurals name="n_keyservers"> + <item quantity="one">%d serwer kluczy</item> + <item quantity="few">%d serwery kluczy</item> + <item quantity="other">%d serwerów kluczy</item> + </plurals> <string name="secret_key">Klucz prywatny:</string> <!--choice--> <string name="choice_none">Brak</string> @@ -171,15 +182,17 @@ <string name="file_delete_confirmation">Czy jesteś pewien że chcesz usunąć\n%s?</string> <string name="file_delete_successful">Usunięto pomyślnie.</string> <string name="no_file_selected">Najpierw wskaż plik.</string> + <string name="encrypt_sign_successful">Pomyślnie podpisano i/lub zaszyfrowano.</string> + <string name="encrypt_sign_clipboard_successful">Pomyslnie podpisano i/lub zaszyfrowano do schowka.</string> <string name="enter_passphrase_twice">Podaj hasło dwukrotnie.</string> <string name="select_encryption_key">Wybierz co najmniej jeden klucz szyfrujący.</string> <string name="select_encryption_or_signature_key">Wybierz co najmniej jeden klucz szyfrujący lub klucz podpisujący.</string> <string name="specify_file_to_encrypt_to">Wskaż, do którego pliku zapisać zaszyfrowane dane.\nOSTRZEŻENIE: Plik zostanie nadpisany, jeżeli istnieje.</string> <string name="specify_file_to_decrypt_to">Wskaż, do którego pliku zapisać odszyfrowane dane.\nOSTRZEŻENIE: Plik zostanie nadpisany, jeżeli istnieje.</string> <string name="specify_file_to_export_to">Wskaż, do którego pliku wyeksportować dane.\nOSTRZEŻENIE: Plik zostanie nadpisany, jeżeli istnieje.</string> + <string name="key_deletion_confirmation_multi">Czy na pewno chcesz usunąć wszystkie zaznaczone klucze publiczne?\nTej operacji nie można cofnąć!</string> <string name="secret_key_deletion_confirmation">Czy na pewno chcesz usunąć klucz prywatny \'%s\'?\nNie można cofnąć tej operacji!</string> <string name="ask_save_changed_key">Zostały dokonane zmiany w pęku kluczy, czy chcesz je zachować?</string> - <string name="ask_empty_id_ok">Dodałeś pusty identyfikator użytkownika, czy na pewno chcesz kontynuować?</string> <string name="public_key_deletetion_confirmation">Czy na pewno chcesz usunąć klucz publiczny \'%s\'?\nNie można cofnąć tej operacji!</string> <string name="also_export_secret_keys">Czy wyeksportować również klucze prywatne?</string> <plurals name="keys_added_and_updated_1"> @@ -220,8 +233,11 @@ <item quantity="other">zignorowano %d niepoprawnych kluczy prywatnych. Prawdopodobnie zostały wyeksportowane przy uzyciu opcji\n --export-secret-subkeys\nUpewnij się że eksportujesz je z opcją\n --export-secret-keys\nktóra jest poprawna.</item> </plurals> <string name="key_send_success">Pomyślnie wysłano klucz na serwer</string> + <string name="key_certify_success">Pomyślnie podpisano klucz</string> <string name="list_empty">Lista jest pusta!</string> + <string name="nfc_successful">Pomyślnie wysłano klucz przez NFC Beam!</string> <string name="key_copied_to_clipboard">Klucz został skopiowany do schowka!</string> + <string name="key_has_already_been_certified">Klucz został już wcześniej certyfikowany!</string> <string name="select_key_to_sign">Wybierz klucz, który zostanie użyty do podpisania!</string> <string name="key_too_big_for_sharing">Klucz ma za duży rozmiar by być udostępniony w ten sposób!</string> <!--errors @@ -235,8 +251,6 @@ <string name="error_master_key_must_not_be_el_gamal">klucz EnGamal nie może być kluczem głównym</string> <string name="error_unknown_algorithm_choice">wybrano nieznany algorytm</string> <string name="error_user_id_no_email">nie znaleziono adresu email</string> - <string name="error_key_needs_a_user_id">potrzeba co najmniej jednego identyfikatora użytkownika</string> - <string name="error_main_user_id_must_not_be_empty">główny identyfikator użytkownika nie może być pusty</string> <string name="error_key_needs_master_key">potrzeba co najmniej klucza głównego</string> <string name="error_no_signature_passphrase">nie podano hasła</string> <string name="error_no_signature_key">nie podano klucza podpisu</string> @@ -247,10 +261,13 @@ <string name="error_could_not_extract_private_key">nie można wyodrębnić klucza prywatnego</string> <string name="error_expiry_must_come_after_creation">data wygaśnięcia musi być późniejsza niż data stworzenia</string> <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">Dane binarne pozbawione pliku nie są obsługiwane.</string> + <string name="error_jelly_bean_needed">Potrzebujesz Androida 4.1 aby korzystać z Android NFC Beam</string> <string name="error_nfc_needed">NCF jest niedostępne na twoim urządzeniu</string> <string name="error_nothing_import">Nie ma nic do zaimportowania!</string> <string name="error_keyserver_insufficient_query">Niewystarczające zapytanie do serwera</string> <string name="error_keyserver_query">Odpytywanie serwera zakończone niepowodzeniem</string> + <string name="error_keyserver_too_many_responses">Zbyt wiele możliwych kluczy. Proszę zweryfikuj swoje zapytanie!</string> <string name="error_import_file_no_content">Plik jest pusty</string> <string name="error_generic_report_bug">Wystąpił błąd ogólny, proszę zgłoś go autorom OpenKeychain.</string> <plurals name="error_import_non_pgp_part"> @@ -260,6 +277,14 @@ </plurals> <string name="error_change_something_first">Musisz dokonać zmian w pęku kluczy zanim będziesz mógł go zachować</string> <!--results shown after decryption/verification--> + <string name="decrypt_result_invalid_signature">Nieprawidłowy podpis!</string> + <string name="decrypt_result_signature_unknown_pub_key">Nieznany klucz publiczny</string> + <string name="decrypt_result_signature_uncertified">Podpis prawidłowy (bez certyfikatu)</string> + <string name="decrypt_result_signature_certified">Podpis prawidłowy (z certyfikatem)</string> + <string name="decrypt_result_decrypted">Odszyfrowano pomyślnie</string> + <string name="decrypt_result_decrypted_unknown_pub_key">Odszyfrowano pomyślnie ale klucz publiczny nieznany</string> + <string name="decrypt_result_decrypted_and_signature_uncertified">Odszyfrowano pomyślnie i podpis prawidłowy (bez certyfikatu)</string> + <string name="decrypt_result_decrypted_and_signature_certified">Odszyfrowano pomyślnie i podpis prawidłowy (z certyfikatem)</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">Gotowe.</string> <string name="progress_cancel">Anuluj</string> @@ -319,6 +344,7 @@ <!--Help--> <string name="help_tab_start">Początek</string> <string name="help_tab_faq">FAQ</string> + <string name="help_tab_wot">Sieć zaufania</string> <string name="help_tab_nfc_beam">NFC Beam</string> <string name="help_tab_changelog">Dziennik zmian</string> <string name="help_tab_about">O programie</string> @@ -366,8 +392,6 @@ <string name="api_register_allow">Zezwól na dostęp</string> <string name="api_register_disallow">Odmów dostępu</string> <string name="api_register_error_select_key">Wybierz klucz!</string> - <string name="api_select_pub_keys_missing_text">Nie znaleziono kluczy publiczych dla tych identyfikatorów użytkownika:</string> - <string name="api_select_pub_keys_dublicates_text">Więcej niż jeden klucz publiczny istnieje dla tych identyfikatorów użytkownika:</string> <string name="api_select_pub_keys_text">Proszę przejrzeć listę adresatów!</string> <string name="api_error_wrong_signature">Sprawdzanie podpisu zakończone niepowodzeniem! Czy zainstalowałeś tę aplikację z innego źródła? Jeżeli jesteś pewien, że nie jest to atak, odwołaj rejestrację teg aplikacji w OpenKeychain, a następnie zarejestruj ją ponownie.</string> <!--Share--> @@ -388,10 +412,10 @@ <string name="key_list_empty_button_create">tworzenie własnego klucza</string> <string name="key_list_empty_button_import">importowanie kluczy.</string> <!--Key view--> - <string name="key_view_action_edit">Edytuj ten klucz</string> - <string name="key_view_tab_main">Informacje</string> + <string name="key_view_action_encrypt">Zaszyfruj korzystając z tego klucza</string> <string name="key_view_tab_certs">Certyfikaty</string> <!--Navigation Drawer--> + <string name="nav_keys">Klucze</string> <string name="nav_encrypt">Podpisz i zaszyfruj</string> <string name="nav_decrypt">Deszyfruj i weryfikuj</string> <string name="nav_import">Importuj klucze</string> @@ -406,27 +430,29 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">Wpisz tutaj wiadomość do zaszyfrowania i/lub podpisania...</string> <string name="decrypt_content_edit_text_hint">Wpisz tutaj tekst do zaszyfrowania i/lub zweryfikowania...</string> - <!--unsorted--> - <string name="section_signer_id">Podpisujący</string> - <string name="section_cert">Szczegóły certyfikatu</string> - <string name="label_user_id">Identyfikator użytkownika</string> - <string name="empty_certs">Nie ma certyfikatów dla tego klucza</string> - <string name="section_uids_to_sign">Identyfikator użytkownika do podpisu</string> + <!--certifications--> <string name="cert_default">domyślny</string> <string name="cert_none">żaden</string> <string name="cert_casual">typowy</string> <string name="cert_positive">pozytywny</string> - <string name="cert_revoke">odwołaj</string> - <string name="help_tab_wot">Sieć zaufania</string> <string name="cert_verify_ok">ok</string> <string name="cert_verify_failed">niepowodzenie!</string> <string name="cert_verify_error">błąd!</string> <string name="cert_verify_unavailable">klucz niedostępny</string> + <!--unsorted--> + <string name="section_signer_id">Podpisujący</string> + <string name="section_cert">Szczegóły certyfikatu</string> + <string name="unknown_uid"><nieznany></string> + <string name="empty_certs">Nie ma certyfikatów dla tego klucza</string> <string name="label_revocation">Powód odwołania</string> <string name="label_verify_status">Stan weryfikacji</string> <string name="label_cert_type">Typ</string> - <string name="can_certify">może certyfikować</string> - <string name="can_certify_not">nie może certyfikować</string> <string name="error_key_not_found">Nie znaleziono klucza!</string> <string name="error_key_processing">Błąd przy przetwarzaniu klucza!</string> + <string name="no_subkey">podklucz niedostępny</string> + <string name="key_stripped">zredukowany</string> + <string name="secret_cannot_multiple">Klucze prywatne mogą być usuwane tylko pojedynczo</string> + <string name="title_view_cert">Zweryfikuj szczegóły certyfikatu</string> + <string name="unknown_algorithm">nieznany</string> + <string name="can_sign_not">nie może podpisać</string> </resources> diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index 5a40a8d96..1dc0a6e36 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -24,13 +24,11 @@ <string name="title_key_details">Сведения о ключе</string> <string name="title_help">Помощь</string> <!--section--> - <string name="section_user_ids">ID пользователя</string> <string name="section_keys">Ключи</string> <string name="section_general">Приложение</string> <string name="section_defaults">Алгоритмы</string> <string name="section_advanced">Дополнительно</string> <string name="section_master_key">Основной ключ</string> - <string name="section_master_user_id">Владелец</string> <string name="section_actions">Действия</string> <string name="section_certification_key">Ваш ключ для сертификации</string> <string name="section_upload_key">Загрузить ключ</string> @@ -107,13 +105,13 @@ <string name="label_passphrase_cache_ttl">Помнить пароль</string> <string name="label_message_compression">Сжатие сообщения</string> <string name="label_file_compression">Сжатие файла</string> - <string name="label_force_v3_signature">Использовать старые OpenPGPV3 подписи</string> + <string name="label_force_v3_signature">Использовать OpenPGPv3 подписи (устар.)</string> + <string name="label_keyservers">Серверы ключей</string> <string name="label_key_id">ID ключа</string> <string name="label_creation">Создан</string> <string name="label_expiry">Годен до...</string> <string name="label_usage">Применение</string> <string name="label_key_size">Размер ключа</string> - <string name="label_main_user_id">Основной ID пользователя</string> <string name="label_name">Имя</string> <string name="label_comment">Комментарий</string> <string name="label_email">Email</string> @@ -133,6 +131,16 @@ <string name="can_sign">подпись</string> <string name="expired">просрочен</string> <string name="revoked">отозван</string> + <plurals name="n_keys"> + <item quantity="one">1 ключ</item> + <item quantity="few">%d ключей</item> + <item quantity="other">%d ключей</item> + </plurals> + <plurals name="n_keyservers"> + <item quantity="one">%d сервер ключей</item> + <item quantity="few">%d серверов ключей</item> + <item quantity="other">%d серверов ключей</item> + </plurals> <string name="secret_key">Секретный ключ:</string> <!--choice--> <string name="choice_none">Нет</string> @@ -176,7 +184,9 @@ <string name="specify_file_to_encrypt_to">Пожалуйста, выберите файл для шифрования.\nВНИМАНИЕ! Если файл существует, он будет перезаписан.</string> <string name="specify_file_to_decrypt_to">Пожалуйста, выберите файл для расшифровки.\nВНИМАНИЕ! Если файл существует, он будет перезаписан.</string> <string name="specify_file_to_export_to">Пожалуйста, выберите файл для экспорта.\nВНИМАНИЕ! Если файл существует, он будет перезаписан.</string> + <string name="key_deletion_confirmation_multi">Вы уверены, что хотите удалить выбранные ключи?\nЭто действие нельзя отменить!</string> <string name="secret_key_deletion_confirmation">Вы уверены, что ходите удалить СЕКРЕТНЫЙ ключ \'%s\'?\nЭто действие нельзя отменить!</string> + <string name="public_key_deletetion_confirmation">Вы правда хотите удалить публичный ключ \'%s\'?\nЭто действие нельзя отменить!</string> <string name="also_export_secret_keys">Экспортировать секретные ключи?</string> <plurals name="keys_added_and_updated_1"> <item quantity="one">Успешно добавлено %d ключ</item> @@ -202,6 +212,7 @@ <string name="key_exported">Успешный экспорт 1 ключа.</string> <string name="keys_exported">Экспортировано %d ключей.</string> <string name="no_keys_exported">Ключи не были экспортированы.</string> + <string name="key_creation_el_gamal_info">Прим.: только вторичные ключи поддерживают ElGamal.</string> <string name="key_creation_weak_rsa_info">Внимание: создание ключей RSA длиной 1024 бита и менее признано небезопасным. Данная возможность отключена.</string> <string name="key_not_found">Не удается найти ключ %08X.</string> <plurals name="keys_found"> @@ -216,7 +227,9 @@ </plurals> <string name="key_send_success">Ключ успешно загружен на сервер</string> <string name="list_empty">Список пуст!</string> + <string name="nfc_successful">Ключ успешно передан через NFC!</string> <string name="key_copied_to_clipboard">Ключ скопирован в буфер обмена!</string> + <string name="key_has_already_been_certified">Ключ уже был сертифицирован ранее!</string> <string name="select_key_to_sign">Выберите ключ, используемый для подписи!</string> <string name="key_too_big_for_sharing">Ключ слишком большой для этого способа передачи!</string> <!--errors @@ -230,8 +243,6 @@ <string name="error_master_key_must_not_be_el_gamal">ключ ElGamal не может быть основным</string> <string name="error_unknown_algorithm_choice">выбран неизвестный алгоритм</string> <string name="error_user_id_no_email">email не найден</string> - <string name="error_key_needs_a_user_id">необходим хотя бы один id пользователя</string> - <string name="error_main_user_id_must_not_be_empty">основная запись пользователя не может быть пустой</string> <string name="error_key_needs_master_key">необходим основной ключ</string> <string name="error_no_signature_passphrase">пароль не задан</string> <string name="error_no_signature_key">ключ для подписи не задан</string> @@ -242,10 +253,13 @@ <string name="error_could_not_extract_private_key">не удалось извлечь личный ключ</string> <string name="error_expiry_must_come_after_creation">срок годности не может быть раньше даты создания</string> <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">Прямая передача данных без использования файла в памяти устройства не поддерживается.</string> + <string name="error_jelly_bean_needed">Для использования NFC Beam требуется Android 4.1+ !</string> <string name="error_nfc_needed">Ваше устройство не поддерживает NFC!</string> <string name="error_nothing_import">Нет данных для импорта!</string> <string name="error_keyserver_insufficient_query">Ограничение запроса сервера</string> <string name="error_keyserver_query">Сбой запроса сервера ключей</string> + <string name="error_keyserver_too_many_responses">Слишком много возможных ключей. Уточните свой запрос!</string> <string name="error_import_file_no_content">Файл пуст</string> <string name="error_generic_report_bug">Выявлена ошибка. Пожалуйста, сообщите о ней разработчику.</string> <plurals name="error_import_non_pgp_part"> @@ -254,6 +268,11 @@ <item quantity="other">части загруженного файла содержат данные OpenPGP, но это не ключ</item> </plurals> <!--results shown after decryption/verification--> + <string name="decrypt_result_invalid_signature">Неверная подпись!</string> + <string name="decrypt_result_signature_unknown_pub_key">Неизвестный ключ</string> + <string name="decrypt_result_signature_uncertified">Верная подпись (не сертифицирована)</string> + <string name="decrypt_result_signature_certified">Верная подпись (сертифицирована)</string> + <string name="decrypt_result_decrypted">Успешно расшифровано</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">Готово.</string> <string name="progress_cancel">Отмена</string> @@ -296,15 +315,24 @@ <string name="action_share_key_with">Отправить...</string> <!--key bit length selections--> <string name="key_size_512">512</string> + <string name="key_size_768">768</string> <string name="key_size_1024">1024</string> + <string name="key_size_1536">1536</string> <string name="key_size_2048">2048</string> + <string name="key_size_3072">3072</string> <string name="key_size_4096">4096</string> + <string name="key_size_8192">8192</string> + <string name="key_size_custom">Произвольная длина ключа</string> + <string name="key_size_custom_info">Введите длину ключа (бит):</string> + <string name="key_size_custom_info_rsa">Длина RSA ключа должна быть в пределах между 1024 и 8192 бит и должна быть кратна 8.</string> + <string name="key_size_custom_info_dsa">Длина DSA ключа должна быть в пределах между 512 и 1024 бит и должна быть кратна 64.</string> <!--compression--> <string name="compression_fast">быстро</string> <string name="compression_very_slow">очень медленно</string> <!--Help--> <string name="help_tab_start">Начать</string> <string name="help_tab_faq">ЧаВо</string> + <string name="help_tab_wot">Сеть доверия (WoT)</string> <string name="help_tab_nfc_beam">NFC Beam</string> <string name="help_tab_changelog">Изменения</string> <string name="help_tab_about">О программе</string> @@ -352,8 +380,6 @@ <string name="api_register_allow">Разрешить доступ</string> <string name="api_register_disallow">Запретить доступ</string> <string name="api_register_error_select_key">Пожалуйста, выберите ключ!</string> - <string name="api_select_pub_keys_missing_text">Для этих id не найдены публичные ключи:</string> - <string name="api_select_pub_keys_dublicates_text">Для этих id найдено более одного ключа:</string> <string name="api_select_pub_keys_text">Пожалуйста, проверьте получателей!</string> <string name="api_error_wrong_signature">Проверка подписи пакета не удалась! Если вы установили программу из другого источника, отзовите для неё доступ к этой программе или обновите право доступа.</string> <!--Share--> @@ -374,10 +400,10 @@ <string name="key_list_empty_button_create">создать свой ключ</string> <string name="key_list_empty_button_import">Импортировать ключи</string> <!--Key view--> - <string name="key_view_action_edit">Изменить ключ</string> - <string name="key_view_tab_main">Информация</string> + <string name="key_view_action_encrypt">Зашифровать этим ключом</string> <string name="key_view_tab_certs">Сертификация</string> <!--Navigation Drawer--> + <string name="nav_keys">Ключи</string> <string name="nav_encrypt">Подписать и зашифровать</string> <string name="nav_decrypt">Расшифровать и проверить</string> <string name="nav_import">Импорт ключей</string> @@ -392,13 +418,25 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">Напишите сообщение здесь, что бы зашифровать и/или подписать...</string> <string name="decrypt_content_edit_text_hint">Введите сюда шифр для расшифровки и/или проверки...</string> + <!--certifications--> + <string name="cert_default">по умолчанию</string> + <string name="cert_none">нет</string> + <string name="cert_verify_ok">ok</string> + <string name="cert_verify_failed">сбой!</string> + <string name="cert_verify_error">ошибка!</string> + <string name="cert_verify_unavailable">ключ не доступен</string> <!--unsorted--> <string name="section_signer_id">Подписант</string> <string name="section_cert">Детали сертификации</string> - <string name="label_user_id">ID пользователя</string> + <string name="unknown_uid"><неизв.></string> <string name="empty_certs">Этот ключ не сертифицирован</string> - <string name="section_uids_to_sign">Подписываемые ID пользователя</string> - <string name="cert_default">по умолчанию</string> - <string name="cert_none">нет</string> - <string name="cert_revoke">отозвать</string> + <string name="label_revocation">Причина отзыва</string> + <string name="label_verify_status">Статус верификации</string> + <string name="label_cert_type">Тип</string> + <string name="error_key_not_found">Ключ не найден!</string> + <string name="error_key_processing">Ошибка обработки ключа!</string> + <string name="no_subkey">вторичный ключ не доступен</string> + <string name="secret_cannot_multiple">Секретные ключи можно удалять только по одному!</string> + <string name="title_view_cert">Просмотреть детали сертификации</string> + <string name="unknown_algorithm">неизв.</string> </resources> diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml new file mode 100644 index 000000000..f2bf134e5 --- /dev/null +++ b/OpenKeychain/src/main/res/values-sl/strings.xml @@ -0,0 +1,472 @@ +<?xml version='1.0' encoding='UTF-8'?> +<resources> + <!--title--> + <string name="title_select_recipients">Izberi javni ključ</string> + <string name="title_select_secret_key">Izberi zasebni ključ</string> + <string name="title_encrypt">Šifriraj</string> + <string name="title_decrypt">Dešifriraj</string> + <string name="title_authentication">Geslo</string> + <string name="title_create_key">Ustvari kluč</string> + <string name="title_edit_key">Uredi ključ</string> + <string name="title_preferences">Nastavitve</string> + <string name="title_api_registered_apps">Prijavljene aplikacije</string> + <string name="title_key_server_preference">Nastavitve strežnikov</string> + <string name="title_change_passphrase">Spremeni geslo</string> + <string name="title_set_passphrase">Določi geslo</string> + <string name="title_share_file">Deli datoteko z...</string> + <string name="title_encrypt_to_file">Šifriraj v datoteko</string> + <string name="title_decrypt_to_file">Dešifriraj v datoteko</string> + <string name="title_import_keys">Uvozi ključe</string> + <string name="title_export_key">Izvozi kluč</string> + <string name="title_export_keys">Izvozi ključe</string> + <string name="title_key_not_found">Ključ ni bil najden</string> + <string name="title_send_key">Naloži na strežnik</string> + <string name="title_certify_key">Overi ključ</string> + <string name="title_key_details">Podrobnosti o ključu</string> + <string name="title_help">Pomoč</string> + <!--section--> + <string name="section_keys">Ključi</string> + <string name="section_general">Splošno</string> + <string name="section_defaults">Privzeto</string> + <string name="section_advanced">Napredno</string> + <string name="section_master_key">Glavni ključ</string> + <string name="section_actions">Ravnanja</string> + <string name="section_certification_key">Vaš ključ, uporabljan za overitev</string> + <string name="section_upload_key">Naloži ključ</string> + <string name="section_key_server">Strežnik</string> + <string name="section_encrypt_and_or_sign">Šifriraj in/ali podpiši</string> + <string name="section_decrypt_verify">Dešifriraj in preveri</string> + <!--button--> + <string name="btn_certify">Overi</string> + <string name="btn_decrypt_verify">Dešifriraj in preveri</string> + <string name="btn_decrypt_verify_clipboard">Iz odložišča</string> + <string name="btn_encrypt_file">Šifriraj datoteko</string> + <string name="btn_save">Shrani</string> + <string name="btn_do_not_save">Prekliči</string> + <string name="btn_delete">Izbriši</string> + <string name="btn_no_date">Brez</string> + <string name="btn_okay">OK</string> + <string name="btn_change_passphrase">Spremeni novo geslo</string> + <string name="btn_set_passphrase">Nastavi novo geslo</string> + <string name="btn_export_to_server">Naloži na strežnik</string> + <string name="btn_next">Naprej</string> + <string name="btn_back">Nazaj</string> + <string name="btn_clipboard">Odložišče</string> + <string name="btn_share">Deli z...</string> + <string name="btn_lookup_key">Išči ključ</string> + <string name="btn_encryption_advanced_settings_show">Prikaži napredne nstavitve</string> + <string name="btn_encryption_advanced_settings_hide">Skrij napredne nastavitve</string> + <!--menu--> + <string name="menu_preferences">Nastavitve</string> + <string name="menu_help">Pomoč</string> + <string name="menu_import_from_file">Uvozi iz datoteke</string> + <string name="menu_import_from_qr_code">Uvozi iz kode QR</string> + <string name="menu_import_from_nfc">Uvozi preko NFC</string> + <string name="menu_export_key">Izvozi v datoteko</string> + <string name="menu_delete_key">Izbriši ključ</string> + <string name="menu_create_key">Ustvari ključ</string> + <string name="menu_create_key_expert">Ustvari ključ (napredno)</string> + <string name="menu_search">Išči</string> + <string name="menu_import_from_key_server">Strežnik</string> + <string name="menu_key_server">Strežnik...</string> + <string name="menu_update_key">Posodobi s strežnika</string> + <string name="menu_export_key_to_server">Naloži na strežnik</string> + <string name="menu_share">Deli...</string> + <string name="menu_share_title_fingerprint">Deli prstni odtis...</string> + <string name="menu_share_title">Deli celotni ključ...</string> + <string name="menu_share_default_fingerprint">z...</string> + <string name="menu_share_default">z...</string> + <string name="menu_share_qr_code">s kodo QR</string> + <string name="menu_share_qr_code_fingerprint">s kodo QR</string> + <string name="menu_share_nfc">preko NFC</string> + <string name="menu_copy_to_clipboard">Kopiraj na odložišče</string> + <string name="menu_beam_preferences">Nastavitve Beam</string> + <string name="menu_key_edit_cancel">Prekliči</string> + <string name="menu_encrypt_to">Šifriraj v...</string> + <string name="menu_select_all">Izberi vse</string> + <string name="menu_add_keys">Dodaj ključe</string> + <string name="menu_export_all_keys">Izvozi vse ključe</string> + <!--label--> + <string name="label_sign">Podpiši</string> + <string name="label_message">Sporočilo</string> + <string name="label_file">Datoteka</string> + <string name="label_no_passphrase">Brez gesla</string> + <string name="label_passphrase">Geslo</string> + <string name="label_passphrase_again">Ponovno</string> + <string name="label_algorithm">Algoritem</string> + <string name="label_ascii_armor">ASCII Armor</string> + <string name="label_select_public_keys">Prejemniki</string> + <string name="label_delete_after_encryption">Po šifriranju izbriši</string> + <string name="label_delete_after_decryption">Po dešifriranju izbriši</string> + <string name="label_share_after_encryption">Deli po šifriranju</string> + <string name="label_encryption_algorithm">Šifrirni algoritem</string> + <string name="label_hash_algorithm">Zgostitveni algoritem</string> + <string name="label_asymmetric">z javnim ključem</string> + <string name="label_symmetric">z geslom</string> + <string name="label_passphrase_cache_ttl">Hranjenje gesla v spominu</string> + <string name="label_message_compression">Stiskanje sporočil</string> + <string name="label_file_compression">Stiskanje datotek</string> + <string name="label_force_v3_signature">Vsili stare podpise OpenPGPv3</string> + <string name="label_keyservers">Strežniki</string> + <string name="label_key_id">ID ključa</string> + <string name="label_creation">Ustvarjanje</string> + <string name="label_expiry">Pretek</string> + <string name="label_usage">Uporaba</string> + <string name="label_key_size">Velikost ključa</string> + <string name="label_name">Ime</string> + <string name="label_comment">Komentar</string> + <string name="label_email">E-pošta</string> + <string name="label_send_key">Po overitvi naloži ključ na izbrani strežnik</string> + <string name="label_fingerprint">Prstni odtis</string> + <string name="select_keys_button_default">Izberi</string> + <string name="expiry_date_dialog_title">Določi datum poteka veljavnosti</string> + <plurals name="select_keys_button"> + <item quantity="one">%d izbran</item> + <item quantity="two">%d izbrana</item> + <item quantity="few">%d izbrani</item> + <item quantity="other">%d izbranih</item> + </plurals> + <string name="user_id_no_name"><brez imena></string> + <string name="none"><nič></string> + <string name="no_key"><brez ključa></string> + <string name="can_encrypt">lahko šifrira</string> + <string name="can_sign">lahko podpisuje</string> + <string name="can_certify">lahko overovi</string> + <string name="can_certify_not">ne more overoviti</string> + <string name="expired">potečen</string> + <string name="revoked">preklican</string> + <plurals name="n_keys"> + <item quantity="one">1 ključ</item> + <item quantity="two">%d ključa</item> + <item quantity="few">%d ključi</item> + <item quantity="other">%d ključev</item> + </plurals> + <plurals name="n_keyservers"> + <item quantity="one">%d strežnik</item> + <item quantity="two">%d strežnika</item> + <item quantity="few">%d strežniki</item> + <item quantity="other">%d strežnikov</item> + </plurals> + <string name="secret_key">Zasebni ključ</string> + <!--choice--> + <string name="choice_none">Nič</string> + <string name="choice_15secs">15 sekund</string> + <string name="choice_1min">1 minuta</string> + <string name="choice_3mins">3 minute</string> + <string name="choice_5mins">5 minut</string> + <string name="choice_10mins">10 minut</string> + <string name="choice_20mins">20 minut</string> + <string name="choice_40mins">40 minut</string> + <string name="choice_1hour">1 ura</string> + <string name="choice_2hours">2 uri</string> + <string name="choice_4hours">4 ure</string> + <string name="choice_8hours">8 ur</string> + <string name="choice_forever">za vedno</string> + <string name="dsa">DSA</string> + <string name="elgamal">ElGamal</string> + <string name="rsa">RSA</string> + <string name="filemanager_title_open">Odpri...</string> + <string name="warning">Opozorilo</string> + <string name="error">Napaka</string> + <string name="error_message">Napaka: %s</string> + <!--key flags--> + <string name="flag_certify">Overi</string> + <string name="flag_sign">Podpiši</string> + <string name="flag_encrypt">Šifriraj</string> + <string name="flag_authenticate">Preveri avtentičnost</string> + <!--sentences--> + <string name="wrong_passphrase">Napačno geslo.</string> + <string name="set_a_passphrase">Najprej določite geslo.</string> + <string name="no_filemanager_installed">Nimate nameščenega združljivega upravljalnika datotek.</string> + <string name="passphrases_do_not_match">Gesli se ne ujemata.</string> + <string name="passphrase_must_not_be_empty">Vnesite geslo.</string> + <string name="passphrase_for_symmetric_encryption">Simetrično šifriranje.</string> + <string name="passphrase_for">Vnesite geslo za \'%s\'</string> + <string name="file_delete_confirmation">Ste prepričani, da želite izbrisati\n%s?</string> + <string name="file_delete_successful">Uspešno izbrisano.</string> + <string name="no_file_selected">Najprej izberite datoteko.</string> + <string name="encrypt_sign_successful">Uspešno podpisano in/ali šifrirano.</string> + <string name="encrypt_sign_clipboard_successful">Uspešno podpisano in/ali šifrirano ter poslano v odložišče.</string> + <string name="enter_passphrase_twice">Dvakrat vnesite geslo.</string> + <string name="select_encryption_key">Izberite vsaj en šifrirni ključ.</string> + <string name="select_encryption_or_signature_key">Vnesite vsaj en šifrirni ključ ali ključ za podpisovanje.</string> + <string name="specify_file_to_encrypt_to">Določite datoteko, kamor želite šifrirati vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string> + <string name="specify_file_to_decrypt_to">Določite datoteko, kamor želite dešifrirati vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string> + <string name="specify_file_to_export_to">Določite datoteko, kamor želite izvoziti vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string> + <string name="key_deletion_confirmation_multi">Ali res želite izbrisati vse izbrane javne ključe?\nTega koraka ne boste mogli preklicati!</string> + <string name="secret_key_deletion_confirmation">Ali res želite izbrisati ZASEBNI ključ \'%s\'?\nTega koraka ne boste mogli preklicati!</string> + <string name="ask_save_changed_key">Vnesli ste spremembe v vaš \'keyring\'. Jih želite shraniti?</string> + <string name="public_key_deletetion_confirmation">Ali res želite izbrisati javni ključ \'%s\'?\nTega koraka ne boste mogli preklicati!</string> + <string name="also_export_secret_keys">Želite izvoziti tudi zasebne ključe?</string> + <plurals name="keys_added_and_updated_1"> + <item quantity="one">Uspešno dodan %d ključ</item> + <item quantity="two">Uspešno dodana %d ključa</item> + <item quantity="few">Uspešno dodani %d ključi</item> + <item quantity="other">Uspešno dodanih %d ključev</item> + </plurals> + <plurals name="keys_added_and_updated_2"> + <item quantity="one">in posodbljen %d.</item> + <item quantity="two">in posodobljena %d.</item> + <item quantity="few">in posodobljeni %d.</item> + <item quantity="other">in posodobljenih %d.</item> + </plurals> + <plurals name="keys_added"> + <item quantity="one">Uspešno dodan %d ključ.</item> + <item quantity="two">Uspešno dodana %d ključa.</item> + <item quantity="few">Uspešno dodani %d ključi.</item> + <item quantity="other">Uspešno dodanih %d ključev.</item> + </plurals> + <plurals name="keys_updated"> + <item quantity="one">Uspešno posodobljen %d ključ.</item> + <item quantity="two">Uspešno posodobljena %d ključa.</item> + <item quantity="few">Uspešno posodobljeni %d ključi.</item> + <item quantity="other">Uspešno posodobljenih %d ključev.</item> + </plurals> + <string name="no_keys_added_or_updated">Noben ključ ni bil dodan ali posodobljen.</string> + <string name="key_exported">Uspešno izvožen 1 ključ.</string> + <string name="keys_exported">Uspešno izvoženih ključev: %d</string> + <string name="no_keys_exported">Noben ključ ni bil izvožen.</string> + <string name="key_creation_el_gamal_info">Pozor: ELGamal podpirajo samo podključi.</string> + <string name="key_creation_weak_rsa_info">Pozor: ključi RSA dolžine 1024 bitov ali manj ne veljajo več za varne, zato je njihovo ustvarjanje onemogočeno.</string> + <string name="key_not_found">Ne najdem ključa %08X.</string> + <plurals name="keys_found"> + <item quantity="one">Najden %d ključ.</item> + <item quantity="two">Najdena %d ključa.</item> + <item quantity="few">Najdeni %d ključi.</item> + <item quantity="other">Najdeno %d ključev.</item> + </plurals> + <plurals name="bad_keys_encountered"> + <item quantity="one">Neupoštevan %d slab zasebni ključ. Morda je bil izvožen na način\n --export-secret-subkeys\nPoskrbite, da bo izvožen z\n --export-secret-keys</item> + <item quantity="two">Neupoštevana %d slaba zasebna ključa. Morda sta bila izvožena na način\n --export-secret-subkeys\nPoskrbite, da bosta izvožena z\n --export-secret-keys</item> + <item quantity="few">Neupoštevani %d slabi zasebni ključi. Morda so bili izvoženi na način\n --export-secret-subkeys\nPoskrbite, da bodo izvoženi z\n --export-secret-keys</item> + <item quantity="other">Neupoštevanih %d slabih zasebnih ključev. Morda so bili izvoženi na način\n --export-secret-subkeys\nPoskrbite, da bodo izvoženi z\n --export-secret-keys</item> + </plurals> + <string name="key_send_success">Ključ je bil uspešno naložen na strežnik.</string> + <string name="key_certify_success">Uspešno overjen ključ</string> + <string name="list_empty">Lista je prazna!</string> + <string name="nfc_successful">Ključ uspešno poslan preko NFC Beam!</string> + <string name="key_copied_to_clipboard">Ključ je bil prekopiran v odložišče!</string> + <string name="key_has_already_been_certified">Ključ je že bil overjen!</string> + <string name="select_key_to_sign">Izberite ključ, ki ga boste uporabljali za podpisovanje</string> + <string name="key_too_big_for_sharing">Ključ je prevelik za delitev na ta način!</string> + <!--errors + no punctuation, all lowercase, + they will be put after "error_message", e.g. "Error: file not found"--> + <string name="error_file_delete_failed">izbris \'%s\' ni uspel</string> + <string name="error_file_not_found">ne najdem datoteke</string> + <string name="error_no_secret_key_found">ne najdem ustreznega zasebnega ključa</string> + <string name="error_external_storage_not_ready">zunanja shramba ni na voljo</string> + <string name="error_key_size_minimum512bit">velikost ključa mora biti najmanj 512bit</string> + <string name="error_master_key_must_not_be_el_gamal">glavni ključ ne more biti ElGamal</string> + <string name="error_unknown_algorithm_choice">neznana izbira algoritma</string> + <string name="error_user_id_no_email">najti ni nobene e-pošte</string> + <string name="error_key_needs_master_key">potrebujem vsaj glavni ključ</string> + <string name="error_no_signature_passphrase">dano ni bilo nobeno geslo</string> + <string name="error_no_signature_key">dan ni bil noben podpisni ključ</string> + <string name="error_invalid_data">neveljavni šifrirni podatki</string> + <string name="error_integrity_check_failed">Preverba neokrnjenosti ni bila uspešna! Podatki so bili spremenjeni!</string> + <string name="error_wrong_passphrase">napačno geslo</string> + <string name="error_saving_keys">napaka pri shranjevanju nekaterih ključev</string> + <string name="error_could_not_extract_private_key">ne morem izvleči zasebnega ključa</string> + <string name="error_expiry_must_come_after_creation">datum poteka mora biti kasnejši od datuma stvaritve</string> + <!--errors without preceeding Error:--> + <string name="error_only_files_are_supported">Neposredni binarni podatki brez dejanske datoteke v datotečnem sistemu niso podprti.</string> + <string name="error_jelly_bean_needed">Za uporabo storitve NFC Beam potrebujete najmanj Android 4.1!</string> + <string name="error_nfc_needed">NFC ni na voljo na vaši napravi!</string> + <string name="error_nothing_import">Ni česa uvoziti!</string> + <string name="error_keyserver_insufficient_query">Pomanjkljiva poizvedba na strežniku</string> + <string name="error_keyserver_query">Poizvedba na strežniku ni bila uspešna</string> + <string name="error_keyserver_too_many_responses">Preveč možnih ključev. Redefinirajte svoje iskanje!</string> + <string name="error_import_file_no_content">Datoteka nima vsebine</string> + <string name="error_generic_report_bug">Pripetila se je splošna napaka, prosimo ustvarite poročilo o \'hrošču\'.</string> + <plurals name="error_import_non_pgp_part"> + <item quantity="one">Del naložene datoteke je veljavnen objekt OpenPGP a ni ključ.</item> + <item quantity="two">Deli naložene datoteke so veljavni objekti OpenPGP a niso ključi.</item> + <item quantity="few">Deli naložene datoteke so veljavni objekti OpenPGP a niso ključi.</item> + <item quantity="other">Deli naložene datoteke so veljavni objekti OpenPGP a niso ključi.</item> + </plurals> + <string name="error_change_something_first">V \'keyring\' morate vnesti spremembe, šele nato ga lahko shranite</string> + <!--results shown after decryption/verification--> + <string name="decrypt_result_invalid_signature">Neveljaven podpis!</string> + <string name="decrypt_result_signature_unknown_pub_key">Neznan javni ključ</string> + <string name="decrypt_result_signature_uncertified">Veljaven podpis (neoverjen)</string> + <string name="decrypt_result_signature_certified">Veljaven podpis (overjen)</string> + <string name="decrypt_result_decrypted">Uspešno dešifrirano</string> + <string name="decrypt_result_decrypted_unknown_pub_key">Uspešno dešifrirano a neznan javni ključ</string> + <string name="decrypt_result_decrypted_and_signature_uncertified">Uspešno dešifrirano in veljaven podpis (neoverjen)</string> + <string name="decrypt_result_decrypted_and_signature_certified">Uspešno dešifrirano in veljaven podpis (overjen)</string> + <!--progress dialogs, usually ending in '…'--> + <string name="progress_done">Opravljeno.</string> + <string name="progress_cancel">Prekliči</string> + <string name="progress_saving">shranjujem...</string> + <string name="progress_importing">uvažam...</string> + <string name="progress_exporting">izvažam...</string> + <string name="progress_building_key">ustvarjam ključ...</string> + <string name="progress_certifying_master_key">overjam glavni ključ...</string> + <string name="progress_building_master_key">ustvarjam glavni prstan...</string> + <string name="progress_adding_sub_keys">dodajam podključe...</string> + <string name="progress_saving_key_ring">shranjujem ključ...</string> + <plurals name="progress_exporting_key"> + <item quantity="one">izvažam ključ...</item> + <item quantity="two">izvažam ključa...</item> + <item quantity="few">izvažam ključe...</item> + <item quantity="other">izvažam ključe...</item> + </plurals> + <plurals name="progress_generating"> + <item quantity="one">ustvarjam ključ, to lahko traja okoli 3 minute...</item> + <item quantity="two">ustvarjam ključa, to lahko traja okoli 3 minute...</item> + <item quantity="few">ustvarjam ključe, to lahko traja okoli 3 minute...</item> + <item quantity="other">ustvarjam ključe, to lahko traja okoli 3 minute...</item> + </plurals> + <string name="progress_extracting_signature_key">izvlačim ključ za podpisovanje...</string> + <string name="progress_extracting_key">izvlačim ključ...</string> + <string name="progress_preparing_streams">pripravljam tokove...</string> + <string name="progress_encrypting">šifriram podatke...</string> + <string name="progress_decrypting">dešifriram podatke...</string> + <string name="progress_preparing_signature">pripravljam podpis...</string> + <string name="progress_generating_signature">ustvarjam podpis...</string> + <string name="progress_processing_signature">obdelujem podpis...</string> + <string name="progress_verifying_signature">preverjam podpis...</string> + <string name="progress_signing">podpisujem...</string> + <string name="progress_reading_data">berem podatke...</string> + <string name="progress_finding_key">iščem ključ...</string> + <string name="progress_decompressing_data">razširjam podatke...</string> + <string name="progress_verifying_integrity">preverjam neokrnjenost...</string> + <string name="progress_deleting_securely">varno brišem \'%s\'…</string> + <!--action strings--> + <string name="hint_public_keys">Iskanje javnih ključev</string> + <string name="hint_secret_keys">Iskanje zasebnih ključev</string> + <string name="action_share_key_with">Deli ključ z...</string> + <!--key bit length selections--> + <string name="key_size_512">512</string> + <string name="key_size_768">768</string> + <string name="key_size_1024">1024</string> + <string name="key_size_1536">1536</string> + <string name="key_size_2048">2048</string> + <string name="key_size_3072">3072</string> + <string name="key_size_4096">4096</string> + <string name="key_size_8192">8192</string> + <string name="key_size_custom">Dolžina ključa po meri</string> + <string name="key_size_custom_info">Vnesite željeno dolžino ključa (v bitih):</string> + <string name="key_size_custom_info_rsa">Ključ RSA mora biti daljši od 1024 bitov, a največ 8192 bitov. Hkrati mora biti deljiv z 8.</string> + <string name="key_size_custom_info_dsa">Ključ DSA mora biti daljši od 512 bitov, a največ 1024 bitov. Hkrati mora biti deljiv z 64.</string> + <!--compression--> + <string name="compression_fast">hitro</string> + <string name="compression_very_slow">zelo počasi</string> + <!--Help--> + <string name="help_tab_start">Start</string> + <string name="help_tab_faq">Pogosta vprašanja</string> + <string name="help_tab_wot">Omrežje zaupanja</string> + <string name="help_tab_nfc_beam">NFC Beam</string> + <string name="help_tab_changelog">Dnevnik sprememb</string> + <string name="help_tab_about">O aplikaciji</string> + <string name="help_about_version">Različica:</string> + <!--Import--> + <string name="import_import">Uvozi izbrane ključe</string> + <string name="import_from_clipboard">Uvozi iz odložišča</string> + <plurals name="import_qr_code_missing"> + <item quantity="one">Manjka koda QR z ID-jem %s</item> + <item quantity="two">Manjkata kodi QR z ID-jema %s</item> + <item quantity="few">Manjkajo kode QR z ID-ji %s</item> + <item quantity="other">Manjkajo kode QR z ID-ji %s</item> + </plurals> + <string name="import_qr_code_start_with_one">Začnite s kodo QR z ID-jem 1</string> + <string name="import_qr_code_wrong">Koda QR je deformirana! Poskusite znova!</string> + <string name="import_qr_code_finished">Skeniranje kode QR zaključeno!</string> + <string name="import_qr_code_too_short_fingerprint">Prstni odtis je prekratek (< 16 znakov)</string> + <string name="import_qr_scan_button">Skenirajte kodo QR z aplikacijo \'Barcode Scanner\'</string> + <string name="import_nfc_text">Za prejem ključev preko NFC mora biti naprava odklenjena.</string> + <string name="import_nfc_help_button">Pomoč</string> + <string name="import_clipboard_button">Pridobi ključ iz odložišča</string> + <!--Intent labels--> + <string name="intent_decrypt_file">Dešifriraj datoteko z OpenKeychain</string> + <string name="intent_import_key">Uvozi ključ z OpenKeychain</string> + <string name="intent_send_encrypt">Šifriraj z OpenKeychain</string> + <string name="intent_send_decrypt">Dešifriraj z OpenKeychain</string> + <!--Remote API--> + <string name="api_no_apps">Ni nobene prijavljene aplikacije!\n\nDruge aplikacije lahko zahtevajo dostop do aplikacije OpenKeychain. Po potrditvi dostopa bodo navedene tukaj.</string> + <string name="api_settings_show_info">Pokaži dodatne informacije</string> + <string name="api_settings_hide_info">Skrij dodatne informacije</string> + <string name="api_settings_show_advanced">Pokaži napredne nastavitve</string> + <string name="api_settings_hide_advanced">Skrij napredne nastavitve</string> + <string name="api_settings_no_key">Izbran ni bil noben ključ</string> + <string name="api_settings_select_key">Izberite ključ</string> + <string name="api_settings_create_key">Ustvari nov ključ za ta račun</string> + <string name="api_settings_save">Shrani</string> + <string name="api_settings_cancel">Prekliči</string> + <string name="api_settings_revoke">Prekliči dostop</string> + <string name="api_settings_delete_account">Izbriši račun</string> + <string name="api_settings_package_name">Ime paketa</string> + <string name="api_settings_package_signature">SHA-256 podpisa paketa</string> + <string name="api_settings_accounts">Računi</string> + <string name="api_settings_accounts_empty">Noben račun ni vezan na to aplikacijo</string> + <string name="api_create_account_text">Aplikacija zahteva stvaritev novega računa. Izberite obstoječ zasebni ključ ali ustvarite novega.\nAplikacije so omejene na uporabo tu izbranih ključev.</string> + <string name="api_register_text">Navedena aplikacija zahteva dostop do aplikacije OpenKeychain.\nDovolim dostop?\n\nPOZOR: Če ne veste zakaj se je pojavilo to obvestilo, ne dovolite dostopa! Dostop lahko prekličete tudi kasneje, v oknu \'Prijavljene aplikacije\'.</string> + <string name="api_register_allow">Dovoli dostop</string> + <string name="api_register_disallow">Zavrni dostop</string> + <string name="api_register_error_select_key">Izberite ključ!</string> + <string name="api_select_pub_keys_text">Preverite seznam prejemnikov!</string> + <string name="api_error_wrong_signature">Preverjanje podpisa ni uspelo! Ste namestili to aplikacijo iz drugega vira? Če ste prepričani, da to ni napad, prekličite registracijo te aplikacije v OpenKeychain in jo izvedite znova.</string> + <!--Share--> + <string name="share_qr_code_dialog_title">Deli s kodo QR</string> + <string name="share_qr_code_dialog_start">Z uporabo tipke \'Naprej\' se sprehodite skozi vse kode QR in jih skenirajte eno za drugo.</string> + <string name="share_qr_code_dialog_fingerprint_text">Prstni odtis:</string> + <string name="share_qr_code_dialog_progress">Koda QR z ID-jem %1$d of %2$d</string> + <string name="share_nfc_dialog">Deli preko NFC</string> + <!--Key list--> + <plurals name="key_list_selected_keys"> + <item quantity="one">Izbran 1 ključ.</item> + <item quantity="two">Izbrana %d ključa.</item> + <item quantity="few">Izbrani %d ključi.</item> + <item quantity="other">Izbranih %d ključev.</item> + </plurals> + <string name="key_list_empty_text1">Na voljo še ni nobenega ključa...</string> + <string name="key_list_empty_text2">Lahko začnete z</string> + <string name="key_list_empty_text3">ali</string> + <string name="key_list_empty_button_create">stvaritvijo lastnega ključa</string> + <string name="key_list_empty_button_import">uvozom obstoječih ključev.</string> + <!--Key view--> + <string name="key_view_action_encrypt">Šifriraj s tem ključem</string> + <string name="key_view_tab_certs">Overitve</string> + <!--Navigation Drawer--> + <string name="nav_keys">Ključi</string> + <string name="nav_encrypt">Podpiši in šifriraj</string> + <string name="nav_decrypt">Dešifriraj in preveri</string> + <string name="nav_import">Uvozi ključe</string> + <string name="nav_apps">Prijavljene aplikacije</string> + <string name="drawer_open">Odprite navigacijski poteznik</string> + <string name="drawer_close">Zaprite navigacijski poteznik</string> + <string name="edit">Uredi</string> + <string name="my_keys">Moji ključi</string> + <string name="label_secret_key">Zasebni ključ</string> + <string name="secret_key_yes">na voljo</string> + <string name="secret_key_no">ni na voljo</string> + <!--hints--> + <string name="encrypt_content_edit_text_hint">Tu zapišite sporočilo, ki ga želite šifrirati in/ali podpisati...</string> + <string name="decrypt_content_edit_text_hint">Tu vnesite tajnopis za dešifriranje in/ali overbo...</string> + <!--certifications--> + <string name="cert_default">privzeto</string> + <string name="cert_none">brez</string> + <string name="cert_casual">navadno</string> + <string name="cert_positive">pozitivno</string> + <string name="cert_verify_ok">ok</string> + <string name="cert_verify_failed">neuspešno!</string> + <string name="cert_verify_error">napaka!</string> + <string name="cert_verify_unavailable">ključ ni na voljo</string> + <!--unsorted--> + <string name="section_signer_id">Podpisnik</string> + <string name="section_cert">Podrobnosti potrdil</string> + <string name="unknown_uid"><neznan></string> + <string name="empty_certs">Ni potrdil za ta ključ</string> + <string name="label_revocation">Razlog za preklic</string> + <string name="label_verify_status">Status preverjanja</string> + <string name="label_cert_type">Vrsta</string> + <string name="error_key_not_found">Ključ ni bil najden!</string> + <string name="error_key_processing">Napaka pri obdelavi ključa!</string> + <string name="no_subkey">podključ ni na voljo</string> + <string name="key_stripped">slečen</string> + <string name="secret_cannot_multiple">Zasebne ključe je mogoče izbrisati zgolj posamično!</string> + <string name="title_view_cert">Preglej podrobosti certifikata</string> + <string name="unknown_algorithm">neznan</string> + <string name="can_sign_not">ne more podpisati</string> +</resources> diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml index 11256f0ae..19115e141 100644 --- a/OpenKeychain/src/main/res/values-tr/strings.xml +++ b/OpenKeychain/src/main/res/values-tr/strings.xml @@ -7,6 +7,7 @@ <string name="title_create_key">Anahtar oluştur</string> <string name="title_edit_key">Anahtarı düzenle</string> <string name="title_preferences">Seçenekler</string> + <string name="title_key_server_preference">Anahtar Sunucusu Seçenekleri</string> <string name="title_import_keys">Anahtarları Al</string> <string name="title_export_key">Anahtarı Ver</string> <string name="title_export_keys">Anahtarları Ver</string> @@ -14,19 +15,21 @@ <string name="title_key_details">Anahtar Detayları</string> <string name="title_help">Yardım</string> <!--section--> - <string name="section_user_ids">Kullanıcı IDleri</string> <string name="section_keys">Anahtarlar</string> <string name="section_general">Genel</string> <string name="section_defaults">Varsayılanlar</string> <string name="section_advanced">Gelişmiş</string> <string name="section_upload_key">Anahtar Yükle</string> + <string name="section_key_server">Anahtar Sunucusu</string> <!--button--> + <string name="btn_decrypt_verify_clipboard">Panodan</string> <string name="btn_save">Kaydet</string> <string name="btn_do_not_save">İptal</string> <string name="btn_delete">Sil</string> <string name="btn_okay">Tamam</string> <string name="btn_next">İleri</string> <string name="btn_back">Geri</string> + <string name="btn_clipboard">Pano</string> <!--menu--> <string name="menu_preferences">Ayarlar</string> <string name="menu_help">Yardım</string> @@ -38,20 +41,35 @@ <string name="menu_create_key">Anahtar oluştur</string> <string name="menu_create_key_expert">Anahtar oluştur (uzman)</string> <string name="menu_search">Ara</string> + <string name="menu_import_from_key_server">Anahtar Sunucusu</string> + <string name="menu_share">Paylaş...</string> + <string name="menu_share_qr_code">QR Kod ile</string> + <string name="menu_share_nfc">NFC ile</string> <string name="menu_copy_to_clipboard">Panoya kopyala</string> <string name="menu_key_edit_cancel">İptal</string> + <string name="menu_select_all">Hepsini seç</string> + <string name="menu_add_keys">Anahtar ekle</string> <!--label--> <string name="label_sign">İmzala</string> <string name="label_message">Mesaj</string> <string name="label_file">Dosya</string> <string name="label_passphrase_again">Tekrar</string> <string name="label_algorithm">Algoritma</string> + <string name="label_select_public_keys">Alıcılar</string> + <string name="label_keyservers">Anahtar Sunucuları</string> + <string name="label_key_id">Anahtar ID</string> <string name="label_creation">Oluşturma</string> + <string name="label_expiry">Bitiş</string> <string name="label_usage">Kullanım</string> <string name="label_key_size">Anahtar Boyutu</string> <string name="label_name">İsim</string> <string name="label_comment">Yorum</string> <string name="label_email">Eposta</string> + <string name="select_keys_button_default">Seç</string> + <plurals name="n_keys"> + <item quantity="one">1 anahtar</item> + <item quantity="other">%d anahtar</item> + </plurals> <string name="secret_key">Özel Anahtar:</string> <!--choice--> <string name="choice_15secs">15 saniye</string> @@ -73,6 +91,9 @@ <string name="error">Hata</string> <string name="error_message">Hata: %s</string> <!--key flags--> + <string name="flag_sign">İmzala</string> + <string name="flag_encrypt">Şifrele</string> + <string name="flag_authenticate">Yetkilendir</string> <!--sentences--> <string name="file_delete_successful">Başarıyla silindi.</string> <string name="no_file_selected">Önce bir dosya seçin.</string> @@ -83,13 +104,23 @@ they will be put after "error_message", e.g. "Error: file not found"--> <string name="error_file_not_found">dosya bulunamadı</string> <string name="error_key_size_minimum512bit">anahtar uzunluğu en az 512bit olmalı</string> + <string name="error_user_id_no_email">eposta bulunamadı</string> <!--errors without preceeding Error:--> + <string name="error_import_file_no_content">Dosyanın içeriği boş</string> <!--results shown after decryption/verification--> + <string name="decrypt_result_invalid_signature">Geçersiz imza!</string> <!--progress dialogs, usually ending in '…'--> + <string name="progress_done">Bitti.</string> + <string name="progress_cancel">İptal</string> <string name="progress_saving">kaydediliyor...</string> <string name="progress_importing">alıyor...</string> <string name="progress_exporting">veriyor...</string> <string name="progress_building_key">anahtar oluşturuluyor...</string> + <string name="progress_saving_key_ring">anahtar kaydediliyor...</string> + <plurals name="progress_exporting_key"> + <item quantity="one">anahtar veriliyor...</item> + <item quantity="other">anahtarlar veriliyor...</item> + </plurals> <string name="progress_preparing_signature">imza hazırlanıyor...</string> <string name="progress_generating_signature">imza oluşturuluyor...</string> <string name="progress_processing_signature">imza işleniyor...</string> @@ -100,13 +131,19 @@ <!--action strings--> <!--key bit length selections--> <string name="key_size_512">512</string> + <string name="key_size_768">768</string> <string name="key_size_1024">1024</string> + <string name="key_size_1536">1536</string> <string name="key_size_2048">2048</string> + <string name="key_size_3072">3072</string> <string name="key_size_4096">4096</string> + <string name="key_size_8192">8192</string> <!--compression--> <string name="compression_fast">hızlı</string> <string name="compression_very_slow">çok yavaş</string> <!--Help--> + <string name="help_tab_start">Başla</string> + <string name="help_tab_faq">SSS</string> <string name="help_tab_about">Hakkında</string> <string name="help_about_version">Sürüm:</string> <!--Import--> @@ -118,13 +155,32 @@ <string name="api_settings_select_key">Anahtar seç</string> <string name="api_settings_save">Kaydet</string> <string name="api_settings_cancel">İptal</string> + <string name="api_settings_delete_account">Hesabı sil</string> + <string name="api_settings_package_name">Paket Adı</string> + <string name="api_settings_accounts">Hesaplar</string> <string name="api_register_allow">Erişime izin ver</string> <string name="api_register_disallow">Erişime izin verme</string> <string name="api_register_error_select_key">Lütfen bir anahtar seçin!</string> <!--Share--> + <string name="share_qr_code_dialog_title">QR Kod ile Paylaş</string> <!--Key list--> + <string name="key_list_empty_text3">ya da</string> <!--Key view--> <!--Navigation Drawer--> + <string name="nav_keys">Anahtarlar</string> + <string name="edit">Düzenle</string> + <string name="my_keys">Anahtarlarım</string> + <string name="label_secret_key">Özel Anahtar</string> + <string name="secret_key_yes">mevcut</string> + <string name="secret_key_no">mevcut değil</string> <!--hints--> + <!--certifications--> + <string name="cert_default">varsayılan</string> + <string name="cert_verify_ok">tamam</string> + <string name="cert_verify_failed">başarısız!</string> + <string name="cert_verify_error">hata!</string> + <string name="cert_verify_unavailable">anahtar mevcut değil</string> <!--unsorted--> + <string name="section_signer_id">İmzalayan</string> + <string name="can_sign_not">imzalanamadı</string> </resources> diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml index dd74826e3..a8c7243b3 100644 --- a/OpenKeychain/src/main/res/values-uk/strings.xml +++ b/OpenKeychain/src/main/res/values-uk/strings.xml @@ -24,13 +24,11 @@ <string name="title_key_details">Подробиці про ключ</string> <string name="title_help">Довідка</string> <!--section--> - <string name="section_user_ids">ІД користувача</string> <string name="section_keys">Ключі</string> <string name="section_general">Загальне</string> <string name="section_defaults">Типове</string> <string name="section_advanced">Додаткове</string> <string name="section_master_key">Основний ключ</string> - <string name="section_master_user_id">ІД основного ключа</string> <string name="section_actions">Дії</string> <string name="section_certification_key">Ваш ключ використаний для сертифікації</string> <string name="section_upload_key">Завантажити ключ</string> @@ -113,7 +111,6 @@ <string name="label_expiry">Закінчення</string> <string name="label_usage">Використання</string> <string name="label_key_size">Розмір ключа</string> - <string name="label_main_user_id">ІД основного користувача</string> <string name="label_name">Назва</string> <string name="label_comment">Коментар</string> <string name="label_email">Ел. пошта</string> @@ -131,6 +128,8 @@ <string name="no_key"><без ключа></string> <string name="can_encrypt">можна зашифрувати</string> <string name="can_sign">можна підписати</string> + <string name="can_certify">можна сертифікувати</string> + <string name="can_certify_not">не можна сертифікувати</string> <string name="expired">закінчився</string> <string name="revoked">скасовано</string> <string name="secret_key">Секретний ключ:</string> @@ -182,7 +181,6 @@ <string name="key_deletion_confirmation_multi">Ви справді хочете вилучити усі вибрані відкриті ключі?\nВи не зможете це відмінити!</string> <string name="secret_key_deletion_confirmation">Ви справді хочете вилучити секретний ключ \'%s\'?\nВи не зможете це відмінити!</string> <string name="ask_save_changed_key">Ви внесли зміни до в\'язки ключів, ви б хотіли. Волієте їх зберегти?</string> - <string name="ask_empty_id_ok">Ви вже додали порожній ідентифікатор користувача. Справді хочете продовжити?</string> <string name="public_key_deletetion_confirmation">Ви справді хочете вилучити відкритий ключ \'%s\'?\nВи не зможете це відмінити!</string> <string name="also_export_secret_keys">Також експортувати секретні ключі?</string> <plurals name="keys_added_and_updated_1"> @@ -238,8 +236,6 @@ <string name="error_master_key_must_not_be_el_gamal">основний ключ не може бути ключем ElGamal</string> <string name="error_unknown_algorithm_choice">вибір невідомого алгоритму</string> <string name="error_user_id_no_email">жодного листа не знайдено</string> - <string name="error_key_needs_a_user_id">потрібний хоча б один ІД користувача</string> - <string name="error_main_user_id_must_not_be_empty">ІД основного користувача не має бути порожнім</string> <string name="error_key_needs_master_key">потрібний хоча б один основний ключ</string> <string name="error_no_signature_passphrase">не подано парольної фрази</string> <string name="error_no_signature_key">не подано ключ підпису</string> @@ -330,6 +326,7 @@ <!--Help--> <string name="help_tab_start">Початок</string> <string name="help_tab_faq">ЧАП</string> + <string name="help_tab_wot">Мережа довіри</string> <string name="help_tab_nfc_beam">NFC промінь</string> <string name="help_tab_changelog">Журнал змін</string> <string name="help_tab_about">Про</string> @@ -377,8 +374,6 @@ <string name="api_register_allow">Дозволити доступ</string> <string name="api_register_disallow">Не дозволити доступ</string> <string name="api_register_error_select_key">Будь ласка, виберіть ключ!</string> - <string name="api_select_pub_keys_missing_text">Не знайдено публічних ключів для цих ІД користувачів:</string> - <string name="api_select_pub_keys_dublicates_text">Більше ніж один публічний ключ існує для цих ІД користувачів:</string> <string name="api_select_pub_keys_text">Будь ласка, перевірте список одержувачів!</string> <string name="api_error_wrong_signature">Перевірка підпису пакету не вдалася! Може ви встановили програму з іншого джерела? Якщо ви впевнені, що це не атака, то відкличте реєстрацію програми у OpenKeychain та знову зареєструйте її.</string> <!--Share--> @@ -399,8 +394,6 @@ <string name="key_list_empty_button_create">створюється ваш власний ключ</string> <string name="key_list_empty_button_import">імпортуюся ключі.</string> <!--Key view--> - <string name="key_view_action_edit">Редагувати цей ключ</string> - <string name="key_view_tab_main">Інформація</string> <string name="key_view_tab_certs">Сертифікати</string> <!--Navigation Drawer--> <string name="nav_encrypt">Підписати і зашифрувати</string> @@ -417,27 +410,22 @@ <!--hints--> <string name="encrypt_content_edit_text_hint">Напишіть повідомлення для шифрування та/або підпису…</string> <string name="decrypt_content_edit_text_hint">Уведіть зашифрований текст тут для його розшифрування та/або перевірки…</string> - <!--unsorted--> - <string name="section_signer_id">Підписувач</string> - <string name="section_cert">Дані сертифікату</string> - <string name="label_user_id">ІД користувача</string> - <string name="empty_certs">Немає сертифікатів для цього ключа</string> - <string name="section_uids_to_sign">ІД користувача для реєстрації</string> + <!--certifications--> <string name="cert_default">типово</string> <string name="cert_none">жоден</string> <string name="cert_casual">випадковий</string> <string name="cert_positive">додатний</string> - <string name="cert_revoke">відхилити</string> - <string name="help_tab_wot">Мережа довіри</string> <string name="cert_verify_ok">Гаразд</string> <string name="cert_verify_failed">Невдача!</string> <string name="cert_verify_error">Помилка!</string> <string name="cert_verify_unavailable">Недоступний ключ</string> + <!--unsorted--> + <string name="section_signer_id">Підписувач</string> + <string name="section_cert">Дані сертифікату</string> + <string name="empty_certs">Немає сертифікатів для цього ключа</string> <string name="label_revocation">Причина відхилення</string> <string name="label_verify_status">Стан перевірки</string> <string name="label_cert_type">Тип</string> - <string name="can_certify">можна сертифікувати</string> - <string name="can_certify_not">не можна сертифікувати</string> <string name="error_key_not_found">Ключ не знайдено!</string> <string name="error_key_processing">Помилка опрацювання ключа!</string> <string name="no_subkey">підключ недоступний</string> diff --git a/OpenKeychain/src/main/res/values-v14/styles.xml b/OpenKeychain/src/main/res/values-v14/styles.xml index 4f8c45117..7097ed900 100644 --- a/OpenKeychain/src/main/res/values-v14/styles.xml +++ b/OpenKeychain/src/main/res/values-v14/styles.xml @@ -15,4 +15,8 @@ <item name="android:textSize">14sp</item> </style> + <style name="SelectableItem"> + <item name="android:background">?android:attr/selectableItemBackground</item> + </style> + </resources>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml index 1266130f8..cf0fff97d 100644 --- a/OpenKeychain/src/main/res/values-zh/strings.xml +++ b/OpenKeychain/src/main/res/values-zh/strings.xml @@ -21,7 +21,6 @@ <string name="title_send_key">上传到密钥服务器</string> <string name="title_help">帮助</string> <!--section--> - <string name="section_user_ids">用户ID</string> <string name="section_keys">密钥</string> <string name="section_general">常规</string> <string name="section_defaults">缺省</string> @@ -104,8 +103,6 @@ <string name="error_external_storage_not_ready">外置存储没有准备好</string> <string name="error_key_size_minimum512bit">密钥的大小必须至少512位</string> <string name="error_unknown_algorithm_choice">位置的算法选择</string> - <string name="error_key_needs_a_user_id">需要至少一个用户id</string> - <string name="error_main_user_id_must_not_be_empty">主用户id不能是空的</string> <string name="error_key_needs_master_key">需要至少一个主密钥</string> <string name="error_no_signature_passphrase">没有提供密语</string> <string name="error_no_signature_key">没有提供密钥</string> @@ -161,5 +158,6 @@ <!--Navigation Drawer--> <string name="nav_import">导入密钥</string> <!--hints--> + <!--certifications--> <!--unsorted--> </resources> diff --git a/OpenKeychain/src/main/res/values/arrays.xml b/OpenKeychain/src/main/res/values/arrays.xml index 4173d49e4..699c02aff 100644 --- a/OpenKeychain/src/main/res/values/arrays.xml +++ b/OpenKeychain/src/main/res/values/arrays.xml @@ -54,6 +54,7 @@ <item>@string/menu_import_from_qr_code</item> <item>@string/import_from_clipboard</item> <item>@string/menu_import_from_nfc</item> + <item>@string/menu_import_from_keybase</item> </string-array> </resources> diff --git a/OpenKeychain/src/main/res/values/colors.xml b/OpenKeychain/src/main/res/values/colors.xml index 0f0b2a600..728aefdd8 100644 --- a/OpenKeychain/src/main/res/values/colors.xml +++ b/OpenKeychain/src/main/res/values/colors.xml @@ -3,9 +3,13 @@ <color name="emphasis">#31b6e7</color> <color name="bg_gray">#cecbce</color> + <color name="tertiary_text_light">#808080</color> - <color name="result_red">#FF4444</color> - <color name="result_orange">#FFBB33</color> - <color name="result_green">#99CC00</color> - <color name="result_blue">#33B5E5</color> + <color name="holo_gray_light">#33999999</color> + <color name="holo_gray_bright">#33CCCCCC</color> + + <color name="result_red">#ffff4444</color> + <color name="result_orange">#ffffbb33</color> + <color name="result_green">#ff99cc00</color> + <color name="result_blue">#ff33b5e5</color> </resources>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 330bc349d..76bf4bd82 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -15,6 +15,8 @@ <string name="title_change_passphrase">Change Passphrase</string> <string name="title_set_passphrase">Set Passphrase</string> <string name="title_share_with">Share with…</string> + <string name="title_share_fingerprint_with">Share fingerprint with…</string> + <string name="title_share_key_with">Share key with…</string> <string name="title_share_file">Share file with…</string> <string name="title_encrypt_to_file">Encrypt To File</string> <string name="title_decrypt_to_file">Decrypt To File</string> @@ -28,19 +30,21 @@ <string name="title_help">Help</string> <!-- section --> - <string name="section_user_ids">User IDs</string> + <string name="section_user_ids">Identities</string> <string name="section_keys">Keys</string> <string name="section_general">General</string> <string name="section_defaults">Defaults</string> <string name="section_advanced">Advanced</string> <string name="section_master_key">Master Key</string> - <string name="section_master_user_id">Master User ID</string> + <string name="section_master_user_id">Primary Identity</string> <string name="section_actions">Actions</string> + <string name="section_share_key">Share key</string> <string name="section_certification_key">Your Key used for certification</string> <string name="section_upload_key">Upload Key</string> <string name="section_key_server">Keyserver</string> <string name="section_encrypt_and_or_sign">Encrypt and/or Sign</string> <string name="section_decrypt_verify">Decrypt and Verify</string> + <string name="section_fingerprint">Fingerprint</string> <!-- button --> <string name="btn_certify">Certify</string> @@ -75,6 +79,7 @@ <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> @@ -121,7 +126,7 @@ <string name="label_expiry">Expiry</string> <string name="label_usage">Usage</string> <string name="label_key_size">Key Size</string> - <string name="label_main_user_id">Main User ID</string> + <string name="label_main_user_id">Primary identity</string> <string name="label_name">Name</string> <string name="label_comment">Comment</string> <string name="label_email">Email</string> @@ -207,7 +212,7 @@ <string name="key_deletion_confirmation_multi">Do you really want to delete all selected public keys?\nYou can\'t undo this!</string> <string name="secret_key_deletion_confirmation">Do you really want to delete the SECRET key \'%s\'?\nYou can\'t undo this!</string> <string name="ask_save_changed_key">You have made changes to the keyring, would you like to save it?</string> - <string name="ask_empty_id_ok">You have added an empty user ID, are you sure you want to continue?</string> + <string name="ask_empty_id_ok">You have added an empty identity, are you sure you want to continue?</string> <string name="public_key_deletetion_confirmation">Do you really want to delete the public key \'%s\'?\nYou can\'t undo this!</string> <string name="also_export_secret_keys">Also export secret keys?</string> @@ -251,6 +256,7 @@ <string name="list_empty">This list is empty!</string> <string name="nfc_successful">Successfully sent key with NFC Beam!</string> <string name="key_copied_to_clipboard">Key has been copied to the clipboard!</string> + <string name="fingerprint_copied_to_clipboard">Fingerprint has been copied to the clipboard!</string> <string name="key_has_already_been_certified">Key has already been certified!</string> <string name="select_key_to_sign">Please select a key to be used for signing!</string> <string name="key_too_big_for_sharing">Key is too big to be shared this way!</string> @@ -268,8 +274,8 @@ <string name="error_master_key_must_not_be_el_gamal">the master key cannot be an ElGamal key</string> <string name="error_unknown_algorithm_choice">unknown algorithm choice</string> <string name="error_user_id_no_email">no email found</string> - <string name="error_key_needs_a_user_id">need at least one user id</string> - <string name="error_main_user_id_must_not_be_empty">main user id must not be empty</string> + <string name="error_key_needs_a_user_id">need at least one identity</string> + <string name="error_main_user_id_must_not_be_empty">primary identity must not be empty</string> <string name="error_key_needs_master_key">need at least a master key</string> <string name="error_no_signature_passphrase">no passphrase given</string> <string name="error_no_signature_key">no signature key given</string> @@ -348,6 +354,7 @@ <string name="hint_public_keys">Search Public Keys</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> <!-- key bit length selections --> <string name="key_size_512">512</string> @@ -393,6 +400,7 @@ <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_clipboard_button">Get key from clipboard</string> + <string name="import_keybase_button">Get key from Keybase.io</string> <!-- Intent labels --> <string name="intent_decrypt_file">Decrypt File with OpenKeychain</string> @@ -422,8 +430,8 @@ <string name="api_register_allow">Allow access</string> <string name="api_register_disallow">Disallow access</string> <string name="api_register_error_select_key">Please select a key!</string> - <string name="api_select_pub_keys_missing_text">No public keys were found for these user ids:</string> - <string name="api_select_pub_keys_dublicates_text">More than one public key exist for these user ids:</string> + <string name="api_select_pub_keys_missing_text">No public keys were found for these identities:</string> + <string name="api_select_pub_keys_dublicates_text">More than one public key exist for these identities:</string> <string name="api_select_pub_keys_text">Please review the list of recipients!</string> <string name="api_error_wrong_signature">Signature check failed! Have you installed this app from a different source? If you are sure that this is not an attack, revoke this app\'s registration in OpenKeychain and then register the app again.</string> @@ -447,10 +455,14 @@ <string name="key_list_empty_button_import">importing keys.</string> <!-- Key view --> - <string name="key_view_action_edit">Edit this key</string> + <string name="key_view_action_edit">Edit key</string> <string name="key_view_action_encrypt">Encrypt with this key</string> - <string name="key_view_action_certify">Certify this key</string> - <string name="key_view_tab_main">Info</string> + <string name="key_view_action_certify">Certify identities</string> + <string name="key_view_action_share_with">with…</string> + <string name="key_view_action_share_nfc">over NFC by holding the devices back to back</string> + <string name="key_view_tab_main">Main Info</string> + <string name="key_view_tab_share">Share</string> + <string name="key_view_tab_keys_details">Key Details</string> <string name="key_view_tab_certs">Certifications</string> <!-- Navigation Drawer --> @@ -476,7 +488,7 @@ <string name="cert_none">none</string> <string name="cert_casual">casual</string> <string name="cert_positive">positive</string> - <string name="cert_revoke">revoke</string> + <string name="cert_revoke">revoked</string> <string name="cert_verify_ok">ok</string> <string name="cert_verify_failed">failed!</string> <string name="cert_verify_error">error!</string> @@ -485,10 +497,10 @@ <!-- unsorted --> <string name="section_signer_id">Signer</string> <string name="section_cert">Certificate Details</string> - <string name="label_user_id">User ID</string> + <string name="label_user_id">Identity</string> <string name="unknown_uid"><unknown></string> <string name="empty_certs">No certificates for this key</string> - <string name="section_uids_to_sign">User IDs to sign</string> + <string name="section_uids_to_sign">Identities to sign</string> <string name="label_revocation">Revocation Reason</string> <string name="label_verify_status">Verification Status</string> <string name="label_cert_type">Type</string> diff --git a/OpenKeychain/src/main/res/values/styles.xml b/OpenKeychain/src/main/res/values/styles.xml index f03d72605..4a3fa0f8f 100644 --- a/OpenKeychain/src/main/res/values/styles.xml +++ b/OpenKeychain/src/main/res/values/styles.xml @@ -2,7 +2,6 @@ <resources> <!-- Used in Android < 4 --> - <style name="KeychainTheme" parent="@style/Theme.AppCompat.Light"> <item name="android:alertDialogStyle">@style/CustomDialogTheme</item> </style> @@ -30,5 +29,8 @@ <item name="android:textSize">14sp</item> </style> + <style name="SelectableItem"> + <item name="android:background">@drawable/selector_transparent_button</item> + </style> </resources>
\ No newline at end of file |