Added optional send-to-self share target

This commit is contained in:
M66B 2023-06-08 08:55:37 +02:00
parent 7f62d73284
commit de0b082ea5
13 changed files with 303 additions and 1 deletions

View File

@ -8,6 +8,7 @@ For support you can use [the contact form](https://contact.faircode.eu/?product=
### Next version
* Added option to add send-to-self to Android's share menu
* Added seperate filter settings for archive, trash and spam folder
* Small improvements and minor bug fixes
* Updated [translations](https://crowdin.com/project/open-source-email)

View File

@ -337,6 +337,44 @@
</intent-filter>
</activity>
<activity
android:name=".ActivitySendSelf"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_send_self"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityClear"
android:excludeFromRecents="true"

View File

@ -343,6 +343,44 @@
</intent-filter>
</activity>
<activity
android:name=".ActivitySendSelf"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_send_self"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityClear"
android:excludeFromRecents="true"

View File

@ -343,6 +343,44 @@
</intent-filter>
</activity>
<activity
android:name=".ActivitySendSelf"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_send_self"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityClear"
android:excludeFromRecents="true"

View File

@ -336,6 +336,44 @@
</intent-filter>
</activity>
<activity
android:name=".ActivitySendSelf"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_send_self"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityClear"
android:excludeFromRecents="true"

View File

@ -8,6 +8,7 @@ For support you can use [the contact form](https://contact.faircode.eu/?product=
### Next version
* Added option to add send-to-self to Android's share menu
* Added seperate filter settings for archive, trash and spam folder
* Small improvements and minor bug fixes
* Updated [translations](https://crowdin.com/project/open-source-email)

View File

@ -0,0 +1,79 @@
package eu.faircode.email;
/*
This file is part of FairEmail.
FairEmail 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.
FairEmail 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 FairEmail. If not, see <http://www.gnu.org/licenses/>.
Copyright 2018-2023 by Marcel Bokhorst (M66B)
*/
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import androidx.annotation.RequiresApi;
import androidx.core.net.MailTo;
import java.util.ArrayList;
import java.util.Arrays;
public class ActivitySendSelf extends ActivityBase {
@Override
@RequiresApi(api = Build.VERSION_CODES.M)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new SimpleTask<EntityIdentity>() {
@Override
protected EntityIdentity onExecute(Context context, Bundle args) {
DB db = DB.getInstance(context);
return db.identity().getPrimaryIdentity();
}
@Override
protected void onExecuted(Bundle args, EntityIdentity identity) {
Intent intent = getIntent();
if (identity != null) {
Uri uri = intent.getData();
if (uri != null && "mailto".equals(uri.getScheme())) {
String mailto = uri.toString();
int s = mailto.indexOf(':');
int q = mailto.indexOf('?', s);
if (s > 0) {
String query = (q < 0 ? mailto.substring(s + 1) : mailto.substring(s + 1, q));
intent.setData(Uri.parse(MailTo.MAILTO_SCHEME + Uri.encode(identity.email) + query));
}
} else
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{identity.email});
}
intent.setClass(ActivitySendSelf.this, ActivityCompose.class);
startActivity(intent);
finish();
}
@Override
protected void onException(Bundle args, Throwable ex) {
Log.unexpectedError(getSupportFragmentManager(), ex);
//finish();
}
}.execute(this, new Bundle(), "send:self");
}
}

View File

@ -86,6 +86,13 @@ public interface DaoIdentity {
@Query("SELECT * FROM identity WHERE id = :id")
EntityIdentity getIdentity(long id);
@Query("SELECT identity.* FROM identity" +
" JOIN account ON account.id = identity.account" +
" JOIN folder ON folder.account = identity.account AND folder.type = '" + EntityFolder.DRAFTS + "'" +
" WHERE account.`primary` AND account.synchronize" +
" AND identity.`primary` AND identity.synchronize")
EntityIdentity getPrimaryIdentity();
@Query("SELECT * FROM identity WHERE uuid = :uuid")
EntityIdentity getIdentityByUUID(String uuid);

View File

@ -109,6 +109,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private View view;
private ImageButton ibHelp;
private SwitchCompat swPowerMenu;
private SwitchCompat swSendSelf;
private SwitchCompat swExternalSearch;
private SwitchCompat swSortAnswers;
private SwitchCompat swExternalAnswer;
@ -355,6 +356,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
ibHelp = view.findViewById(R.id.ibHelp);
swPowerMenu = view.findViewById(R.id.swPowerMenu);
swSendSelf = view.findViewById(R.id.swSendSelf);
swExternalSearch = view.findViewById(R.id.swExternalSearch);
swSortAnswers = view.findViewById(R.id.swSortAnswers);
swExternalAnswer = view.findViewById(R.id.swExternalAnswer);
@ -534,6 +536,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
swSendSelf.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
Helper.enableComponent(getContext(), ActivitySendSelf.class, checked);
}
});
swExternalSearch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@ -2397,6 +2406,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swSortAnswers.setChecked(prefs.getBoolean("sort_answers", false));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
swPowerMenu.setChecked(Helper.isComponentEnabled(getContext(), ServicePowerControl.class));
swSendSelf.setChecked(Helper.isComponentEnabled(getContext(), ActivitySendSelf.class));
swExternalSearch.setChecked(Helper.isComponentEnabled(getContext(), ActivitySearch.class));
swExternalAnswer.setChecked(Helper.isComponentEnabled(getContext(), ActivityAnswer.class));
swShortcuts.setChecked(prefs.getBoolean("shortcuts", true));

View File

@ -86,6 +86,17 @@
app:layout_constraintTop_toBottomOf="@id/tvCaptionGeneral"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swSendSelf"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/app_send_self"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swPowerMenu"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swExternalSearch"
android:layout_width="0dp"
@ -94,7 +105,7 @@
android:text="@string/title_advanced_external_search"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swPowerMenu"
app:layout_constraintTop_toBottomOf="@id/swSendSelf"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat

View File

@ -2,6 +2,7 @@
<string name="app_name" translatable="false">FairEmail</string>
<string name="app_copyright" translatable="false">Copyright &#x24B8; 20182023 by M. Bokhorst</string>
<string name="app_search">FairEmail search</string>
<string name="app_send_self">Send to self</string>
<string name="app_answer" translatable="false">FairEmail template</string>
<string name="app_changelog">Changelog</string>
<string name="app_welcome">FairEmail is an open source email app focused on privacy and security. For this reason some features might work differently from what you are used to.</string>
@ -791,6 +792,7 @@
<string name="title_advanced_aes_key_size" translatable="false">Max AES key size: %1$s</string>
<string name="title_advanced_power_menu">Add actions to the Android power menu</string>
<string name="title_advanced_send_self">Add \'send to self\' to Android\'s share menu</string>
<string name="title_advanced_external_search">Allow other apps to search in messages</string>
<string name="title_advanced_sort_answers">Sort reply templates by frequency of use</string>
<string name="title_advanced_external_answer" translatable="false">Provide reply templates to other apps</string>

View File

@ -337,6 +337,44 @@
</intent-filter>
</activity>
<activity
android:name=".ActivitySendSelf"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_send_self"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityClear"
android:excludeFromRecents="true"

View File

@ -8,6 +8,7 @@ Tratayenia
Next version
* Added option to add send-to-self to Android's share menu
* Added seperate filter settings for archive, trash and spam folder
* Small improvements and minor bug fixes
* Updated translations