/*
* 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.
*/
package uk.ac.cam.db538.cryptosms.ui.list;
import uk.ac.cam.db538.cryptosms.MyApplication;
import uk.ac.cam.db538.cryptosms.R;
import uk.ac.cam.db538.cryptosms.data.Contact;
import uk.ac.cam.db538.cryptosms.data.PendingParser.ParseResult;
import uk.ac.cam.db538.cryptosms.ui.UtilsTextFormat;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.QuickContactBadge;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
* This class manages the view for given conversation.
*/
public class ListItemNotification extends RelativeLayout {
private TextView mSubjectView;
private TextView mFromView;
private TextView mDateView;
private ImageView mMessageTypeIcon;
private View mErrorIndicator;
private QuickContactBadge mAvatarView;
private ParseResult mParseData;
/**
* Instantiates a new list item notification.
*
* @param context the context
*/
public ListItemNotification(Context context) {
super(context);
}
/**
* Instantiates a new list item notification.
*
* @param context the context
* @param attrs the attrs
*/
public ListItemNotification(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mFromView = (TextView) findViewById(R.id.from);
mSubjectView = (TextView) findViewById(R.id.subject);
mDateView = (TextView) findViewById(R.id.date);
mMessageTypeIcon = (ImageView) findViewById(R.id.type);
mErrorIndicator = findViewById(R.id.error);
mAvatarView = (QuickContactBadge) findViewById(R.id.avatar);
}
private void setParseData(ParseResult parseData) {
mParseData = parseData;
}
public ParseResult getParseData() {
return mParseData;
}
/**
* Only used for header binding.
*
* @param title the title
* @param explain the explain
*/
public void bind(String title, String explain) {
Log.d(MyApplication.APP_TAG, "Notification header bound");
mFromView.setText(title);
mSubjectView.setText(explain);
}
/**
* Bind parsing result to notification
*
* @param parseData the parse data
*/
public final void bind(final ParseResult parseData) {
Context context = this.getContext();
Resources res = context.getResources();
setParseData(parseData);
boolean hasError = false;
setBackgroundDrawable(
res.getDrawable(R.drawable.conversation_item_background_read)
);
Contact contact = Contact.getContact(context, parseData.getIdGroup().get(0).getSender());
if (contact.getName() != null && contact.getName().length() > 0)
mFromView.setText(contact.getName());
else
mFromView.setText(contact.getPhoneNumber());
switch (parseData.getResult()) {
case OK_HANDSHAKE_MESSAGE:
mSubjectView.setText(res.getString(R.string.parse_ok_keys_message));
break;
case OK_CONFIRM_MESSAGE:
mSubjectView.setText(res.getString(R.string.parse_ok_confirm_message));
break;
case CORRUPTED_DATA:
mSubjectView.setText(res.getString(R.string.parse_corrupted_data));
hasError = true;
break;
case COULD_NOT_DECRYPT:
mSubjectView.setText(res.getString(R.string.parse_could_not_decrypt));
hasError = true;
break;
case COULD_NOT_VERIFY:
mSubjectView.setText(res.getString(R.string.parse_could_not_verify));
hasError = true;
break;
case MISSING_PARTS:
mSubjectView.setText(res.getString(R.string.parse_missing_parts));
hasError = true;
break;
case NO_SESSION_KEYS:
mSubjectView.setText(res.getString(R.string.parse_no_session_keys));
hasError = true;
break;
case REDUNDANT_PARTS:
mSubjectView.setText(res.getString(R.string.parse_redundant_parts));
hasError = true;
break;
case UNKNOWN_SENDER:
mSubjectView.setText(res.getString(R.string.parse_unknown_sender));
hasError = true;
break;
case INTERNAL_ERROR:
mSubjectView.setText(res.getString(R.string.parse_internal_error));
hasError = true;
break;
case TIMESTAMP_IN_FUTURE:
mSubjectView.setText(res.getString(R.string.parse_timestamp_in_future));
hasError = true;
break;
case TIMESTAMP_OLD:
mSubjectView.setText(res.getString(R.string.parse_timestamp_old));
hasError = true;
break;
default:
hasError = true;
break;
}
mDateView.setText(UtilsTextFormat.formatDateTime(parseData.getTimestamp()));
Drawable avatarDrawable = contact.getAvatar(context, MyApplication.getSingleton().getDefaultContactImage());
if (contact.existsInDatabase()) {
mAvatarView.assignContactUri(contact.getUri());
} else {
mAvatarView.assignContactFromPhone(contact.getPhoneNumber(), true);
}
mAvatarView.setImageDrawable(avatarDrawable);
mAvatarView.setVisibility(View.VISIBLE);
switch (mParseData.getIdGroup().get(0).getType()) {
case HANDSHAKE:
case CONFIRM:
mMessageTypeIcon.setImageDrawable(res.getDrawable(R.drawable.icon_key_exchange));
break;
case TEXT:
mMessageTypeIcon.setImageDrawable(res.getDrawable(R.drawable.icon_message));
break;
default:
mMessageTypeIcon.setImageDrawable(res.getDrawable(R.drawable.ic_list_alert_sms_failed));
break;
}
LayoutParams subjectLayout = (LayoutParams)mSubjectView.getLayoutParams();
subjectLayout.addRule(RelativeLayout.LEFT_OF, hasError ? R.id.error : R.id.type);
mErrorIndicator.setVisibility(hasError ? VISIBLE : GONE);
mMessageTypeIcon.setVisibility(VISIBLE);
}
}