mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 19:22:14 -05:00
better definition of intent filters to open from file managers
This commit is contained in:
parent
b9abe386cd
commit
511cc4af9f
@ -18,10 +18,31 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.thialfihar.android.apg"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="50"
|
||||
android:versionCode="20000"
|
||||
android:versionName="2.0" >
|
||||
|
||||
<!-- APG 2 starting with versionCode 50! -->
|
||||
<!--
|
||||
General remarks
|
||||
===============
|
||||
- APG 2 starting with versionCode 20000!
|
||||
|
||||
|
||||
Registration of APG to file types
|
||||
=================================
|
||||
General remarks about file ending conventions:
|
||||
- *.gpg for binary files
|
||||
- *.asc for ascii armored files
|
||||
|
||||
The actual content can be anything.
|
||||
The file ending only shows if it is binary or ascii encoded.
|
||||
|
||||
Remarks about the ugly android:pathPattern:
|
||||
We are matching all files with a specific file ending.
|
||||
This is done in an ugly way because of Android limitations.
|
||||
Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension
|
||||
and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921
|
||||
for more information.
|
||||
-->
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="7"
|
||||
@ -67,6 +88,55 @@
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEARCH" />
|
||||
</intent-filter>
|
||||
<intent-filter android:label="@string/intent_import_key" >
|
||||
<action android:name="org.thialfihar.android.apg.intent.IMPORT" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
|
||||
<data android:mimeType="*/*" />
|
||||
</intent-filter>
|
||||
<intent-filter android:label="@string/intent_import_key" >
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data android:host="*" />
|
||||
<data android:scheme="file" />
|
||||
<data android:scheme="content" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:pathPattern=".*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
</intent-filter>
|
||||
<intent-filter android:label="@string/intent_import_key" >
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data android:host="*" />
|
||||
<data android:scheme="file" />
|
||||
<data android:scheme="content" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:pathPattern=".*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.app.searchable"
|
||||
@ -168,23 +238,7 @@
|
||||
|
||||
<data android:mimeType="*/*" />
|
||||
</intent-filter>
|
||||
|
||||
<!--
|
||||
General remarks about file ending conventions:
|
||||
- *.gpg for binary files
|
||||
- *.asc for ascii armored files
|
||||
|
||||
The actual content can be anything.
|
||||
The file ending only shows if it is binary or ascii encoded.
|
||||
|
||||
Remarks about the ugly android:pathPattern:
|
||||
We are matching all files with a specific file ending.
|
||||
This is done in an ugly way because of Android limitations.
|
||||
Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension
|
||||
and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921
|
||||
for more information.
|
||||
-->
|
||||
<intent-filter>
|
||||
<intent-filter android:label="@string/intent_decrypt_file" >
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@ -205,7 +259,7 @@
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<intent-filter android:label="@string/intent_decrypt_file" >
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@ -227,47 +281,6 @@
|
||||
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!-- <activity -->
|
||||
<!-- android:name=".deprecated.GeneralActivity" -->
|
||||
<!-- android:configChanges="orientation|screenSize|keyboardHidden|keyboard" -->
|
||||
<!-- android:label="@string/app_name" -->
|
||||
<!-- android:theme="@android:style/Theme.Dialog" > -->
|
||||
<!-- <intent-filter> -->
|
||||
<!-- <action android:name="android.intent.action.VIEW" /> -->
|
||||
<!-- <action android:name="android.intent.action.SEND" /> -->
|
||||
|
||||
|
||||
<!-- <category android:name="android.intent.category.DEFAULT" /> -->
|
||||
|
||||
|
||||
<!-- <data -->
|
||||
<!-- android:mimeType="*/*" -->
|
||||
<!-- android:scheme="file" /> -->
|
||||
<!-- </intent-filter> -->
|
||||
<!-- <intent-filter> -->
|
||||
<!-- <action android:name="android.intent.action.VIEW" /> -->
|
||||
<!-- <action android:name="android.intent.action.SEND" /> -->
|
||||
|
||||
|
||||
<!-- <category android:name="android.intent.category.DEFAULT" /> -->
|
||||
<!-- </intent-filter> -->
|
||||
<!-- <intent-filter> -->
|
||||
<!-- <action android:name="android.intent.action.VIEW" /> -->
|
||||
<!-- <action android:name="android.intent.action.SEND" /> -->
|
||||
|
||||
|
||||
<!-- <category android:name="android.intent.category.DEFAULT" /> -->
|
||||
|
||||
|
||||
<!-- <data -->
|
||||
<!-- android:mimeType="text/*" -->
|
||||
<!-- android:scheme="" /> -->
|
||||
<!-- </intent-filter> -->
|
||||
<!-- </activity> -->
|
||||
<activity
|
||||
android:name=".ui.MailListActivity"
|
||||
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
|
||||
android:label="@string/title_mailInbox" />
|
||||
<activity
|
||||
android:name=".ui.KeyServerQueryActivity"
|
||||
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
|
||||
@ -301,6 +314,11 @@
|
||||
<service android:name=".service.PassphraseCacheService" />
|
||||
<service android:name=".service.ApgService" />
|
||||
|
||||
<provider
|
||||
android:name=".provider.DataProvider"
|
||||
android:authorities="org.thialfihar.android.apg.provider"
|
||||
android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" />
|
||||
|
||||
<!-- TODO: need to be moved into new service model -->
|
||||
<service
|
||||
android:name=".deprecated.ApgService2"
|
||||
@ -317,10 +335,6 @@
|
||||
android:value="2" />
|
||||
</service>
|
||||
|
||||
<provider
|
||||
android:name=".provider.DataProvider"
|
||||
android:authorities="org.thialfihar.android.apg.provider"
|
||||
android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" />
|
||||
<provider
|
||||
android:name=".deprecated.ApgServiceBlobProvider"
|
||||
android:authorities="org.thialfihar.android.apg.provider.apgserviceblobprovider"
|
||||
|
@ -334,10 +334,15 @@
|
||||
<string name="help_about_version">Version:</string>
|
||||
|
||||
<!-- Import from QR Code -->
|
||||
|
||||
<string name="import_from_qr_code_import">Import key (only locally)</string>
|
||||
<string name="import_from_qr_code_import_sign_and_upload">Import, Sign, and upload key</string>
|
||||
<string name="import_from_qr_code_scan_again">Scan qr code again</string>
|
||||
<string name="import_from_qr_code_finish">Finish</string>
|
||||
|
||||
<!-- Intent labels -->
|
||||
<string name="intent_decrypt_file">APG: Decrypt File</string>
|
||||
<string name="intent_import_key">APG: Import Key</string>
|
||||
<string name="intent_send_encrypt">APG: Encrypt</string>
|
||||
<string name="intent_send_decrypt">APG: Decrypt</string>
|
||||
|
||||
</resources>
|
@ -251,26 +251,39 @@ public class DecryptActivity extends SherlockFragmentActivity {
|
||||
mSource.showNext();
|
||||
}
|
||||
|
||||
boolean decryptImmediately = false;
|
||||
|
||||
mIntent = getIntent();
|
||||
|
||||
// handled separately from other actions as it uses mIntent.setAction()
|
||||
if (Intent.ACTION_VIEW.equals(mIntent.getAction())) {
|
||||
Uri uri = mIntent.getData();
|
||||
try {
|
||||
InputStream attachment = getContentResolver().openInputStream(uri);
|
||||
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
|
||||
byte bytes[] = new byte[1 << 16];
|
||||
int length;
|
||||
while ((length = attachment.read(bytes)) > 0) {
|
||||
byteOut.write(bytes, 0, length);
|
||||
}
|
||||
byteOut.close();
|
||||
String data = new String(byteOut.toByteArray());
|
||||
mMessage.setText(data);
|
||||
} catch (FileNotFoundException e) {
|
||||
// ignore, then
|
||||
} catch (IOException e) {
|
||||
// ignore, then
|
||||
}
|
||||
} else if (ACTION_DECRYPT.equals(mIntent.getAction())) {
|
||||
|
||||
// TODO: old implementation of ACTION_VIEW. Is this used in K9?
|
||||
|
||||
// Uri uri = mIntent.getData();
|
||||
// try {
|
||||
// InputStream attachment = getContentResolver().openInputStream(uri);
|
||||
// ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
|
||||
// byte bytes[] = new byte[1 << 16];
|
||||
// int length;
|
||||
// while ((length = attachment.read(bytes)) > 0) {
|
||||
// byteOut.write(bytes, 0, length);
|
||||
// }
|
||||
// byteOut.close();
|
||||
// String data = new String(byteOut.toByteArray());
|
||||
// mMessage.setText(data);
|
||||
// } catch (FileNotFoundException e) {
|
||||
// // ignore, then
|
||||
// } catch (IOException e) {
|
||||
// // ignore, then
|
||||
// }
|
||||
|
||||
// same as ACTION_DECRYPT_FILE but decrypt it immediately
|
||||
mIntent.setAction(ACTION_DECRYPT_FILE);
|
||||
decryptImmediately = true;
|
||||
}
|
||||
|
||||
if (ACTION_DECRYPT.equals(mIntent.getAction())) {
|
||||
Log.d(Constants.TAG, "Apg Intent DECRYPT startet");
|
||||
Bundle extras = mIntent.getExtras();
|
||||
if (extras == null) {
|
||||
@ -317,10 +330,7 @@ public class DecryptActivity extends SherlockFragmentActivity {
|
||||
mReplyTo = extras.getString(EXTRA_REPLY_TO);
|
||||
mSubject = extras.getString(EXTRA_SUBJECT);
|
||||
} else if (ACTION_DECRYPT_FILE.equals(mIntent.getAction())) {
|
||||
mInputFilename = mIntent.getDataString();
|
||||
if ("file".equals(mIntent.getScheme())) {
|
||||
mInputFilename = Uri.decode(mInputFilename.substring(7));
|
||||
}
|
||||
mInputFilename = mIntent.getData().getPath();
|
||||
mFilename.setText(mInputFilename);
|
||||
guessOutputFilename();
|
||||
mSource.setInAnimation(null);
|
||||
@ -420,8 +430,9 @@ public class DecryptActivity extends SherlockFragmentActivity {
|
||||
|
||||
updateSource();
|
||||
|
||||
if (mSource.getCurrentView().getId() == R.id.sourceMessage
|
||||
&& (mMessage.getText().length() > 0 || mData != null || mContentUri != null)) {
|
||||
if (decryptImmediately
|
||||
|| (mSource.getCurrentView().getId() == R.id.sourceMessage && (mMessage.getText()
|
||||
.length() > 0 || mData != null || mContentUri != null))) {
|
||||
decryptClicked();
|
||||
}
|
||||
}
|
||||
|
@ -432,11 +432,9 @@ public class EncryptActivity extends SherlockFragmentActivity {
|
||||
mSource.showNext();
|
||||
}
|
||||
} else if (ACTION_ENCRYPT_FILE.equals(mIntent.getAction())) {
|
||||
if ("file".equals(mIntent.getScheme())) {
|
||||
mInputFilename = Uri.decode(mIntent.getDataString().replace("file://", ""));
|
||||
mFilename.setText(mInputFilename);
|
||||
guessOutputFilename();
|
||||
}
|
||||
mInputFilename = mIntent.getData().getPath();
|
||||
mFilename.setText(mInputFilename);
|
||||
guessOutputFilename();
|
||||
mSource.setInAnimation(null);
|
||||
mSource.setOutAnimation(null);
|
||||
while (mSource.getCurrentView().getId() != R.id.sourceFile) {
|
||||
|
@ -44,7 +44,6 @@ import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteQueryBuilder;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
@ -143,9 +142,15 @@ public class KeyListActivity extends SherlockFragmentActivity {
|
||||
mListAdapter = new KeyListAdapter(this, searchString);
|
||||
mList.setAdapter(mListAdapter);
|
||||
|
||||
// handled separately from other actions as it uses intent.setAction()
|
||||
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
|
||||
// same as ACTION_IMPORT invoked from a file manager
|
||||
intent.setAction(ACTION_IMPORT);
|
||||
}
|
||||
|
||||
if (ACTION_IMPORT.equals(intent.getAction())) {
|
||||
if ("file".equals(intent.getScheme()) && intent.getDataString() != null) {
|
||||
mImportFilename = Uri.decode(intent.getDataString().replace("file://", ""));
|
||||
mImportFilename = intent.getData().getPath();
|
||||
} else {
|
||||
mImportData = intent.getStringExtra(EXTRA_TEXT);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user