/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.hangout; import java.util.HashMap; import java.util.Iterator; import android.app.Dialog; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; import android.os.CountDownTimer; import android.util.AttributeSet; import android.view.ContextMenu; import android.view.GestureDetector; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import com.galaxy.meetup.client.android.Intents; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.ui.fragments.BlockPersonDialog; import com.galaxy.meetup.client.android.ui.fragments.EsFragmentActivity; import com.galaxy.meetup.client.util.Property; import com.galaxy.meetup.client.util.QuickActions; /** * * @author sihai * */ public class TabletFilmStripView extends LinearLayout { private Dialog mContextMenuDialog; private int mCurrentOrientation; private CountDownTimer mDismissMenuTimer; private final EventHandler mEventHandler = new EventHandler(); private final int mFilmStripMargin; private GCommApp mGCommAppInstance; private HangoutTile mHangoutTile; private HashMap mMeetingMembersByVideoView; private MeetingMember mPinnedVideoMember; private boolean mShouldShowStatusIcons; private Boolean mShouldShowStatusIconsOverride; private HashMap mTimersByMeetingMember; private HashMap mVideoViewsByMeetingMember; private boolean msResumed; public TabletFilmStripView(Context context, AttributeSet attributeset) { super(context, attributeset); mVideoViewsByMeetingMember = new HashMap(); mMeetingMembersByVideoView = new HashMap(); mTimersByMeetingMember = new HashMap(); mCurrentOrientation = 0; mFilmStripMargin = context.getResources().getDimensionPixelSize(R.dimen.hangout_filmstrip_margin); mShouldShowStatusIcons = Property.ENABLE_HANGOUT_FILMSTRIP_STATUS.getBoolean(); mDismissMenuTimer = new CountDownTimer(5000L, 5000L) { public final void onFinish() { dismissParticipantMenuDialog(); } public final void onTick(long l) { } }; } private void addParticipantVideo(MeetingMember meetingmember) { if(!meetingmember.isSelf()) { boolean flag; final RemoteVideoView.ParticipantVideoView participantvideoview; RemoteVideoView.ParticipantVideoView participantvideoview1; CountDownTimer countdowntimer; if(mPinnedVideoMember != null && meetingmember == mPinnedVideoMember) flag = true; else flag = false; participantvideoview = (RemoteVideoView.ParticipantVideoView)mVideoViewsByMeetingMember.get(meetingmember); if(participantvideoview != null) removeParticipantVideo(participantvideoview, flag); participantvideoview1 = new RemoteVideoView.ParticipantVideoView(getContext(), null, meetingmember); if(getChildCount() > 0) { android.widget.LinearLayout.LayoutParams layoutparams = new android.widget.LinearLayout.LayoutParams(-2, -2); layoutparams.leftMargin = mFilmStripMargin; participantvideoview1.setLayoutParams(layoutparams); } participantvideoview1.setOnTouchListener(new TouchListener(participantvideoview1)); participantvideoview1.setTag(meetingmember); addView(participantvideoview1); participantvideoview1.setHangoutTile(mHangoutTile); participantvideoview1.onResume(); countdowntimer = new CountDownTimer(2000L, 2000L) { public final void onFinish() { participantvideoview.hideVolumeBar(); } public final void onTick(long l) { } }; mTimersByMeetingMember.put(meetingmember, countdowntimer); if(flag) pinVideo(meetingmember); mVideoViewsByMeetingMember.put(meetingmember, participantvideoview1); mMeetingMembersByVideoView.put(participantvideoview1, meetingmember); updateStatusOverlay(meetingmember); } } private GCommApp getGCommAppInstance() { GCommApp gcommapp; if(mGCommAppInstance != null) gcommapp = mGCommAppInstance; else gcommapp = GCommApp.getInstance(getContext()); return gcommapp; } private void onVideoClicked(HangoutVideoView hangoutvideoview, MeetingMember meetingmember) { ParticipantContextMenuHelper participantcontextmenuhelper = new ParticipantContextMenuHelper(meetingmember); mContextMenuDialog = QuickActions.show(hangoutvideoview, null, null, participantcontextmenuhelper, participantcontextmenuhelper, true, true); mDismissMenuTimer.start(); } private void pinVideo(MeetingMember meetingmember) { MeetingMember meetingmember1 = mPinnedVideoMember; getGCommAppInstance().setSelectedVideoSource(meetingmember); mHangoutTile.updateMainVideoStreaming(); mPinnedVideoMember = meetingmember; updateStatusOverlay(meetingmember1); updateStatusOverlay(mPinnedVideoMember); } private void removeParticipantVideo(RemoteVideoView.ParticipantVideoView participantvideoview, boolean flag) { participantvideoview.onPause(); MeetingMember meetingmember = (MeetingMember)mMeetingMembersByVideoView.remove(participantvideoview); if(meetingmember != null) { mVideoViewsByMeetingMember.remove(meetingmember); mTimersByMeetingMember.remove(meetingmember); if(flag && meetingmember == mPinnedVideoMember) unpinVideo(); } removeView(participantvideoview); } private void unpinVideo() { getGCommAppInstance().setSelectedVideoSource(null); mHangoutTile.updateMainVideoStreaming(); MeetingMember meetingmember = mPinnedVideoMember; mPinnedVideoMember = null; updateStatusOverlay(meetingmember); } private void updateStatusOverlay(MeetingMember meetingmember) { if(meetingmember != null && !meetingmember.isSelf()) { HangoutVideoView hangoutvideoview = (HangoutVideoView)mVideoViewsByMeetingMember.get(meetingmember); if(hangoutvideoview != null) if(meetingmember == mPinnedVideoMember) hangoutvideoview.showPinnedStatus(); else hangoutvideoview.hidePinnedStatus(); } } public final void dismissParticipantMenuDialog() { mDismissMenuTimer.cancel(); if(mContextMenuDialog != null) { mContextMenuDialog.dismiss(); mContextMenuDialog = null; } } public final boolean isAudioMuted(MeetingMember meetingmember) { HangoutVideoView hangoutvideoview = (HangoutVideoView)mVideoViewsByMeetingMember.get(meetingmember); boolean flag; if(hangoutvideoview != null && hangoutvideoview.isAudioMuteStatusShowing()) flag = true; else flag = false; return flag; } protected void onConfigurationChanged(Configuration configuration) { super.onConfigurationChanged(configuration); if(configuration.orientation != mCurrentOrientation) { mCurrentOrientation = configuration.orientation; dismissParticipantMenuDialog(); } } public final void onPause() { if(msResumed) { msResumed = false; getGCommAppInstance().unregisterForEvents(getContext(), mEventHandler, false); for(int i = -1 + getChildCount(); i >= 0; i--) { View view = getChildAt(i); if(view instanceof RemoteVideoView.ParticipantVideoView) removeParticipantVideo((RemoteVideoView.ParticipantVideoView)view, false); } removeAllViews(); dismissParticipantMenuDialog(); } } public final void onResume() { if(!msResumed && mHangoutTile != null) { msResumed = true; mCurrentOrientation = 0; for(Iterator iterator = getGCommAppInstance().getGCommNativeWrapper().getMeetingMembersOrderedByEntry().iterator(); iterator.hasNext(); addParticipantVideo((MeetingMember)iterator.next())); getGCommAppInstance().registerForEvents(getContext(), mEventHandler, false); } } public final void requestPinVideo(RemoteVideoView.ParticipantVideoView participantvideoview) { if(msResumed) { MeetingMember meetingmember = participantvideoview.getMember(); if(meetingmember != null && !meetingmember.isSelf()) pinVideo(meetingmember); } } public void setGCommAppInstanceOverride(GCommApp gcommapp) { mGCommAppInstance = gcommapp; } public void setHangoutTile(HangoutTile hangouttile) { mHangoutTile = hangouttile; } public void setShouldShowStatusIconsOverride(boolean flag) { mShouldShowStatusIconsOverride = Boolean.valueOf(flag); } static void access$500(TabletFilmStripView tabletfilmstripview, MeetingMember meetingmember, boolean flag) { if(meetingmember != null && !meetingmember.isSelf()) { HangoutVideoView hangoutvideoview = (HangoutVideoView)tabletfilmstripview.mVideoViewsByMeetingMember.get(meetingmember); if(hangoutvideoview != null) if(flag) { boolean flag1; if(tabletfilmstripview.mShouldShowStatusIconsOverride != null) flag1 = tabletfilmstripview.mShouldShowStatusIconsOverride.booleanValue(); else flag1 = tabletfilmstripview.mShouldShowStatusIcons; if(flag1) hangoutvideoview.showAudioMutedStatus(); hangoutvideoview.setVolume(0); hangoutvideoview.hideVolumeBar(); } else { hangoutvideoview.hideAudioMutedStatus(); } } } static void access$600(TabletFilmStripView tabletfilmstripview, MeetingMember meetingmember, int i) { CountDownTimer countdowntimer; if(meetingmember != null && !meetingmember.isSelf()) { HangoutVideoView hangoutvideoview = (HangoutVideoView)tabletfilmstripview.mVideoViewsByMeetingMember.get(meetingmember); if(hangoutvideoview != null) { hangoutvideoview.hideAudioMutedStatus(); hangoutvideoview.setVolume(i); if(hangoutvideoview.isVideoShowing()) hangoutvideoview.showVolumeBar(); else hangoutvideoview.hideVolumeBar(); } countdowntimer = (CountDownTimer)tabletfilmstripview.mTimersByMeetingMember.get(meetingmember); if(countdowntimer != null) { countdowntimer.cancel(); countdowntimer.start(); } } } static void access$800(TabletFilmStripView tabletfilmstripview, HangoutVideoView hangoutvideoview, MeetingMember meetingmember) { if(meetingmember != null) { if(meetingmember == tabletfilmstripview.mPinnedVideoMember) tabletfilmstripview.unpinVideo(); else tabletfilmstripview.pinVideo(meetingmember); } else { tabletfilmstripview.onVideoClicked(hangoutvideoview, meetingmember); } return; } //================================================================================================================== // Inner class //================================================================================================================== private final class EventHandler extends GCommEventHandler { public final void onAudioMuteStateChanged(MeetingMember meetingmember, boolean flag) { super.onAudioMuteStateChanged(meetingmember, flag); TabletFilmStripView.access$500(TabletFilmStripView.this, meetingmember, flag); } public final void onMediaBlock(MeetingMember meetingmember, MeetingMember meetingmember1, boolean flag) { super.onMediaBlock(meetingmember, meetingmember1, flag); updateStatusOverlay(meetingmember); updateStatusOverlay(meetingmember1); mHangoutTile.updateMainVideoStreaming(); } public final void onMeetingMemberEntered(MeetingMember meetingmember) { if(msResumed) addParticipantVideo(meetingmember); } public final void onMeetingMemberExited(MeetingMember meetingmember) { if(msResumed) { for(int i = -1 + getChildCount(); i >= 0; i--) { View view = getChildAt(i); if(view != null && (view instanceof RemoteVideoView.ParticipantVideoView) && ((RemoteVideoView.ParticipantVideoView)view).getMember() == meetingmember) removeParticipantVideo((RemoteVideoView.ParticipantVideoView)view, true); } } } public final void onRemoteMute(MeetingMember meetingmember, MeetingMember meetingmember1) { super.onRemoteMute(meetingmember, meetingmember1); TabletFilmStripView.access$500(TabletFilmStripView.this, meetingmember, true); } public final void onVideoPauseStateChanged(MeetingMember meetingmember, boolean flag) { super.onVideoPauseStateChanged(meetingmember, flag); updateStatusOverlay(meetingmember); } public final void onVolumeChanged(MeetingMember meetingmember, int i) { super.onVolumeChanged(meetingmember, i); TabletFilmStripView.access$600(TabletFilmStripView.this, meetingmember, i); } } private final class ParticipantContextMenuHelper implements android.view.MenuItem.OnMenuItemClickListener, android.view.View.OnCreateContextMenuListener { private final MeetingMember mMeetingMember; ParticipantContextMenuHelper(MeetingMember meetingmember) { super(); mMeetingMember = meetingmember; } public final void onCreateContextMenu(ContextMenu contextmenu, View view, android.view.ContextMenu.ContextMenuInfo contextmenuinfo) { (new MenuInflater(getContext())).inflate(R.menu.hangout_participant_menu, contextmenu); MenuItem menuitem = contextmenu.findItem(R.id.menu_hangout_participant_profile); MenuItem menuitem1 = contextmenu.findItem(R.id.menu_hangout_participant_pin_video); MenuItem menuitem2 = contextmenu.findItem(R.id.menu_hangout_participant_unpin_video); MenuItem menuitem3 = contextmenu.findItem(R.id.menu_hangout_participant_remote_mute); MenuItem menuitem4 = contextmenu.findItem(R.id.menu_hangout_participant_remote_mute_disabled); MenuItem menuitem5 = contextmenu.findItem(R.id.menu_hangout_participant_block); MenuItem menuitem6 = contextmenu.findItem(R.id.menu_hangout_participant_block_disabled); menuitem.setTitle(mMeetingMember.getName(getContext())); if(mMeetingMember != mPinnedVideoMember) menuitem1.setVisible(true); else menuitem2.setVisible(true); if(!mMeetingMember.isMediaBlocked() && (view instanceof HangoutVideoView) && !((HangoutVideoView)view).isAudioMuteStatusShowing()) menuitem3.setVisible(true); else menuitem4.setVisible(true); if(mMeetingMember.isSelfProfile() || mMeetingMember.isMediaBlocked()) menuitem6.setVisible(true); else menuitem5.setVisible(true); } public final boolean onMenuItemClick(MenuItem menuitem) { boolean flag; int j; int i = menuitem.getItemId(); if(R.id.menu_hangout_participant_profile == i) { android.content.Intent intent = Intents.getProfileActivityIntent(getContext(), mHangoutTile.getAccount(), mMeetingMember.getId(), null); getContext().startActivity(intent); } else if(R.id.menu_hangout_participant_pin_video == i) { pinVideo(mMeetingMember); } else if(R.id.menu_hangout_participant_unpin_video == i) { unpinVideo(); } else if(R.id.menu_hangout_participant_remote_mute == i) { getGCommAppInstance().getGCommNativeWrapper().remoteMute(mMeetingMember); } else { j = R.id.menu_hangout_participant_block; flag = false; if(i != j) { return flag; } (new BlockPersonDialog(false, mMeetingMember)).show(((EsFragmentActivity)getContext()).getSupportFragmentManager(), null); } mDismissMenuTimer.cancel(); mContextMenuDialog = null; flag = true; return flag; } } private final class TouchListener extends android.view.GestureDetector.SimpleOnGestureListener implements android.view.View.OnTouchListener { private final GestureDetector mGestureDetector; private final HangoutVideoView mVideoView; TouchListener(HangoutVideoView hangoutvideoview) { super(); mGestureDetector = new GestureDetector(getContext(), this); mVideoView = hangoutvideoview; mGestureDetector.setOnDoubleTapListener(this); } public final boolean onDoubleTap(MotionEvent motionevent) { MeetingMember meetingmember = (MeetingMember)mVideoView.getTag(); TabletFilmStripView.access$800(TabletFilmStripView.this, mVideoView, meetingmember); return true; } public final boolean onDown(MotionEvent motionevent) { return true; } public final boolean onFling(MotionEvent motionevent, MotionEvent motionevent1, float f, float f1) { boolean flag; if(mHangoutTile != null && f1 > 0.0F && f1 > Math.abs(f)) { android.view.ViewParent viewparent = mVideoView.getParent(); if(viewparent instanceof TabletFilmStripView) mHangoutTile.hideChild((TabletFilmStripView)viewparent); flag = true; } else { flag = super.onFling(motionevent, motionevent1, f, f1); } return flag; } public final boolean onScroll(MotionEvent motionevent, MotionEvent motionevent1, float f, float f1) { boolean flag; if(getY() > (float)(getHeight() / 2)) { if(f1 < 0.0F) flag = true; else flag = false; } else if(f1 > 0.0F) flag = true; else flag = false; if(flag) { android.view.View.DragShadowBuilder dragshadowbuilder = new android.view.View.DragShadowBuilder(mVideoView) { public final void onDrawShadow(Canvas canvas) { android.graphics.Bitmap bitmap = mVideoView.getBitmap(); if(bitmap != null) canvas.drawBitmap(bitmap, 0.0F, 0.0F, null); } }; mVideoView.startDrag(null, dragshadowbuilder, mVideoView, 0); } return true; } public final boolean onSingleTapConfirmed(MotionEvent motionevent) { if(getParent() != null && getVisibility() == 0 && mVideoView.getParent() != null) { MeetingMember meetingmember = (MeetingMember)mVideoView.getTag(); onVideoClicked(mVideoView, meetingmember); } return true; } public final boolean onTouch(View view, MotionEvent motionevent) { return mGestureDetector.onTouchEvent(motionevent); } } }