Skip to content
This repository has been archived by the owner on Sep 2, 2021. It is now read-only.

rongcloud-archive/sealmic-android

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

8 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

SealMic-Android

็›ฎๅฝ•

ๅ…ณ้”ฎไธšๅŠก้€ป่พ‘่ฏดๆ˜Ž

็™ปๅฝ•ๆต็จ‹

ๅŠ ๅ…ฅๆˆฟ้—ดๆต็จ‹

  • ไปŽๆˆฟ้—ดๅˆ—่กจ่ฟ›ๅ…ฅ็š„ๆˆฟ้—ด้ป˜่ฎค้ƒฝๆ˜ฏ่ง‚ไผ—่บซไปฝ่ฟ›ๅ…ฅ๏ผŒๅชๆœ‰ไปŽๅˆ›ๅปบๆˆฟ้—ด็š„ๅ…ฅๅฃ่ฟ›ๅ…ฅๆ—ถไผšไปฅไธปๆŒไบบ่บซไปฝ่ฟ›ๅ…ฅ
  • ไธปๆŒไบบ
    • ๆ นๆฎๆˆฟ้—ด ID ๅ…ˆๅŠ ๅ…ฅ IM ่Šๅคฉๅฎค
    • ๅŠ ๅ…ฅ่ŠๅคฉๅฎคๆˆๅŠŸๅŽๅŠ ๅ…ฅ RTC ่Šๅคฉๅฎค
    • ๅŠ ๅ…ฅ่ŠๅคฉๅฎคๆˆๅŠŸๅŽ่ฐƒ็”จ RTC ๆŽฅๅฃๅ‘ๅธƒ่‡ชๅทฑ็š„้Ÿณ้ข‘ๆต
    • ๅปถ่ฟŸ 1.5-1 ็ง’๏ผˆๆ—ถ้•ฟๅพ…ๅฎš๏ผ‰ๅฐ†ๅ‘ๅธƒๅŽ็š„็›ดๆ’ญ liveUrl ่ฎพ็ฝฎๅˆฐ KV ไธญ
    • ๅปถ่ฟŸ 1.5-1 ็ง’๏ผˆๆ—ถ้•ฟๅพ…ๅฎš๏ผ‰ๅ–่Šๅคฉๅฎคไธญ้บฆไฝๅŠ่ฎฒ่ฏ็Šถๆ€็š„็›ธๅ…ณ KV ็„ถๅŽๆ›ดๆ–ฐไธ€้้บฆไฝๅฝ“ๅ‰็Šถๆ€
  • ่ง‚ไผ—
    • ๆ นๆฎๆˆฟ้—ด ID ๅŠ ๅ…ฅ่Šๅคฉๅฎค
    • ๅปถ่ฟŸ 0.5-1 ็ง’๏ผˆๆ—ถ้•ฟๅพ…ๅฎš๏ผ‰ๅ– KV ไธญๅญ˜ๆ”พ็š„ liveUrlใ€้บฆไฝใ€่ฎฒ่ฏ็Šถๆ€็š„ใ€ๅฝ“ๅ‰ๆ˜ฏๅฆๆœ‰ไบบๆŽ’้บฆ็š„ KV๏ผŒๅ…ถไธญ liveUrl ๅฆ‚ๅญ˜ๅœจๅˆ™่ฐƒ็”จ RTC ๆŽฅๅฃ่ฎข้˜…็›ดๆ’ญๅˆๆต๏ผŒ้บฆไฝๅŠ่ฎฒ่ฏ็Šถๆ€็š„ value ๅ–ๅ‡บๅŽๆ›ดๆ–ฐไธ€้้บฆไฝๅฝ“ๅ‰็Šถๆ€ใ€ๅฝ“ๅ‰ๆ˜ฏๅฆๆœ‰ไบบๆŽ’้บฆ็š„ value ๅ–ๅ‡บๅŽๆ›ดๆ–ฐๅณไธŠ่ง’ๅฐ็บข็‚น็Šถๆ€

