Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bfd49ff authored by blong's avatar blong
Browse files

Add the support to insert contacts to phone/SIM card

- Add one menu to copy contacts from phone to SIM card,and auto split
  contacts according to the numbers of phone and email.
- Add one menu to copy contacts from SIM card to phone.

Change-Id: I48b2d7ffebe664b83a1dd984b20ab74779541dba
parent 8ced6a5c
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -38,6 +38,18 @@
        android:id="@+id/menu_send_via_sms"
        android:title="@string/menu_sendViaSMS" />

    <item
        android:id="@+id/menu_copy_to_phone"
        android:title="@string/menu_copyTo" />

    <item
        android:id="@+id/menu_copy_to_sim1"
        android:title="@string/menu_copyTo" />

        <item
        android:id="@+id/menu_copy_to_sim2"
        android:title="@string/menu_copyTo" />

    <item
        android:id="@+id/menu_create_contact_shortcut"
        android:title="@string/menu_create_contact_shortcut" />
+414 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@@ -46,6 +47,8 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Trace;
import android.provider.CalendarContract;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
@@ -75,6 +78,8 @@ import android.text.BidiFormatter;
import android.text.SpannableString;
import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
import android.telephony.TelephonyManager;
import android.telephony.SubscriptionManager;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
@@ -108,6 +113,7 @@ import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.Contact;
import com.android.contacts.common.model.ContactLoader;
import com.android.contacts.common.model.RawContact;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.model.dataitem.DataItem;
@@ -126,6 +132,8 @@ import com.android.contacts.common.model.dataitem.StructuredNameDataItem;
import com.android.contacts.common.model.dataitem.StructuredPostalDataItem;
import com.android.contacts.common.model.dataitem.WebsiteDataItem;
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.MoreContactUtils;
import com.android.contacts.common.SimContactsConstants;
import com.android.contacts.common.util.DateUtils;
import com.android.contacts.common.util.MaterialColorMapUtils;
import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
@@ -138,6 +146,7 @@ import com.android.contacts.interactions.CallLogInteractionsLoader;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.interactions.ContactInteraction;
import com.android.contacts.interactions.SmsInteractionsLoader;
import com.android.internal.telephony.PhoneConstants;
import com.android.contacts.quickcontact.ExpandingEntryCardView.Entry;
import com.android.contacts.quickcontact.ExpandingEntryCardView.EntryContextMenuInfo;
import com.android.contacts.quickcontact.ExpandingEntryCardView.EntryTag;
@@ -153,7 +162,7 @@ import com.android.contacts.widget.QuickContactImageView;
import com.android.contactsbind.HelpUtils;

import com.google.common.collect.Lists;

import com.google.common.collect.ImmutableList;
import java.lang.SecurityException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -2513,6 +2522,74 @@ public class QuickContactActivity extends ContactsActivity {

            final MenuItem helpMenu = menu.findItem(R.id.menu_help);
            helpMenu.setVisible(HelpUtils.isHelpAndFeedbackAvailable());
            String accoutName = null;
            String accoutType = null;

            final RawContact rawContact = mContactData.getRawContacts().get(0);
            accoutName = rawContact.getAccountName();
            accoutType = rawContact.getAccountTypeString();

            final MenuItem copyToPhoneMenu = menu.findItem(R.id.menu_copy_to_phone);
            if (copyToPhoneMenu != null) {
                copyToPhoneMenu.setVisible(false);
            }

            final MenuItem copyToSim1Menu = menu.findItem(R.id.menu_copy_to_sim1);
            if (copyToSim1Menu != null) {
                copyToSim1Menu.setVisible(false);
            }

            final MenuItem copyToSim2Menu = menu.findItem(R.id.menu_copy_to_sim2);
            if (copyToSim2Menu != null) {
                copyToSim2Menu.setVisible(false);
            }

            if (!TextUtils.isEmpty(accoutType)) {
                if (SimContactsConstants.ACCOUNT_TYPE_SIM.equals(accoutType)) {
                    copyToPhoneMenu.setVisible(true);
                    copyToPhoneMenu.setTitle(getString(R.string.menu_copyTo)
                            + getString(R.string.phoneLabelsGroup));
                    if (TelephonyManager.getDefault().isMultiSimEnabled()) {
                        if (SimContactsConstants.SIM_NAME_1.equals(accoutName)
                                && simIsReady(PhoneConstants.SUB2)) {
                            copyToSim2Menu.setTitle(getString(R.string.menu_copyTo)
                                    + MoreContactUtils.getMultiSimAliasesName(
                                            this, PhoneConstants.SUB2));
                            copyToSim2Menu.setVisible(true);
                        }
                        if (SimContactsConstants.SIM_NAME_2.equals(accoutName)
                                && simIsReady(PhoneConstants.SUB1)) {
                            copyToSim1Menu.setTitle(getString(R.string.menu_copyTo)
                                    + MoreContactUtils.getMultiSimAliasesName(
                                                this, PhoneConstants.SUB1));
                            copyToSim1Menu.setVisible(true);
                        }
                    }
                } else if (SimContactsConstants.ACCOUNT_TYPE_PHONE.equals(accoutType)) {
                    copyToPhoneMenu.setVisible(false);
                    boolean hasPhoneOrEmail = hasPhoneOrEmailDate(mContactData);
                    if (TelephonyManager.getDefault().isMultiSimEnabled()) {
                        if (hasPhoneOrEmail && simIsReady(PhoneConstants.SUB1)) {
                            copyToSim1Menu.setTitle(getString(R.string.menu_copyTo)
                                    + MoreContactUtils.getMultiSimAliasesName(
                                            this, PhoneConstants.SUB1));
                            copyToSim1Menu.setVisible(true);
                        }
                        if (hasPhoneOrEmail && simIsReady(PhoneConstants.SUB2)) {
                            copyToSim2Menu.setTitle(getString(R.string.menu_copyTo)
                                    + MoreContactUtils.getMultiSimAliasesName(
                                            this, PhoneConstants.SUB2));
                            copyToSim2Menu.setVisible(true);
                        }
                    } else {
                        if (hasPhoneOrEmail && simIsReady(PhoneConstants.SUB1)) {
                            copyToSim1Menu.setTitle(getString(R.string.menu_copyTo)
                                    + SimContactsConstants.SIM_NAME);
                            copyToSim1Menu.setVisible(true);
                        }
                    }
                }
            }

            return true;
        }
