[Contacts Data]在手機(jī)中預(yù)置聯(lián)系人/Service Number

[DESCRIPTION]

預(yù)置聯(lián)系人/Service Number

此方法比較適合預(yù)置聯(lián)系人的數(shù)目不是特別多的情況

聯(lián)系人比較多的情況,請(qǐng)參考:FAQ12935 預(yù)置聯(lián)系人之Vcard預(yù)置聯(lián)系人

[SOLUTION]

本方案實(shí)現(xiàn)預(yù)置聯(lián)系人(包含姓名、號(hào)碼信息)至手機(jī)中棘钞;并保證該聯(lián)系人是只讀的赁严,無法被刪除/編輯铅匹。

代碼分為兩部分:

Part One 將****預(yù)置的聯(lián)系人插入到數(shù)據(jù)庫中栅受;

Part Two 保證預(yù)置聯(lián)系人只讀短条,無法被編輯刪

(在三個(gè)地方屏蔽對(duì)預(yù)置聯(lián)系人進(jìn)行編輯處理:聯(lián)系人詳情界面汉规、聯(lián)系人多選界面礼殊、新建聯(lián)系人選擇合并聯(lián)系人時(shí))。

【注意】

如果您不需要限制預(yù)置聯(lián)系人的刪除/編輯操作针史,加入Part One部分代碼即可晶伦,并去掉第一步importDefaultReadonlyContact() 中的語句:contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);

Part One

1.****新建PresetContactsImportProcessor.java

Before Android N:

Path: alps\packages\apps\Contacts\src\com\mediatek\contacts\simservice

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> package com.mediatek.contacts.simservice;

import com.mediatek.contacts.simservice.SIMProcessorManager.ProcessorCompleteListener;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email; //for usim
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Groups;
import android.provider.ContactsContract.RawContacts;
import com.android.contacts.common.model.account.AccountType;
import android.os.RemoteException;
import java.util.ArrayList;
import com.mediatek.contacts.simservice.SIMProcessorManager.ProcessorCompleteListener;
import com.mediatek.contacts.simservice.SIMServiceUtils;
import com.mediatek.contacts.simservice.SIMServiceUtils.ServiceWorkData;
import com.mediatek.contacts.simcontact.SimCardUtils;
import com.mediatek.contacts.util.LogUtils;
import android.provider.ContactsContract.PhoneLookup;

public class PresetContactsImportProcessor extends SIMProcessorBase {
private static final String TAG = "PresetContactsImportProcessor";
private static boolean sIsRunningNumberCheck = false;
private static final int INSERT_PRESET_NUMBER_COUNT = xxx; //預(yù)置聯(lián)系人的個(gè)數(shù)
private static final String INSERT_PRESET_NAME[] = {"xxx1","xxx2",...}; //各預(yù)置聯(lián)系人的姓名
private static final String INSERT_PRESET_NUMBER[] = {"xxx1","xxx2",...}; //各預(yù)置聯(lián)系人的號(hào)碼

private int mSlotId;
private Context mContext;
public PresetContactsImportProcessor(Context context, int slotId, Intent intent, ProcessorCompleteListener listener) {
super(intent, listener);
mContext = context;
mSlotId = slotId;
}

@Override
public int getType() {
return SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS;
}

@Override
public void doWork() {
if (isCancelled()) {
LogUtils.d(TAG, "[doWork]cancel import preset contacts work. Thread id=" + Thread.currentThread().getId());
return;
}
importDefaultReadonlyContact();
}

private void importDefaultReadonlyContact(){
     Log.i(TAG, "isRunningNumberCheck before: " + sIsRunningNumberCheck);
     if (sIsRunningNumberCheck) {
        return;
     }
     sIsRunningNumberCheck = true;
     for(int i = 0;i < INSERT_PRESET_NUMBER_COUNT; i++) {
         Log.i(TAG, "isRunningNumberCheck after: " + sIsRunningNumberCheck);
         Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(INSERT_PRESET_NUMBER[i]));
         Log.i(TAG, "getContactInfoByPhoneNumbers(), uri = " + uri);
         Cursor contactCursor = mContext.getContentResolver().query(uri, 

new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID}, null, null, null);
try {
if (contactCursor != null && contactCursor.getCount() > 0) {
return;
} else {
final ArrayList operationList = new ArrayList();
ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
ContentValues contactvalues = new ContentValues();
contactvalues.put(RawContacts.ACCOUNT_NAME, AccountType.ACCOUNT_NAME_LOCAL_PHONE);
contactvalues.put(RawContacts.ACCOUNT_TYPE, AccountType.ACCOUNT_TYPE_LOCAL_PHONE);
contactvalues.put(RawContacts.INDICATE_PHONE_SIM, ContactsContract.RawContacts.INDICATE_PHONE);
contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);
builder.withValues(contactvalues);
builder.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
operationList.add(builder.build());
builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
builder.withValue(Phone.NUMBER, INSERT_PRESET_NUMBER[i]);
builder.withValue(Data.IS_PRIMARY, 1);
operationList.add(builder.build());

              builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
              builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
              builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
              builder.withValue(StructuredName.DISPLAY_NAME, INSERT_PRESET_NAME[i]);
              operationList.add(builder.build());

              try {
                  mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
              } catch (RemoteException e) {
                  Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
              } catch (OperationApplicationException e) {
                  Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
              }
         }
     } finally {
         // when this service start,but the contactsprovider has not been started yet.
         // the contactCursor perhaps null, but not always.(first load will weekup the provider)
         // so add null block to avoid nullpointerexception
         if (contactCursor != null) {
              contactCursor.close();
         }
     } //END for
     Log.i(TAG, "isRunningNumberCheck insert: " + sIsRunningNumberCheck);
     sIsRunningNumberCheck = false;
  }
}

}</pre>