้บฆไฝ็›ธๅ…ณ็Šถๆ€ๆ”นๅ˜ๆต็จ‹

  • ็›‘ๅฌ IM ่Šๅคฉๅฎคไธญ็š„ๆถˆๆฏ๏ผŒๅฆ‚ๆžœๆ˜ฏ KV ๆ›ดๆ–ฐๆ—ถๅ‘้€็š„ๆถˆๆฏ็ฑปๅž‹ๅˆ™ๆ นๆฎๅ…ทไฝ“ๆ›ดๆ–ฐ็š„ Key ๆฅๅˆ†ๅˆซ่ฟ›่กŒไธ‹่ฟฐๅค„็†
  • ็›ธๅ…ณ key ็š„ๆ ผๅผๅฆ‚ไธ‹:
    //็›ดๆ’ญๆตๅœฐๅ€๏ผš
    "liveUrl":"http://abc.com"
    
    //้บฆไฝ็›ธๅ…ณ๏ผš
    //ๆœ€ๅŽ็š„ 0-8 ่กจ็คบไนไธช้บฆไฝ๏ผŒ0 ไธบไธปๆŒไบบ
    "sealmic_position_0":
     {
          "userId":"abcde",
      	//0๏ผšๆญฃๅธธ็Šถๆ€๏ผˆๆญคๆ—ถ userId ๅญ˜ๅœจๅˆ™่ฏดๆ˜Ž้บฆไฝไธŠๆœ‰ไบบ๏ผŒๅฆๅˆ™่กจ็คบๅฝ“ๅ‰ไธบ็ฉบ้บฆไฝ๏ผ‰๏ผŒ1:้”ๅฎš็Šถๆ€๏ผˆไธๅ…่ฎธไธŠไบบ๏ผ‰๏ผŒ2:้—ญ้บฆ็Šถๆ€๏ผˆๅฝ“ๅ‰้บฆไฝไธŠ็š„็”จๆˆท่ขซ็ฆ่จ€๏ผ‰
      	"state":0,
      	//0-8 ่กจ็คบไนไธช้บฆไฝ
      	"position":0
     }
    
    //ๆญฃๅœจๅ‘่จ€็›ธๅ…ณ:
    //ๆœ€ๅŽ็š„ 0-8 ่กจ็คบไนไธช้บฆไฝ๏ผŒ0 ไธบไธปๆŒไบบ
    "speaking_0":
    {
       //0 ่กจ็คบๅฝ“ๅ‰ๆœชๅ‘่จ€๏ผŒ1 ่กจ็คบๆญฃๅœจๅ‘่จ€
       "speaking":0,
       //0-8 ่กจ็คบไนไธช้บฆไฝ
       "position":0
    }
    
    //ๆ˜ฏๅฆๆœ‰ไบบๆŽ’้บฆ็›ธๅ…ณ๏ผš
    //0 ่กจ็คบๆฒกไบบๅœจๆŽ’้บฆ๏ผŒ1 ่กจ็คบๆœ‰ไบบๅœจๆŽ’้บฆ
    "applied_mic_list_empty":0
    
  • ๅฆ‚ๆžœๆ˜ฏ liveUrl ๆ›ดๆ–ฐ็š„ Key
    • ไป…่ง‚ไผ—่บซไปฝ้œ€่ฆๅค„็†๏ผŒๅฆ‚ๆžœๅทฒ็ป่ฎข้˜…่ฟ‡ไธ”ๆ›ดๆ–ฐๅŽ็š„ๅ’Œไน‹ๅ‰่ฎข้˜…็š„็›ธๅŒไธ้œ€่ฆๅค„็†๏ผŒๆฒกๆœ‰่ฎข้˜…่ฟ‡ๆˆ–ๆ›ดๆ–ฐๅŽๅ’Œไน‹ๅ‰็š„ไธๅŒๅˆ™้œ€่ฆ่ฐƒ็”จ RTC ๆŽฅๅฃ้‡ๆ–ฐ่ฎข้˜…่ฟ™ๆฌกๆ›ดๆ–ฐๅŽ็š„ liveUrl
  • ๅฆ‚ๆžœๆ˜ฏๅ‘่จ€็Šถๆ€ๆ›ดๆ–ฐ็š„ Key
  • ๆ นๆฎ็›ธๅ…ณ KV ๆ›ดๆ–ฐ UI ไธŠๆŒ‡ๅฎš้บฆไฝ็š„ๅŠจ็”ป็Šถๆ€ๅณๅฏ
  • ๅฆ‚ๆžœๆ˜ฏๆŽ’้บฆ็Šถๆ€ๅ˜ๆ›ด็š„ Key
  • ๆ นๆฎ KV ๆ›ดๆ–ฐๅณไธŠ่ง’ๅฐ็บข็‚น็Šถๆ€ๅณๅฏ
  • ๅฆ‚ๆžœๆ˜ฏ้บฆไฝ็›ธๅ…ณๆ›ดๆ–ฐ็š„ Key
    • ๆ นๆฎๅ…ทไฝ“็š„ KV ๆ›ดๆ–ฐๅฏนๅบ”้บฆไฝ็š„ UI
    • ๆ นๆฎๆ›ดๆ–ฐๅ‰ๅŽๅŒไธ€้บฆไฝ็š„็Šถๆ€ๆ”นๅ˜ๆฅ่ฟ›่กŒไธ‹่ฟฐๅค„็†๏ผˆไธ‹้ขๅช้œ€่ฆๅค„็†ๅ’Œ่‡ชๅทฑ็›ธๅ…ณ็š„่ง’่‰ฒ่ฝฌๅŒ–้€ป่พ‘๏ผŒ้บฆไฝไธŠ้ž่‡ชๅทฑ็š„ๅ…ถๅฎƒ็”จๆˆทๆœ‰ไธŠ้บฆไธ‹้บฆๆ—ถ้œ€่ฆๅš็š„่ฎข้˜…ๆตๆ“ไฝœๅœจ RTC ๆˆฟ้—ดๅ˜ๅŠจ็›ธๅ…ณ็š„ๅ›ž่ฐƒไธญ่ฟ›่กŒๅค„็†๏ผ‰:
      //ๆ”ถๅˆฐDemo serverไธ‹ๅ‘็š„KV
          ChatRoomKVNotiMessage chatRoomKVNotiMessage = eventMicKVMessage.getChatRoomKVNotiMessage();
          String json = chatRoomKVNotiMessage.getValue();
          String key = chatRoomKVNotiMessage.getKey();
          String extra = chatRoomKVNotiMessage.getExtra();
          //KVไธญๆบๅธฆ็š„็›ธๅ…ณ็ฑปๅž‹่ฏดๆ˜Ž
          KvExtraBean kvExtraBean = new Gson().fromJson(extra, KvExtraBean.class);
      
          //ๅฝ“ๅ‰ๆˆฟ้—ดid
          String roomId = CacheManager.getInstance().getRoomId();
          //ๅฝ“ๅ‰็”จๆˆทid
          String userId = CacheManager.getInstance().getUserId();
          //ๅฝ“ๅ‰็™ปๅฝ•็”จๆˆทๆœฌๅœฐไฟๅญ˜็š„้บฆไฝไฟกๆฏ๏ผˆๅฆ‚ๆžœๆœ‰ๅˆ™่ฏดๆ˜Žๅฝ“ๅ‰็”จๆˆทๅœจ้บฆไฝไธŠ๏ผ‰
          MicBean currentMicBean = CacheManager.getInstance().getMicBean();
          //ๅฝ“ๅ‰็”จๆˆท็š„่ง’่‰ฒ
          int currentUserType = CacheManager.getInstance().getUserRoleType();
      
          SpeakBean newSpeakBean = null;
          AppliedMicListBean appliedMicListBean = null;
      
          final MicBean newMicBean;
          //ไธ‹ๅ‘็š„KV้€š็Ÿฅๅ…ฑ4็ฑปKV๏ผŒๅˆ†ๆƒ…ๅ†ต่งฃๆž
          if (key.contains(SealMicConstant.KV_MIC_POSITION_PREFIX)) {
              //ๆญคๆฌก KV ๆถˆๆฏๆ‰€ๆบๅธฆ็š„ๆœ€ๆ–ฐ็š„้บฆไฝไฟกๆฏ
              newMicBean = new Gson().fromJson(json, MicBean.class);
              //ๆ›ดๆ–ฐkvๆ—ถๆœฌๅœฐๆ›ดๆ–ฐ้บฆไฝmap
              localMicBeanMap.put(newMicBean.getPosition(), newMicBean);
              if (newMicBean != null) {
                  //1. ๆ นๆฎๆ–ฐ่ฟ”ๅ›žๆฅ็š„KVๆ›ดๆ–ฐUI
                  if (newMicBean.getState() == MicState.NORMAL.getState()) {
                      //็”จๆˆทไธ‹้บฆ
                      dynamicAvatarViewList.get(newMicBean.getPosition()).micDelUser();
                      //ไธปๆŒไบบ
                      if (UserRoleType.HOST.isHost(CacheManager.getInstance().getUserRoleType())) {
                          if (newMicBean.getUserId().equals(CacheManager.getInstance().getUserId())) {
                              micTextLayoutList.get(newMicBean.getPosition()).HasMic("ๅท้บฆไฝ");
                          } else {
                              micTextLayoutList.get(newMicBean.getPosition()).NullMic("ๅท้บฆไฝ");
                          }
                      }
                      //่ฟž้บฆ่€…
                      if (UserRoleType.CONNECT_MIC.isConnectMic(CacheManager.getInstance().getUserRoleType()) ||
                              UserRoleType.AUDIENCE.isAudience(CacheManager.getInstance().getUserRoleType())) {
                          micTextLayoutList.get(newMicBean.getPosition()).NullMic("ๅท้บฆไฝ");
                      }
                      List<String> ids = new ArrayList<>();
                      ids.add(newMicBean.getUserId());
                      chatRoomViewModel.userBatch(ids);
                      final MicBean finalNewMicBean = newMicBean;
                      chatRoomViewModel.getUserinfolistRepoLiveData().observe(getViewLifecycleOwner(), new Observer<NetResult<List<RoomMemberRepo.MemberBean>>>() {
                          @Override
                          public void onChanged(NetResult<List<RoomMemberRepo.MemberBean>> listNetResult) {
                              List<RoomMemberRepo.MemberBean> memberBeanList = listNetResult.getData();
                              if (memberBeanList != null && memberBeanList.size() != 0) {
                                  RoomMemberRepo.MemberBean memberBean = memberBeanList.get(0);
                                  if ("".equals(memberBean.getUserName())) {
                                      micTextLayoutList.get(finalNewMicBean.getPosition()).HasMic(finalNewMicBean.getPosition() + "ๅท้บฆ");
                                  } else {
                                      micTextLayoutList.get(finalNewMicBean.getPosition()).HasMic(memberBean.getUserName());
                                  }
                                  GlideManager.getInstance().setUrlImage(getView(),
                                          memberBean.getPortrait(),
                                          dynamicAvatarViewList.get(finalNewMicBean.getPosition()).getUserImg());
      
                              }
                          }
                      });
                  } else if (newMicBean.getState() == MicState.LOCK.getState()) {
                      //้บฆไฝ้”ๅฎš
                      dynamicAvatarViewList.get(newMicBean.getPosition()).lockMic();
                  } else if (newMicBean.getState() == MicState.CLOSE.getState()) {
                      //้—ญ้บฆ
                      dynamicAvatarViewList.get(newMicBean.getPosition()).bankMic();
                  }
      
                  //2. ่ขซ็‚น็š„ไบบๆ˜ฏ่‡ชๅทฑ
                  if (newMicBean.getUserId().equals(userId)) {
                      if (UserRoleType.AUDIENCE.isAudience(currentUserType)) {
                          //่ง‚ไผ—ไธŠ้บฆ
                          chatRoomViewModel.switchMic(roomId, CacheManager.getInstance().getUserRoleType(),
                                  newMicBean.getPosition() == 0
                                          ? UserRoleType.HOST.getValue()
                                          : UserRoleType.CONNECT_MIC.getValue(),
                                  new SealMicResultCallback<Map<String, String>>() {
                                      @Override
                                      public void onSuccess(Map<String, String> stringStringMap) {
                                          //ๅˆ‡ๆข่ง’่‰ฒไธŠ้บฆๆˆๅŠŸไน‹ๅŽ๏ผŒๆ›ดๆ–ฐๅฝ“ๅ‰็”จๆˆท่ง’่‰ฒ
                                          ThreadManager.getInstance().runOnUIThread(new Runnable() {
                                              @Override
                                              public void run() {
                                                  SLog.e(SLog.TAG_SEAL_MIC, "่ง‚ไผ—ไธŠ้บฆๆˆๅŠŸ");
                                                  //ไธŠ้บฆๆˆๅŠŸๅŽ็”จๆˆท่ง’่‰ฒๅ˜ไธบไธปๆŒไบบๆˆ–่€…่ฟž้บฆ่€…๏ผŒๅŒๆ—ถVๅฑ‚ๅ“ๅบ”ๅ˜ๅŒ–
                                                  EventBus.getDefault().post(
                                                          newMicBean.getPosition() == 0
                                                                  ? new Event.EventUserRoleType(UserRoleType.HOST, true)
                                                                  : new Event.EventUserRoleType(UserRoleType.CONNECT_MIC, true));
                                                  //ไธŠ้บฆๆˆๅŠŸไน‹ๅŽ้ป˜่ฎค้บฆๅ…‹้ฃŽๅฏ็”จ
                                                  fragmentChatRoomBinding.chatroomVoiceIn.setSelected(false);
                                                  RTCClient.getInstance().setLocalMicEnable(true);
                                              }
                                          });
                                      }
      
                                      @Override
                                      public void onFail(int errorCode) {
      
                                      }
                                  });
                      }
                      //ๅฝ“ๅ‰็”จๆˆทไธๅœจ้บฆไฝๆˆ–่€…ๅฝ“ๅ‰็”จๆˆทๆ‰€ๅœจ้บฆไฝ็š„็Šถๆ€ๅ’Œๆ–ฐ็š„้บฆไฝ็Šถๆ€ไธๅŒน้…
                      if (currentMicBean == null || currentMicBean.getState() != newMicBean.getState()) {
                          //ๆ นๆฎๆ–ฐ้บฆไฝ็š„็Šถๆ€ๆ›ดๆ–ฐๆœฌๅœฐ็š„้บฆๅ…‹้ฃŽ็Šถๆ€๏ผˆ็ฆ็”จๆˆ–ๅฏ็”จ๏ผ‰
                          //ๅบ•้ƒจๆ ๅ›พๆ ‡๏ผŒๆŽงๅˆถๆ˜ฏๅฆไฝฟ็”จ้บฆๅ…‹้ฃŽ
                          //ๆญฃๅธธ: ๅฏ็”จ ๆ‰“ๅผ€ๆ–นๆณ•  ้—ญ้บฆ: ็ฆ็”จ ๅ…ณ้—ญๆ–นๆณ•
                          if (newMicBean.getState() == MicState.NORMAL.getState()) {
                              fragmentChatRoomBinding.chatroomVoiceIn.setSelected(false);
                              RTCClient.getInstance().setLocalMicEnable(true);
                          } else if (newMicBean.getState() == MicState.CLOSE.getState()) {
                              fragmentChatRoomBinding.chatroomVoiceIn.setSelected(true);
                              RTCClient.getInstance().setLocalMicEnable(false);
                          }
                      }
      
                      //ๅœจๆœฌๅœฐไฟๅญ˜็š„้บฆไฝไฟกๆฏๆ”นๅ˜ๅ‰ๅฐ†ๆ‰€ๅœจ้บฆไฝ็š„ๅ‘่จ€็Šถๆ€ๆ‰‹ๅŠจ่ฎพ็ฝฎไธบ 0 ไธ€ๆฌก๏ผŒ่ฎพ็ฝฎๅˆฐKV้‡Œ
                      SpeakBean speakBean = new SpeakBean(0, currentMicBean != null ? currentMicBean.getPosition() : 0);
                      String speakingValue = new Gson().toJson(speakBean);
                      IMClient.getInstance().setChatRoomSpeakEntry(
                              roomId,
                              SealMicConstant.KV_SPEAK_POSITION_PREFIX + (currentMicBean != null ? currentMicBean.getPosition() : 0),
                              speakingValue);
      
                      //ๅฐ†ๆœฌๅœฐไฟๅญ˜็š„ๅฝ“ๅ‰็”จๆˆท็š„้บฆไฝไฟกๆฏๆ›ดๆ–ฐไธบๆ–ฐ้บฆไฝ็š„ไฟกๆฏ
                      CacheManager.getInstance().cacheMicBean(newMicBean);
                      //ไธŠ้บฆๆƒ…ๅ†ตไธ‹ๅˆทๆ–ฐๆœฌๅœฐmap
                      localMicBeanMap.put(newMicBean.getPosition(), newMicBean);
      
                  } else {
      
                      //ๅฆ‚ๆžœ changeType ไธๆ˜ฏ ๏ผˆ4๏ผŒ5๏ผŒ6๏ผ‰ไธญ็š„ไธ€็งๅนถไธ”ๅฝ“ๅ‰็”จๆˆท็š„้บฆไฝไฟกๆฏๅญ˜ๅœจ๏ผˆไนŸๅฐฑๆ˜ฏๅฝ“ๅ‰็”จๆˆทๅœจ้บฆไฝไธŠ๏ผ‰ๅนถไธ”ๆ–ฐ้บฆไฝ็š„ๅบๅท็ญ‰ไบŽๅฝ“ๅ‰็”จๆˆทๆ—ถ
                      int changeType = kvExtraBean.getChangeType();
                      //456 3็งๆƒ…ๅ†ตไธบไธ็”จไธ‹้บฆ็š„ๆƒ…ๅ†ต
                      if (changeType != 4
                              && changeType != 5
                              && changeType != 6
                              && currentMicBean != null
                              && currentMicBean.getPosition() == newMicBean.getPosition()) {
                          //ไธปๆ’ญไธ‹้บฆ
                          chatRoomViewModel.switchMic(roomId,
                                  CacheManager.getInstance().getUserRoleType(),
                                  UserRoleType.AUDIENCE.getValue(),
                                  new SealMicResultCallback<Map<String, String>>() {
                                      @Override
                                      public void onSuccess(Map<String, String> stringStringMap) {
                                          //ๅˆ‡ๆข่ง’่‰ฒไธ‹้บฆๆˆๅŠŸไน‹ๅŽ๏ผŒๆ›ดๆ–ฐๅฝ“ๅ‰็”จๆˆท่ง’่‰ฒ
                                          ThreadManager.getInstance().runOnUIThread(new Runnable() {
                                              @Override
                                              public void run() {
                                                  SLog.e(SLog.TAG_SEAL_MIC, "ไธปๆ’ญไธ‹้บฆๆˆๅŠŸ");
                                                  //ไธ‹้บฆๆˆๅŠŸๅŽ็”จๆˆท่ง’่‰ฒๅ˜ไธบ่ง‚ไผ—๏ผŒๅŒๆ—ถVๅฑ‚ๅ“ๅบ”ๅ˜ๅŒ–
                                                  EventBus.getDefault().post(new Event.EventUserRoleType(UserRoleType.AUDIENCE, true));
                                                  boolean outSelected = fragmentChatRoomBinding.chatroomVoiceOut.isSelected();
                                                  RTCClient.getInstance().setSpeakerEnable(!outSelected);
                                              }
                                          });
                                      }
      
                                      @Override
                                      public void onFail(int errorCode) {
      
                                      }
                                  });
      
                          //ๅœจๆœฌๅœฐไฟๅญ˜็š„้บฆไฝไฟกๆฏๆ”นๅ˜ๅ‰ๅฐ†ๆ‰€ๅœจ้บฆไฝ็š„ๅ‘่จ€็Šถๆ€ๆ‰‹ๅŠจ่ฎพ็ฝฎไธบ 0 ไธ€ๆฌก
                          //่ฎพ็ฝฎๅˆฐKV้‡Œ
                          SpeakBean speakBean = new SpeakBean(0, currentMicBean.getPosition());
                          String speakingValue = new Gson().toJson(speakBean);
                          IMClient.getInstance().setChatRoomSpeakEntry(
                                  roomId,
                                  SealMicConstant.KV_SPEAK_POSITION_PREFIX + currentMicBean.getPosition(),
                                  speakingValue);
      
                          //ๆ›ดๆ–ฐๆœฌๅœฐkvๅˆ—่กจ
                          currentMicBean.setUserId("");
                          //ไธ‹้บฆๅŽๅˆทๆ–ฐๆœฌๅœฐ้บฆไฝmap
                          localMicBeanMap.put(currentMicBean.getPosition(), currentMicBean);
                          //ๅฐ†ๆœฌๅœฐไฟๅญ˜็š„ๅฝ“ๅ‰็”จๆˆท็š„้บฆไฝไฟกๆฏๆ›ดๆ–ฐไธบๆ–ฐ้บฆไฝ็š„ไฟกๆฏ
                          CacheManager.getInstance().cacheMicBean(null);
                      }
                  }
              }
          }
          if (key.contains(SealMicConstant.KV_SPEAK_POSITION_PREFIX)) {
              //่งฃๆžไธ‹ๅ‘็š„ๆญฃๅœจ่ฎฒ่ฏไฟกๆฏ
              //่ฟœ็ซฏ็”จๆˆท้ ไธ‹ๅ‘็š„KV่ฎพ็ฝฎ่ฏด่ฏ็Šถๆ€
              newSpeakBean = new Gson().fromJson(json, SpeakBean.class);
              CustomDynamicAvatar customDynamicAvatar = dynamicAvatarViewList.get(newSpeakBean.getPosition());
              //1: ๆญฃๅœจ่ฏด่ฏ  0: ๆฒกๆœ‰่ฏด่ฏ
              if (newSpeakBean.getSpeaking() == 1) {
                  customDynamicAvatar.startSpeak();
              } else {
                  customDynamicAvatar.stopSpeak();
              }
      
              //ๆœฌๅœฐ็”จๆˆท้ ้Ÿณ้‡ๆ˜ฏๅฆๅคงไบŽ1ๆฅๅˆคๆ–ญๆ˜ฏๅฆๆ˜พ็คบๅŠจ็”ป
      
      
          }
          if (key.contains(SealMicConstant.KV_APPLIED_MIC_PREFIX)) {
              //่งฃๆžไธ‹ๅ‘็š„ๆ˜ฏๅฆๆœ‰ไบบๆŽ’้บฆไฟกๆฏ
              //0 ่กจ็คบๆฒกไบบๅœจๆŽ’้บฆ๏ผŒ1 ่กจ็คบๆœ‰ไบบๅœจๆŽ’้บฆ
              if ("0".equals(json)) {
                  fragmentChatRoomBinding.chatRoomTopBar.hideRedDot();
              } else if ("1".equals(json)) {
                  fragmentChatRoomBinding.chatRoomTopBar.showRedDot();
              }
          }
          
      

