/*
* Copyright 2011 David Brazdil
*
* 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 uk.ac.cam.db538.cryptosms.ui.activity;
import roboguice.inject.InjectView;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import uk.ac.cam.db538.cryptosms.R;
import uk.ac.cam.db538.cryptosms.crypto.EncryptionInterface.EncryptionException;
import uk.ac.cam.db538.cryptosms.data.Contact;
import uk.ac.cam.db538.cryptosms.data.KeysMessage;
import uk.ac.cam.db538.cryptosms.data.Message.MessageException;
import uk.ac.cam.db538.cryptosms.data.Message.MessageSendingListener;
import uk.ac.cam.db538.cryptosms.state.State;
import uk.ac.cam.db538.cryptosms.storage.StorageFileException;
import uk.ac.cam.db538.cryptosms.ui.UtilsContactBadge;
import uk.ac.cam.db538.cryptosms.ui.UtilsSendMessage;
public class ActivityExchangeViaText extends ActivityAppState {
public static final String OPTION_PHONE_NUMBER = "PHONE_NUMBER";
private static boolean mCancelled = false;
private Contact mContact;
private String mPhoneNumber;
@InjectView(R.id.back)
Button mBackButton;
@InjectView(R.id.send)
Button mSendButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_exchange_text_message);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
// set up the recipient
mPhoneNumber = getIntent().getExtras().getString(OPTION_PHONE_NUMBER);
if (mPhoneNumber == null)
this.finish();
mContact = Contact.getContact(this, mPhoneNumber);
if (!mContact.existsInDatabase())
this.finish();
// set up the contact badge
UtilsContactBadge.setBadge(mContact, getMainView());
// back button
mBackButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ActivityExchangeViaText.this.onBackPressed();
}
});
// send button
mSendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mSendButton.setEnabled(false);
mBackButton.setEnabled(false);
getDialogManager().showDialog(UtilsSendMessage.DIALOG_SENDING, null);
new SendMessageTask().execute();
}
});
// prepare dialogs
UtilsSendMessage.prepareDialogs(getDialogManager(), this);
}
/* (non-Javadoc)
* @see uk.ac.cam.db538.cryptosms.ui.activity.ActivityAppState#onPkiLogin()
*/
@Override
public void onPkiLogin() {
super.onPkiLogin();
if (mCancelled) {
mCancelled = false;
getDialogManager().dismissDialog(UtilsSendMessage.DIALOG_SENDING_MULTIPART);
}
}
private class SendMessageTask extends AsyncTask<Void, Void, Void> {
private Exception mException = null;
private KeysMessage mKeysMessage = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... arg0) {
// generate session keys
try {
mKeysMessage = new KeysMessage();
} catch (StorageFileException e) {
mException = e;
return null;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (mException != null) {
State.fatalException(mException);
return;
}
// send the message
try {
mCancelled = false;
mKeysMessage.sendSMS(mPhoneNumber, ActivityExchangeViaText.this, new MessageSendingListener() {
@Override
public void onMessageSent() {
getDialogManager().dismissDialog(UtilsSendMessage.DIALOG_SENDING);
// go back
ActivityExchangeViaText.this.setResult(Activity.RESULT_OK);
ActivityExchangeViaText.this.finish();
}
@Override
public void onError(Exception ex) {
if (ex instanceof StorageFileException) {
State.fatalException(ex);
return;
}
getDialogManager().dismissDialog(UtilsSendMessage.DIALOG_SENDING);
Bundle params = new Bundle();
params.putString(UtilsSendMessage.PARAM_SENDING_ERROR, ex.getMessage());
getDialogManager().showDialog(UtilsSendMessage.DIALOG_SENDING_ERROR, params);
mSendButton.setEnabled(true);
mBackButton.setEnabled(true);
}
@Override
public void onPartSent(int index) {
}
});
} catch (StorageFileException e) {
State.fatalException(e);
return;
} catch (MessageException e) {
State.fatalException(e);
return;
} catch (EncryptionException e) {
State.fatalException(e);
return;
}
}
}
}