Android N:

Path: alps\packages\apps\Contacts\SimProcessor\src\com\mediatek\SimProcessor

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">package com.mediatek.simprocessor;

import android.content.Context;
import android.content.Intent;
import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.os.RemoteException;
import java.util.ArrayList;
import com.mediatek.simprocessor.SimProcessorManager.ProcessorCompleteListener;
import com.mediatek.simprocessor.SimServiceUtils;
import com.mediatek.simprocessor.Log;
import android.provider.ContactsContract.PhoneLookup;

public class PresetContactsImportProcessor extends SimProcessorBase {
private static final String TAG = "PresetContactsImportProcessor";
private static boolean sIsRunningNumberCheck = false;
private static final int INSERT_PRESET_NUMBER_COUNT = xxx; //預(yù)置聯(lián)系人的個(gè)數(shù)
private static final String INSERT_PRESET_NAME[] = {"xxx1","xxx2", ...}; //各預(yù)置聯(lián)系人的姓名
private static final String INSERT_PRESET_NUMBER[] = {"xxxx","xxxx", ...}; //各預(yù)置聯(lián)系人的號(hào)碼

private int mSubId;
private Context mContext;

public PresetContactsImportProcessor(Context context, int subId, Intent intent, ProcessorCompleteListener listener) {
    super(intent, listener);
    mContext = context;
    mSubId = subId;
}

@Override
public int getType() {
    return SimServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS;
}

@Override
public void doWork() {
    if (isCancelled()) {
        Log.d(TAG, "[doWork]cancel import preset contacts work. Thread id=" + Thread.currentThread().getId());
    return;
    }
    importDefaultReadonlyContact();
}

private void importDefaultReadonlyContact(){
    Log.i(TAG, "isRunningNumberCheck before: " + sIsRunningNumberCheck);
    if (sIsRunningNumberCheck) {
        return;
    }
    sIsRunningNumberCheck = true;
    for(int i = 0;i < INSERT_PRESET_NUMBER_COUNT; i++) {
        Log.i(TAG, "isRunningNumberCheck after: " + sIsRunningNumberCheck);
        Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(INSERT_PRESET_NUMBER[i]));
        Log.i(TAG, "getContactInfoByPhoneNumbers(), uri = " + uri);
        Cursor contactCursor = mContext.getContentResolver().query(uri, 
                new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID}, null, null, null);
        try {
            if (contactCursor != null && contactCursor.getCount() > 0) {
                return;
            } else {
                final ArrayList operationList = new ArrayList();
                ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
                ContentValues contactvalues = new ContentValues();
                contactvalues.put(RawContacts.ACCOUNT_NAME, "Phone");
                contactvalues.put(RawContacts.ACCOUNT_TYPE, "Local Phone Account");
                contactvalues.put(RawContacts.INDICATE_PHONE_SIM, ContactsContract.RawContacts.INDICATE_PHONE);
                contactvalues.put(RawContacts.IS_SDN_CONTACT, -2);
                builder.withValues(contactvalues);
                builder.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
                operationList.add(builder.build());
                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
                builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
                builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
                builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
                builder.withValue(Phone.NUMBER, INSERT_PRESET_NUMBER[i]);
                builder.withValue(Data.IS_PRIMARY, 1);
                operationList.add(builder.build());

                builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
                builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
                builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
                builder.withValue(StructuredName.DISPLAY_NAME, INSERT_PRESET_NAME[i]);
                operationList.add(builder.build());

                try {
                    mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
                } catch (RemoteException e) {
                    Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
                } catch (OperationApplicationException e) {
                    Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
                }
            }
        } finally {
            // when this service start,but the contactsprovider has not been started yet.
            // the contactCursor perhaps null, but not always.(first load will weekup the provider)
            // so add null block to avoid nullpointerexception
            if (contactCursor != null) {
                contactCursor.close();
            }
        }
        Log.i(TAG, "isRunningNumberCheck insert: " + sIsRunningNumberCheck);
        sIsRunningNumberCheck = false;
    }
}

}</pre>