่ง‚ไผ—่ฝฌๆขไธบๅ‚ไผšไบบๅ‘˜ๆต็จ‹

  • ๅ–ๆถˆ่ฎข้˜…็›ดๆ’ญๅˆๆต
  • ๅ–ๆถˆๆˆๅŠŸๅŽๅŠ ๅ…ฅ RTC ๆˆฟ้—ดๅ†…
  • ๅŠ ๅ…ฅ RTC ๆˆฟ้—ดๅŽ่ฎข้˜…ๆˆฟ้—ดๅฝ“ๅ‰ๅญ˜ๅœจ็š„ๆ‰€ๆœ‰้Ÿณ้ข‘ๆต
  • ๅŠ ๅ…ฅ RTC ๆˆฟ้—ดๅŽๅ‘ๅธƒ่‡ชๅทฑ็š„้Ÿณ้ข‘ๆต
  • ็”จ RTC ๅ‘ๅธƒ้Ÿณ้ข‘ๆตๅŽ่ฟ”ๅ›ž็š„ liveUrl ๅ’ŒไปŽ KV ไธญ่Žทๅ–ๅˆฐ็š„ liveUrl ๆฏ”ๅฏน๏ผŒๅฆ‚ๆžœไธๅŒๅˆ™ไธปๅŠจ่ฎพ็ฝฎไธ€ๆฌก KV ไธญ็š„ liveUrl

