package com.android.phone; /* * Copyright (C) 2008 Esmertec AG. * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.ArrayList; import java.util.regex.Pattern; import java.lang.Integer; import org.apache.harmony.kernel.vm.StringUtils; import com.android.phone.R; import android.database.sqlite.SqliteWrapper; //import com.android.mms.transaction.MessagingNotification; import android.app.Activity; import android.app.AlertDialog; import android.content.AsyncQueryHandler; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.database.ContentObserver; import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.net.Uri; import android.os.AsyncResult; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.telephony.SmsManager; import android.util.Log; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.Button; import android.widget.EditText; import android.text.TextUtils; import android.text.Selection; import android.text.Spannable; import android.text.method.DialerKeyListener; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; import android.content.ContentValues; /** * Displays a list of the Cell Broadcast Sms. */ public class CellBroadcastSmsSettingEditActivity extends Activity { private static final int MENU_DELETE = 0; private TextView mMessage; private static final String TAG = "CellBroadcastSmsSettingEditActivity"; private int mPos; private EditText mNameField; private EditText mNumberField; private Button mButton; private boolean mAdd; private String COLUMN_CHANNEL_ID = "channel_id"; private String COLUMN_CHANNEL_NAME = "channel_name"; private String COLUMN_CHANNEL_PHONEID = "phone_id"; private String ACTION = "add"; private String COLUMN_CHANNEL_ENABLE = "enable"; private String COLUMN_LANG = "lang"; private String mName; private String mNumber; private CheckBox mCheckbox; private int mEnable = 1; private int mLang = 0; private ContentResolver mContentResolver; private int[] mConfigDataComplete; private int[] mAllEnableChannel; private int[] mLangSet; private String COLUMN_ID = "_id"; private int mSave = 0; private int mPhoneId = 0; private static final int MESSAGE_SET_CB_SMS_CONFIG = 4; private final String[] PROJECTION = { COLUMN_ID, COLUMN_CHANNEL_ID, COLUMN_CHANNEL_NAME, COLUMN_CHANNEL_ENABLE,COLUMN_CHANNEL_PHONEID }; private final String[] SET_PROJECTION = { COLUMN_ID, COLUMN_LANG, COLUMN_CHANNEL_ENABLE }; private static final int ENG_LANG = 0x1; private static final int FRENCH_LANG = 0x2; private static final int SPANISH_LANG = 0x4; private static final int JAPANESE_LANG = 0x8; private static final int KOREAN_LANG = 0x10; private static final int CHINESE_LANG = 0x20; private static final int HERBREW_LANG = 0x40; private static final int PADDING = 0XFFFF; private static final int[] LangMap = { ENG_LANG, FRENCH_LANG, SPANISH_LANG, JAPANESE_LANG, KOREAN_LANG, CHINESE_LANG, HERBREW_LANG }; private static int MAX_LANG = 7; private static final int COMMA = 0x2c; private static final int QUOTES = 0x22; private static final int CR = 0xd; private Phone mPhone; private MyHandler mHandler; private static final Uri CBSMS_URI_SET = Uri .parse("content://sms/cbsmssetting"); private Cursor mSetCursor = null; private int mSubscription; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); mPhone = PhoneFactory.getDefaultPhone(); mHandler = new MyHandler(); mContentResolver = getContentResolver(); Log.i(TAG, "onCreate 2" + mPhone.getPhoneName()); resolveIntent(); getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.cell_broadcast_setting_edit); setupView(); setTitle(R.string.edit); } private void resolveIntent() { Intent intent = getIntent(); mName = intent.getStringExtra(COLUMN_CHANNEL_NAME); mNumber = intent.getStringExtra(COLUMN_CHANNEL_ID); mLang = intent.getIntExtra(COLUMN_LANG, 0); mPos = intent.getIntExtra("pos", 0); mPhoneId = intent.getExtras().getInt("phoneid"); mPhone = PhoneApp.getInstance().getPhone(mPhoneId); Log.i(TAG, "onCreate" + "mLang :" + mLang + "mPos :" + mPos); if (TextUtils.isEmpty(mName) && TextUtils.isEmpty(mNumber)) { mAdd = true; } if (!mAdd) { mEnable = intent.getIntExtra(COLUMN_CHANNEL_ENABLE, 0); } } private View.OnClickListener mClicked = new View.OnClickListener() { public void onClick(View v) { if (v == mNameField) { mNameField.requestFocus(); } else if (v == mNumberField) { mNumberField.requestFocus(); } else if (v == mButton) { String regexNum = "^[0-9]*$"; String mNumber = mNumberField.getText().toString().trim(); if ("".equals(mNumber)) { Toast.makeText(getApplicationContext(), getString(R.string.info_input_channel_number), Toast.LENGTH_SHORT).show(); } else if (!mNumber.matches(regexNum)) { Toast.makeText(getApplicationContext(), getString(R.string.info_input_channel_number_num), Toast.LENGTH_SHORT).show(); } else { // test if (onAction()) { setResult(22, getIntent()); finish(); } } } else if (v == mCheckbox) { int enable = (mCheckbox.isChecked() == false) ? 1 : 0; if (enable != mEnable) { mSave = 1; mEnable = enable; } else { mSave = 0; } Log.i(TAG, "mCheckbox" + mCheckbox.isChecked() + "mEnable :" + mEnable); } } }; View.OnFocusChangeListener mOnFocusChangeHandler = new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { TextView textView = (TextView) v; Selection.selectAll((Spannable) textView.getText()); } } }; /** * We have multiple layouts, one to indicate that the user needs to open the * keyboard to enter information (if the keybord is hidden). So, we need to * make sure that the layout here matches that in the layout file. */ private void setupView() { mNameField = (EditText) findViewById(R.id.channel_name_edit); if (mNameField != null) { mNameField.setOnFocusChangeListener(mOnFocusChangeHandler); mNameField.setOnClickListener(mClicked); } mNumberField = (EditText) findViewById(R.id.channel_number_edit); if (mNumberField != null) { mNumberField.setKeyListener(DialerKeyListener.getInstance()); mNumberField.setOnFocusChangeListener(mOnFocusChangeHandler); mNumberField.setOnClickListener(mClicked); } if (!mAdd) { if (mNameField != null) { mNameField.setText(mName); } if (mNumberField != null) { mNumberField.setText(mNumber); } } mButton = (Button) findViewById(R.id.button); if (mButton != null) { mButton.setOnClickListener(mClicked); } mCheckbox = (CheckBox) findViewById(R.id.enable_checkbox); mCheckbox.setOnClickListener(mClicked); boolean enable; if (mAdd) { enable = false; } else { enable = (mEnable == 0) ? true : false; } mCheckbox.setChecked(enable); } private String getNameFromTextField() { return mNameField.getText().toString(); } private String getNumberFromTextField() { return mNumberField.getText().toString().trim(); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } OnClickListener positiveListener = new OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.i(TAG, "mPos" + mPos); // getIntent().putExtra("pos",mPos); setResult(20, getIntent()); CellBroadcastSmsSettingEditActivity.this.finish(); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); Log.i(TAG, "onCreateOptionsMenu"); menu.add(0, MENU_DELETE, Menu.NONE, R.string.menu_delete_sigle_channel) .setIcon(android.R.drawable.ic_menu_delete); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Log.i(TAG, "onOptionsItemSelectedSIM MenuItem"); switch (item.getItemId()) { case MENU_DELETE: { Log.i(TAG, "onOptionsItemSelectedSIM MENU_DELETE"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.menu_delete_sigle_channel); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setCancelable(true); builder.setMessage(R.string.confirm_delete_message); builder.setPositiveButton(R.string.menu_delete_sigle_channel, positiveListener); builder.setNegativeButton(R.string.no, null); builder.show(); return true; } default: break; } return false; } private void setxOneChannelATCmd(int channel_id, boolean isEnable) { int[] channel = new int[1]; channel[0] = channel_id; int[] lang = getLang(); int[] data; data = setChannelATCmd(channel, mLangSet, isEnable); if (data != null) { mPhone.setCellBroadcastSmsConfig(mConfigDataComplete, Message.obtain(mHandler, MESSAGE_SET_CB_SMS_CONFIG)); } } private boolean onAction() { { Log.i(TAG, "onAction: mEnable" + mEnable); String id = getNumberFromTextField(); if (id == null && getNameFromTextField() == null) { return false; } int newId = Integer.parseInt(getNumberFromTextField()); int channel_id = Integer.parseInt(getNumberFromTextField()); matchInfo ret = matchName(id); String name = getNameFromTextField(); if (ret.isMatch) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); CharSequence info = getString(R.string.same_setting) + " < " + ret.name + " >"; builder.setMessage(info); builder.show(); return false; } try { ContentValues values = new ContentValues(); values.put(COLUMN_CHANNEL_ID, getNumberFromTextField()); values.put(COLUMN_CHANNEL_NAME, getNameFromTextField()); values.put(COLUMN_CHANNEL_ENABLE, mEnable); values.put(COLUMN_CHANNEL_PHONEID, mPhoneId); if (mAdd) { Uri insertedUri = SqliteWrapper.insert( CellBroadcastSmsSettingEditActivity.this, mContentResolver, CBSMS_URI_SET, values); if (mEnable == 0) { int enableChannel[] = new int[1]; enableChannel[0] = channel_id; mAllEnableChannel = enableChannel; Log.i(TAG, "onAction + mAllEnableChannel " + mAllEnableChannel.toString()); setOneChannelATCmd(channel_id, true); } } else { Uri updateUri = ContentUris.withAppendedId(CBSMS_URI_SET, mPos); SqliteWrapper.update( CellBroadcastSmsSettingEditActivity.this, mContentResolver, updateUri, values, null, null); if (Integer.parseInt(getNumberFromTextField()) != Integer .parseInt(mNumber) || mSave == 1) { int enableChannel[] = new int[1]; enableChannel[0] = channel_id; mAllEnableChannel = enableChannel; Log.i(TAG, "onAction + mAllEnableChannel " + mAllEnableChannel.toString()); boolean isEnable = (mEnable == 0) ? true : false; setxOneChannelATCmd(channel_id, isEnable); } } } catch (SQLiteException e) { SqliteWrapper.checkSQLiteException(this, e); } } return true; } private int[] setChannelATCmd(int[] channel, int[] lang, boolean isEnable) { int[] data; int raw_length = 0; int length = 0; int j = 0; int i = 0; if (channel != null && lang != null) { raw_length = (channel.length + lang.length) * 2 + 10; } else { return null; } if (raw_length % 4 != 0) { length = raw_length + (4 - raw_length % 4); } else { length = raw_length; } Log.i(TAG, "setChannelATCmd length :" + length + " rawlength " + raw_length + "lang.length" + lang.length); for (i = 0; i < lang.length; i++) { Log.i(TAG, "setChannelATCmd lang :" + lang[i]); } data = new int[length]; if (isEnable) { data[0] = 0; } else { data[0] = 1; } data[1] = COMMA; data[2] = QUOTES; j = 3; for (i = 0; i < channel.length; i++) { data[j] = channel[i]; if (i == channel.length - 1) { j++; break; } data[j + 1] = COMMA; j += 2; } data[j] = QUOTES; if (lang.length > 0) { j++; data[j] = COMMA; j++; data[j] = QUOTES; j++; for (i = 0; i < lang.length; i++) { data[j] = lang[i]; if (i == lang.length - 1) { j++; break; } data[j + 1] = COMMA; j += 2; } data[j] = QUOTES; } else { j++; data[j] = COMMA; j++; data[j] = QUOTES; j++; data[j] = QUOTES; } j++; Log.i(TAG, "setChannelATCmd raw length:" + j); for (i = j; i < length; i++) { data[i] = CR; Log.i(TAG, "setChannelATCmd FILL CR :" + data[i]); } Log.i(TAG, "setChannelATCmd data length:" + data.length); mConfigDataComplete = new int[data.length]; for (i = 0; i < data.length; i++) { mConfigDataComplete[i] = data[i]; Log.i(TAG, "setChannelATCmd data :" + mConfigDataComplete[i]); } return data; } private void setOneChannelATCmd(int channel_id, boolean isEnable) { int[] channel = new int[1]; channel[0] = channel_id; int[] lang = getLang(); int[] data; data = setChannelATCmd(channel, mLangSet, isEnable); if (data != null) { mPhone.setCellBroadcastSmsConfig(mConfigDataComplete, Message.obtain(mHandler, MESSAGE_SET_CB_SMS_CONFIG)); } } private int getLangId(int langSet) { int langId = 0XFFFF; switch (langSet) { case ENG_LANG: langId = 1; break; case FRENCH_LANG: langId = 3; break; case SPANISH_LANG: langId = 4; break; case JAPANESE_LANG:// @need to do langId = 0; break; case KOREAN_LANG:// @need to do langId = 0; break; case CHINESE_LANG: langId = 0x48; break; case HERBREW_LANG: langId = 0x21; break; default: break; } return langId; } private int[] getLang() { int[] data = new int[MAX_LANG]; int lang = 0xFFFF; int j = 0; Log.i(TAG, "getLang mLang " + mLang); for (int i = 0; i < MAX_LANG; i++) { if ((mLang & LangMap[i]) != 0) { lang = getLangId(LangMap[i]); Log.i(TAG, "getLang lang " + lang); if (0xFFFF != lang) { data[j] = lang; j++; } } } mLangSet = new int[j]; Log.i(TAG, "getLang count " + j); for (int i = 0; i < j; i++) { mLangSet[i] = data[i]; Log.i(TAG, "getLang mLangSet " + mLangSet[i]); } return mLangSet; } private class MyHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_SET_CB_SMS_CONFIG: // Only a log message here, because the received response is // always null // Log.i(TAG, "Set Cell Broadcast SMS values."); // / mPhone.getCellBroadcastSmsConfig(Message.obtain(mHandler, // MESSAGE_SET_CB_SMS_CONFIG)); break; default: Log.e(TAG, "Error! Unhandled message in CellBroadcastSms.java. Message: " + msg.what); break; } } } private class matchInfo{ public boolean isMatch; public String name; public String id; public int mPhoneId; } private matchInfo matchName(String id) { matchInfo ret = new matchInfo(); ret.isMatch = false; // Cursor cursor = SqliteWrapper.query(this, mContentResolver, // CBSMS_URI_SET, PROJECTION, null, null, null); Cursor cursor = SqliteWrapper .query(this, mContentResolver, CBSMS_URI_SET, PROJECTION, "phone_id = " + mPhoneId, null, null); int count = cursor.getCount(); if (cursor != null) { try { if (cursor.moveToFirst()) { for (int i = 0; i < count; ++i) { int channel_id = cursor.getInt(cursor .getColumnIndexOrThrow(COLUMN_CHANNEL_ID)); int ids = Integer.parseInt(id); Log.i(TAG, "channel_id:" + channel_id + " ids:" + ids); if (channel_id == ids) { String channel_name = cursor .getString(cursor .getColumnIndexOrThrow(COLUMN_CHANNEL_NAME)); Log.i(TAG, "channel_id:" + channel_id + " channel_name:" + channel_name); ret.name = channel_name; ret.id = id; ret.isMatch = true; break; } cursor.moveToNext(); } } } finally { cursor.close(); } } return ret; } }