pacakges/apps/Mms/src/com/android/mms/ui/ComposeMessageActivity
1.private void saveMessageToSim(String msgType, long msgId) {
Intent intent = new Intent();
intent.putExtra("message_type", msgType);
intent.putExtra("message_id", msgId);
intent.putExtra(SELECT_TYPE, SIM_SELECT_FOR_SAVE_MSG_TO_SIM);
showSimSelectedDialog(intent);
}
2. private void showSimSelectedDialog(Intent intent) {
final Intent it = intent;
List<Map<String, ?>> entries = new ArrayList<Map<String, ?>>();
for (int i = 0; i < mSimCount; i++) {
SIMInfo simInfo = mSimInfoList.get(i);
HashMap<String, Object> entry = new HashMap<String, Object>();
entry.put("simIcon", simInfo.mSimBackgroundRes);
int state = getSimStatus(i);
entry.put("simStatus", MessageUtils.getSimStatusResource(state));
String simNumber = "";
if (!TextUtils.isEmpty(simInfo.mNumber)) {
switch(simInfo.mDispalyNumberFormat) {
//case android.provider.Telephony.SimInfo.DISPLAY_NUMBER_DEFAULT:
case android.provider.Telephony.SimInfo.DISPLAY_NUMBER_FIRST:
if(simInfo.mNumber.length() <= 4)
simNumber = simInfo.mNumber;
else
simNumber = simInfo.mNumber.substring(0, 4);
break;
case android.provider.Telephony.SimInfo.DISPLAY_NUMBER_LAST:
if(simInfo.mNumber.length() <= 4)
simNumber = simInfo.mNumber;
else
simNumber = simInfo.mNumber.substring(simInfo.mNumber.length() - 4);
break;
case 0://android.provider.Telephony.SimInfo.DISPLAY_NUMBER_NONE:
simNumber = "";
break;
}
}
if (!TextUtils.isEmpty(simNumber)) {
entry.put("simNumberShort",simNumber);
} else {
entry.put("simNumberShort", "");
}
entry.put("simName", simInfo.mDisplayName);
if (!TextUtils.isEmpty(simInfo.mNumber)) {
entry.put("simNumber", simInfo.mNumber);
} else {
entry.put("simNumber", "");
}
if (mAssociatedSimId == (int) simInfo.mSimId) {
// if this SIM is contact SIM, set "Suggested"
entry.put("suggested", getString(R.string.suggested));
} else {
entry.put("suggested", "");// not suggested
}
if (!is3G(i)) {
entry.put("sim3g", "");
} else {
String optr = SystemProperties.get("ro.operator.optr");
if (optr.equals("OP02")) {
entry.put("sim3g", "3G");
} else {
entry.put("sim3g", "");
}
}
entries.add(entry);
}
final SimpleAdapter a = new SimpleAdapter(
this,
entries,
R.layout.sim_selector,
new String[] {"simIcon", "simStatus", "simNumberShort", "simName", "simNumber", "suggested", "sim3g"},
new int[] {R.id.sim_icon, R.id.sim_status, R.id.sim_number_short, R.id.sim_name, R.id.sim_number, R.id.sim_suggested, R.id.sim3g});
SimpleAdapter.ViewBinder viewBinder = new SimpleAdapter.ViewBinder() {
public boolean setViewValue(View view, Object data, String textRepresentation) {
if (view instanceof ImageView) {
if (view.getId() == R.id.sim_icon) {
ImageView simicon = (ImageView) view.findViewById(R.id.sim_icon);
simicon.setBackgroundResource((Integer) data);
} else if (view.getId() == R.id.sim_status) {
ImageView simstatus = (ImageView)view.findViewById(R.id.sim_status);
if ((Integer)data != -1) {
simstatus.setImageResource((Integer)data);
}
else {
//add by yanjun.yao To bug Tsk_6573_W626Retail00289
simstatus.setVisibility(View.INVISIBLE);
}
}
return true;
}
return false;
}
};
a.setViewBinder(viewBinder);
AlertDialog.Builder b = new AlertDialog.Builder(this);
b.setTitle(getString(R.string.sim_selected_dialog_title));
b.setCancelable(true);
b.setAdapter(a, new DialogInterface.OnClickListener() {
@SuppressWarnings("unchecked")
public final void onClick(DialogInterface dialog, int which) {
updateSendButtonState(false);
mSelectedSimId = (int) mSimInfoList.get(which).mSimId;
if (it.getIntExtra(SELECT_TYPE, -1) == SIM_SELECT_FOR_SEND_MSG) {
confirmSendMessageIfNeeded();
} else if (it.getIntExtra(SELECT_TYPE, -1) == SIM_SELECT_FOR_SAVE_MSG_TO_SIM) {
//getMessageAndSaveToSim(it);
Message msg = mSaveMsgHandler.obtainMessage(MSG_SAVE_MESSAGE_TO_SIM_AFTER_SELECT_SIM);
msg.obj = it;
//mSaveMsgHandler.sendMessageDelayed(msg, 60);
mSaveMsgHandler.sendMessage(msg);
}
dialog.dismiss();
}
});
mSIMSelectDialog = b.create();
mSIMSelectDialog.show();
}
3. private final class SaveMsgHandler extends Handler {
public SaveMsgHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_QUIT_SAVE_MESSAGE_THREAD: {
if (MmsApp.DEBUG) {
Log.d("MMSLog", "exit save message thread");
}
getLooper().quit();
break;
}
case MSG_SAVE_MESSAGE_TO_SIM: {
String type = (String)msg.obj;
long msgId = msg.arg1;
//saveMessageToSim(type, msgId);
getMessageAndSaveToSim(type, msgId);
break;
}
case MSG_SAVE_MESSAGE_TO_SIM_AFTER_SELECT_SIM: {
Intent it = (Intent)msg.obj;
getMessageAndSaveToSim(it);
break;
}
default:
break;
}
}
}
4.private void getMessageAndSaveToSim(Intent intent) {
Log.d("MMSLog", "get message and save to sim, selected sim id = " + mSelectedSimId);
String msgType = intent.getStringExtra("message_type");
long msgId = intent.getLongExtra("message_id", 0);
if (msgType == null) {
//mSaveMsgHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_FAILED_GENERIC);
mUiHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_FAILED_GENERIC);
return;
}
getMessageAndSaveToSim(msgType, msgId);
}
5. private void getMessageAndSaveToSim(String msgType, long msgId){
int result = 0;
MessageItem msgItem = getMessageItem(msgType, msgId, true);
if (msgItem == null || msgItem.mBody == null) {
Log.e("MMSLog", "getMessageAndSaveToSim, can not get Message Item.");
return;
}
String scAddress = null;
if (FeatureOption.MTK_GEMINI_SUPPORT) {
scAddress = TelephonyManagerEx.getDefault().getScAddress(SIMInfo.getSlotById(this, mSelectedSimId));
} else {
scAddress = TelephonyManagerEx.getDefault().getScAddress(0);
}
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> messages = null;
messages = smsManager.divideMessage(msgItem.mBody);
int smsStatus = 0;
long timeStamp = 0;
if (msgItem.isReceivedMessage()) {
smsStatus = SmsManager.STATUS_ON_ICC_READ;
timeStamp = msgItem.mSmsDate;
} else if (msgItem.isSentMessage()) {
smsStatus = SmsManager.STATUS_ON_ICC_SENT;
} else if (msgItem.isFailedMessage()) {
smsStatus = SmsManager.STATUS_ON_ICC_UNSENT;
} else {
Log.e("MMSLog", "Unknown sms status");
}
result = GeminiSmsManager.copyTextMessageToIccCardGemini(scAddress,
msgItem.mAddress, messages, smsStatus, timeStamp, slotId);
} else {
result = SmsManager.getDefault().copyTextMessageToIccCard(scAddress,
msgItem.mAddress, messages, smsStatus, timeStamp);
}
if (result == SmsManager.RESULT_ERROR_SUCCESS) {
//mSaveMsgHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_SUCCEED);
mUiHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_SUCCEED);
} else if (result == SmsManager.RESULT_ERROR_SIM_MEM_FULL) {
//mSaveMsgHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_FAILED_SIM_FULL);
mUiHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_FAILED_SIM_FULL);
} else {
//mSaveMsgHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_FAILED_GENERIC);
mUiHandler.sendEmptyMessage(MSG_SAVE_MESSAGE_TO_SIM_FAILED_GENERIC);
}
mSaveMsgHandler.sendEmptyMessageDelayed(MSG_QUIT_SAVE_MESSAGE_THREAD, 5000);
}
6.frameworksbasetelephonyjavaandroidtelephony/SmsManager.java
public static boolean copyMessageToIcc(
byte[] smsc, byte[] pdu, int status, int simId) {
boolean success = false;
String isms = getSmsServiceName(simId);
try {
ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService(isms));
if (iccISms != null) {
success = iccISms.copyMessageToIccEf(status, pdu, smsc);
}
} catch (RemoteException ex) {
// ignore it
}
return success;
}
out/target/common/obj/java_libraries/framework_intermediates/src/telephony/java/com/android/internal/telephony/ISms.java
/**
* Copy a raw SMS PDU to the ICC.
*
* @param pdu the raw PDU to store
* @param status message status (STATUS_ON_ICC_READ, STATUS_ON_ICC_UNREAD,
* STATUS_ON_ICC_SENT, STATUS_ON_ICC_UNSENT)
* @return success or not
*
*/
public boolean copyMessageToIccEf(int status, byte[] pdu, byte[] smsc) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(status);
_data.writeByteArray(pdu);
_data.writeByteArray(smsc);
mRemote.transact(Stub.TRANSACTION_copyMessageToIccEf, _data, _reply, 0);
_reply.readException();
_result = (0!=_reply.readInt());
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
/**
* Copy a text SMS to the ICC.
*
* @param scAddress Service center address
* @param address Destination address or original address
* @param text List of message text
* @param status message status (STATUS_ON_ICC_READ, STATUS_ON_ICC_UNREAD,
* STATUS_ON_ICC_SENT, STATUS_ON_ICC_UNSENT)
* @param timestamp Timestamp when service center receive the message
* @return success or not
*
*/
public int copyTextMessageToIccCard(java.lang.String scAddress, java.lang.String address, java.util.List<java.lang.String> text, int status, long timestamp) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(scAddress);
_data.writeString(address);
_data.writeStringList(text);
_data.writeInt(status);
_data.writeLong(timestamp);
mRemote.transact(Stub.TRANSACTION_copyTextMessageToIccCard, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;