ๅ‚ไผšไบบๅ‘˜่ฝฌไธบ่ง‚ไผ—ๆต็จ‹

  • ้€€ๅ‡บ RTC ๆˆฟ้—ด
  • ้€€ๅ‡บๆˆๅŠŸๅŽๆ นๆฎ liveUrl ๅœฐๅ€่ฎข้˜…็›ดๆ’ญๅˆๆต

ๆญฃๅœจๅ‘่จ€็›ธๅ…ณๅค„็†ๆต็จ‹

  • ็”จๆˆท้บฆไฝ็Šถๆ€ๆ”นๅ˜ๆ—ถไธปๅŠจๅฐ†ๅฝ“ๅ‰้บฆไฝไธŠๅ‘่จ€็Šถๆ€็š„ KV ่ฎพ็ฝฎไธบ NO๏ผˆ้ฟๅ…ไธŠไธช้บฆไฝ็”จๆˆทๅผ‚ๅธธไธ‹้บฆๅฏผ่‡ด่ฟ™ไธช้บฆไฝไธ€็›ดไธบๅ‘่จ€็Šถๆ€๏ผ‰
  • ็›‘ๅฌ RTC ๆไพ›็š„ SDK ๅฝ“ๅ‰็Šถๆ€ๅ›ž่ฐƒ๏ผˆๆญคๅ›ž่ฐƒไธ€็ง’ไผš่งฆๅ‘ไธ€ๆฌก๏ผŒ็œๅŽป่‡ชๅทฑๅ†™ๅฎšๆ—ถๅ™จไบ†๏ผ‰
  • ๅœจๅ›ž่ฐƒไธญ็›‘ๅฌๅ‘ๅ‡บๅŽป็š„ๆต็Šถๆ€
  • ๆœฌๅœฐไฟๅญ˜ไธ€ไธ‹ๅฝ“ๅ‰็š„ๅ‘่จ€็Šถๆ€
  • ้Ÿณ้‡ๅคงไบŽ 0 ๅˆ™่ฎคไธบๆญฃๅœจ่ฎฒ่ฏ๏ผŒๅฆ‚ๆžœๅฝ“ๅ‰ๅ‘่จ€็Šถๆ€ไธŽๆœฌๅœฐไฟๅญ˜็š„ๅฝ“ๅ‰ๅ‘่จ€็Šถๆ€ไธ็›ธ็ฌฆๅˆ™่ฎคไธบๅฝ“ๅ‰็”จๆˆทๅ‘่จ€็Šถๆ€ๆœ‰ๅ˜ๅŠจ๏ผŒๆ›ดๆ–ฐไธ€ๆฌกๅ‘่จ€็Šถๆ€็š„ KV

