summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/ApnEditor.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:32:34 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:32:34 -0800
commitafc4ab2ffbb8327ddce9907961295a32cbf49d0f (patch)
tree64baf0ce0e3c9fb39cc086994dbe9805b74e5bca /src/com/android/settings/ApnEditor.java
parent4e14e5ccbf1ef27220419849133d482a546d5c04 (diff)
downloadpackages_apps_Settings-afc4ab2ffbb8327ddce9907961295a32cbf49d0f.zip
packages_apps_Settings-afc4ab2ffbb8327ddce9907961295a32cbf49d0f.tar.gz
packages_apps_Settings-afc4ab2ffbb8327ddce9907961295a32cbf49d0f.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'src/com/android/settings/ApnEditor.java')
-rw-r--r--src/com/android/settings/ApnEditor.java403
1 files changed, 403 insertions, 0 deletions
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
new file mode 100644
index 0000000..f1fa2ef
--- /dev/null
+++ b/src/com/android/settings/ApnEditor.java
@@ -0,0 +1,403 @@
+/*
+ * Copyright (C) 2006 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.
+ */
+
+package com.android.settings;
+
+import android.app.AlertDialog;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.preference.EditTextPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.provider.Telephony;
+import com.android.internal.telephony.TelephonyProperties;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+
+
+public class ApnEditor extends PreferenceActivity
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+
+ private final static String TAG = ApnEditor.class.getSimpleName();
+
+ private final static String SAVED_POS = "pos";
+
+ private static final int MENU_DELETE = Menu.FIRST;
+ private static final int MENU_SAVE = Menu.FIRST + 1;
+ private static final int MENU_CANCEL = Menu.FIRST + 2;
+
+ private static String sNotSet;
+ private EditTextPreference mName;
+ private EditTextPreference mApn;
+ private EditTextPreference mProxy;
+ private EditTextPreference mPort;
+ private EditTextPreference mUser;
+ private EditTextPreference mServer;
+ private EditTextPreference mPassword;
+ private EditTextPreference mMmsc;
+ private EditTextPreference mMcc;
+ private EditTextPreference mMnc;
+ private EditTextPreference mMmsProxy;
+ private EditTextPreference mMmsPort;
+ private EditTextPreference mApnType;
+ private String mCurMnc;
+ private String mCurMcc;
+
+ private Uri mUri;
+ private Cursor mCursor;
+ private boolean mNewApn;
+ private boolean mFirstTime;
+ private Resources mRes;
+
+ /**
+ * Standard projection for the interesting columns of a normal note.
+ */
+ private static final String[] sProjection = new String[] {
+ Telephony.Carriers._ID, // 0
+ Telephony.Carriers.NAME, // 1
+ Telephony.Carriers.APN, // 2
+ Telephony.Carriers.PROXY, // 3
+ Telephony.Carriers.PORT, // 4
+ Telephony.Carriers.USER, // 5
+ Telephony.Carriers.SERVER, // 6
+ Telephony.Carriers.PASSWORD, // 7
+ Telephony.Carriers.MMSC, // 8
+ Telephony.Carriers.MCC, // 9
+ Telephony.Carriers.MNC, // 10
+ Telephony.Carriers.NUMERIC, // 11
+ Telephony.Carriers.MMSPROXY,// 12
+ Telephony.Carriers.MMSPORT, // 13
+ Telephony.Carriers.TYPE, // 14
+ };
+
+ private static final int ID_INDEX = 0;
+ private static final int NAME_INDEX = 1;
+ private static final int APN_INDEX = 2;
+ private static final int PROXY_INDEX = 3;
+ private static final int PORT_INDEX = 4;
+ private static final int USER_INDEX = 5;
+ private static final int SERVER_INDEX = 6;
+ private static final int PASSWORD_INDEX = 7;
+ private static final int MMSC_INDEX = 8;
+ private static final int MCC_INDEX = 9;
+ private static final int MNC_INDEX = 10;
+ private static final int MMSPROXY_INDEX = 12;
+ private static final int MMSPORT_INDEX = 13;
+ private static final int TYPE_INDEX = 14;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.apn_editor);
+
+ sNotSet = getResources().getString(R.string.apn_not_set);
+ mName = (EditTextPreference) findPreference("apn_name");
+ mApn = (EditTextPreference) findPreference("apn_apn");
+ mProxy = (EditTextPreference) findPreference("apn_http_proxy");
+ mPort = (EditTextPreference) findPreference("apn_http_port");
+ mUser = (EditTextPreference) findPreference("apn_user");
+ mServer = (EditTextPreference) findPreference("apn_server");
+ mPassword = (EditTextPreference) findPreference("apn_password");
+ mMmsProxy = (EditTextPreference) findPreference("apn_mms_proxy");
+ mMmsPort = (EditTextPreference) findPreference("apn_mms_port");
+ mMmsc = (EditTextPreference) findPreference("apn_mmsc");
+ mMcc = (EditTextPreference) findPreference("apn_mcc");
+ mMnc = (EditTextPreference) findPreference("apn_mnc");
+ mApnType = (EditTextPreference) findPreference("apn_type");
+
+ mRes = getResources();
+
+ final Intent intent = getIntent();
+ final String action = intent.getAction();
+
+ mFirstTime = icicle == null;
+
+ if (action.equals(Intent.ACTION_EDIT)) {
+ mUri = intent.getData();
+ } else if (action.equals(Intent.ACTION_INSERT)) {
+ if (mFirstTime) {
+ mUri = getContentResolver().insert(intent.getData(), new ContentValues());
+ } else {
+ mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI,
+ icicle.getInt(SAVED_POS));
+ }
+ mNewApn = true;
+ // If we were unable to create a new note, then just finish
+ // this activity. A RESULT_CANCELED will be sent back to the
+ // original activity if they requested a result.
+ if (mUri == null) {
+ Log.w(TAG, "Failed to insert new telephony provider into "
+ + getIntent().getData());
+ finish();
+ return;
+ }
+
+ // The new entry was created, so assume all will end well and
+ // set the result to be returned.
+ setResult(RESULT_OK, (new Intent()).setAction(mUri.toString()));
+
+ } else {
+ finish();
+ return;
+ }
+
+ mCursor = managedQuery(mUri, sProjection, null, null);
+ mCursor.moveToFirst();
+
+ fillUi();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onPause() {
+ getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ super.onPause();
+ }
+
+ private void fillUi() {
+ if (mFirstTime) {
+ mFirstTime = false;
+ // Fill in all the values from the db in both text editor and summary
+ mName.setText(mCursor.getString(NAME_INDEX));
+ mApn.setText(mCursor.getString(APN_INDEX));
+ mProxy.setText(mCursor.getString(PROXY_INDEX));
+ mPort.setText(mCursor.getString(PORT_INDEX));
+ mUser.setText(mCursor.getString(USER_INDEX));
+ mServer.setText(mCursor.getString(SERVER_INDEX));
+ mPassword.setText(mCursor.getString(PASSWORD_INDEX));
+ mMmsProxy.setText(mCursor.getString(MMSPROXY_INDEX));
+ mMmsPort.setText(mCursor.getString(MMSPORT_INDEX));
+ mMmsc.setText(mCursor.getString(MMSC_INDEX));
+ mMcc.setText(mCursor.getString(MCC_INDEX));
+ mMnc.setText(mCursor.getString(MNC_INDEX));
+ mApnType.setText(mCursor.getString(TYPE_INDEX));
+ if (mNewApn) {
+ String numeric =
+ SystemProperties.get(TelephonyProperties.PROPERTY_SIM_OPERATOR_NUMERIC);
+ // MCC is first 3 chars and then in 2 - 3 chars of MNC
+ if (numeric != null && numeric.length() > 4) {
+ // Country code
+ String mcc = numeric.substring(0, 3);
+ // Network code
+ String mnc = numeric.substring(3);
+ // Auto populate MNC and MCC for new entries, based on what SIM reports
+ mMcc.setText(mcc);
+ mMnc.setText(mnc);
+ mCurMnc = mnc;
+ mCurMcc = mcc;
+ }
+ }
+ }
+
+ mName.setSummary(checkNull(mName.getText()));
+ mApn.setSummary(checkNull(mApn.getText()));
+ mProxy.setSummary(checkNull(mProxy.getText()));
+ mPort.setSummary(checkNull(mPort.getText()));
+ mUser.setSummary(checkNull(mUser.getText()));
+ mServer.setSummary(checkNull(mServer.getText()));
+ mPassword.setSummary(starify(mPassword.getText()));
+ mMmsProxy.setSummary(checkNull(mMmsProxy.getText()));
+ mMmsPort.setSummary(checkNull(mMmsPort.getText()));
+ mMmsc.setSummary(checkNull(mMmsc.getText()));
+ mMcc.setSummary(checkNull(mMcc.getText()));
+ mMnc.setSummary(checkNull(mMnc.getText()));
+ mApnType.setSummary(checkNull(mApnType.getText()));
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ // If it's a new APN, then cancel will delete the new entry in onPause
+ if (!mNewApn) {
+ menu.add(0, MENU_DELETE, 0, R.string.menu_delete)
+ .setIcon(android.R.drawable.ic_menu_delete);
+ }
+ menu.add(0, MENU_SAVE, 0, R.string.menu_save)
+ .setIcon(android.R.drawable.ic_menu_save);
+ menu.add(0, MENU_CANCEL, 0, R.string.menu_cancel)
+ .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_DELETE:
+ deleteApn();
+ return true;
+ case MENU_SAVE:
+ if (validateAndSave(false)) {
+ finish();
+ }
+ return true;
+ case MENU_CANCEL:
+ if (mNewApn) {
+ getContentResolver().delete(mUri, null, null);
+ }
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_BACK: {
+ if (validateAndSave(false)) {
+ finish();
+ }
+ return true;
+ }
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle icicle) {
+ super.onSaveInstanceState(icicle);
+ validateAndSave(true);
+ icicle.putInt(SAVED_POS, mCursor.getInt(ID_INDEX));
+ }
+
+ /**
+ * Check the key fields' validity and save if valid.
+ * @param force save even if the fields are not valid, if the app is
+ * being suspended
+ * @return true if the data was saved
+ */
+ private boolean validateAndSave(boolean force) {
+ String name = checkNotSet(mName.getText());
+ String apn = checkNotSet(mApn.getText());
+ String mcc = checkNotSet(mMcc.getText());
+ String mnc = checkNotSet(mMnc.getText());
+
+ String errorMsg = null;
+ if (name.length() < 1) {
+ errorMsg = mRes.getString(R.string.error_name_empty);
+ } else if (apn.length() < 1) {
+ errorMsg = mRes.getString(R.string.error_apn_empty);
+ } else if (mcc.length() != 3) {
+ errorMsg = mRes.getString(R.string.error_mcc_not3);
+ } else if ((mnc.length() & 0xFFFE) != 2) {
+ errorMsg = mRes.getString(R.string.error_mnc_not23);
+ }
+
+ if (errorMsg != null && !force) {
+ showErrorMessage(errorMsg);
+ return false;
+ }
+
+ if (!mCursor.moveToFirst()) {
+ Log.w(TAG,
+ "Could not go to the first row in the Cursor when saving data.");
+ return false;
+ }
+
+ ContentValues values = new ContentValues();
+
+ values.put(Telephony.Carriers.NAME, name);
+ values.put(Telephony.Carriers.APN, apn);
+ values.put(Telephony.Carriers.PROXY, checkNotSet(mProxy.getText()));
+ values.put(Telephony.Carriers.PORT, checkNotSet(mPort.getText()));
+ values.put(Telephony.Carriers.MMSPROXY, checkNotSet(mMmsProxy.getText()));
+ values.put(Telephony.Carriers.MMSPORT, checkNotSet(mMmsPort.getText()));
+ values.put(Telephony.Carriers.USER, checkNotSet(mUser.getText()));
+ values.put(Telephony.Carriers.SERVER, checkNotSet(mServer.getText()));
+ values.put(Telephony.Carriers.PASSWORD, checkNotSet(mPassword.getText()));
+ values.put(Telephony.Carriers.MMSC, checkNotSet(mMmsc.getText()));
+ values.put(Telephony.Carriers.TYPE, checkNotSet(mApnType.getText()));
+
+ values.put(Telephony.Carriers.MCC, mcc);
+ values.put(Telephony.Carriers.MNC, mnc);
+
+ values.put(Telephony.Carriers.NUMERIC, mcc + mnc);
+
+ if (mCurMnc != null && mCurMcc != null) {
+ if (mCurMnc.equals(mnc) && mCurMcc.equals(mcc)) {
+ values.put(Telephony.Carriers.CURRENT, 1);
+ }
+ }
+
+ getContentResolver().update(mUri, values, null, null);
+
+ return true;
+ }
+
+ private void showErrorMessage(String message) {
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.error_title)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ }
+
+ private void deleteApn() {
+ getContentResolver().delete(mUri, null, null);
+ finish();
+ }
+
+ private String starify(String value) {
+ if (value == null || value.length() == 0) {
+ return sNotSet;
+ } else {
+ char[] password = new char[value.length()];
+ for (int i = 0; i < password.length; i++) {
+ password[i] = '*';
+ }
+ return new String(password);
+ }
+ }
+
+ private String checkNull(String value) {
+ if (value == null || value.length() == 0) {
+ return sNotSet;
+ } else {
+ return value;
+ }
+ }
+
+ private String checkNotSet(String value) {
+ if (value == null || value.equals(sNotSet)) {
+ return "";
+ } else {
+ return value;
+ }
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ Preference pref = findPreference(key);
+ if (pref != null) {
+ pref.setSummary(checkNull(sharedPreferences.getString(key, "")));
+ }
+ }
+}