diff --git a/app/src/main/java/com/tianrun/sipcall/call/InCallMeetingActivity.java b/app/src/main/java/com/tianrun/sipcall/call/InCallMeetingActivity.java index 1d1d887..1c25cc7 100644 --- a/app/src/main/java/com/tianrun/sipcall/call/InCallMeetingActivity.java +++ b/app/src/main/java/com/tianrun/sipcall/call/InCallMeetingActivity.java @@ -5,6 +5,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.KeyguardManager; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; @@ -28,6 +29,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.qmuiteam.qmui.skin.QMUISkinManager; import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.popup.QMUIPopups; import com.qmuiteam.qmui.widget.popup.QMUIQuickAction; @@ -36,7 +39,9 @@ import com.qmuiteam.qmui.widget.tab.QMUITabIndicator; import com.qmuiteam.qmui.widget.tab.QMUITabSegment; import com.tianrun.sipcall.R; import com.tianrun.sipcall.SipEngine; +import com.tianrun.sipcall.db.DBGroup; import com.tianrun.sipcall.db.DBUser; +import com.tianrun.sipcall.db.UserMeetingViews; import com.tianrun.sipcall.db.UserViews; import com.tianrun.sipcall.net.Net; import com.tianrun.sipcall.ui.TrAdapter; @@ -64,6 +69,7 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList private SMPercentFrameLayout localRenderLayout; private SMPercentFrameLayout remoteRenderLayout; private ImageButton incall_answer, incall_hangup; + private View imageButtonAddUser; private TextView show; GridView gridUser; QMUITabSegment mTabSegment; @@ -72,11 +78,13 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList private EngineServer engineServer; private int callid = -1;//当前通话的id + private String meetingName = ""; private String callnumber = "未知"; private String callstate = "未知"; private int calltype = 0; //0音频1视频 private boolean VIDEOSTATE = false; public static Intent incallIntent; + TrAdapter adapterUser; List allUsers = new ArrayList<>(); @@ -160,6 +168,12 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList mTabSegment = findViewById(R.id.ScreenType); mContentViewPager = findViewById(R.id.contentViewPager); + imageButtonAddUser = findViewById(R.id.imageButtonAddUser); + if (DBUser.mySelf.isManager) { + imageButtonAddUser.setVisibility(View.VISIBLE); + } else { + imageButtonAddUser.setVisibility(View.INVISIBLE); + } } private void initTabAndPager() { @@ -195,18 +209,21 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList } }); } - public void getMembers() - { + + public void getMembers() { Net.getGroupMenbers(callnumber, new HttpUtl.CallBack() { @Override public void onRequestComplete(int cmd, String result, Object orgs) { JSONObject jo = JSONObject.parseObject(result); + meetingName = jo.getString("topic"); JSONArray array = jo.getJSONArray("members_msg"); allUsers.clear(); - for(Object o:array) { - allUsers.add(new DBUser((JSONObject)o)); + for (Object o : array) { + allUsers.add(new DBUser((JSONObject) o)); } setUsers(); + + show.setText(meetingName + " " + callstate); } @Override @@ -218,20 +235,23 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList public void setUsers() { if (adapterUser == null) { - adapterUser = UIUtl.setList(this, gridUser, R.layout.list_item_user, allUsers, new TrAdapter.Callback() { + adapterUser = UIUtl.setList(this, gridUser, R.layout.list_item_user_meeting, allUsers, new TrAdapter.Callback() { @Override public void initCallback(Object data, int position, View prefabView, ViewGroup parent) { - UserViews views = null; + UserMeetingViews views = null; if (prefabView.getTag() == null) { - views = new UserViews(); + views = new UserMeetingViews(); views.textViewName = prefabView.findViewById(R.id.textViewName); views.textViewNum = prefabView.findViewById(R.id.textViewNum); views.imageViewStatus = prefabView.findViewById(R.id.imageViewStatus); views.imageViewAddflag = prefabView.findViewById(R.id.imageViewAddflag); views.imageViewPhoneIcon = prefabView.findViewById(R.id.imageView3PhoneIcon); + views.memberStatus1 = prefabView.findViewById(R.id.memberStatus1); + views.memberStatus2 = prefabView.findViewById(R.id.memberStatus2); + views.memberStatus3 = prefabView.findViewById(R.id.memberStatus3); prefabView.setTag(views); } else { - views = (UserViews) (prefabView.getTag()); + views = (UserMeetingViews) (prefabView.getTag()); } DBUser d = (DBUser) data; views.textViewName.setText(d.name); @@ -256,6 +276,9 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList @Override public void clickCallback(Object data, AdapterView parent, View view, int position, long id) { + if (!DBUser.mySelf.isManager) { + return; + } DBUser d = (DBUser) data; QMUIQuickAction qa = QMUIPopups.quickAction(InCallMeetingActivity.this, QMUIDisplayHelper.dp2px(InCallMeetingActivity.this, 56), @@ -265,6 +288,128 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList .skinManager(QMUISkinManager.defaultInstance(InCallMeetingActivity.this)) .edgeProtection(QMUIDisplayHelper.dp2px(InCallMeetingActivity.this, 20)); if (DBUser.mySelf.isManager) { + if (d.isMute) { + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("取消禁言").onClick( + new QMUIQuickAction.OnClickListener() { + @Override + public void onClick(QMUIQuickAction quickAction, QMUIQuickAction.Action action, int position) { + quickAction.dismiss(); + Net.unmuteMember4Group(callnumber, d.phone, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + } + }, null); + } + } + )); + } else { + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("禁言").onClick( + new QMUIQuickAction.OnClickListener() { + @Override + public void onClick(QMUIQuickAction quickAction, QMUIQuickAction.Action action, int position) { + quickAction.dismiss(); + Net.muteMember4Group(callnumber, d.phone, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + } + }, null); + } + } + )); + } + + if (VIDEOSTATE) { + if (d.isVMute) { + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("回复视频").onClick( + new QMUIQuickAction.OnClickListener() { + @Override + public void onClick(QMUIQuickAction quickAction, QMUIQuickAction.Action action, int position) { + quickAction.dismiss(); + Net.unvmuteMember4Group(callnumber, d.phone, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + } + }, null); + } + } + )); + } else { + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("停止视频").onClick( + new QMUIQuickAction.OnClickListener() { + @Override + public void onClick(QMUIQuickAction quickAction, QMUIQuickAction.Action action, int position) { + quickAction.dismiss(); + Net.vmuteMember4Group(callnumber, d.phone, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + } + }, null); + } + } + )); + } + + if (d.isLayout) { + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("恢复布局").onClick( + new QMUIQuickAction.OnClickListener() { + @Override + public void onClick(QMUIQuickAction quickAction, QMUIQuickAction.Action action, int position) { + quickAction.dismiss(); + Net.vidlayoutMember4Group(callnumber, d.phone, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + } + }, null); + } + } + )); + } else { + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("切换布局").onClick( + new QMUIQuickAction.OnClickListener() { + @Override + public void onClick(QMUIQuickAction quickAction, QMUIQuickAction.Action action, int position) { + quickAction.dismiss(); + Net.vidfloorMember4Group(callnumber, d.phone, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + } + }, null); + } + } + )); + } + } + qa.addAction(new QMUIQuickAction.Action().icon(android.R.drawable.ic_delete).text("移除").onClick( new QMUIQuickAction.OnClickListener() { @Override @@ -471,6 +616,85 @@ public class InCallMeetingActivity extends TrBaseActivity implements OnClickList } } + public void addMember(View v) { + showUsersMultiChoiceDialog(); + } + + boolean containMember(String phone) { + for (DBUser u : allUsers) { + if (u.phone.equals(phone)) { + return true; + } + } + return false; + } + + private void showUsersMultiChoiceDialog() { + List list = new ArrayList<>(); + List listPhone = new ArrayList<>(); + for (DBUser u : DBUser.allUser) { + if (!containMember(u.phone)) { + listPhone.add(u.phone); + list.add(u.phone + " | " + u.name); + } + } + if (list.size() == 0) { + UIUtl.toastI("所有分机已经添加"); + return; + } + + final String[] items = new String[list.size()]; + list.toArray(items); + final QMUIDialog.MultiCheckableDialogBuilder builder = new QMUIDialog.MultiCheckableDialogBuilder(this) + .setTitle("选择要加入的分机号") +// .setCheckedItems(new int[]{1, 3}) + .setSkinManager(QMUISkinManager.defaultInstance(this)) + .addItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }); + builder.addAction("取消", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + } + }); + builder.addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + int[] selectIndexs = builder.getCheckedItemIndexes(); + if (selectIndexs.length > 0) { + List list = new ArrayList<>(); + String members = ""; + for (int i = 0; i < selectIndexs.length; i++) { + String phNum = listPhone.get(selectIndexs[i]); + members = members + phNum + ","; + } + + Net.addMember2Group(callnumber, members, new HttpUtl.CallBack() { + @Override + public void onRequestComplete(int cmd, String result, Object orgs) { + getMembers(); + } + + @Override + public void onRequestError(int cmd, String result, Object orgs) { + + } + }, null); + } + + dialog.dismiss(); + } + }); + + int mCurrentDialogStyle = com.qmuiteam.qmui.R.style.QMUI_Dialog; + builder.create(mCurrentDialogStyle).show(); + } + + @SuppressLint("NewApi") void fullScreen() { int flag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE diff --git a/app/src/main/java/com/tianrun/sipcall/db/DBUser.java b/app/src/main/java/com/tianrun/sipcall/db/DBUser.java index a7a280a..56aa42b 100644 --- a/app/src/main/java/com/tianrun/sipcall/db/DBUser.java +++ b/app/src/main/java/com/tianrun/sipcall/db/DBUser.java @@ -21,6 +21,10 @@ public class DBUser { public boolean isManager = false; public boolean isAddFlag = false; + public boolean isMute = false; + public boolean isVMute = false; + public boolean isLayout = false; + public DBUser(String name, String phone, String status) { this.name = name; this.phone = phone; diff --git a/app/src/main/java/com/tianrun/sipcall/db/UserMeetingViews.java b/app/src/main/java/com/tianrun/sipcall/db/UserMeetingViews.java new file mode 100644 index 0000000..7055e29 --- /dev/null +++ b/app/src/main/java/com/tianrun/sipcall/db/UserMeetingViews.java @@ -0,0 +1,10 @@ +package com.tianrun.sipcall.db; + +import android.widget.ImageView; +import android.widget.TextView; + +public class UserMeetingViews extends UserViews { + public ImageView memberStatus1; + public ImageView memberStatus2; + public ImageView memberStatus3; +} \ No newline at end of file diff --git a/app/src/main/java/com/tianrun/sipcall/login/MainActivity.java b/app/src/main/java/com/tianrun/sipcall/login/MainActivity.java index 9273021..3033fb4 100644 --- a/app/src/main/java/com/tianrun/sipcall/login/MainActivity.java +++ b/app/src/main/java/com/tianrun/sipcall/login/MainActivity.java @@ -478,7 +478,7 @@ public class MainActivity extends TrBaseActivity { members = members + phNum + ","; } - Net.addUser2Group(currSelectData.id, members, new HttpUtl.CallBack() { + Net.addMember2Group(currSelectData.id, members, new HttpUtl.CallBack() { @Override public void onRequestComplete(int cmd, String result, Object orgs) { Net.getGroupMenbers(currSelectData.id, null, currSelectData.id); diff --git a/app/src/main/java/com/tianrun/sipcall/net/Net.java b/app/src/main/java/com/tianrun/sipcall/net/Net.java index 7ef9a70..be989f3 100644 --- a/app/src/main/java/com/tianrun/sipcall/net/Net.java +++ b/app/src/main/java/com/tianrun/sipcall/net/Net.java @@ -26,6 +26,12 @@ public class Net { public static final int CMD_deleteGroup = 7007; public static final int CMD_addUser2Group = 7008; public static final int CMD_kickMember4Group = 7009; + public static final int CMD_muteMember4Group = 7010; + public static final int CMD_unmuteMember4Group = 7011; + public static final int CMD_vmuteMember4Group = 7012; + public static final int CMD_unvmuteMember4Group = 7013; + public static final int CMD_vidlayoutMember4Group = 7014; + public static final int CMD_vidfloorMember4Group = 7015; static HttpUtl.CallBack _callback = new HttpUtl.CallBack() { @Override @@ -123,9 +129,9 @@ public class Net { } //TODO:确认下参数 - public static void addUser2Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + public static void addMember2Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { String url = "http://" + ip + ":" + port + "/api/conferences/conference/add"; - String _params = "opr_nbr=" + task_uuid+"&opr_member="+members; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members; Object[] params = {callBack, orgs}; HttpUtl.doPostAsyn(url, _params, _callback, CMD_addUser2Group, params); } @@ -133,15 +139,51 @@ public class Net { //TODO:确认下参数 public static void kickMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; - String _params = "opr_nbr=" + task_uuid+"&opr_member="+members+"&opr_action=kick"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=kick"; Object[] params = {callBack, orgs}; HttpUtl.doPostAsyn(url, _params, _callback, CMD_kickMember4Group, params); } -// public static void updateGroup(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { -// String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; -// String _params = "opr_nbr=" + task_uuid+"&opr_member="+members; -// Object[] params = {callBack, orgs}; -// HttpUtl.doPostAsyn(url, _params, _callback, CMD_updateGroup, params); -// } + //mute:禁言、unmute:取消禁言、vmute:关闭视频、unvmute:恢复视频、kick:踢出、vidlayout:切换布局、vidfloor:切换到主画面 + public static void muteMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=mute"; + Object[] params = {callBack, orgs}; + HttpUtl.doPostAsyn(url, _params, _callback, CMD_muteMember4Group, params); + } + + public static void unmuteMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=unmute"; + Object[] params = {callBack, orgs}; + HttpUtl.doPostAsyn(url, _params, _callback, CMD_unmuteMember4Group, params); + } + + public static void vmuteMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=vmute"; + Object[] params = {callBack, orgs}; + HttpUtl.doPostAsyn(url, _params, _callback, CMD_vmuteMember4Group, params); + } + + public static void unvmuteMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=unvmute"; + Object[] params = {callBack, orgs}; + HttpUtl.doPostAsyn(url, _params, _callback, CMD_unvmuteMember4Group, params); + } + + public static void vidlayoutMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=vidlayout"; + Object[] params = {callBack, orgs}; + HttpUtl.doPostAsyn(url, _params, _callback, CMD_vidlayoutMember4Group, params); + } + + public static void vidfloorMember4Group(String task_uuid, String members, HttpUtl.CallBack callBack, Object orgs) { + String url = "http://" + ip + ":" + port + "/api/conferences/conference/update"; + String _params = "opr_nbr=" + task_uuid + "&opr_member=" + members + "&opr_action=vidfloor"; + Object[] params = {callBack, orgs}; + HttpUtl.doPostAsyn(url, _params, _callback, CMD_vidfloorMember4Group, params); + } } diff --git a/app/src/main/res/drawable-hdpi/bg3.9.png b/app/src/main/res/drawable-hdpi/bg3.9.png new file mode 100644 index 0000000..e5fc459 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/bg3.9.png differ diff --git a/app/src/main/res/layout/incallactivity.xml b/app/src/main/res/layout/incallactivity.xml index e89ac76..b7118d6 100644 --- a/app/src/main/res/layout/incallactivity.xml +++ b/app/src/main/res/layout/incallactivity.xml @@ -77,7 +77,7 @@ diff --git a/app/src/main/res/layout/incallmeetingactivity.xml b/app/src/main/res/layout/incallmeetingactivity.xml index fa7a472..1a2f36a 100644 --- a/app/src/main/res/layout/incallmeetingactivity.xml +++ b/app/src/main/res/layout/incallmeetingactivity.xml @@ -13,6 +13,18 @@ android:layout_height="match_parent" android:background="#15516C" /> + + @@ -51,6 +63,7 @@ android:id="@+id/remote_video_view" android:layout_width="wrap_content" android:layout_height="wrap_content" /> + - - @@ -120,4 +122,16 @@ android:layout_weight="1" android:fitsSystemWindows="true" /> + + diff --git a/app/src/main/res/layout/list_item_user_meeting.xml b/app/src/main/res/layout/list_item_user_meeting.xml new file mode 100644 index 0000000..cc5bc72 --- /dev/null +++ b/app/src/main/res/layout/list_item_user_meeting.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file