ไธปๆŒไบบ่ฝฌ่ฎฉไธŽๆŽฅ็ฎกๆต็จ‹

  • ่ฝฌ่ฎฉๆต็จ‹
    • ไธปๆŒไบบ่ฐƒ็”จ server ๆŽฅๅฃ๏ผŒ่ฏทๆฑ‚่ฝฌ่ฎฉไธปๆŒไบบ
    • server ่Žท็ŸฅๅŽไผšไธ‹ๅ‘RCMic:transferHostMsg็ฑปๅž‹็š„่‡ชๅฎšไน‰ๆถˆๆฏ๏ผŒๆถˆๆฏไธญๅŒ…ๅซๆ“ไฝœ็š„ๅ‘่ตท่€…ๅ’ŒๆŽฅๆ”ถ่€…
    • ๆˆฟ้—ดๅ†…็”จๆˆทๆ”ถๅˆฐๆถˆๆฏๅŽๆ นๆฎ่‡ชๅทฑๅฝ“ๅ‰็š„่บซไปฝไปฅๅŠๆถˆๆฏไธญๆบๅธฆ็š„ๆŽฅๆ”ถ่€…ๅˆคๆ–ญ่‡ชๅทฑๆ˜ฏๅฆ่ขซ้‚€่ฏทๆŽฅ็ฎกไธปๆŒไบบไฝ็ฝฎ
    • ๅฆ‚ๆžœ่‡ชๅทฑๆ˜ฏ่ขซ้‚€่ฏท็š„ไธ€ๆ–นๅˆ™ๅผนๅ‡บๆ็คบๆก†๏ผŒ่ฎฉ็”จๆˆท้€‰ๆ‹ฉๆŽฅๅ—่ฟ˜ๆ˜ฏๆ‹’็ป๏ผŒไธคไธชๆ“ไฝœ้ƒฝ้œ€่ฆ่ฐƒ็”จ server ๆŽฅๅฃๅ้ฆˆ็ป™ server
    • server ่Žท็Ÿฅ็ป“ๆžœๅŽไผšๅ†ๆฌกไธ‹ๅ‘ไธ€ๆกRCMic:transferHostMsgๆถˆๆฏ๏ผŒๆถˆๆฏไธญๅŒ…ๅซๆญคๆฌก่ขซ้‚€่ฏท็”จๆˆท็š„ๅ“ๅบ”๏ผˆๅŒๆ„่ฟ˜ๆ˜ฏๆ‹’็ป๏ผ‰
    • ไธปๆŒไบบๅœจ 15 ็ง’ไน‹ๅ†…ๆ”ถๅˆฐ่ฟ™ๆกๆถˆๆฏๅŽๅฐฑๅฏไปฅๆ นๆฎๅ…ทไฝ“็ป“ๆžœๅ–ๆถˆๅผนๅ‡บๅฑ‚ๅนถๆ็คบ็”จๆˆทไบ†
    • ่ถ…่ฟ‡ 15 ็ง’ๆœชๆ”ถๅˆฐๅฏนๆ–นๅ“ๅบ”ๅˆ™ๆญคๆฌก่ฝฌ่ฎฉไฟกๆฏๅคฑๆ•ˆ
  • ๆŽฅ็ฎกๆต็จ‹
    • ๆŽฅ็ฎกๆต็จ‹ๅ’ŒไธปๆŒไบบ่ฝฌ่ฎฉๆต็จ‹ๅคง่‡ดๅฝขๅผไธ€ๆ ท๏ผŒๅชๆ˜ฏ server ไธ‹ๅ‘็š„ๆ˜ฏRCMic:takeOverHostMsg็ฑปๅž‹็š„ๆถˆๆฏ๏ผŒๅ…ถไธญ็š„ๅ„ไธชๅญ—ๆฎตๅ’Œไน‹ๅ‰็š„ๆถˆๆฏๆ„ไน‰้ƒฝ็ฑปไผผ

็”จๅˆฐ็š„ๆŠ€ๆœฏ่„šๆ‰‹ๆžถ

  • Android JetPack
    • LifeCycles
    • DataBinding
    • LiveData
    • Navigation
    • ViewModel
    • WorkManager
  • Retrofit
  • OkHttp
  • Glide
  • EventBus

ๅ…ณ้”ฎไปฃ็ ๆจกๅ—่ฏดๆ˜Ž