2.

Before Android N:
修改SIMServiceUtils.java
Path: alps\packages\apps\ContactsCommon\src\com\mediatek\contacts\simservice

Android N:
修改SimServiceUtils.java
Path: alps\packages\apps\Contacts\SimProcessor\src\com\mediatek\SimProcessor

添加

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">public static final int SERVICE_WORK_IMPORT_PRESET_CONTACTS = 5;</pre>

3.

**Before Android N: **
修改SIMProcessorManager.java
Path: alps\packages\apps\Contacts\src\com\mediatek\contacts\simservice
在createProcessor函數(shù)里添加

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">else if (workType == SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS) {
processor = new PresetContactsImportProcessor(context, subId, intent, listener);
}</pre>

**Android N: **
修改SimProcessorManager.java
Path: alps\packages\apps\Contacts\SimProcessor\src\com\mediatek\SimProcessor
在createProcessor函數(shù)里添加

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">else if (workType == SimServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS) {
processor = new PresetContactsImportProcessor(context, subId, intent, listener);
}</pre>

4.修改BootCmpReceiver.java

Before Android N:
Path: alps\packages\apps\Contacts\src\com\mediatek\contacts\simservice
添加如下方法:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> /**

  • when boot complete,preset the service number directly.
    */
    private void presetServiceNumber(Context context) {
    Log.d(TAG, "presetServiceNumber");
    startSimService(context, -1, SIMServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS);
    }</pre>

**Android N: **
Path: alps\packages\apps\Contacts\SimProcessor\src\com\mediatek\SimProcessor
添加如下方法:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> /**

  • when boot complete,preset the service number directly.
    */
    private void presetServiceNumber(Context context) {
    Log.d(TAG, "presetServiceNumber");
    startSimService(context, -1, SimServiceUtils.SERVICE_WORK_IMPORT_PRESET_CONTACTS);
    }</pre>

5. 修改BootCmpReceiver.java

**Before Android N: **
Path: alps\packages\apps\Contacts\src\com\mediatek\contacts\simservice
在onReceive()方法

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> public void onReceive(Context context, Intent intent) {
... ...
} else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
// fix ALPS01003520,when boot complete,remove the contacts if the
// card of a slot has been removed
if (!isPhbReady()) {
processBootComplete(context);
}
}
... ...
}</pre>

修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> public void onReceive(Context context, Intent intent) {
... ...
} else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
// fix ALPS01003520,when boot complete,remove the contacts if the
// card of a slot has been removed
if (!isPhbReady()) {
processBootComplete(context);
}

     // [START] add for Preset service number
     presetServiceNumber(context);
     // [END]
 }
 ... ...

}</pre>

Android N:

Path: alps\packages\apps\Contacts\SimProcessor\src\com\mediatek\SimProcessor

在onReceive()方法

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> public void onReceive(Context context, Intent intent) {
... ...
} else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
if (!isPhbReady()) {
processBootComplete(context);
} else {
processDupSimContacts(context);
}
}
... ...
}</pre>

修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> public void onReceive(Context context, Intent intent) {
... ...
} else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
if (!isPhbReady()) {
processBootComplete(context);
} else {
processDupSimContacts(context);
}

     // [START] add for Preset service number
     presetServiceNumber(context);
     // [END]
 }
 ... ...

}</pre>

Part Two

**1. **

Before Android N:

File:DefaultContactListAdapter.java

Path: alps\packages\apps\ContactsCommon\src\com\android\contacts\common\list

Android N:

File:ContactsCommonListUtils.java

Path: alps\packages\apps\ContactsCommon\src\com\mediatek\contacts\util

configureOnlyShowPhoneContactsSelection函數(shù)中如下語句:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">selection.append(Contacts.INDICATE_PHONE_SIM + "= ?");

selectionArgs.add("-1");</pre>

之后增加下面的代碼

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">selection.append(" AND " + RawContacts.IS_SDN_CONTACT + " > -2");</pre>

**2. File:Contact.java **

Path: alps\packages\apps\ContactsCommon\src\com\android\contacts\common\model