@@ -2611,9 +2688,344 @@ public class QuickContactActivity extends ContactsActivity {
                sendContactViaSMS();
                return true;
            }

            case R.id.menu_copy_to_phone: {
                if (mContactData == null) return false;
                copyToPhone();
                return true;
            }
            case R.id.menu_copy_to_sim1: {
                if (mContactData == null) return false;
                copyToCard(PhoneConstants.SUB1);
                return true;
            }
            case R.id.menu_copy_to_sim2: {
                if (mContactData == null) return false;
                copyToCard(PhoneConstants.SUB2);
                return true;
            }
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    private boolean hasPhoneOrEmailDate(Contact contact){
        int phoneCount = 0;
        int emailCount = 0;
        ImmutableList<RawContact> rawContacts = contact.getRawContacts();
        for (RawContact rawContact : rawContacts) {
            RawContactDelta rawContactDelta = RawContactDelta.fromBefore(rawContact);
            phoneCount += rawContactDelta.getMimeEntriesCount(
                    Phone.CONTENT_ITEM_TYPE, true);
            emailCount += rawContactDelta.getMimeEntriesCount(
                    Email.CONTENT_ITEM_TYPE, true);
        }
        if (phoneCount > 0 || emailCount > 0) {
            return true;
        } else {
            return false;
        }
    }

    //supply phone number and email which could stored in one ADN
    class UsimEntity {
        private ArrayList<String> mNumberList = new ArrayList<String>();
        private ArrayList<String> mEmailList = new ArrayList<String>();

        public ArrayList<String> getEmailList() {
            return mEmailList;
        }

        public ArrayList<String> getNumberList() {
            return mNumberList;
        }

        public void putEmailList(ArrayList<String> list) {
            mEmailList = list;
        }

        public void putNumberList(ArrayList<String> list) {
            mNumberList = list;
        }

        public boolean containsEmail() {
            return !mEmailList.isEmpty();
        }

        public boolean containsNumber() {
            return !mNumberList.isEmpty();
        }
    }

    private void copyToPhone() {
        String name = mContactData.getDisplayName();
        if (TextUtils.isEmpty(name)) {
            name = "";
        }
        String phoneNumber = "";
        StringBuilder anrNumber = new StringBuilder();
        StringBuilder email = new StringBuilder();

        //get phonenumber,email,anr from SIM contacts,then insert them to phone
        for (RawContact rawContact : mContactData.getRawContacts()) {
            for (DataItem dataItem : rawContact.getDataItems()) {
                if (dataItem.getMimeType() == null) {
                    continue;
                }
                if (dataItem instanceof PhoneDataItem) {
                    PhoneDataItem phoneNum = (PhoneDataItem) dataItem;
                    final String number = phoneNum.getNumber();
                    if (!TextUtils.isEmpty(number)) {
                        if (Phone.TYPE_MOBILE == phoneNum.getContentValues().getAsInteger(
                                Phone.TYPE)) {
                            phoneNumber = number;
                        } else {
                            if(!TextUtils.isEmpty(anrNumber.toString())) {
                                anrNumber.append(",");
                            }
                            anrNumber.append(number);
                        }
                    }
                } else if (dataItem instanceof EmailDataItem) {
                    EmailDataItem emailData = (EmailDataItem) dataItem;
                    final String address = emailData.getData();
                    if (!TextUtils.isEmpty(address)) {
                        if(!TextUtils.isEmpty(email.toString())) {
                            email.append(",");
                        }
                        email.append(address);
                    }
                }
            }
        }

        String[] value = new String[] {
                name, phoneNumber, email.toString(), anrNumber.toString()
        };
        boolean success = MoreContactUtils
                .insertToPhone(value, getContentResolver(),
                        SubscriptionManager.INVALID_SUBSCRIPTION_ID);
        Toast.makeText(this, success ? R.string.copy_done : R.string.copy_failure,
                Toast.LENGTH_SHORT).show();
    }

    private Handler mHandler = null;

    private void copyToCard(final int sub) {
        final int MSG_COPY_DONE = 0;
        final int MSG_COPY_FAILURE = 1;
        final int MSG_CARD_NO_SPACE = 2;
        final int MSG_NO_EMPTY_EMAIL = 3;
        if (mHandler == null) {
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    switch (msg.what) {
                        case MSG_COPY_DONE:
                            Toast.makeText(QuickContactActivity.this, R.string.copy_done,
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case MSG_COPY_FAILURE:
                            Toast.makeText(QuickContactActivity.this, R.string.copy_failure,
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case MSG_CARD_NO_SPACE:
                            Toast.makeText(QuickContactActivity.this, R.string.card_no_space,
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case MSG_NO_EMPTY_EMAIL:
                            Toast.makeText(QuickContactActivity.this,
                                    R.string.no_empty_email_in_usim,
                                    Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            };
        }

        new Thread(new Runnable() {
            public void run() {
                synchronized (this) {
                    int adnCountInSimContact = 1;
                    int anrCountInSimContact = 0;
                    int emailCountInSimContact = 0;

                    Cursor cr = null;
                    // call query first, otherwise the count queries will fail
                    try{
                        int[] subId = SubscriptionManager.getSubId(sub);
                        if (subId != null
                            && TelephonyManager.getDefault().isMultiSimEnabled()) {
                            cr = getContentResolver().query(
                                Uri.parse(SimContactsConstants.SIM_SUB_URI
                                    + subId[0]), null, null, null, null);
                        } else {
                            cr = getContentResolver().query(
                                Uri.parse(SimContactsConstants.SIM_URI), null,
                                null, null, null);
                        }
                    } catch (NullPointerException e) {
                        Log.e(TAG, "Exception:" + e);
                    } finally {
                        if (cr != null) {
                            cr.close();
                        }
                    }

                    if (MoreContactUtils.canSaveAnr(sub)) {
                        anrCountInSimContact = MoreContactUtils.getOneSimAnrCount(sub);
                    }
                    if (MoreContactUtils.canSaveEmail(sub)) {
                        emailCountInSimContact = MoreContactUtils.getOneSimEmailCount(sub);
                    }
                    int totalEmptyAdn = MoreContactUtils.getSimFreeCount(
                            QuickContactActivity.this, sub);
                    int totalEmptyAnr = MoreContactUtils.getSpareAnrCount(sub);
                    int totalEmptyEmail = MoreContactUtils.getSpareEmailCount(sub);

                    Message msg = Message.obtain();
                    if (totalEmptyAdn <= 0) {
                        msg.what = MSG_CARD_NO_SPACE;
                        mHandler.sendMessage(msg);
                        return;
                    }

                    //to indiacate how many number in one ADN can saved to SIM card,
                    //1 means can only save one number,2,3 ... means can save anr
                    int numEntitySize = adnCountInSimContact + anrCountInSimContact;

                    //empty number is equals to the sum of adn and anr
                    int emptyNumTotal = totalEmptyAdn + totalEmptyAnr;

                    // Get name string
                    String strName = mContactData.getDisplayName();

                    ArrayList<String> arrayNumber = new ArrayList<String>();
                    ArrayList<String> arrayEmail = new ArrayList<String>();

                    for (RawContact rawContact : mContactData.getRawContacts()) {
                        for (DataItem dataItem : rawContact.getDataItems()) {
                            if (dataItem.getMimeType() == null) {
                                continue;
                            }
                            if (dataItem instanceof PhoneDataItem) {
                                // Get phone string
                                PhoneDataItem phoneNum = (PhoneDataItem) dataItem;
                                final String number = phoneNum.getNumber();
                                if (!TextUtils.isEmpty(number) && emptyNumTotal-- > 0) {
                                    arrayNumber.add(number);
                                }
                            } else if (dataItem instanceof EmailDataItem) {
                                // Get email string
                                EmailDataItem emailData = (EmailDataItem) dataItem;
                                final String address = emailData.getData();
                                if (!TextUtils.isEmpty(address) && totalEmptyEmail-- > 0) {
                                    arrayEmail.add(address);
                                }
                            }
                        }
                    }

                    //calculate how many ADN needed according to the number,name,phone,email,
                    //then uses the max of them
                    int nameCount = (strName != null && !strName.equals("")) ? 1 : 0;
                    int groupNumCount = (arrayNumber.size() % numEntitySize) != 0 ? (arrayNumber
                            .size() / numEntitySize + 1) : (arrayNumber.size() / numEntitySize);
                    int groupEmailCount = emailCountInSimContact == 0 ? 0
                            : ((arrayEmail.size() % emailCountInSimContact) != 0 ? (arrayEmail
                                    .size() / emailCountInSimContact + 1)
                                    : (arrayEmail.size() / emailCountInSimContact));

                    int groupCount = Math.max(groupEmailCount, Math.max(nameCount, groupNumCount));

                    ArrayList<UsimEntity> results = new ArrayList<UsimEntity>();
                    for (int i = 0; i < groupCount; i++) {
                        results.add(new UsimEntity());
                    }

                    UsimEntity value;
                    //get the phone number for each ADN from arrayNumber,put them in UsimEntity
                    for (int i = 0; i < groupNumCount; i++) {
                        value = results.get(i);
                        ArrayList<String> numberItem = new ArrayList<String>();
                        for (int j = 0; j < numEntitySize; j++) {
                            if ((i * numEntitySize + j) < arrayNumber.size()) {
                                numberItem.add(arrayNumber.get(i * numEntitySize + j));
                            }
                        }
                        value.putNumberList(numberItem);
                    }

                    for (int i = 0; i < groupEmailCount; i++) {
                        value = results.get(i);
                        ArrayList<String> emailItem = new ArrayList<String>();
                        for (int j = 0; j < emailCountInSimContact; j++) {
                            if ((i * emailCountInSimContact + j) < arrayEmail.size()) {
                                emailItem.add(arrayEmail.get(i * emailCountInSimContact + j));
                            }
                        }
                        value.putEmailList(emailItem);
                    }

                    ArrayList<String> emptyList = new ArrayList<String>();
                    Uri itemUri = null;
                    if (totalEmptyEmail < 0 && MoreContactUtils.canSaveEmail(sub)) {
                        Message e_msg = Message.obtain();
                        e_msg.what = MSG_NO_EMPTY_EMAIL;
                        mHandler.sendMessage(e_msg);
                    }

                    //get phone number from UsimEntity,then insert to SIM card
                    for (int i = 0; i < groupCount; i++) {
                        value = results.get(i);
                        if (value.containsNumber()) {
                            arrayNumber = (ArrayList<String>) value.getNumberList();
                        } else {
                            arrayNumber = emptyList;
                        }

                        if (value.containsEmail()) {
                            arrayEmail = (ArrayList<String>) value.getEmailList();
                        } else {
                            arrayEmail = emptyList;
                        }
                        String strNum = arrayNumber.size() > 0 ? arrayNumber.get(0) : null;
                        StringBuilder strAnrNum = new StringBuilder();
                        for (int j = 1; j < arrayNumber.size(); j++) {
                            String s = arrayNumber.get(j);
                            if (s.length() > MoreContactUtils.MAX_LENGTH_NUMBER_IN_SIM) {
                                s = s.substring(
                                        0, MoreContactUtils.MAX_LENGTH_NUMBER_IN_SIM);
                            }
                            strAnrNum.append(s);
                            strAnrNum.append(SimContactsConstants.ANR_SEP);
                        }
                        StringBuilder strEmail = new StringBuilder();
                        for (int j = 0; j < arrayEmail.size(); j++) {
                            String s = arrayEmail.get(j);
                            if (s.length() > MoreContactUtils.MAX_LENGTH_EMAIL_IN_SIM) {
                                s = s.substring(
                                        0, MoreContactUtils.MAX_LENGTH_EMAIL_IN_SIM);
                            }
                            strEmail.append(s);
                            strEmail.append(SimContactsConstants.EMAIL_SEP);
                        }
                        itemUri = MoreContactUtils.insertToCard(QuickContactActivity.this, strName,
                                strNum, strEmail.toString(), strAnrNum.toString(), sub);
                    }
                    if (itemUri != null) {
                        msg.what = MSG_COPY_DONE;
                        mHandler.sendMessage(msg);
                    } else {
                        msg.what = MSG_COPY_FAILURE;
                        mHandler.sendMessage(msg);
                    }
                }
            }
        }).start();
    }

    private boolean simIsReady(int sub) {
        if (TelephonyManager.getDefault().getSimState(sub)
                == TelephonyManager.SIM_STATE_READY)
            return true;
        return false;
    }
}