Added contact picker to rule definition, added action remark

pull/147/head
M66B 7 years ago
parent 52631074a5
commit 4e087c18b3

@ -122,6 +122,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
static final int REQUEST_ATTACHMENT = 2; static final int REQUEST_ATTACHMENT = 2;
static final int REQUEST_ATTACHMENTS = 3; static final int REQUEST_ATTACHMENTS = 3;
static final int REQUEST_DECRYPT = 4; static final int REQUEST_DECRYPT = 4;
static final int REQUEST_SENDER = 5;
static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES"; static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES";
static final String ACTION_VIEW_THREAD = BuildConfig.APPLICATION_ID + ".VIEW_THREAD"; static final String ACTION_VIEW_THREAD = BuildConfig.APPLICATION_ID + ".VIEW_THREAD";
@ -1377,6 +1378,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
if (data != null) if (data != null)
decrypt(data, message); decrypt(data, message);
} }
super.onActivityResult(requestCode, resultCode, data);
} }
private void saveRaw(Intent data) { private void saveRaw(Intent data) {

@ -21,8 +21,12 @@ package eu.faircode.email;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.provider.ContactsContract;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -32,8 +36,10 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView;
import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
@ -50,6 +56,8 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Group; import androidx.constraintlayout.widget.Group;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import static android.app.Activity.RESULT_OK;
public class FragmentRule extends FragmentBase { public class FragmentRule extends FragmentBase {
private ViewGroup view; private ViewGroup view;
private ScrollView scroll; private ScrollView scroll;
@ -60,11 +68,13 @@ public class FragmentRule extends FragmentBase {
private CheckBox cbStop; private CheckBox cbStop;
private EditText etSender; private EditText etSender;
private CheckBox cbSender; private CheckBox cbSender;
private ImageView ivSender;
private EditText etSubject; private EditText etSubject;
private CheckBox cbSubject; private CheckBox cbSubject;
private EditText etHeader; private EditText etHeader;
private CheckBox cbHeader; private CheckBox cbHeader;
private Spinner spAction; private Spinner spAction;
private TextView tvActionRemark;
private Spinner spTarget; private Spinner spTarget;
private Spinner spIdent; private Spinner spIdent;
private Spinner spAnswer; private Spinner spAnswer;
@ -108,11 +118,13 @@ public class FragmentRule extends FragmentBase {
cbStop = view.findViewById(R.id.cbStop); cbStop = view.findViewById(R.id.cbStop);
etSender = view.findViewById(R.id.etSender); etSender = view.findViewById(R.id.etSender);
cbSender = view.findViewById(R.id.cbSender); cbSender = view.findViewById(R.id.cbSender);
ivSender = view.findViewById(R.id.ivSender);
etSubject = view.findViewById(R.id.etSubject); etSubject = view.findViewById(R.id.etSubject);
cbSubject = view.findViewById(R.id.cbSubject); cbSubject = view.findViewById(R.id.cbSubject);
etHeader = view.findViewById(R.id.etHeader); etHeader = view.findViewById(R.id.etHeader);
cbHeader = view.findViewById(R.id.cbHeader); cbHeader = view.findViewById(R.id.cbHeader);
spAction = view.findViewById(R.id.spAction); spAction = view.findViewById(R.id.spAction);
tvActionRemark = view.findViewById(R.id.tvActionRemark);
spTarget = view.findViewById(R.id.spTarget); spTarget = view.findViewById(R.id.spTarget);
spIdent = view.findViewById(R.id.spIdent); spIdent = view.findViewById(R.id.spIdent);
spAnswer = view.findViewById(R.id.spAnswer); spAnswer = view.findViewById(R.id.spAnswer);
@ -122,6 +134,17 @@ public class FragmentRule extends FragmentBase {
grpMove = view.findViewById(R.id.grpMove); grpMove = view.findViewById(R.id.grpMove);
grpAnswer = view.findViewById(R.id.grpAnswer); grpAnswer = view.findViewById(R.id.grpAnswer);
ivSender.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent pick = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
if (pick.resolveActivity(getContext().getPackageManager()) == null)
Snackbar.make(view, R.string.title_no_contacts, Snackbar.LENGTH_LONG).show();
else
startActivityForResult(Helper.getChooser(getContext(), pick), ActivityView.REQUEST_SENDER);
}
});
adapterAction = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList<Action>()); adapterAction = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList<Action>());
adapterAction.setDropDownViewResource(R.layout.spinner_item1_dropdown); adapterAction.setDropDownViewResource(R.layout.spinner_item1_dropdown);
spAction.setAdapter(adapterAction); spAction.setAdapter(adapterAction);
@ -173,6 +196,8 @@ public class FragmentRule extends FragmentBase {
} }
}); });
tvActionRemark.setVisibility(View.GONE);
bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override @Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
@ -205,16 +230,19 @@ public class FragmentRule extends FragmentBase {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putLong("account", account); args.putLong("account", account);
args.putLong("folder", folder);
new SimpleTask<RefData>() { new SimpleTask<RefData>() {
@Override @Override
protected RefData onExecute(Context context, Bundle args) { protected RefData onExecute(Context context, Bundle args) {
long account = args.getLong("account"); long aid = args.getLong("account");
long fid = args.getLong("folder");
RefData data = new RefData(); RefData data = new RefData();
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
data.folders = db.folder().getFolders(account); data.folder = db.folder().getFolder(fid);
data.folders = db.folder().getFolders(aid);
if (data.folders == null) if (data.folders == null)
data.folders = new ArrayList<>(); data.folders = new ArrayList<>();
@ -223,7 +251,7 @@ public class FragmentRule extends FragmentBase {
folder.display = folder.getDisplayName(context); folder.display = folder.getDisplayName(context);
EntityFolder.sort(context, data.folders); EntityFolder.sort(context, data.folders);
data.identities = db.identity().getIdentities(account); data.identities = db.identity().getIdentities(aid);
data.answers = db.answer().getAnswers(); data.answers = db.answer().getAnswers();
return data; return data;
@ -240,6 +268,10 @@ public class FragmentRule extends FragmentBase {
adapterAnswer.clear(); adapterAnswer.clear();
adapterAnswer.addAll(data.answers); adapterAnswer.addAll(data.answers);
tvActionRemark.setText(
getString(R.string.title_rule_action_remark, data.folder.getDisplayName(getContext())));
tvActionRemark.setVisibility(View.VISIBLE);
Bundle rargs = new Bundle(); Bundle rargs = new Bundle();
rargs.putLong("id", id); rargs.putLong("id", id);
@ -339,6 +371,38 @@ public class FragmentRule extends FragmentBase {
}.execute(this, args, "rule:accounts"); }.execute(this, args, "rule:accounts");
} }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("Request=" + requestCode + " result=" + resultCode + " data=" + data);
if (resultCode == RESULT_OK) {
if (requestCode == ActivityView.REQUEST_SENDER) {
if (data != null)
handlePickContact(data);
}
}
}
private void handlePickContact(Intent data) {
Cursor cursor = null;
try {
Uri uri = data.getData();
if (uri != null)
cursor = getContext().getContentResolver().query(uri,
new String[]{
ContactsContract.CommonDataKinds.Email.ADDRESS
},
null, null, null);
if (cursor != null && cursor.moveToFirst())
etSender.setText(cursor.getString(0));
} catch (Throwable ex) {
Log.e(ex);
Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex);
} finally {
if (cursor != null)
cursor.close();
}
}
private void onActionTrash() { private void onActionTrash() {
new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner())
.setMessage(R.string.title_ask_delete_rule) .setMessage(R.string.title_ask_delete_rule)
@ -535,6 +599,7 @@ public class FragmentRule extends FragmentBase {
} }
private class RefData { private class RefData {
EntityFolder folder;
List<EntityFolder> folders; List<EntityFolder> folders;
List<EntityIdentity> identities; List<EntityIdentity> identities;
List<EntityAnswer> answers; List<EntityAnswer> answers;

@ -117,10 +117,21 @@
android:hint="@string/title_optional" android:hint="@string/title_optional"
android:inputType="textEmailAddress" android:inputType="textEmailAddress"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/ivSender"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbSender" /> app:layout_constraintTop_toBottomOf="@id/cbSender" />
<ImageView
android:id="@+id/ivSender"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="6dp"
android:layout_marginEnd="6dp"
android:src="@drawable/baseline_person_24"
app:layout_constraintBottom_toBottomOf="@id/etSender"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/etSender" />
<TextView <TextView
android:id="@+id/tvAndSubject" android:id="@+id/tvAndSubject"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -239,7 +250,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/title_rule_action" android:text="@string/title_rule_action"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/vSeparatorAction" /> app:layout_constraintTop_toBottomOf="@+id/vSeparatorAction" />
@ -251,6 +262,17 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAction" /> app:layout_constraintTop_toBottomOf="@id/tvAction" />
<TextView
android:id="@+id/tvActionRemark"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_rule_action_remark"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="italic"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spAction" />
<View <View
android:id="@+id/vSeparatorParameters" android:id="@+id/vSeparatorParameters"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -258,7 +280,7 @@
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
android:background="?attr/colorSeparator" android:background="?attr/colorSeparator"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spAction" /> app:layout_constraintTop_toBottomOf="@id/tvActionRemark" />
<TextView <TextView
android:id="@+id/tvMoveTarget" android:id="@+id/tvMoveTarget"

@ -416,6 +416,7 @@
<string name="title_rule_regex">Regex</string> <string name="title_rule_regex">Regex</string>
<string name="title_rule_and">AND</string> <string name="title_rule_and">AND</string>
<string name="title_rule_action">Action</string> <string name="title_rule_action">Action</string>
<string name="title_rule_action_remark">This action will be applied to new messages arriving in the folder %1$s</string>
<string name="title_rule_folder">Folder</string> <string name="title_rule_folder">Folder</string>
<string name="title_rule_identity">Identity</string> <string name="title_rule_identity">Identity</string>
<string name="title_rule_answer">Reply template</string> <string name="title_rule_answer">Reply template</string>

Loading…
Cancel
Save