/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.hangout; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import android.content.Context; import android.text.TextUtils; import android.util.Pair; import com.galaxy.meetup.client.android.AuthData; import com.galaxy.meetup.client.android.api.ApiUtils; import com.galaxy.meetup.client.android.content.AudienceData; import com.galaxy.meetup.client.android.content.CircleData; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsPeopleData; import com.galaxy.meetup.client.android.content.PersonData; import com.galaxy.meetup.client.android.service.Hangout; import com.galaxy.meetup.client.util.Property; /** * * @author sihai * */ public class GCommNativeWrapper { static boolean $assertionsDisabled = false; private static final int GCOMM_NATIVE_LIB_API_LEVEL = 6; public static final String HANGOUT = "HANGOUT"; public static final String HANGOUT_SYNC = "HANGOUT_SYNC"; public static final int INVALID_INCOMING_VIDEO_REQUEST_ID = 0; static final int MAX_INCOMING_AUDIO_LEVEL = 255; static final int MIN_INCOMING_AUDIO_LEVEL = 0; private static final String SELF_MUC_JID_BEFORE_ENTERING_HANGOUT = ""; public static final String TRANSFER = "TRANSFER"; private volatile EsAccount account; private volatile boolean clientInitiatedExit; private final Context context; private volatile boolean hadSomeConnectedParticipant; private volatile boolean hangoutCreated; private volatile Hangout.Info hangoutInfo; private volatile boolean isHangoutLite; private volatile Map memberMucJidToMeetingMember; private volatile int membersCount; private volatile long nativePeerObject; private volatile boolean retrySignin; private volatile boolean ringInvitees; private volatile List roomHistory; private volatile MeetingMember selfMeetingMember; private volatile String userJid; static { boolean flag; if(!GCommNativeWrapper.class.desiredAssertionStatus()) flag = true; else flag = false; $assertionsDisabled = flag; Log.info("GCommNativeWrapper loading gcomm_ini"); System.loadLibrary("gcomm_jni"); Log.info("GCommNativeWrapper done loading gcomm_ini"); } public GCommNativeWrapper(Context context1) { retrySignin = true; context = context1; roomHistory = new ArrayList(); memberMucJidToMeetingMember = Collections.synchronizedMap(new HashMap()); } private static ArrayList ToArrayList(Object aobj[]) { ArrayList arraylist = new ArrayList(aobj.length); int i = aobj.length; for(int j = 0; j < i; j++) arraylist.add(aobj[j]); return arraylist; } public static void initialize(Context context1, String s, String s1, String s2, boolean flag, String s3, String s4) throws LinkageError { int i = nativeStaticGetVersion(); Log.debug((new StringBuilder("GComm native lib API version: ")).append(i).toString()); Log.debug("GComm native wrapper API version: 6"); Log.debug((new StringBuilder("GComm native lib logging: ")).append(flag).append(" at level ").append(s4).toString()); if(i != 6) { Log.error((new StringBuilder("GComm native lib version mismatch. Expected 6 but got ")).append(i).toString()); throw new UnsupportedClassVersionError(); } if(!nativeStaticInitialize(context1, s, s1, s2, flag, s3, s4)) { Log.error("GComm native lib initialization failed"); throw new ExceptionInInitializerError(); } else { return; } } private native void nativeBlockMedia(String s); private native void nativeConnectAndSignin(String s, String s1); private native void nativeConnectAndSigninFull(String s, String s1, String s2, String s3, boolean flag); private native void nativeCreateHangout(); private native void nativeEnterMeeting(int i, String s, String s1, String s2, String s3, boolean flag, boolean flag1); private native void nativeEnterMeetingWithCachedGreenRoomInfo(boolean flag); private native void nativeExitMeeting(); private native int nativeGetIncomingAudioVolume(); private native boolean nativeInitializeIncomingVideoRenderer(int i); private native void nativeInviteToMeeting(String as[], String as1[], String s, boolean flag, boolean flag1); private native boolean nativeIsAudioMute(); private native boolean nativeIsOutgoingVideoStarted(); private native void nativeKickMeetingMember(String s, String s1); private native long nativePeerCreate(); private native void nativePeerDestroy(long l); private native void nativeProvideOutgoingVideoFrame(byte abyte0[], long l, int i); private native void nativeRemoteMute(String s); private native boolean nativeRenderIncomingVideoFrame(int i); private native void nativeRequestVCard(String s, String s1); private native void nativeSendInstantMessage(String s); private native void nativeSendInstantMessageToUser(String s, String s1); private native void nativeSendRingStatus(String s, String s1, String s2); private native void nativeSetAudioMute(boolean flag); private native void nativeSetIncomingAudioVolume(int i); private native void nativeSetIncomingVideoParameters(int i, int j, int k, int l, int i1); private native boolean nativeSetIncomingVideoRendererSurfaceSize(int i, int j, int k); private native void nativeSetIncomingVideoSourceToSpeakerIndex(int i, int j); private native void nativeSetIncomingVideoSourceToUser(int i, String s); private native void nativeSetPresenceConnectionStatus(int i); private native void nativeSignoutAndDisconnect(); public static native void nativeSimulateCrash(); private native int nativeStartIncomingVideoForSpeakerIndex(int i, int j, int k, int l); private native int nativeStartIncomingVideoForUser(String s, int i, int j, int k); private native void nativeStartOutgoingVideo(int i, int j); public static native void nativeStaticCleanup(); private static native int nativeStaticGetVersion(); private static native boolean nativeStaticInitialize(Context context1, String s, String s1, String s2, boolean flag, String s3, String s4); public static native void nativeStaticSetDeviceCaptureType(int i); private native void nativeStopIncomingVideo(int i); private native void nativeStopOutgoingVideo(); private native void nativeUploadCallgrokLog(); private void onAudioMuteStateChanged(String s, boolean flag) { MeetingMember meetingmember = null; if(!s.equals("")) meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); GCommApp.sendObjectMessage(context, 101, Pair.create(meetingmember, Boolean.valueOf(flag))); } private void onCallgrokLogUploadCompleted(int i, String s) { GCommApp.sendObjectMessage(context, 60, Pair.create(Integer.valueOf(i), s)); } private void onCurrentSpeakerChanged(String s) { GCommApp.sendObjectMessage(context, 102, memberMucJidToMeetingMember.get(s)); } private void onError(int i) { Error error; Object aobj[] = new Object[1]; aobj[0] = Integer.valueOf(i); Log.info("GCommNativeWrapper.onError: %d", aobj); error = Error.values()[i]; if(error != Error.AUTHENTICATION) { GCommApp.sendObjectMessage(context, -1, error); return; } Log.info("Invalidating auth token..."); try { AuthData.invalidateAuthToken(context, account.getName(), "webupdates"); } catch(Exception exception) { } if(!retrySignin) GCommApp.sendObjectMessage(context, -1, error); else { GCommApp.getInstance(context).signinUser(getAccount()); retrySignin = false; } } private void onHangoutCreated(String s) { hangoutCreated = true; Hangout.Info info = new Hangout.Info(Hangout.RoomType.CONSUMER, null, null, s, null, Hangout.LaunchSource.Creation, ringInvitees); GCommApp.sendObjectMessage(context, 50, info); } private void onIncomingVideoFrameDimensionsChanged(int i, int j, int k) { GCommApp.sendObjectMessage(context, 107, new FrameDimensionsChangedMessageParams(i, new RectangleDimensions(j, k))); } private void onIncomingVideoFrameReceived(int i) { GCommApp.sendObjectMessage(context, 106, Integer.valueOf(i)); } private void onIncomingVideoStarted(int i) { GCommApp.sendObjectMessage(context, 104, Integer.valueOf(i)); } private void onInstantMessageReceived(String s, String s1) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); if(meetingmember == null) Log.error((new StringBuilder("onInstantMessageReceived missing fromMucJid: ")).append(s).toString()); InstantMessage instantmessage = new InstantMessage(meetingmember, s, s1); GCommApp.sendObjectMessage(context, 59, instantmessage); } private void onMediaBlock(String s, String s1, boolean flag) { MeetingMember meetingmember; MeetingMember meetingmember1; meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); meetingmember1 = (MeetingMember)memberMucJidToMeetingMember.get(s1); if(!meetingmember.isSelf()) { if(meetingmember1.isSelf()) meetingmember.setMediaBlocked(true); } else { meetingmember1.setMediaBlocked(true); } if(!Property.ENABLE_HANGOUT_RECORD_ABUSE.getBoolean()) flag = false; if(flag || meetingmember1 != null && meetingmember != null) GCommApp.sendObjectMessage(context, 110, Pair.create(Pair.create(meetingmember, meetingmember1), Boolean.valueOf(flag))); return; } private void onMeetingEnterError(int i) { MeetingEnterError meetingentererror = MeetingEnterError.values()[i]; if(meetingentererror == MeetingEnterError.HANGOUT_OVER && hangoutInfo != null && hangoutInfo.getLaunchSource() == Hangout.LaunchSource.MissedCall) { hangoutInfo = null; GCommApp.sendEmptyMessage(context, 6); } else { clearMeetingState(); GCommApp.sendObjectMessage(context, -3, meetingentererror); } } private void onMeetingExited() { boolean flag = clientInitiatedExit; clearMeetingState(); Context context1 = context; Object obj; if(flag) obj = new Object(); else obj = null; GCommApp.sendObjectMessage(context1, 54, obj); } private void onMeetingMediaStarted() { GCommApp.sendEmptyMessage(context, 53); } private void onMeetingMemberEntered(String s, String s1, String s2, int i) { if(!isHangoutLite && (s2 == null || "".equals(s2))) { Log.debug((new StringBuilder("Ignoring invalid user: JID=")).append(s).append(" nickname=").append(s1).append(" ID=<empty> status=").append(i).toString()); } else { boolean flag = account.isMyGaiaId(s2); int j = membersCount; membersCount = j + 1; MeetingMember meetingmember = new MeetingMember(s, s1, s2, j, false, flag); PresenceConnectionStatus presenceconnectionstatus = PresenceConnectionStatus.values()[i]; if(presenceconnectionstatus == PresenceConnectionStatus.CONNECTING || presenceconnectionstatus == PresenceConnectionStatus.JOINING) meetingmember.setCurrentStatus(MeetingMember.Status.CONNECTING); else meetingmember.setCurrentStatus(MeetingMember.Status.CONNECTED); memberMucJidToMeetingMember.put(s, meetingmember); if(!hadSomeConnectedParticipant && meetingmember.getCurrentStatus() == MeetingMember.Status.CONNECTED) hadSomeConnectedParticipant = true; nativeRequestVCard(s, ""); GCommApp.sendObjectMessage(context, 55, meetingmember); } } private void onMeetingMemberExited(String s) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.remove(s); if(meetingmember == null) { Log.error((new StringBuilder("onMeetingMemberExited missing memberMucJid: ")).append(s).toString()); } else { meetingmember.setCurrentStatus(MeetingMember.Status.DISCONNECTED); GCommApp.sendObjectMessage(context, 57, meetingmember); } } private void onMeetingMemberPresenceConnectionStateChanged(String s, int i) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); if(null == meetingmember) { Log.error((new StringBuilder("onMeetingMemberPresenceConnectionStateChanged missing memberMucJid: ")).append(s).toString()); return; } PresenceConnectionStatus presenceconnectionstatus = PresenceConnectionStatus.values()[i]; MeetingMember.Status status; if(presenceconnectionstatus == PresenceConnectionStatus.CONNECTING || presenceconnectionstatus == PresenceConnectionStatus.JOINING) status = MeetingMember.Status.CONNECTING; else status = MeetingMember.Status.CONNECTED; if(status != meetingmember.getCurrentStatus()) { meetingmember.setCurrentStatus(status); if(!hadSomeConnectedParticipant && meetingmember.getCurrentStatus() == MeetingMember.Status.CONNECTED) hadSomeConnectedParticipant = true; GCommApp.sendObjectMessage(context, 56, meetingmember); } } private void onMucEntered(String s, String s1, boolean flag) { String s2 = account.getGaiaId(); int i = membersCount; membersCount = i + 1; selfMeetingMember = new MeetingMember(s, s1, s2, i, true, true); memberMucJidToMeetingMember.put(s, selfMeetingMember); nativeRequestVCard(s, ""); isHangoutLite = flag; GCommApp.sendObjectMessage(context, 52, selfMeetingMember); } public static void onNativeCrash() { Log.error("GCommNativeWrapper.onNativeCrash - Crash from native code!!!"); GCommApp.reportNativeCrash(); } private void onOutgoingVideoStarted() { GCommApp.sendEmptyMessage(context, 105); } private void onReceivedRoomHistory(String as[], String as1[]) { if(!$assertionsDisabled && as.length != as1.length) throw new AssertionError(); ArrayList arraylist = new ArrayList(as.length); String s = account.getName().split("@")[1]; int i = 0; while(i < as.length) { String as2[] = as[i].split("@"); if(as2.length != 2) { Log.warn((new StringBuilder("Bad format for room history: ")).append(as[i]).toString()); } else { String s1 = as2[0]; String s2 = as2[1]; String s3 = s1; if(!s2.equals(s)) s3 = String.format("%s (%s)", new Object[] { s1, s2 }); arraylist.add(new RoomEntry(s3)); } i++; } roomHistory = arraylist; GCommApp.sendObjectMessage(context, 5, arraylist); } private void onRemoteMute(String s, String s1) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); MeetingMember meetingmember1 = (MeetingMember)memberMucJidToMeetingMember.get(s1); if(meetingmember1 != null && meetingmember != null) GCommApp.sendObjectMessage(context, 109, Pair.create(meetingmember, meetingmember1)); } private void onSignedIn(String s) { userJid = s; GCommApp.sendObjectMessage(context, 1, s); } private void onSignedOut() { GCommApp.sendEmptyMessage(context, 2); } private void onSigninTimeOutError() { GCommApp.sendEmptyMessage(context, -2); } public static void onUnhandledJavaException(Throwable throwable) { GCommApp.reportJavaCrashFromNativeCode(throwable); } private void onVCardResponse(String s, VCard vcard) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); if(meetingmember == null) { Log.warn((new StringBuilder("onVCardResponse missing memberMucJid: ")).append(s).toString()); } else { meetingmember.setVCard(vcard); GCommApp.sendObjectMessage(context, 3, meetingmember); } } private void onVideoPauseStateChanged(String s, boolean flag) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); if(meetingmember != null) { meetingmember.setVideoPaused(flag); GCommApp.sendObjectMessage(context, 111, Pair.create(meetingmember, Boolean.valueOf(flag))); } } private void onVideoSourceChanged(int i, String s, boolean flag) { VideoSourceChangedMessageParams videosourcechangedmessageparams = new VideoSourceChangedMessageParams(i, (MeetingMember)memberMucJidToMeetingMember.get(s), flag); GCommApp.sendObjectMessage(context, 103, videosourcechangedmessageparams); } private void onVolumeChanged(String s, int i) { MeetingMember meetingmember = (MeetingMember)memberMucJidToMeetingMember.get(s); if(meetingmember != null) GCommApp.sendObjectMessage(context, 112, Pair.create(meetingmember, Integer.valueOf(i))); } public void blockMedia(MeetingMember meetingmember) { if(nativePeerObject != 0L) nativeBlockMedia(meetingmember.getMucJid()); } void clearMeetingState() { hangoutInfo = null; selfMeetingMember = null; memberMucJidToMeetingMember.clear(); membersCount = 0; hadSomeConnectedParticipant = false; hangoutCreated = false; ringInvitees = false; clientInitiatedExit = false; } public void connectAndSignin(EsAccount esaccount, String s) { boolean flag; if(nativePeerObject == 0L) flag = true; else flag = false; if(!flag) { throw new IllegalStateException(); } else { retrySignin = true; nativePeerObject = nativePeerCreate(); account = esaccount; Log.info((new StringBuilder("Created native peer: ")).append(nativePeerObject).toString()); nativeConnectAndSignin(esaccount.getName(), s); return; } } public void createHangout(boolean flag) { if(nativePeerObject != 0L) { ringInvitees = flag; nativeCreateHangout(); } } public void enterMeeting(Hangout.Info info, boolean flag, boolean flag1) { if(nativePeerObject != 0L) { clearMeetingState(); hangoutInfo = info; String s; int i; String s1; String s2; String s3; if(info.getDomain() == null) s = ""; else s = info.getDomain(); i = info.getRoomType().ordinal(); if(info.getServiceId() == null) s1 = ""; else s1 = info.getServiceId(); s2 = info.getId(); if(info.getNick() == null) s3 = ""; else s3 = info.getNick(); nativeEnterMeeting(i, s, s1, s2, s3, flag, flag1); } } public void exitMeeting() { if(nativePeerObject != 0L) { clientInitiatedExit = true; nativeExitMeeting(); } } public EsAccount getAccount() { return account; } public GCommAppState getCurrentState() { GCommAppState gcommappstate; if(nativePeerObject == 0L) gcommappstate = GCommAppState.NONE; else gcommappstate = GCommAppState.values()[nativeGetCurrentState()]; return gcommappstate; } public boolean getHadSomeConnectedParticipantInPast() { return hadSomeConnectedParticipant; } public boolean getHangoutCreated() { return hangoutCreated; } public String getHangoutDomain() { return hangoutInfo.getDomain(); } public String getHangoutId() { return hangoutInfo.getId(); } public Hangout.Info getHangoutInfo() { return hangoutInfo; } public Hangout.RoomType getHangoutRoomType() { return hangoutInfo.getRoomType(); } public boolean getHasSomeConnectedParticipant() { for(Iterator iterator = memberMucJidToMeetingMember.values().iterator(); iterator.hasNext();) { if(((MeetingMember)iterator.next()).getCurrentStatus() == MeetingMember.Status.CONNECTED) { return true; } } return false; } public int getIncomingAudioVolume() { int i; if(nativePeerObject == 0L) i = 0; else i = nativeGetIncomingAudioVolume(); return i; } public boolean getIsHangoutLite() { return isHangoutLite; } public MeetingMember getMeetingMember(String s) { return (MeetingMember)memberMucJidToMeetingMember.get(s); } public int getMeetingMemberCount() { return memberMucJidToMeetingMember.size(); } public List getMeetingMembersOrderedByEntry() { ArrayList arraylist = new ArrayList(memberMucJidToMeetingMember.values()); Collections.sort(arraylist, new MeetingMember.SortByEntryOrder()); return arraylist; } public List getRoomHistory() { return roomHistory; } public MeetingMember getSelfMeetingMember() { return selfMeetingMember; } public String getUserJid() { return userJid; } public boolean initializeIncomingVideoRenderer(int i) { boolean flag; if(nativePeerObject == 0L) flag = false; else flag = nativeInitializeIncomingVideoRenderer(i); return flag; } void inviteToMeeting(AudienceData audiencedata, String s, boolean flag, boolean flag1) { if(nativePeerObject != 0L) { AudienceData audiencedata1 = ApiUtils.removeCircleIdNamespaces(audiencedata); HashSet hashset = new HashSet(); Iterator iterator = memberMucJidToMeetingMember.values().iterator(); do { if(!iterator.hasNext()) break; String s2 = EsPeopleData.extractGaiaId(((MeetingMember)iterator.next()).getId()); if(s2 != null) hashset.add(s2); } while(true); ArrayList arraylist = new ArrayList(audiencedata1.getUserCount()); PersonData apersondata[] = audiencedata1.getUsers(); int i = apersondata.length; int j = 0; while(j < i) { PersonData persondata = apersondata[j]; String s1 = persondata.getObfuscatedId(); if(TextUtils.isEmpty(s1)) Log.error((new StringBuilder("Person object with no id: ")).append(persondata).toString()); else if(hashset.contains(s1)) Log.debug((new StringBuilder("Skip adding: ")).append(s1).toString()); else arraylist.add(s1); j++; } ArrayList arraylist1 = new ArrayList(audiencedata1.getCircleCount()); CircleData acircledata[] = audiencedata1.getCircles(); int k = acircledata.length; for(int l = 0; l < k; l++) arraylist1.add(acircledata[l].getId()); if(arraylist.size() == 0 && arraylist1.size() == 0 && s != "TRANSFER") { Log.debug("Skipping invite since no one to invite"); } else { String as[] = new String[arraylist.size()]; arraylist.toArray(as); String as1[] = new String[arraylist1.size()]; arraylist1.toArray(as1); nativeInviteToMeeting(as, as1, s, flag, flag1); } } } public boolean isAudioMute() { boolean flag; if(nativePeerObject == 0L) flag = false; else flag = nativeIsAudioMute(); return flag; } public boolean isInHangout(Hangout.Info info) { boolean flag; if(info == null) flag = false; else flag = info.equals(hangoutInfo); return flag; } public boolean isOutgoingVideoStarted() { boolean flag; if(nativePeerObject == 0L) flag = false; else flag = nativeIsOutgoingVideoStarted(); return flag; } public void kickMeetingMember(String s, String s1) { if(nativePeerObject != 0L) nativeKickMeetingMember(s, s1); } public native int nativeGetCurrentState(); public void provideOutgoingVideoFrame(byte abyte0[], long l, int i) { if(nativePeerObject != 0L && getCurrentState() == GCommAppState.IN_MEETING_WITH_MEDIA) nativeProvideOutgoingVideoFrame(abyte0, l, i); } public void remoteMute(MeetingMember meetingmember) { if(nativePeerObject != 0L) nativeRemoteMute(meetingmember.getMucJid()); } public boolean renderIncomingVideoFrame(int i) { boolean flag; if(nativePeerObject == 0L) flag = false; else flag = nativeRenderIncomingVideoFrame(i); return flag; } public void sendInstantMessage(String s) { if(nativePeerObject != 0L) nativeSendInstantMessage(s); } public void sendInstantMessageToUser(String s, String s1) { if(nativePeerObject != 0L) nativeSendInstantMessageToUser(s, s1); } public void sendRingStatus(String s, String s1, String s2) { if(nativePeerObject != 0L) nativeSendRingStatus(s, s1, s2); } public void setAudioMute(boolean flag) { if(nativePeerObject != 0L) nativeSetAudioMute(flag); } public void setIncomingAudioVolume(int i) { if(nativePeerObject != 0L) { if(i < 0 || i > 255) throw new IllegalArgumentException((new StringBuilder("level is ")).append(i).toString()); nativeSetIncomingAudioVolume(i); } } public void setIncomingVideoParameters(int i, int j, int k, ScalingMode scalingmode, int l) { if(nativePeerObject != 0L) nativeSetIncomingVideoParameters(i, j, k, scalingmode.ordinal(), l); } public boolean setIncomingVideoRendererSurfaceSize(int i, int j, int k) { boolean flag; if(nativePeerObject == 0L) flag = false; else flag = nativeSetIncomingVideoRendererSurfaceSize(i, j, k); return flag; } public void setIncomingVideoSourceToSpeakerIndex(int i, int j) { if(nativePeerObject != 0L) nativeSetIncomingVideoSourceToSpeakerIndex(i, j); } public void setIncomingVideoSourceToUser(int i, String s) { if(nativePeerObject != 0L) nativeSetIncomingVideoSourceToUser(i, s); } public void setPresenceConnectionStatus(PresenceConnectionStatus presenceconnectionstatus) { if(nativePeerObject != 0L) nativeSetPresenceConnectionStatus(presenceconnectionstatus.ordinal()); } public void signoutAndDisconnect() { if(0L == nativePeerObject) { return; } nativeSignoutAndDisconnect(); if(nativePeerObject != 0L) { nativePeerDestroy(nativePeerObject); nativePeerObject = 0L; } } public int startIncomingVideoForSpeakerIndex(int i, int j, int k, int l) { int i1; if(nativePeerObject == 0L) i1 = 0; else i1 = nativeStartIncomingVideoForSpeakerIndex(i, j, k, l); return i1; } public int startIncomingVideoForUser(String s, int i, int j, int k) { int l; if(nativePeerObject == 0L) l = 0; else l = nativeStartIncomingVideoForUser(s, i, j, k); return l; } public void startOutgoingVideo(int i, int j) { if(nativePeerObject != 0L) nativeStartOutgoingVideo(i, j); } public void stopIncomingVideo(int i) { if(nativePeerObject != 0L) nativeStopIncomingVideo(i); } public void stopOutgoingVideo() { if(nativePeerObject != 0L) nativeStopOutgoingVideo(); } public void uploadCallgrokLog() { if(nativePeerObject != 0L) nativeUploadCallgrokLog(); } //============================================================================= // Inner class //============================================================================= public static enum DeviceCaptureType { LOW_RESOLUTION, MEDIUM_RESOLUTION; } public static enum Error { FATAL, INCONSISTENT_STATE, NETWORK, AUTHENTICATION, AUDIO_VIDEO_SESSION, UNKNOWN; } public static enum MeetingEnterError { UNKNOWN, TIMEOUT, BLOCKED_BY_SOMEONE_IN_HANGOUT, BLOCKING_SOMEONE_IN_HANGOUT, MAX_USERS, SERVER, MEDIA_START_TIMEOUT, AUDIO_VIDEO_SESSION, GREEN_ROOM_INFO, OUTDATED_CLIENT, HANGOUT_OVER, HANGOUT_ON_AIR; } public static enum GCommAppState { NONE, START, SIGNING_IN, SIGNED_IN, ENTERING_MEETING, IN_MEETING_WITHOUT_MEDIA, IN_MEETING_WITH_MEDIA; } public static enum PresenceConnectionStatus { UNKNOWN, CONNECTING, JOINING, CONNECTED; } public static enum ScalingMode { ZOOM_OUT_TO_FIT, ZOOM_IN_TO_FILL, AUTO_ZOOM; } public static class FrameDimensionsChangedMessageParams { public final RectangleDimensions getDimensions() { return dimensions; } public final int getRequestID() { return requestID; } private final RectangleDimensions dimensions; private final int requestID; public FrameDimensionsChangedMessageParams(int i, RectangleDimensions rectangledimensions) { requestID = i; dimensions = rectangledimensions; } } static class RoomEntry { public String toString() { return displayRoomName; } private final String displayRoomName; private final Date lastEnterTime = new Date(); RoomEntry(String s) { displayRoomName = s; } } public static class VideoSourceChangedMessageParams { private final int requestID; private final MeetingMember source; private final boolean videoAvailable; public VideoSourceChangedMessageParams(int i, MeetingMember meetingmember, boolean flag) { requestID = i; source = meetingmember; videoAvailable = flag; } public final int getRequestID() { return requestID; } public final MeetingMember getSource() { return source; } public final boolean isVideoAvailable() { return videoAvailable; } } }