/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.hangout; import android.content.Context; import android.content.res.Resources; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.util.Property; /** * * @author sihai * */ public class ToastsView extends FrameLayout { private final Animation animIn; private final Animation animOut; private final EventHandler eventHandler = new EventHandler(); private Runnable hideToastRunnable; private ImageView imageView; private final Handler mHandler = new Handler(Looper.getMainLooper()); private TextView mTextView; public ToastsView(Context context, AttributeSet attributeset) { super(context, attributeset); View view = LayoutInflater.from(context).inflate(R.layout.hangout_toasts_view, this, true); imageView = (ImageView)view.findViewById(R.id.toast_icon); mTextView = (TextView)view.findViewById(R.id.toast_text); hideToastRunnable = new Runnable() { public final void run() { startAnimation(animIn); } }; animIn = AnimationUtils.loadAnimation(context, R.anim.fade_in); animIn.setAnimationListener(new android.view.animation.Animation.AnimationListener() { public final void onAnimationEnd(Animation animation) { } public final void onAnimationRepeat(Animation animation) { } public final void onAnimationStart(Animation animation) { setVisibility(0); } }); animOut = AnimationUtils.loadAnimation(context, R.anim.fade_out); animOut.setAnimationListener(new android.view.animation.Animation.AnimationListener() { public final void onAnimationEnd(Animation animation) { setVisibility(8); } public final void onAnimationRepeat(Animation animation) { } public final void onAnimationStart(Animation animation) { } }); } public final void addToast(int i) { addToast(((ToastInfo) (new StringToastInfo(getContext().getResources().getString(i))))); } public final void addToast(ToastInfo toastinfo) { imageView.setVisibility(0); toastinfo.populateView(imageView, mTextView); if(!TextUtils.isEmpty(mTextView.getText())) { mHandler.removeCallbacks(hideToastRunnable); mHandler.postDelayed(hideToastRunnable, 5000L); startAnimation(animIn); } } public final void onPause() { GCommApp.getInstance(getContext()).unregisterForEvents(getContext(), eventHandler, false); } public final void onResume() { GCommApp.getInstance(getContext()).registerForEvents(getContext(), eventHandler, false); } //================================================================================================================== // Inner class //================================================================================================================== private final class EventHandler extends GCommEventHandler { public final void onMediaBlock(MeetingMember meetingmember, MeetingMember meetingmember1, boolean flag) { super.onMediaBlock(meetingmember, meetingmember1, flag); addToast(new MediaBlockToast(meetingmember, meetingmember1, flag)); } public final void onMeetingMemberExited(MeetingMember meetingmember) { super.onMeetingMemberExited(meetingmember); addToast(new MeetingMemberToast(meetingmember)); } public final void onMeetingMemberPresenceConnectionStatusChanged(MeetingMember meetingmember) { if(GCommApp.getInstance(getContext()).shouldShowToastForMember(meetingmember)) addToast(new MeetingMemberToast(meetingmember)); } public final void onRemoteMute(MeetingMember meetingmember, MeetingMember meetingmember1) { super.onRemoteMute(meetingmember, meetingmember1); addToast(new RemoteMuteToast(meetingmember, meetingmember1)); } public final void onVCardResponse(MeetingMember meetingmember) { super.onVCardResponse(meetingmember); if(GCommApp.getInstance(getContext()).shouldShowToastForMember(meetingmember)) addToast(new MeetingMemberToast(meetingmember)); } } private final class MediaBlockToast extends ToastInfo { private final MeetingMember mBlockee; private final MeetingMember mBlocker; private final boolean mIsRecording; MediaBlockToast(MeetingMember meetingmember, MeetingMember meetingmember1, boolean flag) { mBlockee = meetingmember; mBlocker = meetingmember1; if(Property.FORCE_HANGOUT_RECORD_ABUSE.getBoolean()) flag = true; mIsRecording = flag; } final void populateView(ImageView imageview, TextView textview) { Resources resources = getResources(); String s; if(mIsRecording) { s = resources.getString(R.string.hangout_recording_abuse); imageview.setVisibility(8); } else if(mBlockee != null && mBlocker != null) { Avatars.renderAvatar(getContext(), mBlockee, imageview); String s1 = mBlockee.getName(getContext()); String s2 = mBlocker.getName(getContext()); if(mBlocker.isSelf()) s = resources.getString(R.string.hangout_media_block_by_self, new Object[] { s1 }); else if(mBlockee.isSelf()) s = resources.getString(R.string.hangout_media_block_to_self, new Object[] { s2 }); else s = resources.getString(R.string.hangout_media_block, new Object[] { s2, s1 }); } else { s = null; } textview.setText(s); } } private final class MeetingMemberToast extends ToastInfo { private final MeetingMember meetingMember; private final int messageId; MeetingMemberToast(MeetingMember meetingmember) { meetingMember = meetingmember; switch(meetingmember.getCurrentStatus()) { case DISCONNECTED: if(meetingmember.getPreviousStatus() == MeetingMember.Status.CONNECTING) messageId = R.string.hangout_member_unable_to_join; else messageId = R.string.hangout_member_exiting_meeting; break; case CONNECTING: messageId = -1; break; case CONNECTED: messageId = R.string.hangout_member_entering_meeting; break; default: messageId = -1; break; } } final void populateView(ImageView imageview, TextView textview) { if(messageId != -1) { Avatars.renderAvatar(getContext(), meetingMember, imageview); String s = meetingMember.getName(getContext()); textview.setText(String.format(getResources().getString(messageId), new Object[] { s })); } } } private final class RemoteMuteToast extends ToastInfo { private final MeetingMember mutee; private final MeetingMember muter; RemoteMuteToast(MeetingMember meetingmember, MeetingMember meetingmember1) { mutee = meetingmember; muter = meetingmember1; } final void populateView(ImageView imageview, TextView textview) { Avatars.renderAvatar(getContext(), mutee, imageview); String s = mutee.getName(getContext()); String s1 = muter.getName(getContext()); String s2; if(muter.isSelf()) s2 = getResources().getString(R.string.hangout_remote_mute_by_self, new Object[] { s }); else if(mutee.isSelf()) s2 = getResources().getString(R.string.hangout_remote_mute_to_self, new Object[] { s1 }); else s2 = getResources().getString(R.string.hangout_remote_mute, new Object[] { s1, s }); textview.setText(s2); } } private final class StringToastInfo extends ToastInfo { private final String string; StringToastInfo(String s) { string = s; } final void populateView(ImageView imageview, TextView textview) { imageview.setVisibility(8); textview.setText(string); } } private abstract class ToastInfo { abstract void populateView(ImageView imageview, TextView textview); } }