package com.jeztek.imok; import java.text.DecimalFormat; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.PendingIntent; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.preference.PreferenceManager; import android.telephony.SmsManager; import android.text.Editable; import android.text.Html; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class SmsActivity extends Activity { public static final String TAG="ImOk.SmsActivity"; public static final String BROADCAST_SMS = "com.jeztek.imok.SMS_SENT"; private static final int DIALOG_ERROR = 1; private static final int DIALOG_EMERGENCY = 2; private static final int DIALOG_SENDING = 3; private static final int DIALOG_SENT = 4; private Location mLocation = null; private boolean mHaveProvider = false; private LocationManager mLocationManager; private LocationListener mLocationListener = new LocationListener() { public void onLocationChanged(Location location) { DecimalFormat formatter = new DecimalFormat("###.######"); String messageStr = formatter.format(location.getLatitude()) + "," + formatter.format(location.getLongitude()); mLocationEdit.setText(messageStr); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } }; private BroadcastReceiver mSentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(BROADCAST_SMS)) { if (this.getResultCode() != Activity.RESULT_OK) { Log.e(TAG, "Error sending SMS"); showDialog(DIALOG_ERROR); return; } dismissDialog(DIALOG_SENDING); showDialog(DIALOG_SENT); } } }; private TextWatcher mLengthWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { mEditLength = mLocationEdit.getText().length() + mFreeEdit.getText().length(); // Add in <sp>#loc<sp> tag if (mLocationEdit.getText().length() > 0) { mEditLength += 6; } if (mFreeEdit.getText().length() > 0) mEditLength++; updateRemaining(); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } }; private TextView mTextView; private long mHashLength; private TextView mCharsRemaining; private EditText mLocationEdit; private EditText mFreeEdit; private Button mSendButton; private static final int SMS_LENGTH = 160; private int mEditLength = 0; private boolean mDisclaimerShown = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "SmsActivity onCreate called"); setContentView(R.layout.sms); mTextView = (TextView) findViewById(R.id.sms_msg); mCharsRemaining = (TextView) findViewById(R.id.sms_remaining_msg); mFreeEdit = (EditText) findViewById(R.id.sms_free_txt); mLocationEdit = (EditText) findViewById(R.id.sms_location_txt); mLocationEdit.addTextChangedListener(mLengthWatcher); mFreeEdit.addTextChangedListener(mLengthWatcher); mSendButton = (Button) findViewById(R.id.sms_send_btn); mSendButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { sendSms(); } }); mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "SmsActivity onStart called"); Intent i = this.getIntent(); if (i.getAction().equals(Settings.SMS_ACTION_HELP)) { setTitle(R.string.sms_help_name); mTextView.setText(Html.fromHtml(getResources().getString(R.string.sms_needhelp_text))); mHashLength = Settings.HASH_HELP.length() + 1; SharedPreferences settings = getSharedPreferences(Settings.SETTINGS_FILE, 0); mDisclaimerShown = settings.getBoolean(Settings.SETTINGS_DISCLAIMER, false); if (!mDisclaimerShown) { showDialog(DIALOG_EMERGENCY); mDisclaimerShown = true; } } else { setTitle(R.string.sms_ok_name); mTextView.setText(Html.fromHtml(getResources().getString(R.string.sms_ok_text))); mHashLength = Settings.HASH_OK.length() + 1; } updateRemaining(); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "SmsActivity onStop called"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "SmsActivity onResume called"); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); String provider = mLocationManager.getBestProvider(criteria, true); if (provider != null) { mHaveProvider = true; mLocationManager.requestLocationUpdates(provider, 1000, 1, mLocationListener); } IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BROADCAST_SMS); registerReceiver(mSentReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "SmsActivity onPause called"); // We need an Editor object to make preference changes. // All objects are from android.context.Context SharedPreferences settings = getSharedPreferences(Settings.SETTINGS_FILE, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean(Settings.SETTINGS_DISCLAIMER, mDisclaimerShown); // Commit the edits! editor.commit(); if (mHaveProvider) mLocationManager.removeUpdates(mLocationListener); unregisterReceiver(mSentReceiver); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "SmsActivity onCreate called"); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_EMERGENCY: return new AlertDialog.Builder(this) .setTitle(getString(R.string.sms_help_name)) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(getString(R.string.sms_911_text)) .setCancelable(false) .setPositiveButton(R.string.sms_911_continue, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .setNegativeButton(R.string.sms_911_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { SmsActivity.this.finish(); } }) .create(); case DIALOG_ERROR: return new AlertDialog.Builder(this) .setTitle(getString(R.string.sms_error_title)) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(getString(R.string.sms_error_message)) .setCancelable(false) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create(); case DIALOG_SENDING: { ProgressDialog progressDialog = new ProgressDialog(this); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setMessage("Sending...."); return progressDialog; } case DIALOG_SENT: return new AlertDialog.Builder(this) .setTitle(getString(R.string.sms_sent_title)) .setIcon(android.R.drawable.ic_dialog_info) .setMessage(getString(R.string.sms_sent_message)) .setCancelable(false) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { SmsActivity.this.finish(); } }) .create(); } return null; } private void sendSms() { final StringBuilder sb = new StringBuilder(); if (mFreeEdit.getText().length() > 0) { sb.append(mFreeEdit.getText()); } Intent i = getIntent(); if (i.getAction().equals(Settings.SMS_ACTION_OK)) { sb.append(" ").append(Settings.HASH_OK); } else { sb.append(" ").append(Settings.HASH_HELP); } if (mLocationEdit.getText().length() > 0) { sb.append(" ").append(Settings.HASH_LOC).append(" ") .append(mLocationEdit.getText()); } Log.d(TAG, "SMS to send: *" + sb.toString() + "*"); showDialog(DIALOG_SENDING); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); String phoneNumber = preferences.getString( Settings.GATEWAY_PHONE, getText(R.string.settings_gateway_phone_summary).toString()); /* DecimalFormat formatter = new DecimalFormat("###.######"); String messageStr = "OK [" + formatter.format(mLocation.getLatitude()) + "," + formatter.format(mLocation.getLongitude()) + "]"; */ SmsManager manager = SmsManager.getDefault(); Intent intent = new Intent(BROADCAST_SMS); PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, intent, 0); manager.sendTextMessage(phoneNumber, null, sb.toString(), sentIntent, null); } private void updateRemaining() { long charsRemaining = SMS_LENGTH - (mEditLength + mHashLength); String msg = String.format(getResources().getString(R.string.sms_remaining), charsRemaining); mCharsRemaining.setText(msg); if(charsRemaining < 0) { mCharsRemaining.setTextColor(0xffff0000); mSendButton.setEnabled(false); } else { mCharsRemaining.setTextColor(0xff000000); mSendButton.setEnabled(true); } } }