Search contacts on typing

This commit is contained in:
M66B 2018-08-10 16:06:39 +00:00
parent 55b10420cf
commit 53d77fe205
6 changed files with 64 additions and 11 deletions

View File

@ -5,7 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- uses-permission android:name="android.permission.READ_CONTACTS" / --> <uses-permission android:name="android.permission.READ_CONTACTS" />
<application <application
android:name=".ApplicationEx" android:name=".ApplicationEx"

View File

@ -19,8 +19,10 @@ package eu.faircode.email;
Copyright 2018 by Marcel Bokhorst (M66B) Copyright 2018 by Marcel Bokhorst (M66B)
*/ */
import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor; import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -35,7 +37,9 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FilterQueryProvider;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Spinner; import android.widget.Spinner;
@ -56,6 +60,8 @@ import javax.mail.internet.InternetAddress;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.Group; import androidx.constraintlayout.widget.Group;
import androidx.core.content.ContextCompat;
import androidx.cursoradapter.widget.SimpleCursorAdapter;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
@ -71,11 +77,11 @@ public class FragmentCompose extends FragmentEx {
private Spinner spFrom; private Spinner spFrom;
private ImageView ivIdentityAdd; private ImageView ivIdentityAdd;
private EditText etTo; private AutoCompleteTextView etTo;
private ImageView ivToAdd; private ImageView ivToAdd;
private EditText etCc; private AutoCompleteTextView etCc;
private ImageView ivCcAdd; private ImageView ivCcAdd;
private EditText etBcc; private AutoCompleteTextView etBcc;
private ImageView ivBccAdd; private ImageView ivBccAdd;
private EditText etSubject; private EditText etSubject;
private EditText etBody; private EditText etBody;
@ -182,6 +188,54 @@ public class FragmentCompose extends FragmentEx {
pbWait.setVisibility(View.VISIBLE); pbWait.setVisibility(View.VISIBLE);
bottom_navigation.getMenu().setGroupEnabled(0, false); bottom_navigation.getMenu().setGroupEnabled(0, false);
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CONTACTS)
== PackageManager.PERMISSION_GRANTED) {
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
getContext(),
android.R.layout.simple_list_item_2,
null,
new String[]{
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DATA
},
new int[]{
android.R.id.text1,
android.R.id.text2
},
0);
etTo.setAdapter(adapter);
etCc.setAdapter(adapter);
etBcc.setAdapter(adapter);
adapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence typed) {
return getContext().getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[]{
ContactsContract.RawContacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DATA
},
ContactsContract.CommonDataKinds.Email.DATA + " <> ''" +
" AND (" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE '%" + typed + "%'" +
" OR " + ContactsContract.CommonDataKinds.Email.DATA + " LIKE '%" + typed + "%')",
null,
"CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%' THEN 0 ELSE 1 END" +
", " + ContactsContract.Contacts.DISPLAY_NAME +
", " + ContactsContract.CommonDataKinds.Email.DATA + " COLLATE NOCASE");
}
});
adapter.setCursorToStringConverter(new SimpleCursorAdapter.CursorToStringConverter() {
public CharSequence convertToString(Cursor cursor) {
int colName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int colEmail = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
return cursor.getString(colName) + "<" + cursor.getString(colEmail) + ">";
}
});
}
return view; return view;
} }

View File

@ -114,6 +114,7 @@ public class FragmentSetup extends FragmentEx {
btnPermissions.setOnClickListener(new View.OnClickListener() { btnPermissions.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
btnPermissions.setEnabled(false);
requestPermissions(permissions, 1); requestPermissions(permissions, 1);
} }
}); });

View File

@ -24,7 +24,7 @@
app:layout_constraintStart_toEndOf="@id/spFrom" app:layout_constraintStart_toEndOf="@id/spFrom"
app:layout_constraintTop_toTopOf="@id/spFrom" /> app:layout_constraintTop_toTopOf="@id/spFrom" />
<EditText <AutoCompleteTextView
android:id="@+id/etTo" android:id="@+id/etTo"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -49,7 +49,7 @@
app:layout_constraintStart_toEndOf="@id/etTo" app:layout_constraintStart_toEndOf="@id/etTo"
app:layout_constraintTop_toTopOf="@+id/etTo" /> app:layout_constraintTop_toTopOf="@+id/etTo" />
<EditText <AutoCompleteTextView
android:id="@+id/etCc" android:id="@+id/etCc"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -74,7 +74,7 @@
app:layout_constraintStart_toEndOf="@id/etCc" app:layout_constraintStart_toEndOf="@id/etCc"
app:layout_constraintTop_toTopOf="@+id/etCc" /> app:layout_constraintTop_toTopOf="@+id/etCc" />
<EditText <AutoCompleteTextView
android:id="@+id/etBcc" android:id="@+id/etBcc"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -108,7 +108,6 @@
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
android:text="@string/title_setup_permissions" android:text="@string/title_setup_permissions"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvIdentityDone" /> app:layout_constraintTop_toBottomOf="@id/tvIdentityDone" />
@ -119,7 +118,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/title_setup_permissions_remark" android:text="@string/title_setup_permissions_remark"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnPermissions" /> app:layout_constraintTop_toBottomOf="@id/btnPermissions" />
@ -128,9 +126,8 @@
android:id="@+id/tvPermissionsDone" android:id="@+id/tvPermissionsDone"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/title_setup_done" android:text="@string/title_setup_granted"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPermissions" /> app:layout_constraintTop_toBottomOf="@id/tvPermissions" />

View File

@ -51,6 +51,7 @@
<string name="title_setup_permissions_remark">To read contacts (optional)</string> <string name="title_setup_permissions_remark">To read contacts (optional)</string>
<string name="title_setup_messages">View messages</string> <string name="title_setup_messages">View messages</string>
<string name="title_setup_done">Done</string> <string name="title_setup_done">Done</string>
<string name="title_setup_granted">Granted</string>
<string name="title_setup_dark_theme">Dark theme</string> <string name="title_setup_dark_theme">Dark theme</string>
<string name="title_setup_debug">Debug</string> <string name="title_setup_debug">Debug</string>