增加如下函數(shù):

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">//add for Preset Contacts
public boolean isReadOnlyContact() {
return mIsSdnContact == -2;
}</pre>

**3. **

**Before Android N: **

File:ContactLoaderFragment.java

Path:alps\packages\apps\contacts\src\com\android\contacts\detail

將isContactEditable函數(shù)修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">public boolean isContactEditable() {
// return mContactData != null && !mContactData.isDirectoryEntry() && !mContactData.isSdnContacts() && !mContactData.isInternationalDialNumber(); // before
return mContactData != null && !mContactData.isDirectoryEntry() && !mContactData.isSdnContacts() && !mContactData.isInternationalDialNumber() && !mContactData.isReadOnlyContact() ; // after
}</pre>

** Android N:**

File:QuickContactActivity.java

Path:alps\packages\apps\contacts\src\com\android\contacts\quickcontact

將isContactEditable函數(shù)修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"> private boolean isContactEditable() {
// return mContactData != null && !mContactData.isDirectoryEntry() && !mContactData.isSdnContacts() ; // before
return mContactData != null && !mContactData.isDirectoryEntry() && !mContactData.isSdnContacts() && !mContactData.isReadOnlyContact() ; // after
}</pre>

4.

File:ContactEntryListAdapter.java

Path:alps\packages\apps\contactscommon\src\com\android\contacts\common\list

在文件最后增加以下代碼:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">public boolean showReadOnlyContact = true;

public void setShowReadOnlyContact(boolean canDelete) {
showReadOnlyContact = canDelete;
}</pre>

**5. **

File:ContactEntryListFragment.java

Path:alps\packages\apps\contactscommon\src\com\android\contacts\common\list

添加代碼:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">protected boolean isInstanceOfContactsMultiDeletionFragment(){
return false;
}</pre>

在onCreateLoader函數(shù)中,倒數(shù)第二句

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">mAdapter.configureLoader(loader, directoryId);</pre>

之前增加語句:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">mAdapter.setShowReadOnlyContact(isInstanceOfContactsMultiDeletionFragment() ? false : true);
mAdapter.configureLoader(loader, directoryId);</pre>

6.

Before Android M:

File: ContactsMultiDeletionFragment.java

Path:alps\packages\apps\Contacts\src\com\mediatek\contacts\list

添加代碼:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">protected boolean isInstanceOfContactsMultiDeletionFragment(){
return true;
}</pre>

[ Android M:

C File: packages/apps/ContactsCommon/src/com/android/contacts/common/list/ContactEntryListAdapter.java

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public boolean isSdnNumber(int position) {
boolean isSdnNumber = false;
int partition = getPartitionForPosition(position);
if (partition >= 0) {
// Save the old cursor position - the call to getItem() may modify the cursor
// position.
int offset = getCursor(partition).getPosition();
Cursor cursor = (Cursor) getItem(position);
if (cursor != null) {
// [START]
// Before
// isSdnNumber = cursor.getInt(ContactQuery.IS_SDN_CONTACT) == 1;
// After
final long isSdn = cursor.getInt(ContactQuery.IS_SDN_CONTACT);
if (isSdn == 1 || isSdn == -2) {
isSdnNumber = true;
}
Log.d(TAG, "[isSdnNumber] isSdn = " + isSdn + ",isSdnNumber = " + isSdnNumber); //add log
// [END]

        // Restore the old cursor position.
        cursor.moveToPosition(offset);
    }
}
return isSdnNumber;

}</pre>

Android N:

C File: packages/apps/ContactsCommon/src/com/android/contacts/common/list/ContactEntryListAdapter.java

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> public boolean isSdnNumber(int position) {
boolean isSdnNumber = false;
int partition = getPartitionForPosition(position);
if (partition >= 0) {
// Save the old cursor position - the call to getItem() may modify the cursor
// position.
int offset = getCursor(partition).getPosition();
Cursor cursor = (Cursor) getItem(position);
if (cursor != null) {
// [START]
// Before
// isSdnNumber = cursor.getInt(cursor.getColumnIndex(Contacts.IS_SDN_CONTACT)) == 1;
// After
final long isSdn = cursor.getInt(cursor.getColumnIndex(Contacts.IS_SDN_CONTACT));
if (isSdn == 1 || isSdn == -2) {
isSdnNumber = true;
}
Log.d(TAG, "[isSdnNumber] isSdn = " + isSdn + ",isSdnNumber = " + isSdnNumber); //add log
// [END]

         // Restore the old cursor position.
         cursor.moveToPosition(offset);
     }
 }
 return isSdnNumber;

}</pre>

** 7.**

** Before Android M:**

File:MultiContactsBasePickerAdapter.java

Path:alps\packages\apps\contacts\src\com\mediatek\contacts\list

** After Android M:**

File:MultiBasePickerAdapter.java

Path:alps\packages\apps\contacts\src\com\mediatek\contacts\list

在configureSelection函數(shù)最后的語句

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">loader.setSelection(selection.toString());</pre>

之前增加語句:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">if (!showReadOnlyContact ) {
selection.append(" AND " + Contacts.IS_SDN_CONTACT + "=0");
}