โ”œโ”€โ”€ app
โ”‚   โ”œโ”€โ”€ build.gradle   -------------------------------------------------- //ๆ นgradle
โ”‚   โ”œโ”€โ”€ libs
โ”‚   โ”œโ”€โ”€ proguard-rules.pro  --------------------------------------------- //ๆททๆท†่ง„ๅˆ™
โ”‚   โ””โ”€โ”€ src
โ”‚       โ”œโ”€โ”€ main
โ”‚       โ”‚   โ”œโ”€โ”€ AndroidManifest.xml  ------------------------------------ //ๆณจๅ†Œ่กจ
โ”‚       โ”‚   โ”œโ”€โ”€ assets
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ airport_gate1.mp3 ----------------------------------- //ๆœบๅœบไผด้Ÿณ่ต„ๆบ
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ metro_entrance.mp3 ---------------------------------- //็ซ่ฝฆ็ซ™ไผด้Ÿณ่ต„ๆบ
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ rain_thunder1.mp3 ----------------------------------- //่‡ช็„ถไผด้Ÿณ่ต„ๆบ
โ”‚       โ”‚   โ”œโ”€โ”€ java
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ cn
โ”‚       โ”‚   โ”‚       โ””โ”€โ”€ rongcloud
โ”‚       โ”‚   โ”‚           โ””โ”€โ”€ sealmicandroid
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ MainActivity.java ----------------------- //้กน็›ฎ็•Œ้ขๆ€ปๅฎนๅ™จ
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ SealMicApp.java ------------------------- //้กน็›ฎapplication
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ bean  
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ BgAudioBean.java -------------------- //ไผด้Ÿณ้€‰้กน่งฃๆž็ฑป                  
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ SendSuperGiftBean.java ------โ€”โ€”------ //่ถ…็บง็คผ็‰ฉ่งฃๆž็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ kv  --------------------------------- //KVๅญ˜ๅ‚จๅทฅๅ…ท็›ธๅ…ณ็š„bean
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ AppliedMicListBean.java --------- //KVไธญๆŽ’้บฆๅˆ—่กจๆ›ดๆ–ฐ่งฃๆž็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ KvExtraBean.java ---------------- //KVไธญextraๅญ—ๆฎต่งฃๆž็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ MicBean.java -------------------- //KVไธญ้บฆไฝ่งฃๆž็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ SpeakBean.java ------------------ //KVไธญ่ฎฒ่ฏ็Šถๆ€่งฃๆž็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ local
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ BgmBean.java -------------------- //ไผด้Ÿณ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ repo  ------------------------------- //ๆŽฅๅฃๅ“ๅบ”ไฝ“
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ CreateRoomRepo.java ------------- //ๅˆ›ๅปบๆˆฟ้—ดresponse
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ NetResult.java ------------------ //็ฝ‘็ปœ่ฏทๆฑ‚่ฟ”ๅ›ž็š„ๅ…ฌๅ…ฑresponse
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ RefreshTokenRepo.java ----------- //ๅˆทๆ–ฐtokenๆŽฅๅฃresponse
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ RoomDetailRepo.java ------------- //ๆˆฟ้—ด่ฏฆๆƒ…response
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ RoomListRepo.java --------------- //ๆˆฟ้—ดๅˆ—่กจresponse
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ RoomMemberRepo.java ------------- //่Žทๅ–ๆˆฟ้—ดๆˆๅ‘˜response
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ UserLoginRepo.java -------------- //็”จๆˆท็™ปๅฝ•response
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ VersionCheckRepo.java ----------- //็‰ˆๆœฌๆ›ดๆ–ฐresponse
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ VisitorLoginRepo.java ----------- //ๆธธๅฎข็™ปๅฝ•response
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ req  -------------------------------- //ๆŽฅๅฃ่ฏทๆฑ‚ไฝ“
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ CreateRoomReq.java -------------- //ๅˆ›ๅปบๆˆฟ้—ดrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MessageBroadCastReq.java -------- //่ถ…็บง็คผ็‰ฉๆถˆๆฏๅนฟๆ’ญrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicAcceptReq.java --------------- //ๅŒๆ„็”จๆˆทไธŠ้บฆrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicApplyReq.java ---------------- //็”จๆˆท็”ณ่ฏทๆŽ’้บฆrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicQuitReq.java ----------------- //ไธปๆ’ญไธ‹้บฆrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicStateReq.java ---------------- //้บฆไฝ็Šถๆ€่ฏทๆฑ‚request
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicTransferHostReq.java --------- //ๆ‹’็ป่ฝฌ่ฎฉไธปๆŒไบบrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicTransferHostResultReq.java --- //ๅŒๆ„่ฝฌ่ฎฉไธปๆŒไบบrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ RoomBanUserReq.java ------------- //็”จๆˆท็ฆ่จ€่ฎพ็ฝฎrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ RoomKickUserReq.java ------------ //ๅฐ†็”จๆˆท่ธขๅ‡บๆˆฟ้—ดrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ RoomSettingReq.java ------------- //ๆˆฟ้—ด่ฎพ็ฝฎrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ SendCodeReq.java ---------------- //ๅ‘้€็Ÿญไฟก้ชŒ่ฏ็ request
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ UserInfoReq.java ---------------- //็”จๆˆทไฟกๆฏrequest
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ UserLoginReq.java --------------- //็”จๆˆท็™ปๅฝ•request
โ”‚       โ”‚   โ”‚               โ”‚       โ””โ”€โ”€ VisitorLoginReq.java ------------ //ๆธธๅฎข็™ปๅฝ•request
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ common
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ Event.java -------------------------- //ไบ‹ไปถๆ€ป็บฟEventBusไบ‹ไปถ็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ MicState.java ----------------------- //้บฆไฝ็Šถๆ€ๆžšไธพ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ NetStateLiveData.java --------------- //็ฝ‘็ปœ่ฏทๆฑ‚ๅฏนๅบ”็š„ๅ“ๅบ”็Šถๆ€็š„ๅฎšๅˆถ็‰ˆLiveData
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ SealMicResultCallback.java ---------- //ๅ…จๅฑ€็ป“ๆžœๅ›ž่ฐƒ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ UserType.java ----------------------- //็”จๆˆท็ฑปๅž‹
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ adapter
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ AudioDialogAdapter.java --------- //ๅฃฐ้Ÿณadapter๏ผŒ็›ฎๅ‰ๅชๅŒ…ๆ‹ฌไผด้Ÿณ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ BaseDialogListAdapter.java ------ //dialogๅˆ—่กจ้€‚้…ๅ™จ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ ButtonBaseDialogAdapter.java ---- //ๆŒ‰้’ฎ้ฃŽๆ ผ็š„dialogๅˆ—่กจ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ ExtensionClickListenerAdapter.java//่พ“ๅ…ฅๆก†adapter๏ผŒ้€‚้…ๅ™จๆจกๅผ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ GiftDialogAdapter.java ---------- //็คผ็‰ฉdialog adapter
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ LiveDataCallAdapter.java -------- //retrofit่ฟ”ๅ›ž็š„็ป“ๆžœ็”ฑๅŽŸ็”Ÿ็š„call่ฝฌไธบLiveData
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ RTCEventsListenerAdapter.java --- //RTCๅŠ ๅ…ฅๆˆฟ้—ดๅฏนๅบ”็š„ๅ›ž่ฐƒ้€‚้…ๅ™จ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ SendMessageAdapter.java --------- //ๆถˆๆฏ้€่พพๅ›ž่ฐƒๅฏนๅบ”็š„้€‚้…ๅ™จ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ SwitchBaseDialogAdapter.java ---- //ๅˆ‡ๆขๅผ€ๅ…ณ้ฃŽๆ ผ็š„dialogๅˆ—่กจ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ TextWatcherAdapter.java --------- //editๅฎ่ง‚้€‚้…ๅ™จ๏ผŒ้€‚้…ๅ™จๆจกๅผ๏ผŒๅ†…ๅซ3ไธช้’ฉๅญๆ–นๆณ•
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ constant
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ ErrorCode.java ------------------ //ๅ„่ทฏๅ›ž่ฐƒไธญ็š„ไธ€ไบ›้€š็”จ้”™่ฏฏ็ ๆžšไธพ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ MainLoadData.java --------------- //้ฆ–้กตๆ•ฐๆฎๆ‹‰ๅ–ๆ–นๅผๆžšไธพ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ RoomMemberStatus.java ----------- //ๆˆฟ้—ดไธญ็š„ๆˆๅ‘˜(่ง‚ไผ—)็Šถๆ€ๆžšไธพ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ SealMicConstant.java ------------ //ๆœฌๅบ”็”จๅ…จๅฑ€ๅธธ้‡
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ SealMicErrorMsg.java ------------ //ๆŽฅๅฃๅ›ž่ฐƒ้”™่ฏฏ็ ๅ’ŒToastๆ็คบไฟกๆฏๆžšไธพ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ UserRoleType.java --------------- //็”จๆˆท่ง’่‰ฒๆžšไธพ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ divider
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ GridItemDecoration.java --------- //grid็ฝ‘ๆ ผๅˆ—่กจไธ‹ๅ‡ๅˆ†ๅˆ†ๅธƒitem
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ factory
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ CommonViewModelFactory.java ----- //ViewModelไผ ๅ‚ๆž„้€ ๅ™จ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ LiveDataCallFactory.java -------- //retrofit่ฟ”ๅ›ž็š„็ป“ๆžœ็”ฑๅŽŸ็”Ÿ็š„call่ฝฌไธบLiveData๏ผŒๅฏนๅบ”็š„้€‚้…ๅ™จๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ dialog -------------------------- //้กต้ขๅผน็ช—็”ŸไบงๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ BgBaseAudioDialogFactory.java //ไผด้Ÿณdialog ๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ ChangeBaseAudioDialogFactory.java //ๅ˜ๅฃฐdialogๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ ClickMessageDialogFactory.java //็‚นๅ‡ปๆถˆๆฏๅˆ—่กจๅผนๅ‡บ็š„ dialog ๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ GiftDialogFactory.java ------- //็คผ็‰ฉdialogๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ HandOverHostDialogFactory.java //่ฝฌ่ฎฉไธปๆŒไบบๅผน็ช—
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ MicAudienceFactory.java ------ //่ง‚ไผ—็‚นๅ‡ปๆœ‰ไบบๆ—ถ็š„้บฆไฝๆ—ถ่งฆๅ‘
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ MicConnectDialogFactory.java - //ๅฝ“่ฟž้บฆ่€…็‚นๅ‡ป่‡ชๅทฑๆ—ถๅผนๅ‡บ็š„dialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ MicConnectTakeOverDialogFactory.java //่ฟž้บฆ่€…็‚นๅ‡ปไธปๆŒไบบ้บฆไฝ๏ผŒไธ”ไธปๆŒไบบ้บฆไฝๆœ‰ไบบๆ—ถๆ‰€ๅฏนๅบ”ๅผนๅ‡บ็š„dialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ MicDialogFactory.java -------- //ๅผนๅ‡บ้บฆไฝ็š„ dialog ๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ MicEnqueueDialogFactory.java - //ๆŽ’้บฆdialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ MicSettingDialogFactory.java - //้บฆไฝ่ฎพ็ฝฎdialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ RoomMemberManagerDialogFactory.java //ๆˆฟ้—ดๆˆๅ‘˜็ฎก็†ๅผน็ช—
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ RoomNoticeDialogFactory.java - //ๆˆฟ้—ดๅ…ฌๅ‘Šdialog ๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ RoomSettingDialogFactory.java  //ไธปๆŒไบบ่ฎพ็ฝฎๅผน็ช—
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ SelectedGiftDialogFactory.java //้€‰ไธญ็š„็คผ็‰ฉๅŽ็š„dialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ TakeOverHostDialogFactory.java //ๆŽฅ็ฎกไธปๆŒไบบๅผน็ช—
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ””โ”€โ”€ base
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚           โ”œโ”€โ”€ BaseAudioDialogFactory.java //ๅฃฐ้ŸณdialogๅทฅๅŽ‚
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚           โ”œโ”€โ”€ BottomDialogFactory.java -- //ไปŽๅบ•้ƒจๅผนๅ‡บ็š„dialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚           โ”œโ”€โ”€ CenterDialogFactory.java -- //ไปŽไธญ้ƒจๅผนๅ‡บ็š„dialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚           โ”œโ”€โ”€ FullDialogFactory.java ---- //ๅ ๆฎๅ…จๅฑ็š„dialog
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚           โ””โ”€โ”€ SealMicDialogFactory.java - //dialog็”ŸๆˆๅทฅๅŽ‚๏ผŒ้‡‡็”จๅทฅๅŽ‚ๆ–นๆณ•ๆจกๅผ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ lifecycle ----------------------------- //่Šๅคฉๅฎค้กต้ขๅ’Œไธป้กต้ข็”Ÿๅ‘ฝๅ‘จๆœŸ็›‘ๅฌ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ MainObserver.java ----------------- //ไธป็•Œ้ข่ง‚ๅฏŸ่€…
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ RoomObserver.java ----------------- //่Šๅคฉๅฎค่ง‚ๅฏŸ่€…
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ listener
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ OnChatRoomTopBarClickListener.java  //่Šๅคฉๅฎค้กถ้ƒจๆก็‚นๅ‡ปไบ‹ไปถ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ OnClickGiftListener.java ---------- //็‚นๅ‡ป็คผ็‰ฉๅฏนๅบ”็š„็›‘ๅฌๅ™จ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ OnDialogButtonListClickListener.java //ๅˆ—่กจๆŒ‰้’ฎ็‚นๅ‡ป็š„ไบ‹ไปถ็›‘ๅฌ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ OnHandOverHostDialogClickListener.java //่ฝฌ่ฎฉไธปๆŒไบบdialog็‚นๅ‡ปไบ‹ไปถ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ OnTakeOverHostDialogClickListener.java //ๆŽฅ็ฎกไธปๆŒไบบdialog็‚นๅ‡ปไบ‹ไปถ
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ RoomListItemOnClickListener.java //็‚นๅ‡ปๅˆ—่กจ้กน็›‘ๅฌ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ service
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ RTCNotificationService.java ------- //RTCๅˆ‡ๆข่‡ณๅŽๅฐไน‹ๅŽ้บฆๅ…‹้ฃŽ็š„ๅ‰ๅฐ้€š็Ÿฅ
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ worker
โ”‚       โ”‚   โ”‚               โ”‚       โ””โ”€โ”€ RongWorker.java -------โ€”โ€”---------- //WorkManagerๅˆๅง‹ๅŒ–็ฑป
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ im ---------------------------------------- //IMไบคไบ’ๆจกๅ—
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ IMClient.java ------------------------- //Rong IM ไธšๅŠก็›ธๅ…ณๅฐ่ฃ…
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ message 
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ HandOverHostMessage.java ---------- //ไธปๆŒไบบ่ฝฌ่ฎฉ้€š็Ÿฅ่‡ชๅฎšไน‰ๆถˆๆฏ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ KickMemberMessage.java ------------ //็”จๆˆท่ขซ่ธขๅ‡บๆˆฟ้—ด้€š็Ÿฅ่‡ชๅฎšไน‰ๆถˆๆฏ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ RoomMemberChangedMessage.java ----- //ๆˆฟ้—ดๆˆๅ‘˜ๅ˜ๅŠจ่‡ชๅฎšไน‰ๆถˆๆฏ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ SendBroadcastGiftMessage.java ----- //่ถ…็บง็คผ็‰ฉๅนฟๆ’ญ็š„่‡ชๅฎšไน‰ๆถˆๆฏ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ SendGiftMessage.java -------------- //ๆ™ฎ้€š็คผ็‰ฉ็š„่‡ชๅฎšไน‰ๆถˆๆฏ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ SendGiftTag.java ------------------ //้€ๅ‡บไธๅŒ็š„็คผ็‰ฉๆ—ถ็š„ๆžšไธพ๏ผŒไพ็…งๆญคๆฅๅฑ•็คบไธๅŒ็š„ๅŠจ็”ป
โ”‚       โ”‚   โ”‚               โ”‚       โ””โ”€โ”€ TakeOverHostMessage.java ---------- //ไธปๆŒไบบๆŽฅ็ฎก้€š็Ÿฅ็š„่‡ชๅฎšไน‰ๆถˆๆฏ
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ manager
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ CacheManager.java --------------------- //็ผ“ๅญ˜็ฎก็†็ฑป๏ผŒไธป่ฆไฟๅญ˜ไธ€ไบ›ๆœฌๅบ”็”จ็š„ๅ…ณ้”ฎไฟกๆฏ่‡ณspๆ–‡ไปถ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ GlideManager.java --------------------- //GlideๅŠ ่ฝฝๅ›พ็‰‡็ฎก็†็ฑป๏ผŒไธป่ฆๆ˜ฏๅฐ่ฃ…ไธ€ไบ›้€š็”จ็š„ๅŠ ่ฝฝๅ›พ็‰‡็š„ๆ–นๆณ•
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ NavOptionsRouterManager.java ---------- //้ป˜่ฎค็š„navigation่ทณ่ฝฌ้…็ฝฎ๏ผŒ้ป˜่ฎคFragmentไน‹้—ด่ทณ่ฝฌๆ—ถ็š„่ฝฌๅœบๅŠจ็”ป
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ RoomManager.java ---------------------- //ๆˆฟ้—ด่ฟ›ๅ‡บใ€ไธŠไธ‹้บฆใ€ๆˆฟ้—ดๅ†…ๅ‘้€ๆถˆๆฏ็ญ‰ๆ ธๅฟƒๆ“ไฝœ
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ ThreadManager.java -------------------- //็บฟ็จ‹็ฎก็†็ฑป
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ model
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ AppModel.java ------------------------- //APP็‰ˆๆœฌ็ฎก็†ๆจกๅ—ๆ•ฐๆฎๅฑ‚(Mๅฑ‚)
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ MicModel.java ------------------------- //้บฆไฝๆจกๅ—ๆ•ฐๆฎๅฑ‚(Mๅฑ‚)
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ RoomModel.java ------------------------ //ๆˆฟ้—ดๆจกๅ—ๆ•ฐๆฎๅฑ‚(Mๅฑ‚)
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ UserModel.java ------------------------ //็”จๆˆทๆจกๅ—ๆ•ฐๆฎๅฑ‚(Mๅฑ‚)
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ net
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ SealMicUrl.java ----------------------- //seal mic ่ฏทๆฑ‚ๆŽฅๅฃๅœฐๅ€้›†ๅˆ
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ client
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ HttpClient.java ------------------- //็ฝ‘็ปœ่ฏทๆฑ‚ไธŽๆ•ฐๆฎๅฑ‚(Mๅฑ‚)ๅฏนๆŽฅ็ฑป
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ RetrofitClient.java --------------- //็ฝ‘็ปœ่ฏทๆฑ‚ๅŸบ็ก€้…็ฝฎ
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ service
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ AppService.java -โ€”โ€”โ€”โ€”-------------- //APP็‰ˆๆœฌ็ฎก็†ๆจกๅ—ๆŽฅๅฃๅฐ่ฃ… 
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicService.java ------------------- //้บฆไฝๆจกๅ—่ฏทๆฑ‚ๅฐ่ฃ…
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ RoomService.java ------------------ //ๆˆฟ้—ดๆจกๅ—่ฏทๆฑ‚ๅฐ่ฃ…
โ”‚       โ”‚   โ”‚               โ”‚       โ””โ”€โ”€ UserService.java ------------------ //็”จๆˆทๆจกๅ—่ฏทๆฑ‚ๅฐ่ฃ…
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ rtc --------------------------------------- //RTCไบคไบ’ๆจกๅ—
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ DebugInfoAdapter.java ----------------- //Debugๆจกๅผๆ˜พ็คบ
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ RTCClient.java ------------------------ //Rong RTC ่ฏญ้ŸณไธšๅŠกๅฐ่ฃ…
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ ui ---------------------------------------- //ๆ‰€ๆœ‰็š„UI็•Œ้ข
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ login --------------------------------- //็™ปๅฝ•
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ LoginFragment.java ---------------- //็™ปๅฝ•็•Œ้ข
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ LoginViewModel.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ main ---------------------------------- //ไธป็•Œ้ข
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ AppVersionViewModel.java ---------- //ๆฃ€ๆŸฅ็‰ˆๆœฌๆ›ดๆ–ฐVM
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ MainFragment.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ MainViewModel.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ room ---------------------------------- //่Šๅคฉๅฎค
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ ChatRoomFragment.java 
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ ChatRoomViewModel.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ CreateRoomFragment.java ----------- //ๅˆ›ๅปบๆˆฟ้—ด
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ CreateRoomViewModel.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ adapter
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BanMemberFragment.java -------- //็ฆ่จ€ๅˆ—่กจ้กต้ข
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BanMicAdapter.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ChatRoomRefreshAdapter.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ EnqueueFragment.java ---------- //ๆŽ’้บฆๅˆ—่กจ้กต้ข
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ EnqueueMicAdapter.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ OnLineMemberFragment.java ----- //ๅœจ็บฟๅˆ—่กจ้กต้ข
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ OnlineRoomMemberAdapter.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RoomChatListAdapter.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RoomChatMessageListAdapter.java //่Šๅคฉๅฎคๆถˆๆฏๅˆ—่กจadapter๏ผŒListview
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ RoomMemberManagerDialogAdapter.java //ๆˆฟ้—ดๆˆๅ‘˜็ฎก็†viewpager2ๅฏนๅบ”็š„adapter
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ member
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ”œโ”€โ”€ RoomMemberFragment.java ------- //ๆˆฟ้—ด่ง‚ไผ—ๆˆๅ‘˜็ฎก็†
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚       โ””โ”€โ”€ RoomMemberViewModel.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ splash -------------------------------- //ๅผ€ๅฑ้กต
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ”œโ”€โ”€ SplashFragment.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”‚   โ””โ”€โ”€ SplashViewModel.java
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ widget -------------------------------- //่‡ชๅฎšไน‰ๆŽงไปถ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ ChatRoomTopBar.java --------------- //่Šๅคฉๅฎค้กถ้ƒจๆก
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ CustomDynamicAvatar.java ---------- //ๅฑ•็คบ้บฆไฝ็š„ๆŽงไปถ๏ผŒๅŒ…ๆ‹ฌ่ฏด่ฏๆ—ถ็š„ๅŠจ็”ป
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ CustomTextView.java
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ CustomTitleBar.java
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ DynamicAvatarView.java ------------ //้บฆไฝๆŽงไปถ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ ListItemSwitchButton.java
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ MicTextLayout.java ---------------- //่‡ชๅฎšไน‰้บฆไฝๆ˜พ็คบ็”จๆˆทๅ็งฐ็š„็ป„ๅˆๆŽงไปถ
โ”‚       โ”‚   โ”‚               โ”‚       โ”œโ”€โ”€ RoundRectImageView.java ----------- //่‡ชๅฎšไน‰็š„ๅœ†่ง’ๆญฃๆ–นๅฝขImageView๏ผŒๅฏไปฅ็›ดๆŽฅๅฝ“็ป„ไปถๅœจๅธƒๅฑ€ไธญไฝฟ็”จใ€‚
โ”‚       โ”‚   โ”‚               โ”‚       โ””โ”€โ”€ SwitchButton.java ----------------- //็Šถๆ€ๅˆ‡ๆขๆŒ‰้’ฎ
โ”‚       โ”‚   โ”‚               โ””โ”€โ”€ util -------------------------------------- //้€š็”จๅทฅๅ…ท็ฑป
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ BitmapUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ ButtonDelayUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ ColorUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ DeviceUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ DisplayUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ HeadsetUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ KeyBoardUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ PatternUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ RandomUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ SPUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ SystemUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ ToastUtil.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ ToolBarUtil.java
โ”‚       โ”‚   โ”‚                   โ””โ”€โ”€ log ----------------------------------- //ๅ…จๅฑ€ๆ—ฅๅฟ—็ฑป
โ”‚       โ”‚   โ”‚                       โ”œโ”€โ”€ ISLog.java 
โ”‚       โ”‚   โ”‚                       โ”œโ”€โ”€ SLog.java
โ”‚       โ”‚   โ”‚                       โ””โ”€โ”€ SimpleDebugSLog.java
โ”‚       โ”‚   โ””โ”€โ”€ res ------------------------------------------------------- //่ต„ๆบๅˆ—่กจ
โ”‚       โ”‚       โ”œโ”€โ”€ anim
โ”‚       โ”‚       โ”œโ”€โ”€ drawable
โ”‚       โ”‚       โ”œโ”€โ”€ drawable-v24
โ”‚       โ”‚       โ”œโ”€โ”€ layout
โ”‚       โ”‚       โ”œโ”€โ”€ mipmap-anydpi-v26
โ”‚       โ”‚       โ”œโ”€โ”€ mipmap-hdpi
โ”‚       โ”‚       โ”œโ”€โ”€ mipmap-mdpi
โ”‚       โ”‚       โ”œโ”€โ”€ mipmap-xhdpi
โ”‚       โ”‚       โ”œโ”€โ”€ mipmap-xxhdpi
โ”‚       โ”‚       โ”œโ”€โ”€ mipmap-xxxhdpi
โ”‚       โ”‚       โ”œโ”€โ”€ navigation -------------------------------------------- //navigationๅฏผ่ˆชๅ›พ
โ”‚       โ”‚       โ”‚   โ””โ”€โ”€ nav_main.xml -------------------------------------- //ๆ•ดไธชๅบ”็”จ็š„้กต้ข่ทณ่ฝฌๅ…ณ็ณป
โ”‚       โ”‚       โ””โ”€โ”€ values
โ”‚       โ”‚           โ”œโ”€โ”€ attrs.xml
โ”‚       โ”‚           โ”œโ”€โ”€ colors.xml
โ”‚       โ”‚           โ”œโ”€โ”€ dimens.xml
โ”‚       โ”‚           โ”œโ”€โ”€ strings.xml
โ”‚       โ”‚           โ””โ”€โ”€ styles.xml
โ”œโ”€โ”€ build.gradle ---------------------------------------------------------- //appไธ‹็š„gradle
โ”œโ”€โ”€ gradle ---------------------------------------------------------------- //gradle็‰ˆๆœฌไฟกๆฏ
โ”‚   โ””โ”€โ”€ wrapper
โ”‚       โ”œโ”€โ”€ gradle-wrapper.jar
โ”‚       โ””โ”€โ”€ gradle-wrapper.properties
โ”œโ”€โ”€ gradle.properties ----------------------------------------------------- //ๅŠจๆ€ๅŒ–ๅ‚ๆ•ฐ้…็ฝฎ้กน๏ผŒไปฅๅŠ่ฎพ็ฝฎ่žไบ‘ๅ’Œๅ…ถไป–ไธ‰ๆ–น็š„AppKey
โ”œโ”€โ”€ gradlew
โ”œโ”€โ”€ gradlew.bat
โ”œโ”€โ”€ local.properties
โ”œโ”€โ”€ settings.gradle ------------------------------------------------------- //ๅ‚ๆ•ฐๆž„ๅปบๆ—ถ็š„ๆŽงๅˆถๅฐ่พ“ๅ‡บ้กน

็‰ˆๆœฌๅ…ผๅฎน

  • ๅฝ“ๅ‰็‰ˆๆœฌไธŽv1.2.0(ไธๅซv1.2.0)ไน‹ๅ‰็š„็‰ˆๆœฌไธๅ…ผๅฎน

ๆ–‡ๆกฃ้“พๆŽฅ

่”็ณปๆˆ‘ไปฌ

  • ๅฆ‚ๆžœๅ‘็Žฐไบ†็คบไพ‹ไปฃ็ ็š„ bug, ๆฌข่ฟŽๆไบค issue
  • ๅฆ‚ๆžœๆœ‰ๅ”ฎๅ‰ๅ’จ่ฏข้—ฎ้ข˜, ๅฏไปฅๆ‹จๆ‰“ 13161856839 ่ฟ›่กŒๅ’จ่ฏขใ€‚

Releases

No releases published

Packages

No packages published