loader.setSelection(selection.toString());</pre>

8.File:AggregationSuggestionEngine.java

Path:alps\packages\apps\contacts\src\com\android\contacts\editor

在loadAggregationSuggestions函數(shù) 在語句:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">sb.append(" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");</pre>

之后添加:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">sb.append(" AND " + Contacts.IS_SDN_CONTACT + "!=-2");</pre>

9.

File:JoinContactListAdapter.java

Path:packages\apps\contacts\src\com\android\contacts\list 函數(shù):public void configureLoader(CursorLoader cursorLoader, long directoryId)

Before Android N:

將:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1");</pre>

修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">loader.setSelection(Contacts._ID + "!=?"+" AND " + Contacts.INDICATE_PHONE_SIM + "=-1" + " AND " + Contacts.IS_SDN_CONTACT + "!=-2");</pre>

Android N:
將:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> if (ContactsPortableUtils.MTK_PHONE_BOOK_SUPPORT) {
loader.setSelection(Contacts._ID + "!=?" + " AND " + Contacts.INDICATE_PHONE_SIM
+ "=-1");
} else {
loader.setSelection(Contacts._ID + "!=?");
}</pre>

修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> if (ContactsPortableUtils.MTK_PHONE_BOOK_SUPPORT) {
loader.setSelection(Contacts._ID + "!=?" + " AND " + Contacts.INDICATE_PHONE_SIM
+ "=-1" + " AND " + Contacts.IS_SDN_CONTACT + "!=-2");
} else {
loader.setSelection(Contacts._ID + "!=?" + " AND " + Contacts.IS_SDN_CONTACT + "!=-2");
}</pre>

10.

Android N:
File: MultiSelectEntryContactListAdapter
Path: packages\apps\contacts\src\com\android\contacts\list
語句:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> if (ContactsPortableUtils.MTK_PHONE_BOOK_SUPPORT
&& cursor.getInt(
cursor.getColumnIndex(ContactsContract.Contacts.IS_SDN_CONTACT)) == 1) {
view.setClickable(false);
view.hideCheckBox();
return;
}</pre>

修改為:

<pre class="brush:java;" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> if ((ContactsPortableUtils.MTK_PHONE_BOOK_SUPPORT
&& cursor.getInt(cursor.getColumnIndex(
ContactsContract.Contacts.IS_SDN_CONTACT)) == 1)
|| cursor.getInt(cursor.getColumnIndex(
ContactsContract.Contacts.IS_SDN_CONTACT)) == -2) {
view.setClickable(false);
view.hideCheckBox();
return;
}</pre>

//End for Test

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啄枕,一起剝皮案震驚了整個(gè)濱河市婚陪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌频祝,老刑警劉巖泌参,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異常空,居然都是意外死亡沽一,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門漓糙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣缠,“玉大人,你說我怎么就攤上這事昆禽』韧埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵醉鳖,是天一觀的道長捡硅。 經(jīng)常有香客問我,道長辐棒,這世上最難降的妖魔是什么病曾? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任牍蜂,我火速辦了婚禮,結(jié)果婚禮上泰涂,老公的妹妹穿的比我還像新娘鲫竞。我一直安慰自己,他們只是感情好逼蒙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布从绘。 她就那樣靜靜地躺著,像睡著了一般是牢。 火紅的嫁衣襯著肌膚如雪僵井。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天驳棱,我揣著相機(jī)與錄音批什,去河邊找鬼。 笑死社搅,一個(gè)胖子當(dāng)著我的面吹牛驻债,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播形葬,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼合呐,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了笙以?” 一聲冷哼從身側(cè)響起淌实,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猖腕,沒想到半個(gè)月后拆祈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谈息,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年缘屹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侠仇。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轻姿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逻炊,到底是詐尸還是另有隱情互亮,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布余素,位于F島的核電站豹休,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏桨吊。R本人自食惡果不足惜威根,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一凤巨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洛搀,春花似錦敢茁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谎砾,卻和暖如春逢倍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背景图。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工较雕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人症歇。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓郎笆,卻偏偏與公主長得像谭梗,于是被迫代替她去往敵國和親忘晤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容