Commit e964d03e0d170da48d804423605ba422cba8c47c
1 parent
2f8fe45c
Exists in
yxb_dev
and in
1 other branch
no message
Showing
222 changed files
with
11254 additions
and
15 deletions
Show diff stats
Too many changes.
To preserve performance only 100 of 222 files displayed.
.idea/gradle.xml
| ... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 | <option value="$PROJECT_DIR$" /> |
| 11 | 11 | <option value="$PROJECT_DIR$/app" /> |
| 12 | 12 | <option value="$PROJECT_DIR$/mvpsdk" /> |
| 13 | + <option value="$PROJECT_DIR$/mychartlibrary" /> | |
| 13 | 14 | <option value="$PROJECT_DIR$/processor" /> |
| 14 | 15 | <option value="$PROJECT_DIR$/roundedimageview-2.2.1" /> |
| 15 | 16 | </set> | ... | ... |
.idea/modules.xml
| ... | ... | @@ -4,6 +4,7 @@ |
| 4 | 4 | <modules> |
| 5 | 5 | <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> |
| 6 | 6 | <module fileurl="file://$PROJECT_DIR$/mvpsdk/mvpsdk.iml" filepath="$PROJECT_DIR$/mvpsdk/mvpsdk.iml" /> |
| 7 | + <module fileurl="file://$PROJECT_DIR$/mychartlibrary/mychartlibrary.iml" filepath="$PROJECT_DIR$/mychartlibrary/mychartlibrary.iml" /> | |
| 7 | 8 | <module fileurl="file://$PROJECT_DIR$/parentwork.iml" filepath="$PROJECT_DIR$/parentwork.iml" /> |
| 8 | 9 | <module fileurl="file://$PROJECT_DIR$/processor/processor.iml" filepath="$PROJECT_DIR$/processor/processor.iml" /> |
| 9 | 10 | <module fileurl="file://$PROJECT_DIR$/roundedimageview-2.2.1/roundedimageview-2.2.1.iml" filepath="$PROJECT_DIR$/roundedimageview-2.2.1/roundedimageview-2.2.1.iml" /> | ... | ... |
app/build.gradle
| ... | ... | @@ -81,11 +81,8 @@ greendao { |
| 81 | 81 | schemaVersion 1//数据库版本升级 |
| 82 | 82 | } |
| 83 | 83 | dependencies { |
| 84 | - | |
| 85 | 84 | implementation fileTree(include: ['*.jar'], dir: 'libs') |
| 86 | - implementation 'com.android.support:appcompat-v7:26.1.0' | |
| 87 | 85 | implementation 'com.android.support.constraint:constraint-layout:1.0.2' |
| 88 | - implementation 'com.android.support:support-v4:26.1.0' | |
| 89 | 86 | testImplementation 'junit:junit:4.12' |
| 90 | 87 | androidTestImplementation 'com.android.support.test:runner:1.0.1' |
| 91 | 88 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' |
| ... | ... | @@ -97,6 +94,19 @@ dependencies { |
| 97 | 94 | compile 'me.leolin:ShortcutBadger:1.1.19@aar' |
| 98 | 95 | annotationProcessor 'com.google.dagger:dagger-compiler:2.12' |
| 99 | 96 | compile files('libs/processor.jar') |
| 100 | - | |
| 101 | 97 | compile 'com.contrarywind:Android-PickerView:4.1.3' |
| 102 | -} | |
| 103 | 98 | \ No newline at end of file |
| 99 | + implementation files('libs/gesture-imageview.jar') | |
| 100 | + implementation 'com.android.support:support-v4:27.1.0' | |
| 101 | + implementation project(':mychartlibrary') | |
| 102 | +} | |
| 103 | + | |
| 104 | +configurations.all { | |
| 105 | + resolutionStrategy.eachDependency { DependencyResolveDetails details -> | |
| 106 | + def requested = details.requested | |
| 107 | + if (requested.group == 'com.android.support') { | |
| 108 | + if (!requested.name.startsWith("multidex")) { | |
| 109 | + details.useVersion '26.1.0' | |
| 110 | + } | |
| 111 | + } | |
| 112 | + } | |
| 113 | +} | ... | ... |
No preview for this file type
app/libs/processor.jar
No preview for this file type
app/src/main/AndroidManifest.xml
| ... | ... | @@ -48,6 +48,7 @@ |
| 48 | 48 | <!-- 接收 SDK 消息广播权限, 第三方 APP 接入时,请将 com.netease.nim.demo 替换为自己的包名 --> |
| 49 | 49 | <uses-permission android:name="com.shunzhi.parent.permission.RECEIVE_MSG" /> |
| 50 | 50 | <uses-permission android:name="android.permission.CALL_PHONE" /> |
| 51 | + <uses-permission android:name="android.permission.RECORD_AUDIO" /> | |
| 51 | 52 | |
| 52 | 53 | <application |
| 53 | 54 | android:name=".AppContext" |
| ... | ... | @@ -117,7 +118,6 @@ |
| 117 | 118 | android:name="com.amap.api.v2.apikey" |
| 118 | 119 | android:value="1d130afb822d8a1019e6592cbaf10bcc" /> |
| 119 | 120 | |
| 120 | - | |
| 121 | 121 | <provider |
| 122 | 122 | android:name="android.support.v4.content.FileProvider" |
| 123 | 123 | android:authorities="com.shunzhi.parent.fileprovider" |
| ... | ... | @@ -147,6 +147,12 @@ |
| 147 | 147 | <!-- android:screenOrientation="portrait" --> |
| 148 | 148 | <!-- android:windowSoftInputMode="adjustPan|stateAlwaysHidden" /> --> |
| 149 | 149 | <activity |
| 150 | + android:name=".ui.activity.chartroom.RecyclerViewChatActivity" | |
| 151 | + android:theme="@style/AppBarTheme" | |
| 152 | + android:windowSoftInputMode="adjustResize|stateHidden" | |
| 153 | + android:screenOrientation="portrait" | |
| 154 | + /> | |
| 155 | + <activity | |
| 150 | 156 | android:name=".ui.activity.MyChildActivity" |
| 151 | 157 | android:screenOrientation="portrait" /> |
| 152 | 158 | <activity |
| ... | ... | @@ -178,6 +184,11 @@ |
| 178 | 184 | android:launchMode="singleInstance" |
| 179 | 185 | android:screenOrientation="portrait" |
| 180 | 186 | android:windowSoftInputMode="adjustPan|stateHidden" /> |
| 187 | + | |
| 188 | + <activity android:name=".ui.activity.chartroom.ImageViewActivity" | |
| 189 | + android:launchMode="singleInstance" | |
| 190 | + android:screenOrientation="portrait" | |
| 191 | + android:windowSoftInputMode="adjustPan|stateHidden"/> | |
| 181 | 192 | <activity |
| 182 | 193 | android:name=".ui.activity.binding.CheckInfoActivity" |
| 183 | 194 | android:launchMode="singleInstance" |
| ... | ... | @@ -212,21 +223,20 @@ |
| 212 | 223 | android:name=".ui.activity.BankActivity" |
| 213 | 224 | android:launchMode="singleInstance" |
| 214 | 225 | android:windowSoftInputMode="adjustPan|stateAlwaysHidden" /> |
| 215 | - | |
| 216 | 226 | <activity |
| 217 | 227 | android:name=".ui.activity.apply.ApplyReplaceCardActivity" |
| 218 | 228 | android:launchMode="singleInstance" |
| 219 | 229 | android:windowSoftInputMode="adjustPan|stateAlwaysHidden" /> |
| 220 | - | |
| 221 | 230 | <activity |
| 222 | 231 | android:name=".ui.activity.apply.ApplySigninActivity" |
| 223 | 232 | android:launchMode="singleInstance" /> |
| 224 | 233 | |
| 225 | 234 | <service |
| 226 | 235 | android:name=".ui.service.BadgeIntentService" |
| 227 | - android:exported="false"></service> | |
| 236 | + android:exported="false" /> | |
| 228 | 237 | |
| 229 | - <activity android:name=".ui.activity.message.MesageActivity"></activity> | |
| 238 | + <activity android:name=".ui.activity.message.MesageActivity" /> | |
| 239 | + <activity android:name=".ui.activity.message.LeaverMessagesActivity"></activity> | |
| 230 | 240 | </application> |
| 231 | 241 | |
| 232 | 242 | </manifest> |
| 233 | 243 | \ No newline at end of file | ... | ... |
app/src/main/java/com/shunzhi/parent/AppContext.java
| ... | ... | @@ -5,7 +5,6 @@ import android.content.Context; |
| 5 | 5 | import android.content.Intent; |
| 6 | 6 | import android.content.SharedPreferences; |
| 7 | 7 | import android.text.TextUtils; |
| 8 | -import android.util.Log; | |
| 9 | 8 | |
| 10 | 9 | import com.amap.api.location.AMapLocation; |
| 11 | 10 | import com.amap.api.location.AMapLocationClient; |
| ... | ... | @@ -18,6 +17,7 @@ import com.netease.nimlib.sdk.StatusBarNotificationConfig; |
| 18 | 17 | import com.netease.nimlib.sdk.auth.LoginInfo; |
| 19 | 18 | import com.share.mvpsdk.global.GlobalApplication; |
| 20 | 19 | import com.share.mvpsdk.helper.RetrofitCreateHelper; |
| 20 | +import com.shunzhi.mychartlibrary.db.BaseManager; | |
| 21 | 21 | import com.shunzhi.parent.bean.message.DaoMaster; |
| 22 | 22 | import com.shunzhi.parent.bean.message.DaoSession; |
| 23 | 23 | import com.shunzhi.parent.dbhelper.GreenDaoDatabaseOpenHelper; |
| ... | ... | @@ -70,7 +70,7 @@ public class AppContext extends GlobalApplication { |
| 70 | 70 | NIMClient.init(this, loginInfo(), options()); |
| 71 | 71 | if (null==AppConfig.getAppConfig(getContext()).get(AppConfig.DISTRICT)) |
| 72 | 72 | AppConfig.getAppConfig(getContext()).set(AppConfig.DISTRICT,"越城区"); |
| 73 | - | |
| 73 | + BaseManager.initOpenHelper(this); | |
| 74 | 74 | if (inMainProcess(this)) { |
| 75 | 75 | //开启地图地位 |
| 76 | 76 | initMapLocal(); | ... | ... |
app/src/main/java/com/shunzhi/parent/api/GetLeaveMessageListAPI.java
0 → 100644
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +package com.shunzhi.parent.api; | |
| 2 | + | |
| 3 | +import com.google.gson.JsonObject; | |
| 4 | + | |
| 5 | +import io.reactivex.Observable; | |
| 6 | +import retrofit2.http.GET; | |
| 7 | +import retrofit2.http.Query; | |
| 8 | + | |
| 9 | +public interface GetLeaveMessageListAPI { | |
| 10 | + | |
| 11 | + @GET("api/XAWebCommon/GetLeaveMessageList") | |
| 12 | + Observable<JsonObject> GetLeaveMessageList(@Query("puserid") String puserid,@Query("suserid")String suserid); | |
| 13 | + | |
| 14 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/contract/leavermessage/LeaverMessage.java
0 → 100644
| ... | ... | @@ -0,0 +1,34 @@ |
| 1 | +package com.shunzhi.parent.contract.leavermessage; | |
| 2 | + | |
| 3 | +public class LeaverMessage { | |
| 4 | + | |
| 5 | + public String id; | |
| 6 | + | |
| 7 | + public String sendUserId; | |
| 8 | + | |
| 9 | + public String receiveUserId; | |
| 10 | + | |
| 11 | + public String content; | |
| 12 | + | |
| 13 | + public String isRead; | |
| 14 | + | |
| 15 | + public String isRecall; | |
| 16 | + | |
| 17 | + public String intime; | |
| 18 | + | |
| 19 | + public String type; | |
| 20 | + | |
| 21 | + @Override | |
| 22 | + public String toString() { | |
| 23 | + return "LeaverMessage{" + | |
| 24 | + "id='" + id + '\'' + | |
| 25 | + ", sendUserId='" + sendUserId + '\'' + | |
| 26 | + ", receiveUserId='" + receiveUserId + '\'' + | |
| 27 | + ", content='" + content + '\'' + | |
| 28 | + ", isRead='" + isRead + '\'' + | |
| 29 | + ", isRecall='" + isRecall + '\'' + | |
| 30 | + ", intime='" + intime + '\'' + | |
| 31 | + ", type='" + type + '\'' + | |
| 32 | + '}'; | |
| 33 | + } | |
| 34 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/contract/leavermessage/LeaverMessageContract.java
0 → 100644
| ... | ... | @@ -0,0 +1,31 @@ |
| 1 | +package com.shunzhi.parent.contract.leavermessage; | |
| 2 | + | |
| 3 | +import com.google.gson.JsonObject; | |
| 4 | +import com.share.mvpsdk.base.BasePresenter; | |
| 5 | +import com.share.mvpsdk.base.IBaseActivity; | |
| 6 | +import com.share.mvpsdk.base.IBaseModel; | |
| 7 | + | |
| 8 | +import java.util.List; | |
| 9 | + | |
| 10 | +import io.reactivex.Observable; | |
| 11 | + | |
| 12 | +public interface LeaverMessageContract { | |
| 13 | + | |
| 14 | + public abstract class MyLeaverMessagePresenter extends BasePresenter<ILeaverMessageModel,ILeverMessageView>{ | |
| 15 | + | |
| 16 | + public abstract void GetLeaveMessageList(String puserid,String suserid); | |
| 17 | + | |
| 18 | + } | |
| 19 | + | |
| 20 | + interface ILeaverMessageModel extends IBaseModel { | |
| 21 | + | |
| 22 | + Observable<JsonObject> GetLeaveMessageList(String puserid, String suserid); | |
| 23 | + | |
| 24 | + } | |
| 25 | + | |
| 26 | + interface ILeverMessageView extends IBaseActivity{ | |
| 27 | + | |
| 28 | + abstract void ShowLeaverMessageList(List<LeaverMessage> leaverMessageList); | |
| 29 | + | |
| 30 | + } | |
| 31 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/model/leavermessage/LeaverMessageModel.java
0 → 100644
| ... | ... | @@ -0,0 +1,25 @@ |
| 1 | +package com.shunzhi.parent.model.leavermessage; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.google.gson.JsonObject; | |
| 5 | +import com.share.mvpsdk.helper.RetrofitCreateHelper; | |
| 6 | +import com.share.mvpsdk.helper.RxHelper; | |
| 7 | +import com.shunzhi.parent.AppConfig; | |
| 8 | +import com.shunzhi.parent.api.GetLeaveMessageListAPI; | |
| 9 | +import com.shunzhi.parent.contract.leavermessage.LeaverMessageContract; | |
| 10 | + | |
| 11 | +import io.reactivex.Observable; | |
| 12 | + | |
| 13 | +public class LeaverMessageModel implements LeaverMessageContract.ILeaverMessageModel{ | |
| 14 | + | |
| 15 | + | |
| 16 | + @Override | |
| 17 | + public Observable GetLeaveMessageList(String puserid, String suserid) { | |
| 18 | + return RetrofitCreateHelper.getInstance().createApi(GetLeaveMessageListAPI.class, AppConfig.BASE_URL) | |
| 19 | + .GetLeaveMessageList(puserid,suserid).compose(RxHelper.<JsonObject>rxSchedulerHelper()); | |
| 20 | + } | |
| 21 | + | |
| 22 | + public static LeaverMessageContract.ILeaverMessageModel newInstance() { | |
| 23 | + return new LeaverMessageModel(); | |
| 24 | + } | |
| 25 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/presenter/leavermessage/LeaverMessagePresenter.java
0 → 100644
| ... | ... | @@ -0,0 +1,26 @@ |
| 1 | +package com.shunzhi.parent.presenter.leavermessage; | |
| 2 | + | |
| 3 | +import com.share.mvpsdk.base.BasePresenter; | |
| 4 | +import com.shunzhi.parent.contract.leavermessage.LeaverMessageContract; | |
| 5 | +import com.shunzhi.parent.model.leavermessage.LeaverMessageModel; | |
| 6 | + | |
| 7 | +public class LeaverMessagePresenter extends LeaverMessageContract.MyLeaverMessagePresenter{ | |
| 8 | + @Override | |
| 9 | + public LeaverMessageContract.ILeaverMessageModel getModel() { | |
| 10 | + return LeaverMessageModel.newInstance(); | |
| 11 | + } | |
| 12 | + | |
| 13 | + @Override | |
| 14 | + public void onStart() { | |
| 15 | + | |
| 16 | + } | |
| 17 | + | |
| 18 | + @Override | |
| 19 | + public void GetLeaveMessageList(String puserid, String suserid) { | |
| 20 | + | |
| 21 | + } | |
| 22 | + | |
| 23 | + public static BasePresenter newInstance() { | |
| 24 | + return new LeaverMessagePresenter(); | |
| 25 | + } | |
| 26 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/activity/chartroom/ImageViewActivity.java
0 → 100644
| ... | ... | @@ -0,0 +1,116 @@ |
| 1 | +package com.shunzhi.parent.ui.activity.chartroom; | |
| 2 | + | |
| 3 | +import android.content.Intent; | |
| 4 | +import android.os.Bundle; | |
| 5 | +import android.support.v4.app.Fragment; | |
| 6 | +import android.support.v4.app.FragmentActivity; | |
| 7 | +import android.support.v4.app.FragmentManager; | |
| 8 | +import android.support.v4.app.FragmentPagerAdapter; | |
| 9 | +import android.support.v4.view.ViewPager; | |
| 10 | +import android.support.v4.view.ViewPager.OnPageChangeListener; | |
| 11 | +import android.widget.TextView; | |
| 12 | + | |
| 13 | + | |
| 14 | +import com.shunzhi.parent.R; | |
| 15 | +import com.shunzhi.parent.ui.activity.chartroom.fragment.ImageViewFragment; | |
| 16 | + | |
| 17 | +import java.util.ArrayList; | |
| 18 | +import java.util.List; | |
| 19 | + | |
| 20 | +public class ImageViewActivity extends FragmentActivity { | |
| 21 | + private ArrayList<String> imageList; | |
| 22 | + private List<Fragment> fragList; | |
| 23 | + private ViewPager imageVp; | |
| 24 | + private TextView currentTv; | |
| 25 | + private TextView totalTv; | |
| 26 | + private int currentPage; | |
| 27 | + | |
| 28 | + @Override | |
| 29 | + protected void onCreate(Bundle savedInstanceState) { | |
| 30 | + super.onCreate(savedInstanceState); | |
| 31 | + Intent intent = getIntent(); | |
| 32 | + Bundle bundle = intent.getExtras(); | |
| 33 | + if (bundle != null) { | |
| 34 | + if (bundle.containsKey("images")) { | |
| 35 | + imageList = bundle.getStringArrayList("images"); | |
| 36 | + } | |
| 37 | + if (bundle.containsKey("clickedIndex")) { | |
| 38 | + currentPage = bundle.getInt("clickedIndex"); | |
| 39 | + } | |
| 40 | + } | |
| 41 | + setContentView(R.layout.activity_images_view); | |
| 42 | + findView(); | |
| 43 | + init(); | |
| 44 | + } | |
| 45 | + | |
| 46 | + private void init() { | |
| 47 | + totalTv.setText("/" + imageList.size()); | |
| 48 | + fragList = new ArrayList<Fragment>(); | |
| 49 | + for (int i = 0; i < imageList.size(); i++) { | |
| 50 | + ImageViewFragment imageVF = new ImageViewFragment(); | |
| 51 | + imageVF.setImageUrl(imageList.get(i)); | |
| 52 | + fragList.add(imageVF); | |
| 53 | + } | |
| 54 | + // 类似缓存 | |
| 55 | + imageVp.setOffscreenPageLimit(imageList.size()); | |
| 56 | + imageVp.setAdapter(new ImageViewFPAdapter(getSupportFragmentManager())); | |
| 57 | + imageVp.setOnPageChangeListener(new OnPageChangeListener() { | |
| 58 | + | |
| 59 | + @Override | |
| 60 | + public void onPageSelected(int index) { | |
| 61 | + currentPage = index; | |
| 62 | + currentTv.setText((index + 1) + ""); | |
| 63 | + fragList.get(currentPage).onPause(); // 调用切换前Fargment的onPause() | |
| 64 | + if (fragList.get(index).isAdded()) { | |
| 65 | + fragList.get(index).onResume(); // 调用切换后Fargment的onResume() | |
| 66 | + } | |
| 67 | + } | |
| 68 | + | |
| 69 | + @Override | |
| 70 | + public void onPageScrolled(int arg0, float arg1, int arg2) { | |
| 71 | + | |
| 72 | + } | |
| 73 | + | |
| 74 | + @Override | |
| 75 | + public void onPageScrollStateChanged(int arg0) { | |
| 76 | + | |
| 77 | + } | |
| 78 | + }); | |
| 79 | + imageVp.setCurrentItem(currentPage); | |
| 80 | + currentTv.setText((currentPage + 1) + ""); | |
| 81 | + } | |
| 82 | + | |
| 83 | + protected void findView() { | |
| 84 | + imageVp = (ViewPager) findViewById(R.id.images_vp); | |
| 85 | + currentTv = (TextView) findViewById(R.id.imageView_current_tv); | |
| 86 | + totalTv = (TextView) findViewById(R.id.imageView_total_tv); | |
| 87 | + } | |
| 88 | + | |
| 89 | + class ImageViewFPAdapter extends FragmentPagerAdapter { | |
| 90 | + protected FragmentManager fm; | |
| 91 | + | |
| 92 | + public ImageViewFPAdapter(FragmentManager fm) { | |
| 93 | + super(fm); | |
| 94 | + this.fm = fm; | |
| 95 | + } | |
| 96 | + | |
| 97 | + @Override | |
| 98 | + public Fragment getItem(int arg0) { | |
| 99 | + return fragList.get(arg0); | |
| 100 | + } | |
| 101 | + | |
| 102 | + @Override | |
| 103 | + public int getCount() { | |
| 104 | + return fragList.size(); | |
| 105 | + } | |
| 106 | + } | |
| 107 | + | |
| 108 | + @Override | |
| 109 | + protected void onDestroy() { | |
| 110 | + if (fragList.size() > 0) { | |
| 111 | + for (Fragment fragment : fragList) | |
| 112 | + fragment.onDestroy(); | |
| 113 | + } | |
| 114 | + super.onDestroy(); | |
| 115 | + } | |
| 116 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/activity/chartroom/RecyclerViewChatActivity.java
0 → 100644
| ... | ... | @@ -0,0 +1,442 @@ |
| 1 | +package com.shunzhi.parent.ui.activity.chartroom; | |
| 2 | + | |
| 3 | +import android.graphics.Rect; | |
| 4 | +import android.os.Bundle; | |
| 5 | +import android.os.Handler; | |
| 6 | +import android.os.Message; | |
| 7 | +import android.support.v7.widget.LinearLayoutManager; | |
| 8 | +import android.support.v7.widget.RecyclerView; | |
| 9 | +import android.view.View; | |
| 10 | +import android.view.ViewTreeObserver; | |
| 11 | + | |
| 12 | +import com.shunzhi.mychartlibrary.BaseActivity; | |
| 13 | +import com.shunzhi.mychartlibrary.db.ChatMessageBean; | |
| 14 | +import com.shunzhi.parent.ui.activity.chartroom.adapter.ChatListViewAdapter; | |
| 15 | +import com.shunzhi.parent.ui.activity.chartroom.adapter.ChatRecyclerAdapter; | |
| 16 | +import com.shunzhi.mychartlibrary.animator.SlideInOutBottomItemAnimator; | |
| 17 | +import com.shunzhi.mychartlibrary.common.ChatConst; | |
| 18 | +import com.shunzhi.mychartlibrary.utils.KeyBoardUtils; | |
| 19 | +import com.shunzhi.mychartlibrary.widget.AudioRecordButton; | |
| 20 | +import com.shunzhi.mychartlibrary.widget.pulltorefresh.PullToRefreshRecyclerView; | |
| 21 | +import com.shunzhi.mychartlibrary.widget.pulltorefresh.WrapContentLinearLayoutManager; | |
| 22 | +import com.shunzhi.mychartlibrary.widget.pulltorefresh.base.PullToRefreshView; | |
| 23 | + | |
| 24 | +import java.lang.ref.WeakReference; | |
| 25 | + | |
| 26 | +public class RecyclerViewChatActivity extends BaseActivity { | |
| 27 | + private PullToRefreshRecyclerView myList; | |
| 28 | + private ChatRecyclerAdapter tbAdapter; | |
| 29 | + private SendMessageHandler sendMessageHandler; | |
| 30 | + private WrapContentLinearLayoutManager wcLinearLayoutManger; | |
| 31 | + | |
| 32 | + @Override | |
| 33 | + protected void onCreate(Bundle savedInstanceState) { | |
| 34 | + super.onCreate(savedInstanceState); | |
| 35 | + } | |
| 36 | + | |
| 37 | + @Override | |
| 38 | + protected void findView() { | |
| 39 | + super.findView(); | |
| 40 | + pullList.setSlideView(new PullToRefreshView(this).getSlideView(PullToRefreshView.RECYCLERVIEW)); | |
| 41 | + myList = (PullToRefreshRecyclerView) pullList.returnMylist(); | |
| 42 | + } | |
| 43 | + | |
| 44 | + @Override | |
| 45 | + protected void onResume() { | |
| 46 | + // TODO Auto-generated method stub | |
| 47 | + super.onResume(); | |
| 48 | + } | |
| 49 | + | |
| 50 | + @Override | |
| 51 | + protected void onDestroy() { | |
| 52 | + tblist.clear(); | |
| 53 | + tbAdapter.notifyDataSetChanged(); | |
| 54 | + myList.setAdapter(null); | |
| 55 | + sendMessageHandler.removeCallbacksAndMessages(null); | |
| 56 | + super.onDestroy(); | |
| 57 | + } | |
| 58 | + | |
| 59 | + @Override | |
| 60 | + protected void init() { | |
| 61 | + setTitle(getIntent().getStringExtra("childName")); | |
| 62 | + tbAdapter = new ChatRecyclerAdapter(this, tblist,getIntent().getStringExtra("childPhoto")); | |
| 63 | + wcLinearLayoutManger = new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); | |
| 64 | + myList.setLayoutManager(wcLinearLayoutManger); | |
| 65 | + myList.setItemAnimator(new SlideInOutBottomItemAnimator(myList)); | |
| 66 | + myList.setAdapter(tbAdapter); | |
| 67 | + sendMessageHandler = new SendMessageHandler(this); | |
| 68 | + tbAdapter.isPicRefresh = true; | |
| 69 | + tbAdapter.notifyDataSetChanged(); | |
| 70 | + tbAdapter.setSendErrorListener(new ChatRecyclerAdapter.SendErrorListener() { | |
| 71 | + | |
| 72 | + @Override | |
| 73 | + public void onClick(int position) { | |
| 74 | + // TODO Auto-generated method stub | |
| 75 | + ChatMessageBean tbub = tblist.get(position); | |
| 76 | + if (tbub.getType() == ChatRecyclerAdapter.TO_USER_VOICE) { | |
| 77 | + sendVoice(tbub.getUserVoiceTime(), tbub.getUserVoicePath()); | |
| 78 | + tblist.remove(position); | |
| 79 | + } else if (tbub.getType() == ChatRecyclerAdapter.TO_USER_IMG) { | |
| 80 | + sendImage(tbub.getImageLocal()); | |
| 81 | + tblist.remove(position); | |
| 82 | + } | |
| 83 | + } | |
| 84 | + | |
| 85 | + }); | |
| 86 | + tbAdapter.setVoiceIsReadListener(new ChatRecyclerAdapter.VoiceIsRead() { | |
| 87 | + | |
| 88 | + @Override | |
| 89 | + public void voiceOnClick(int position) { | |
| 90 | + // TODO Auto-generated method stub | |
| 91 | + for (int i = 0; i < tbAdapter.unReadPosition.size(); i++) { | |
| 92 | + if (tbAdapter.unReadPosition.get(i).equals(position + "")) { | |
| 93 | + tbAdapter.unReadPosition.remove(i); | |
| 94 | + break; | |
| 95 | + } | |
| 96 | + } | |
| 97 | + } | |
| 98 | + | |
| 99 | + }); | |
| 100 | + voiceBtn.setAudioFinishRecorderListener(new AudioRecordButton.AudioFinishRecorderListener() { | |
| 101 | + | |
| 102 | + @Override | |
| 103 | + public void onFinished(float seconds, String filePath) { | |
| 104 | + // TODO Auto-generated method stub | |
| 105 | + sendVoice(seconds, filePath); | |
| 106 | + } | |
| 107 | + | |
| 108 | + @Override | |
| 109 | + public void onStart() { | |
| 110 | + // TODO Auto-generated method stub | |
| 111 | + tbAdapter.stopPlayVoice(); | |
| 112 | + } | |
| 113 | + }); | |
| 114 | + myList.setOnScrollListener(new RecyclerView.OnScrollListener() { | |
| 115 | + | |
| 116 | + @Override | |
| 117 | + public void onScrollStateChanged(RecyclerView view, int scrollState) { | |
| 118 | + // TODO Auto-generated method stub | |
| 119 | + switch (scrollState) { | |
| 120 | + case RecyclerView.SCROLL_STATE_IDLE: | |
| 121 | + tbAdapter.handler.removeCallbacksAndMessages(null); | |
| 122 | + tbAdapter.setIsGif(true); | |
| 123 | + tbAdapter.isPicRefresh = false; | |
| 124 | + tbAdapter.notifyDataSetChanged(); | |
| 125 | + break; | |
| 126 | + case RecyclerView.SCROLL_STATE_DRAGGING: | |
| 127 | + tbAdapter.handler.removeCallbacksAndMessages(null); | |
| 128 | + tbAdapter.setIsGif(false); | |
| 129 | + tbAdapter.isPicRefresh = true; | |
| 130 | + reset(); | |
| 131 | + KeyBoardUtils.hideKeyBoard(RecyclerViewChatActivity.this, | |
| 132 | + mEditTextContent); | |
| 133 | + break; | |
| 134 | + default: | |
| 135 | + break; | |
| 136 | + } | |
| 137 | + } | |
| 138 | + | |
| 139 | + @Override | |
| 140 | + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { | |
| 141 | + super.onScrolled(recyclerView, dx, dy); | |
| 142 | + } | |
| 143 | + }); | |
| 144 | + controlKeyboardLayout(activityRootView, pullList); | |
| 145 | + super.init(); | |
| 146 | + } | |
| 147 | + | |
| 148 | + /** | |
| 149 | + * @param root 最外层布局 | |
| 150 | + * @param needToScrollView 要滚动的布局,就是说在键盘弹出的时候,你需要试图滚动上去的View,在键盘隐藏的时候,他又会滚动到原来的位置的布局 | |
| 151 | + */ | |
| 152 | + private void controlKeyboardLayout(final View root, final View needToScrollView) { | |
| 153 | + root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { | |
| 154 | + | |
| 155 | + private Rect r = new Rect(); | |
| 156 | + | |
| 157 | + @Override | |
| 158 | + public void onGlobalLayout() { | |
| 159 | + //获取当前界面可视部分 | |
| 160 | + RecyclerViewChatActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r); | |
| 161 | + //获取屏幕的高度 | |
| 162 | + int screenHeight = RecyclerViewChatActivity.this.getWindow().getDecorView().getRootView().getHeight(); | |
| 163 | + //此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数 | |
| 164 | + int heightDifference = screenHeight - r.bottom; | |
| 165 | + int recyclerHeight = 0; | |
| 166 | + if (wcLinearLayoutManger != null) { | |
| 167 | + recyclerHeight = wcLinearLayoutManger.getRecyclerHeight(); | |
| 168 | + } | |
| 169 | + if (heightDifference == 0 || heightDifference == bottomStatusHeight) { | |
| 170 | + needToScrollView.scrollTo(0, 0); | |
| 171 | + } else { | |
| 172 | + if (heightDifference < recyclerHeight) { | |
| 173 | + int contentHeight = wcLinearLayoutManger == null ? 0 : wcLinearLayoutManger.getHeight(); | |
| 174 | + if (recyclerHeight < contentHeight) { | |
| 175 | + listSlideHeight = heightDifference - (contentHeight - recyclerHeight); | |
| 176 | + needToScrollView.scrollTo(0, listSlideHeight); | |
| 177 | + } else { | |
| 178 | + listSlideHeight = heightDifference; | |
| 179 | + needToScrollView.scrollTo(0, listSlideHeight); | |
| 180 | + } | |
| 181 | + } else { | |
| 182 | + listSlideHeight = 0; | |
| 183 | + } | |
| 184 | + } | |
| 185 | + } | |
| 186 | + }); | |
| 187 | + } | |
| 188 | + | |
| 189 | + @Override | |
| 190 | + protected void loadRecords() { | |
| 191 | + isDown = true; | |
| 192 | + if (pagelist != null) { | |
| 193 | + pagelist.clear(); | |
| 194 | + } | |
| 195 | + pagelist = mChatDbManager.loadPages(page, number); | |
| 196 | + position = pagelist.size(); | |
| 197 | + if (pagelist.size() != 0) { | |
| 198 | + pagelist.addAll(tblist); | |
| 199 | + tblist.clear(); | |
| 200 | + tblist.addAll(pagelist); | |
| 201 | + if (imageList != null) { | |
| 202 | + imageList.clear(); | |
| 203 | + } | |
| 204 | + if (imagePosition != null) { | |
| 205 | + imagePosition.clear(); | |
| 206 | + } | |
| 207 | + int key = 0; | |
| 208 | + int position = 0; | |
| 209 | + for (ChatMessageBean cmb : tblist) { | |
| 210 | + if (cmb.getType() == ChatListViewAdapter.FROM_USER_IMG || cmb.getType() == ChatListViewAdapter.TO_USER_IMG) { | |
| 211 | + imageList.add(cmb.getImageLocal()); | |
| 212 | + imagePosition.put(key, position); | |
| 213 | + position++; | |
| 214 | + } | |
| 215 | + key++; | |
| 216 | + } | |
| 217 | + tbAdapter.setImageList(imageList); | |
| 218 | + tbAdapter.setImagePosition(imagePosition); | |
| 219 | + sendMessageHandler.sendEmptyMessage(PULL_TO_REFRESH_DOWN); | |
| 220 | + if (page == 0) { | |
| 221 | + pullList.refreshComplete(); | |
| 222 | + pullList.setPullGone(); | |
| 223 | + } else { | |
| 224 | + page--; | |
| 225 | + } | |
| 226 | + } else { | |
| 227 | + if (page == 0) { | |
| 228 | + pullList.refreshComplete(); | |
| 229 | + pullList.setPullGone(); | |
| 230 | + } | |
| 231 | + } | |
| 232 | + } | |
| 233 | + | |
| 234 | + static class SendMessageHandler extends Handler { | |
| 235 | + WeakReference<RecyclerViewChatActivity> mActivity; | |
| 236 | + | |
| 237 | + SendMessageHandler(RecyclerViewChatActivity activity) { | |
| 238 | + mActivity = new WeakReference<RecyclerViewChatActivity>(activity); | |
| 239 | + } | |
| 240 | + | |
| 241 | + @Override | |
| 242 | + public void handleMessage(Message msg) { | |
| 243 | + // TODO Auto-generated method stub | |
| 244 | + RecyclerViewChatActivity theActivity = mActivity.get(); | |
| 245 | + if (theActivity != null) { | |
| 246 | + switch (msg.what) { | |
| 247 | + case REFRESH: | |
| 248 | + theActivity.tbAdapter.isPicRefresh = true; | |
| 249 | + theActivity.tbAdapter.notifyDataSetChanged(); | |
| 250 | + int position = theActivity.tbAdapter.getItemCount() - 1 < 0 ? 0 : theActivity.tbAdapter.getItemCount() - 1; | |
| 251 | + theActivity.myList.smoothScrollToPosition(position); | |
| 252 | + break; | |
| 253 | + case SEND_OK: | |
| 254 | + theActivity.mEditTextContent.setText(""); | |
| 255 | + theActivity.tbAdapter.isPicRefresh = true; | |
| 256 | + theActivity.tbAdapter.notifyItemInserted(theActivity.tblist | |
| 257 | + .size() - 1); | |
| 258 | + theActivity.myList.smoothScrollToPosition(theActivity.tbAdapter.getItemCount() - 1); | |
| 259 | + break; | |
| 260 | + case RECERIVE_OK: | |
| 261 | + theActivity.tbAdapter.isPicRefresh = true; | |
| 262 | + theActivity.tbAdapter.notifyItemInserted(theActivity.tblist | |
| 263 | + .size() - 1); | |
| 264 | + theActivity.myList.smoothScrollToPosition(theActivity.tbAdapter.getItemCount() - 1); | |
| 265 | + break; | |
| 266 | + case PULL_TO_REFRESH_DOWN: | |
| 267 | + theActivity.pullList.refreshComplete(); | |
| 268 | + theActivity.tbAdapter.notifyDataSetChanged(); | |
| 269 | + theActivity.myList.smoothScrollToPosition(theActivity.position - 1); | |
| 270 | + theActivity.isDown = false; | |
| 271 | + break; | |
| 272 | + default: | |
| 273 | + break; | |
| 274 | + } | |
| 275 | + } | |
| 276 | + } | |
| 277 | + | |
| 278 | + } | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * 发送文字 | |
| 282 | + */ | |
| 283 | + @Override | |
| 284 | + protected void sendMessage() { | |
| 285 | + new Thread(new Runnable() { | |
| 286 | + @Override | |
| 287 | + public void run() { | |
| 288 | + String content = mEditTextContent.getText().toString(); | |
| 289 | + tblist.add(getTbub(userName, ChatListViewAdapter.TO_USER_MSG, content, null, null, | |
| 290 | + null, null, null, 0f, ChatConst.COMPLETED)); | |
| 291 | + sendMessageHandler.sendEmptyMessage(SEND_OK); | |
| 292 | + RecyclerViewChatActivity.this.content = content; | |
| 293 | + receriveHandler.sendEmptyMessageDelayed(0, 1000); | |
| 294 | + } | |
| 295 | + }).start(); | |
| 296 | + } | |
| 297 | + | |
| 298 | + /** | |
| 299 | + * 接收文字 | |
| 300 | + */ | |
| 301 | + String content = ""; | |
| 302 | + | |
| 303 | + private void receriveMsgText(final String content) { | |
| 304 | + new Thread(new Runnable() { | |
| 305 | + @Override | |
| 306 | + public void run() { | |
| 307 | + String message = "回复:" + content; | |
| 308 | + ChatMessageBean tbub = new ChatMessageBean(); | |
| 309 | + tbub.setUserName(userName); | |
| 310 | + String time = returnTime(); | |
| 311 | + tbub.setUserContent(message); | |
| 312 | + tbub.setTime(time); | |
| 313 | + tbub.setType(ChatListViewAdapter.FROM_USER_MSG); | |
| 314 | + tblist.add(tbub); | |
| 315 | + sendMessageHandler.sendEmptyMessage(RECERIVE_OK); | |
| 316 | + mChatDbManager.insert(tbub); | |
| 317 | + } | |
| 318 | + }).start(); | |
| 319 | + } | |
| 320 | + | |
| 321 | + /** | |
| 322 | + * 发送图片 | |
| 323 | + */ | |
| 324 | + int i = 0; | |
| 325 | + | |
| 326 | + @Override | |
| 327 | + protected void sendImage(final String filePath) { | |
| 328 | + new Thread(new Runnable() { | |
| 329 | + @Override | |
| 330 | + public void run() { | |
| 331 | + if (i == 0) { | |
| 332 | + tblist.add(getTbub(userName, ChatListViewAdapter.TO_USER_IMG, null, null, null, filePath, null, null, | |
| 333 | + 0f, ChatConst.SENDING)); | |
| 334 | + } else if (i == 1) { | |
| 335 | + tblist.add(getTbub(userName, ChatListViewAdapter.TO_USER_IMG, null, null, null, filePath, null, null, | |
| 336 | + 0f, ChatConst.SENDERROR)); | |
| 337 | + } else if (i == 2) { | |
| 338 | + tblist.add(getTbub(userName, ChatListViewAdapter.TO_USER_IMG, null, null, null, filePath, null, null, | |
| 339 | + 0f, ChatConst.COMPLETED)); | |
| 340 | + i = -1; | |
| 341 | + } | |
| 342 | + imageList.add(tblist.get(tblist.size() - 1).getImageLocal()); | |
| 343 | + imagePosition.put(tblist.size() - 1, imageList.size() - 1); | |
| 344 | + sendMessageHandler.sendEmptyMessage(SEND_OK); | |
| 345 | + RecyclerViewChatActivity.this.filePath = filePath; | |
| 346 | + receriveHandler.sendEmptyMessageDelayed(1, 3000); | |
| 347 | + i++; | |
| 348 | + } | |
| 349 | + }).start(); | |
| 350 | + } | |
| 351 | + | |
| 352 | + /** | |
| 353 | + * 接收图片 | |
| 354 | + */ | |
| 355 | + String filePath = ""; | |
| 356 | + | |
| 357 | + private void receriveImageText(final String filePath) { | |
| 358 | + new Thread(new Runnable() { | |
| 359 | + @Override | |
| 360 | + public void run() { | |
| 361 | + ChatMessageBean tbub = new ChatMessageBean(); | |
| 362 | + tbub.setUserName(userName); | |
| 363 | + String time = returnTime(); | |
| 364 | + tbub.setTime(time); | |
| 365 | + tbub.setImageLocal(filePath); | |
| 366 | + tbub.setType(ChatListViewAdapter.FROM_USER_IMG); | |
| 367 | + tblist.add(tbub); | |
| 368 | + imageList.add(tblist.get(tblist.size() - 1).getImageLocal()); | |
| 369 | + imagePosition.put(tblist.size() - 1, imageList.size() - 1); | |
| 370 | + sendMessageHandler.sendEmptyMessage(RECERIVE_OK); | |
| 371 | + mChatDbManager.insert(tbub); | |
| 372 | + } | |
| 373 | + }).start(); | |
| 374 | + } | |
| 375 | + | |
| 376 | + /** | |
| 377 | + * 发送语音 | |
| 378 | + */ | |
| 379 | + @Override | |
| 380 | + protected void sendVoice(final float seconds, final String filePath) { | |
| 381 | + new Thread(new Runnable() { | |
| 382 | + @Override | |
| 383 | + public void run() { | |
| 384 | + tblist.add(getTbub(userName, ChatListViewAdapter.TO_USER_VOICE, null, null, null, null, filePath, | |
| 385 | + null, seconds, ChatConst.SENDING)); | |
| 386 | + sendMessageHandler.sendEmptyMessage(SEND_OK); | |
| 387 | + RecyclerViewChatActivity.this.seconds = seconds; | |
| 388 | + voiceFilePath = filePath; | |
| 389 | + receriveHandler.sendEmptyMessageDelayed(2, 3000); | |
| 390 | + } | |
| 391 | + }).start(); | |
| 392 | + } | |
| 393 | + | |
| 394 | + /** | |
| 395 | + * 接收语音 | |
| 396 | + */ | |
| 397 | + float seconds = 0.0f; | |
| 398 | + String voiceFilePath = ""; | |
| 399 | + | |
| 400 | + private void receriveVoiceText(final float seconds, final String filePath) { | |
| 401 | + new Thread(new Runnable() { | |
| 402 | + @Override | |
| 403 | + public void run() { | |
| 404 | + ChatMessageBean tbub = new ChatMessageBean(); | |
| 405 | + tbub.setUserName(userName); | |
| 406 | + String time = returnTime(); | |
| 407 | + tbub.setTime(time); | |
| 408 | + tbub.setUserVoiceTime(seconds); | |
| 409 | + tbub.setUserVoicePath(filePath); | |
| 410 | + tbAdapter.unReadPosition.add(tblist.size() + ""); | |
| 411 | + tbub.setType(ChatListViewAdapter.FROM_USER_VOICE); | |
| 412 | + tblist.add(tbub); | |
| 413 | + sendMessageHandler.sendEmptyMessage(RECERIVE_OK); | |
| 414 | + mChatDbManager.insert(tbub); | |
| 415 | + } | |
| 416 | + }).start(); | |
| 417 | + } | |
| 418 | + | |
| 419 | + /** | |
| 420 | + * 为了模拟接收延迟 | |
| 421 | + */ | |
| 422 | + private Handler receriveHandler = new Handler() { | |
| 423 | + @Override | |
| 424 | + public void handleMessage(Message msg) { | |
| 425 | + super.handleMessage(msg); | |
| 426 | + switch (msg.what) { | |
| 427 | + case 0: | |
| 428 | + receriveMsgText(content); | |
| 429 | + break; | |
| 430 | + case 1: | |
| 431 | + receriveImageText(filePath); | |
| 432 | + break; | |
| 433 | + case 2: | |
| 434 | + receriveVoiceText(seconds, voiceFilePath); | |
| 435 | + break; | |
| 436 | + default: | |
| 437 | + break; | |
| 438 | + } | |
| 439 | + } | |
| 440 | + }; | |
| 441 | + | |
| 442 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/activity/chartroom/adapter/ChatListViewAdapter.java
0 → 100644
| ... | ... | @@ -0,0 +1,826 @@ |
| 1 | +package com.shunzhi.parent.ui.activity.chartroom.adapter; | |
| 2 | + | |
| 3 | +import android.annotation.SuppressLint; | |
| 4 | +import android.app.Activity; | |
| 5 | +import android.content.Context; | |
| 6 | +import android.content.Intent; | |
| 7 | +import android.graphics.drawable.AnimationDrawable; | |
| 8 | +import android.media.MediaPlayer; | |
| 9 | +import android.os.Handler; | |
| 10 | +import android.os.Message; | |
| 11 | +import android.util.DisplayMetrics; | |
| 12 | +import android.view.LayoutInflater; | |
| 13 | +import android.view.View; | |
| 14 | +import android.view.ViewGroup; | |
| 15 | +import android.view.WindowManager; | |
| 16 | +import android.view.animation.Animation; | |
| 17 | +import android.view.animation.AnimationUtils; | |
| 18 | +import android.view.animation.LinearInterpolator; | |
| 19 | +import android.widget.BaseAdapter; | |
| 20 | +import android.widget.FrameLayout; | |
| 21 | +import android.widget.ImageView; | |
| 22 | +import android.widget.LinearLayout; | |
| 23 | +import android.widget.TextView; | |
| 24 | + | |
| 25 | + | |
| 26 | +import com.shunzhi.mychartlibrary.db.ChatMessageBean; | |
| 27 | +import com.shunzhi.parent.R; | |
| 28 | +import com.shunzhi.parent.ui.activity.chartroom.ImageViewActivity; | |
| 29 | +import com.shunzhi.mychartlibrary.common.ChatConst; | |
| 30 | +import com.shunzhi.mychartlibrary.utils.FileSaveUtil; | |
| 31 | +import com.shunzhi.mychartlibrary.utils.ImageCheckoutUtil; | |
| 32 | +import com.shunzhi.mychartlibrary.widget.BubbleImageView; | |
| 33 | +import com.shunzhi.mychartlibrary.widget.GifTextView; | |
| 34 | +import com.shunzhi.mychartlibrary.widget.MediaManager; | |
| 35 | + | |
| 36 | +import java.io.File; | |
| 37 | +import java.lang.ref.WeakReference; | |
| 38 | +import java.math.BigDecimal; | |
| 39 | +import java.text.DateFormat; | |
| 40 | +import java.text.SimpleDateFormat; | |
| 41 | +import java.util.ArrayList; | |
| 42 | +import java.util.HashMap; | |
| 43 | +import java.util.List; | |
| 44 | + | |
| 45 | +/** | |
| 46 | + * Created by Mao Jiqing on 2016/9/28. | |
| 47 | + */ | |
| 48 | +public class ChatListViewAdapter extends BaseAdapter { | |
| 49 | + private Context context; | |
| 50 | + private List<ChatMessageBean> userList = new ArrayList<ChatMessageBean>(); | |
| 51 | + private ArrayList<String> imageList = new ArrayList<String>(); | |
| 52 | + private HashMap<Integer,Integer> imagePosition = new HashMap<Integer,Integer>(); | |
| 53 | + public static final int FROM_USER_MSG = 0;//接收消息类型 | |
| 54 | + public static final int TO_USER_MSG = 1;//发送消息类型 | |
| 55 | + public static final int FROM_USER_IMG = 2;//接收消息类型 | |
| 56 | + public static final int TO_USER_IMG = 3;//发送消息类型 | |
| 57 | + public static final int FROM_USER_VOICE = 4;//接收消息类型 | |
| 58 | + public static final int TO_USER_VOICE = 5;//发送消息类型 | |
| 59 | + private int mMinItemWith;// 设置对话框的最大宽度和最小宽度 | |
| 60 | + private int mMaxItemWith; | |
| 61 | + public MyHandler handler; | |
| 62 | + private Animation an; | |
| 63 | + private SendErrorListener sendErrorListener; | |
| 64 | + private VoiceIsRead voiceIsRead; | |
| 65 | + public List<String> unReadPosition = new ArrayList<String>(); | |
| 66 | + private int voicePlayPosition = -1; | |
| 67 | + private LayoutInflater mLayoutInflater; | |
| 68 | + private boolean isGif = true; | |
| 69 | + public boolean isPicRefresh = true; | |
| 70 | + | |
| 71 | + public interface SendErrorListener { | |
| 72 | + public void onClick(int position); | |
| 73 | + } | |
| 74 | + | |
| 75 | + public void setSendErrorListener(SendErrorListener sendErrorListener) { | |
| 76 | + this.sendErrorListener = sendErrorListener; | |
| 77 | + } | |
| 78 | + | |
| 79 | + public interface VoiceIsRead { | |
| 80 | + public void voiceOnClick(int position); | |
| 81 | + } | |
| 82 | + | |
| 83 | + public void setVoiceIsReadListener(VoiceIsRead voiceIsRead) { | |
| 84 | + this.voiceIsRead = voiceIsRead; | |
| 85 | + } | |
| 86 | + | |
| 87 | + public ChatListViewAdapter(Context context) { | |
| 88 | + this.context = context; | |
| 89 | + mLayoutInflater = LayoutInflater.from(context); | |
| 90 | + // 获取系统宽度 | |
| 91 | + WindowManager wManager = (WindowManager) context | |
| 92 | + .getSystemService(Context.WINDOW_SERVICE); | |
| 93 | + DisplayMetrics outMetrics = new DisplayMetrics(); | |
| 94 | + wManager.getDefaultDisplay().getMetrics(outMetrics); | |
| 95 | + mMaxItemWith = (int) (outMetrics.widthPixels * 0.5f); | |
| 96 | + mMinItemWith = (int) (outMetrics.widthPixels * 0.15f); | |
| 97 | + handler = new MyHandler(this); | |
| 98 | + } | |
| 99 | + | |
| 100 | + public static class MyHandler extends Handler { | |
| 101 | + private final WeakReference<ChatListViewAdapter> mTbAdapter; | |
| 102 | + | |
| 103 | + public MyHandler(ChatListViewAdapter tbAdapter) { | |
| 104 | + mTbAdapter = new WeakReference<ChatListViewAdapter>(tbAdapter); | |
| 105 | + } | |
| 106 | + | |
| 107 | + @Override | |
| 108 | + public void handleMessage(Message msg) { | |
| 109 | + ChatListViewAdapter tbAdapter = mTbAdapter.get(); | |
| 110 | + | |
| 111 | + if (tbAdapter != null) { | |
| 112 | + } | |
| 113 | + } | |
| 114 | + } | |
| 115 | + | |
| 116 | + public void setIsGif(boolean isGif) { | |
| 117 | + this.isGif = isGif; | |
| 118 | + } | |
| 119 | + | |
| 120 | + public void setUserList(List<ChatMessageBean> userList) { | |
| 121 | + this.userList = userList; | |
| 122 | + } | |
| 123 | + | |
| 124 | + public void setImageList(ArrayList<String> imageList) { | |
| 125 | + this.imageList = imageList; | |
| 126 | + } | |
| 127 | + public void setImagePosition(HashMap<Integer,Integer> imagePosition) { | |
| 128 | + this.imagePosition = imagePosition; | |
| 129 | + } | |
| 130 | + | |
| 131 | + @Override | |
| 132 | + public int getCount() { | |
| 133 | + return userList.size(); | |
| 134 | + } | |
| 135 | + | |
| 136 | + @Override | |
| 137 | + public Object getItem(int i) { | |
| 138 | + return userList.get(i); | |
| 139 | + } | |
| 140 | + | |
| 141 | + @Override | |
| 142 | + public long getItemId(int i) { | |
| 143 | + return i; | |
| 144 | + } | |
| 145 | + | |
| 146 | + @Override | |
| 147 | + public int getItemViewType(int position) { | |
| 148 | + // TODO Auto-generated method stub | |
| 149 | + return userList.get(position).getType(); | |
| 150 | + } | |
| 151 | + | |
| 152 | + @Override | |
| 153 | + public int getViewTypeCount() { | |
| 154 | + // TODO Auto-generated method stub | |
| 155 | + return 6; | |
| 156 | + } | |
| 157 | + | |
| 158 | + @SuppressLint("InflateParams") | |
| 159 | + @Override | |
| 160 | + public View getView(int i, View view, ViewGroup viewGroup) { | |
| 161 | + ChatMessageBean tbub = userList.get(i); | |
| 162 | + switch (getItemViewType(i)) { | |
| 163 | + case FROM_USER_MSG: | |
| 164 | + FromUserMsgViewHolder holder; | |
| 165 | + if (view == null) { | |
| 166 | + holder = new FromUserMsgViewHolder(); | |
| 167 | + view = mLayoutInflater.inflate(R.layout.layout_msgfrom_list_item, null); | |
| 168 | + holder.headicon = (ImageView) view | |
| 169 | + .findViewById(R.id.tb_other_user_icon); | |
| 170 | + holder.chat_time = (TextView) view.findViewById(R.id.chat_time); | |
| 171 | + holder.content = (GifTextView) view.findViewById(R.id.content); | |
| 172 | + view.setTag(holder); | |
| 173 | + } else { | |
| 174 | + holder = (FromUserMsgViewHolder) view.getTag(); | |
| 175 | + } | |
| 176 | + fromMsgUserLayout((FromUserMsgViewHolder) holder, tbub, i); | |
| 177 | + break; | |
| 178 | + case FROM_USER_IMG: | |
| 179 | + FromUserImageViewHolder holder1; | |
| 180 | + if (view == null) { | |
| 181 | + holder1 = new FromUserImageViewHolder(); | |
| 182 | + view = mLayoutInflater.inflate(R.layout.layout_imagefrom_list_item, null); | |
| 183 | + holder1.headicon = (ImageView) view | |
| 184 | + .findViewById(R.id.tb_other_user_icon); | |
| 185 | + holder1.chat_time = (TextView) view.findViewById(R.id.chat_time); | |
| 186 | + holder1.image_Msg = (BubbleImageView) view | |
| 187 | + .findViewById(R.id.image_message); | |
| 188 | + view.setTag(holder1); | |
| 189 | + } else { | |
| 190 | + holder1 = (FromUserImageViewHolder) view.getTag(); | |
| 191 | + } | |
| 192 | + fromImgUserLayout((FromUserImageViewHolder) holder1, tbub, i); | |
| 193 | + break; | |
| 194 | + case FROM_USER_VOICE: | |
| 195 | + FromUserVoiceViewHolder holder2; | |
| 196 | + if (view == null) { | |
| 197 | + holder2 = new FromUserVoiceViewHolder(); | |
| 198 | + view = mLayoutInflater.inflate(R.layout.layout_voicefrom_list_item, null); | |
| 199 | + holder2.headicon = (ImageView) view | |
| 200 | + .findViewById(R.id.tb_other_user_icon); | |
| 201 | + holder2.chat_time = (TextView) view.findViewById(R.id.chat_time); | |
| 202 | + holder2.voice_group = (LinearLayout) view | |
| 203 | + .findViewById(R.id.voice_group); | |
| 204 | + holder2.voice_time = (TextView) view | |
| 205 | + .findViewById(R.id.voice_time); | |
| 206 | + holder2.receiver_voice_unread = (View) view | |
| 207 | + .findViewById(R.id.receiver_voice_unread); | |
| 208 | + holder2.voice_image = (FrameLayout) view | |
| 209 | + .findViewById(R.id.voice_receiver_image); | |
| 210 | + holder2.voice_anim = (View) view | |
| 211 | + .findViewById(R.id.id_receiver_recorder_anim); | |
| 212 | + view.setTag(holder2); | |
| 213 | + } else { | |
| 214 | + holder2 = (FromUserVoiceViewHolder) view.getTag(); | |
| 215 | + } | |
| 216 | + fromVoiceUserLayout((FromUserVoiceViewHolder) holder2, tbub, i); | |
| 217 | + break; | |
| 218 | + case TO_USER_MSG: | |
| 219 | + ToUserMsgViewHolder holder3; | |
| 220 | + if (view == null) { | |
| 221 | + holder3 = new ToUserMsgViewHolder(); | |
| 222 | + view = mLayoutInflater.inflate(R.layout.layout_msgto_list_item, null); | |
| 223 | + holder3.headicon = (ImageView) view | |
| 224 | + .findViewById(R.id.tb_my_user_icon); | |
| 225 | + holder3.chat_time = (TextView) view | |
| 226 | + .findViewById(R.id.mychat_time); | |
| 227 | + holder3.content = (GifTextView) view | |
| 228 | + .findViewById(R.id.mycontent); | |
| 229 | + holder3.sendFailImg = (ImageView) view | |
| 230 | + .findViewById(R.id.mysend_fail_img); | |
| 231 | + view.setTag(holder3); | |
| 232 | + } else { | |
| 233 | + holder3 = (ToUserMsgViewHolder) view.getTag(); | |
| 234 | + } | |
| 235 | + toMsgUserLayout((ToUserMsgViewHolder) holder3, tbub, i); | |
| 236 | + break; | |
| 237 | + case TO_USER_IMG: | |
| 238 | + ToUserImgViewHolder holder4; | |
| 239 | + if (view == null) { | |
| 240 | + holder4 = new ToUserImgViewHolder(); | |
| 241 | + view = mLayoutInflater.inflate(R.layout.layout_imageto_list_item, null); | |
| 242 | + holder4.headicon = (ImageView) view | |
| 243 | + .findViewById(R.id.tb_my_user_icon); | |
| 244 | + holder4.chat_time = (TextView) view | |
| 245 | + .findViewById(R.id.mychat_time); | |
| 246 | + holder4.sendFailImg = (ImageView) view | |
| 247 | + .findViewById(R.id.mysend_fail_img); | |
| 248 | + holder4.image_group = (LinearLayout) view | |
| 249 | + .findViewById(R.id.image_group); | |
| 250 | + holder4.image_Msg = (BubbleImageView) view | |
| 251 | + .findViewById(R.id.image_message); | |
| 252 | + view.setTag(holder4); | |
| 253 | + } else { | |
| 254 | + holder4 = (ToUserImgViewHolder) view.getTag(); | |
| 255 | + } | |
| 256 | + toImgUserLayout((ToUserImgViewHolder) holder4, tbub, i); | |
| 257 | + break; | |
| 258 | + case TO_USER_VOICE: | |
| 259 | + ToUserVoiceViewHolder holder5; | |
| 260 | + if (view == null) { | |
| 261 | + holder5 = new ToUserVoiceViewHolder(); | |
| 262 | + view = mLayoutInflater.inflate(R.layout.layout_voiceto_list_item, null); | |
| 263 | + holder5.headicon = (ImageView) view | |
| 264 | + .findViewById(R.id.tb_my_user_icon); | |
| 265 | + holder5.chat_time = (TextView) view | |
| 266 | + .findViewById(R.id.mychat_time); | |
| 267 | + holder5.voice_group = (LinearLayout) view | |
| 268 | + .findViewById(R.id.voice_group); | |
| 269 | + holder5.voice_time = (TextView) view | |
| 270 | + .findViewById(R.id.voice_time); | |
| 271 | + holder5.voice_image = (FrameLayout) view | |
| 272 | + .findViewById(R.id.voice_image); | |
| 273 | + holder5.voice_anim = (View) view | |
| 274 | + .findViewById(R.id.id_recorder_anim); | |
| 275 | + holder5.sendFailImg = (ImageView) view | |
| 276 | + .findViewById(R.id.mysend_fail_img); | |
| 277 | + view.setTag(holder5); | |
| 278 | + } else { | |
| 279 | + holder5 = (ToUserVoiceViewHolder) view.getTag(); | |
| 280 | + } | |
| 281 | + toVoiceUserLayout((ToUserVoiceViewHolder) holder5, tbub, i); | |
| 282 | + break; | |
| 283 | + } | |
| 284 | + | |
| 285 | + return view; | |
| 286 | + } | |
| 287 | + | |
| 288 | + public class FromUserMsgViewHolder { | |
| 289 | + public ImageView headicon; | |
| 290 | + public TextView chat_time; | |
| 291 | + public GifTextView content; | |
| 292 | + } | |
| 293 | + | |
| 294 | + public class FromUserImageViewHolder { | |
| 295 | + public ImageView headicon; | |
| 296 | + public TextView chat_time; | |
| 297 | + public BubbleImageView image_Msg; | |
| 298 | + } | |
| 299 | + | |
| 300 | + public class FromUserVoiceViewHolder { | |
| 301 | + public ImageView headicon; | |
| 302 | + public TextView chat_time; | |
| 303 | + public LinearLayout voice_group; | |
| 304 | + public TextView voice_time; | |
| 305 | + public FrameLayout voice_image; | |
| 306 | + public View receiver_voice_unread; | |
| 307 | + public View voice_anim; | |
| 308 | + } | |
| 309 | + | |
| 310 | + public class ToUserMsgViewHolder { | |
| 311 | + public ImageView headicon; | |
| 312 | + public TextView chat_time; | |
| 313 | + public GifTextView content; | |
| 314 | + public ImageView sendFailImg; | |
| 315 | + } | |
| 316 | + | |
| 317 | + public class ToUserImgViewHolder { | |
| 318 | + public ImageView headicon; | |
| 319 | + public TextView chat_time; | |
| 320 | + public LinearLayout image_group; | |
| 321 | + public BubbleImageView image_Msg; | |
| 322 | + public ImageView sendFailImg; | |
| 323 | + } | |
| 324 | + | |
| 325 | + public class ToUserVoiceViewHolder { | |
| 326 | + public ImageView headicon; | |
| 327 | + public TextView chat_time; | |
| 328 | + public LinearLayout voice_group; | |
| 329 | + public TextView voice_time; | |
| 330 | + public FrameLayout voice_image; | |
| 331 | + public View receiver_voice_unread; | |
| 332 | + public View voice_anim; | |
| 333 | + public ImageView sendFailImg; | |
| 334 | + } | |
| 335 | + | |
| 336 | + private void fromMsgUserLayout(final FromUserMsgViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 337 | + holder.headicon.setBackgroundResource(R.mipmap.tongbao_hiv); | |
| 338 | + /* time */ | |
| 339 | + if (position != 0) { | |
| 340 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 341 | + .getTime()); | |
| 342 | + if (showTime != null) { | |
| 343 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 344 | + holder.chat_time.setText(showTime); | |
| 345 | + } else { | |
| 346 | + holder.chat_time.setVisibility(View.GONE); | |
| 347 | + } | |
| 348 | + } else { | |
| 349 | + String showTime = getTime(tbub.getTime(), null); | |
| 350 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 351 | + holder.chat_time.setText(showTime); | |
| 352 | + } | |
| 353 | + holder.content.setVisibility(View.VISIBLE); | |
| 354 | + holder.content.setSpanText(handler, tbub.getUserContent(), isGif); | |
| 355 | + } | |
| 356 | + | |
| 357 | + private void fromImgUserLayout(final FromUserImageViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 358 | + holder.headicon.setBackgroundResource(R.mipmap.tongbao_hiv); | |
| 359 | + /* time */ | |
| 360 | + if (position != 0) { | |
| 361 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 362 | + .getTime()); | |
| 363 | + if (showTime != null) { | |
| 364 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 365 | + holder.chat_time.setText(showTime); | |
| 366 | + } else { | |
| 367 | + holder.chat_time.setVisibility(View.GONE); | |
| 368 | + } | |
| 369 | + } else { | |
| 370 | + String showTime = getTime(tbub.getTime(), null); | |
| 371 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 372 | + holder.chat_time.setText(showTime); | |
| 373 | + } | |
| 374 | + if (isPicRefresh) { | |
| 375 | +// holder.image_Msg.setImageBitmap(null); | |
| 376 | + final String imageSrc = tbub.getImageLocal() == null ? "" : tbub | |
| 377 | + .getImageLocal(); | |
| 378 | + final String imageUrlSrc = tbub.getImageUrl() == null ? "" : tbub | |
| 379 | + .getImageUrl(); | |
| 380 | + final String imageIconUrl = tbub.getImageIconUrl() == null ? "" | |
| 381 | + : tbub.getImageIconUrl(); | |
| 382 | + File file = new File(imageSrc); | |
| 383 | + final boolean hasLocal = !imageSrc.equals("") | |
| 384 | + && FileSaveUtil.isFileExists(file); | |
| 385 | + int res; | |
| 386 | + res = R.drawable.chatfrom_bg_focused; | |
| 387 | + if (hasLocal) { | |
| 388 | + holder.image_Msg.setLocalImageBitmap(ImageCheckoutUtil.getLoacalBitmap(imageSrc), | |
| 389 | + res); | |
| 390 | + } else { | |
| 391 | + holder.image_Msg.load(imageIconUrl, res, R.mipmap.cygs_cs); | |
| 392 | + } | |
| 393 | + holder.image_Msg.setOnClickListener(new View.OnClickListener() { | |
| 394 | + | |
| 395 | + @Override | |
| 396 | + public void onClick(View view) { | |
| 397 | + // TODO Auto-generated method stub | |
| 398 | + stopPlayVoice(); | |
| 399 | + Intent intent = new Intent(context, ImageViewActivity.class); | |
| 400 | + intent.putStringArrayListExtra("images", imageList); | |
| 401 | + intent.putExtra("clickedIndex", imagePosition.get(position)); | |
| 402 | + context.startActivity(intent); | |
| 403 | + } | |
| 404 | + | |
| 405 | + }); | |
| 406 | + } | |
| 407 | + | |
| 408 | + } | |
| 409 | + | |
| 410 | + private void fromVoiceUserLayout(final FromUserVoiceViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 411 | + holder.headicon.setBackgroundResource(R.mipmap.tongbao_hiv); | |
| 412 | + /* time */ | |
| 413 | + if (position != 0) { | |
| 414 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 415 | + .getTime()); | |
| 416 | + if (showTime != null) { | |
| 417 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 418 | + holder.chat_time.setText(showTime); | |
| 419 | + } else { | |
| 420 | + holder.chat_time.setVisibility(View.GONE); | |
| 421 | + } | |
| 422 | + } else { | |
| 423 | + String showTime = getTime(tbub.getTime(), null); | |
| 424 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 425 | + holder.chat_time.setText(showTime); | |
| 426 | + } | |
| 427 | + | |
| 428 | + holder.voice_group.setVisibility(View.VISIBLE); | |
| 429 | + if (holder.receiver_voice_unread != null) | |
| 430 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 431 | + if (holder.receiver_voice_unread != null && unReadPosition != null) { | |
| 432 | + for (String unRead : unReadPosition) { | |
| 433 | + if (unRead.equals(position + "")) { | |
| 434 | + holder.receiver_voice_unread | |
| 435 | + .setVisibility(View.VISIBLE); | |
| 436 | + break; | |
| 437 | + } | |
| 438 | + } | |
| 439 | + } | |
| 440 | + AnimationDrawable drawable; | |
| 441 | + holder.voice_anim.setId(position); | |
| 442 | + if (position == voicePlayPosition) { | |
| 443 | + holder.voice_anim | |
| 444 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 445 | + holder.voice_anim | |
| 446 | + .setBackgroundResource(R.drawable.voice_play_receiver); | |
| 447 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 448 | + .getBackground(); | |
| 449 | + drawable.start(); | |
| 450 | + } else { | |
| 451 | + holder.voice_anim | |
| 452 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 453 | + } | |
| 454 | + holder.voice_group.setOnClickListener(new View.OnClickListener() { | |
| 455 | + | |
| 456 | + @Override | |
| 457 | + public void onClick(View v) { | |
| 458 | + // TODO Auto-generated method stub | |
| 459 | + if (holder.receiver_voice_unread != null) | |
| 460 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 461 | + holder.voice_anim | |
| 462 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 463 | + stopPlayVoice(); | |
| 464 | + voicePlayPosition = holder.voice_anim.getId(); | |
| 465 | + AnimationDrawable drawable; | |
| 466 | + holder.voice_anim | |
| 467 | + .setBackgroundResource(R.drawable.voice_play_receiver); | |
| 468 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 469 | + .getBackground(); | |
| 470 | + drawable.start(); | |
| 471 | + String voicePath = tbub.getUserVoicePath() == null ? "" : tbub | |
| 472 | + .getUserVoicePath(); | |
| 473 | + File file = new File(voicePath); | |
| 474 | + if (!(!voicePath.equals("") && FileSaveUtil | |
| 475 | + .isFileExists(file))) { | |
| 476 | + voicePath = tbub.getUserVoiceUrl() == null ? "" | |
| 477 | + : tbub.getUserVoiceUrl(); | |
| 478 | + } | |
| 479 | + if (voiceIsRead != null) { | |
| 480 | + voiceIsRead.voiceOnClick(position); | |
| 481 | + } | |
| 482 | + MediaManager.playSound(voicePath, | |
| 483 | + new MediaPlayer.OnCompletionListener() { | |
| 484 | + | |
| 485 | + @Override | |
| 486 | + public void onCompletion(MediaPlayer mp) { | |
| 487 | + voicePlayPosition = -1; | |
| 488 | + holder.voice_anim | |
| 489 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 490 | + } | |
| 491 | + }); | |
| 492 | + } | |
| 493 | + | |
| 494 | + }); | |
| 495 | + float voiceTime = tbub.getUserVoiceTime(); | |
| 496 | + BigDecimal b = new BigDecimal(voiceTime); | |
| 497 | + float f1 = b.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); | |
| 498 | + holder.voice_time.setText(f1 + "\""); | |
| 499 | + ViewGroup.LayoutParams lParams = holder.voice_image | |
| 500 | + .getLayoutParams(); | |
| 501 | + lParams.width = (int) (mMinItemWith + mMaxItemWith / 60f | |
| 502 | + * tbub.getUserVoiceTime()); | |
| 503 | + holder.voice_image.setLayoutParams(lParams); | |
| 504 | + } | |
| 505 | + | |
| 506 | + private void toMsgUserLayout(final ToUserMsgViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 507 | + holder.headicon.setBackgroundResource(R.mipmap.grzx_tx_s); | |
| 508 | + holder.headicon.setImageDrawable(context.getResources() | |
| 509 | + .getDrawable(R.mipmap.grzx_tx_s)); | |
| 510 | + /* time */ | |
| 511 | + if (position != 0) { | |
| 512 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 513 | + .getTime()); | |
| 514 | + if (showTime != null) { | |
| 515 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 516 | + holder.chat_time.setText(showTime); | |
| 517 | + } else { | |
| 518 | + holder.chat_time.setVisibility(View.GONE); | |
| 519 | + } | |
| 520 | + } else { | |
| 521 | + String showTime = getTime(tbub.getTime(), null); | |
| 522 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 523 | + holder.chat_time.setText(showTime); | |
| 524 | + } | |
| 525 | + | |
| 526 | + holder.content.setVisibility(View.VISIBLE); | |
| 527 | + holder.content.setSpanText(handler, tbub.getUserContent(), isGif); | |
| 528 | + } | |
| 529 | + | |
| 530 | + private void toImgUserLayout(final ToUserImgViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 531 | + holder.headicon.setBackgroundResource(R.mipmap.grzx_tx_s); | |
| 532 | + switch (tbub.getSendState()) { | |
| 533 | + case ChatConst.SENDING: | |
| 534 | + an = AnimationUtils.loadAnimation(context, | |
| 535 | + R.anim.update_loading_progressbar_anim); | |
| 536 | + LinearInterpolator lin = new LinearInterpolator(); | |
| 537 | + an.setInterpolator(lin); | |
| 538 | + an.setRepeatCount(-1); | |
| 539 | + holder.sendFailImg | |
| 540 | + .setBackgroundResource(R.mipmap.xsearch_loading); | |
| 541 | + holder.sendFailImg.startAnimation(an); | |
| 542 | + an.startNow(); | |
| 543 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 544 | + break; | |
| 545 | + | |
| 546 | + case ChatConst.COMPLETED: | |
| 547 | + holder.sendFailImg.clearAnimation(); | |
| 548 | + holder.sendFailImg.setVisibility(View.GONE); | |
| 549 | + break; | |
| 550 | + | |
| 551 | + case ChatConst.SENDERROR: | |
| 552 | + holder.sendFailImg.clearAnimation(); | |
| 553 | + holder.sendFailImg | |
| 554 | + .setBackgroundResource(R.mipmap.msg_state_fail_resend_pressed); | |
| 555 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 556 | + holder.sendFailImg.setOnClickListener(new View.OnClickListener() { | |
| 557 | + | |
| 558 | + @Override | |
| 559 | + public void onClick(View view) { | |
| 560 | + // TODO Auto-generated method stub | |
| 561 | + if (sendErrorListener != null) { | |
| 562 | + sendErrorListener.onClick(position); | |
| 563 | + } | |
| 564 | + } | |
| 565 | + | |
| 566 | + }); | |
| 567 | + break; | |
| 568 | + default: | |
| 569 | + break; | |
| 570 | + } | |
| 571 | + holder.headicon.setImageDrawable(context.getResources() | |
| 572 | + .getDrawable(R.mipmap.grzx_tx_s)); | |
| 573 | + | |
| 574 | + /* time */ | |
| 575 | + if (position != 0) { | |
| 576 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 577 | + .getTime()); | |
| 578 | + if (showTime != null) { | |
| 579 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 580 | + holder.chat_time.setText(showTime); | |
| 581 | + } else { | |
| 582 | + holder.chat_time.setVisibility(View.GONE); | |
| 583 | + } | |
| 584 | + } else { | |
| 585 | + String showTime = getTime(tbub.getTime(), null); | |
| 586 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 587 | + holder.chat_time.setText(showTime); | |
| 588 | + } | |
| 589 | + | |
| 590 | + if (isPicRefresh) { | |
| 591 | +// holder.image_Msg.setImageBitmap(null); | |
| 592 | + holder.image_group.setVisibility(View.VISIBLE); | |
| 593 | + final String imageSrc = tbub.getImageLocal() == null ? "" : tbub | |
| 594 | + .getImageLocal(); | |
| 595 | + final String imageUrlSrc = tbub.getImageUrl() == null ? "" : tbub | |
| 596 | + .getImageUrl(); | |
| 597 | + final String imageIconUrl = tbub.getImageIconUrl() == null ? "" | |
| 598 | + : tbub.getImageIconUrl(); | |
| 599 | + File file = new File(imageSrc); | |
| 600 | + final boolean hasLocal = !imageSrc.equals("") | |
| 601 | + && FileSaveUtil.isFileExists(file); | |
| 602 | + int res; | |
| 603 | + res = R.drawable.chatto_bg_focused; | |
| 604 | + if (hasLocal) { | |
| 605 | + holder.image_Msg.setLocalImageBitmap(ImageCheckoutUtil.getLoacalBitmap(imageSrc), | |
| 606 | + res); | |
| 607 | + } else { | |
| 608 | + holder.image_Msg.load(imageIconUrl, res, R.mipmap.cygs_cs); | |
| 609 | + } | |
| 610 | + holder.image_Msg.setOnClickListener(new View.OnClickListener() { | |
| 611 | + | |
| 612 | + @Override | |
| 613 | + public void onClick(View view) { | |
| 614 | + // TODO Auto-generated method stub | |
| 615 | + stopPlayVoice(); | |
| 616 | + Intent intent = new Intent(context, ImageViewActivity.class); | |
| 617 | + intent.putStringArrayListExtra("images", imageList); | |
| 618 | + intent.putExtra("clickedIndex", imagePosition.get(position)); | |
| 619 | + context.startActivity(intent); | |
| 620 | + } | |
| 621 | + | |
| 622 | + }); | |
| 623 | + } | |
| 624 | + } | |
| 625 | + | |
| 626 | + private void toVoiceUserLayout(final ToUserVoiceViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 627 | + holder.headicon.setBackgroundResource(R.mipmap.grzx_tx_s); | |
| 628 | + switch (tbub.getSendState()) { | |
| 629 | + case ChatConst.SENDING: | |
| 630 | + an = AnimationUtils.loadAnimation(context, | |
| 631 | + R.anim.update_loading_progressbar_anim); | |
| 632 | + LinearInterpolator lin = new LinearInterpolator(); | |
| 633 | + an.setInterpolator(lin); | |
| 634 | + an.setRepeatCount(-1); | |
| 635 | + holder.sendFailImg | |
| 636 | + .setBackgroundResource(R.mipmap.xsearch_loading); | |
| 637 | + holder.sendFailImg.startAnimation(an); | |
| 638 | + an.startNow(); | |
| 639 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 640 | + break; | |
| 641 | + | |
| 642 | + case ChatConst.COMPLETED: | |
| 643 | + holder.sendFailImg.clearAnimation(); | |
| 644 | + holder.sendFailImg.setVisibility(View.GONE); | |
| 645 | + break; | |
| 646 | + | |
| 647 | + case ChatConst.SENDERROR: | |
| 648 | + holder.sendFailImg.clearAnimation(); | |
| 649 | + holder.sendFailImg | |
| 650 | + .setBackgroundResource(R.mipmap.msg_state_fail_resend_pressed); | |
| 651 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 652 | + holder.sendFailImg.setOnClickListener(new View.OnClickListener() { | |
| 653 | + | |
| 654 | + @Override | |
| 655 | + public void onClick(View view) { | |
| 656 | + // TODO Auto-generated method stub | |
| 657 | + if (sendErrorListener != null) { | |
| 658 | + sendErrorListener.onClick(position); | |
| 659 | + } | |
| 660 | + } | |
| 661 | + | |
| 662 | + }); | |
| 663 | + break; | |
| 664 | + default: | |
| 665 | + break; | |
| 666 | + } | |
| 667 | + holder.headicon.setImageDrawable(context.getResources() | |
| 668 | + .getDrawable(R.mipmap.grzx_tx_s)); | |
| 669 | + | |
| 670 | + /* time */ | |
| 671 | + if (position != 0) { | |
| 672 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 673 | + .getTime()); | |
| 674 | + if (showTime != null) { | |
| 675 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 676 | + holder.chat_time.setText(showTime); | |
| 677 | + } else { | |
| 678 | + holder.chat_time.setVisibility(View.GONE); | |
| 679 | + } | |
| 680 | + } else { | |
| 681 | + String showTime = getTime(tbub.getTime(), null); | |
| 682 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 683 | + holder.chat_time.setText(showTime); | |
| 684 | + } | |
| 685 | + holder.voice_group.setVisibility(View.VISIBLE); | |
| 686 | + if (holder.receiver_voice_unread != null) | |
| 687 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 688 | + if (holder.receiver_voice_unread != null && unReadPosition != null) { | |
| 689 | + for (String unRead : unReadPosition) { | |
| 690 | + if (unRead.equals(position + "")) { | |
| 691 | + holder.receiver_voice_unread | |
| 692 | + .setVisibility(View.VISIBLE); | |
| 693 | + break; | |
| 694 | + } | |
| 695 | + } | |
| 696 | + } | |
| 697 | + AnimationDrawable drawable; | |
| 698 | + holder.voice_anim.setId(position); | |
| 699 | + if (position == voicePlayPosition) { | |
| 700 | + holder.voice_anim.setBackgroundResource(R.mipmap.adj); | |
| 701 | + holder.voice_anim | |
| 702 | + .setBackgroundResource(R.drawable.voice_play_send); | |
| 703 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 704 | + .getBackground(); | |
| 705 | + drawable.start(); | |
| 706 | + } else { | |
| 707 | + holder.voice_anim.setBackgroundResource(R.mipmap.adj); | |
| 708 | + } | |
| 709 | + holder.voice_group.setOnClickListener(new View.OnClickListener() { | |
| 710 | + | |
| 711 | + @Override | |
| 712 | + public void onClick(View v) { | |
| 713 | + // TODO Auto-generated method stub | |
| 714 | + if (holder.receiver_voice_unread != null) | |
| 715 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 716 | + holder.voice_anim.setBackgroundResource(R.mipmap.adj); | |
| 717 | + stopPlayVoice(); | |
| 718 | + voicePlayPosition = holder.voice_anim.getId(); | |
| 719 | + AnimationDrawable drawable; | |
| 720 | + holder.voice_anim | |
| 721 | + .setBackgroundResource(R.drawable.voice_play_send); | |
| 722 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 723 | + .getBackground(); | |
| 724 | + drawable.start(); | |
| 725 | + String voicePath = tbub.getUserVoiceUrl() == null ? "" | |
| 726 | + : tbub.getUserVoiceUrl(); | |
| 727 | + if (voiceIsRead != null) { | |
| 728 | + voiceIsRead.voiceOnClick(position); | |
| 729 | + } | |
| 730 | + MediaManager.playSound(voicePath, | |
| 731 | + new MediaPlayer.OnCompletionListener() { | |
| 732 | + | |
| 733 | + @Override | |
| 734 | + public void onCompletion(MediaPlayer mp) { | |
| 735 | + voicePlayPosition = -1; | |
| 736 | + holder.voice_anim | |
| 737 | + .setBackgroundResource(R.mipmap.adj); | |
| 738 | + } | |
| 739 | + }); | |
| 740 | + } | |
| 741 | + | |
| 742 | + }); | |
| 743 | + float voiceTime = tbub.getUserVoiceTime(); | |
| 744 | + BigDecimal b = new BigDecimal(voiceTime); | |
| 745 | + float f1 = b.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); | |
| 746 | + holder.voice_time.setText(f1 + "\""); | |
| 747 | + ViewGroup.LayoutParams lParams = holder.voice_image | |
| 748 | + .getLayoutParams(); | |
| 749 | + lParams.width = (int) (mMinItemWith + mMaxItemWith / 60f | |
| 750 | + * tbub.getUserVoiceTime()); | |
| 751 | + holder.voice_image.setLayoutParams(lParams); | |
| 752 | + } | |
| 753 | + | |
| 754 | + @SuppressLint("SimpleDateFormat") | |
| 755 | + public String getTime(String time, String before) { | |
| 756 | + String show_time = null; | |
| 757 | + if (before != null) { | |
| 758 | + try { | |
| 759 | + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
| 760 | + java.util.Date now = df.parse(time); | |
| 761 | + java.util.Date date = df.parse(before); | |
| 762 | + long l = now.getTime() - date.getTime(); | |
| 763 | + long day = l / (24 * 60 * 60 * 1000); | |
| 764 | + long hour = (l / (60 * 60 * 1000) - day * 24); | |
| 765 | + long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60); | |
| 766 | + if (min >= 1) { | |
| 767 | + show_time = time.substring(11); | |
| 768 | + } | |
| 769 | + } catch (Exception e) { | |
| 770 | + e.printStackTrace(); | |
| 771 | + } | |
| 772 | + } else { | |
| 773 | + show_time = time.substring(11); | |
| 774 | + } | |
| 775 | + String getDay = getDay(time); | |
| 776 | + if (show_time != null && getDay != null) | |
| 777 | + show_time = getDay + " " + show_time; | |
| 778 | + return show_time; | |
| 779 | + } | |
| 780 | + | |
| 781 | + @SuppressLint("SimpleDateFormat") | |
| 782 | + public static String returnTime() { | |
| 783 | + SimpleDateFormat sDateFormat = new SimpleDateFormat( | |
| 784 | + "yyyy-MM-dd HH:mm:ss"); | |
| 785 | + String date = sDateFormat.format(new java.util.Date()); | |
| 786 | + return date; | |
| 787 | + } | |
| 788 | + | |
| 789 | + @SuppressLint("SimpleDateFormat") | |
| 790 | + public String getDay(String time) { | |
| 791 | + String showDay = null; | |
| 792 | + String nowTime = returnTime(); | |
| 793 | + try { | |
| 794 | + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
| 795 | + java.util.Date now = df.parse(nowTime); | |
| 796 | + java.util.Date date = df.parse(time); | |
| 797 | + long l = now.getTime() - date.getTime(); | |
| 798 | + long day = l / (24 * 60 * 60 * 1000); | |
| 799 | + if (day >= 365) { | |
| 800 | + showDay = time.substring(0, 10); | |
| 801 | + } else if (day >= 1 && day < 365) { | |
| 802 | + showDay = time.substring(5, 10); | |
| 803 | + } | |
| 804 | + } catch (Exception e) { | |
| 805 | + e.printStackTrace(); | |
| 806 | + } | |
| 807 | + return showDay; | |
| 808 | + } | |
| 809 | + | |
| 810 | + public void stopPlayVoice() { | |
| 811 | + if (voicePlayPosition != -1) { | |
| 812 | + View voicePlay = (View) ((Activity) context) | |
| 813 | + .findViewById(voicePlayPosition); | |
| 814 | + if (voicePlay != null) { | |
| 815 | + if (getItemViewType(voicePlayPosition) == FROM_USER_VOICE) { | |
| 816 | + voicePlay | |
| 817 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 818 | + } else { | |
| 819 | + voicePlay.setBackgroundResource(R.mipmap.adj); | |
| 820 | + } | |
| 821 | + } | |
| 822 | + MediaManager.pause(); | |
| 823 | + voicePlayPosition = -1; | |
| 824 | + } | |
| 825 | + } | |
| 826 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/activity/chartroom/adapter/ChatRecyclerAdapter.java
0 → 100644
| ... | ... | @@ -0,0 +1,858 @@ |
| 1 | +package com.shunzhi.parent.ui.activity.chartroom.adapter; | |
| 2 | + | |
| 3 | +import android.annotation.SuppressLint; | |
| 4 | +import android.app.Activity; | |
| 5 | +import android.content.Context; | |
| 6 | +import android.content.Intent; | |
| 7 | +import android.graphics.Bitmap; | |
| 8 | +import android.graphics.BitmapFactory; | |
| 9 | +import android.graphics.drawable.AnimationDrawable; | |
| 10 | +import android.media.MediaPlayer; | |
| 11 | +import android.os.Handler; | |
| 12 | +import android.support.v7.widget.RecyclerView; | |
| 13 | +import android.text.TextUtils; | |
| 14 | +import android.util.DisplayMetrics; | |
| 15 | +import android.view.LayoutInflater; | |
| 16 | +import android.view.View; | |
| 17 | +import android.view.ViewGroup; | |
| 18 | +import android.view.WindowManager; | |
| 19 | +import android.view.animation.Animation; | |
| 20 | +import android.view.animation.AnimationUtils; | |
| 21 | +import android.view.animation.LinearInterpolator; | |
| 22 | +import android.widget.FrameLayout; | |
| 23 | +import android.widget.ImageView; | |
| 24 | +import android.widget.LinearLayout; | |
| 25 | +import android.widget.TextView; | |
| 26 | + | |
| 27 | +import com.bumptech.glide.Glide; | |
| 28 | +import com.shunzhi.mychartlibrary.db.ChatMessageBean; | |
| 29 | +import com.shunzhi.parent.AppConfig; | |
| 30 | +import com.shunzhi.parent.AppContext; | |
| 31 | +import com.shunzhi.parent.R; | |
| 32 | +import com.shunzhi.parent.ui.activity.chartroom.ImageViewActivity; | |
| 33 | +import com.shunzhi.mychartlibrary.common.ChatConst; | |
| 34 | +import com.shunzhi.mychartlibrary.utils.FileSaveUtil; | |
| 35 | +import com.shunzhi.mychartlibrary.widget.BubbleImageView; | |
| 36 | +import com.shunzhi.mychartlibrary.widget.CustomShapeTransformation; | |
| 37 | +import com.shunzhi.mychartlibrary.widget.GifTextView; | |
| 38 | +import com.shunzhi.mychartlibrary.widget.MediaManager; | |
| 39 | +import com.shunzhi.parent.util.GlideUtils; | |
| 40 | + | |
| 41 | +import java.io.BufferedInputStream; | |
| 42 | +import java.io.ByteArrayOutputStream; | |
| 43 | +import java.io.File; | |
| 44 | +import java.io.FileInputStream; | |
| 45 | +import java.io.FileNotFoundException; | |
| 46 | +import java.io.IOException; | |
| 47 | +import java.math.BigDecimal; | |
| 48 | +import java.text.DateFormat; | |
| 49 | +import java.text.SimpleDateFormat; | |
| 50 | +import java.util.ArrayList; | |
| 51 | +import java.util.HashMap; | |
| 52 | +import java.util.List; | |
| 53 | + | |
| 54 | +/** | |
| 55 | + * Created by Mao Jiqing on 2016/9/29. | |
| 56 | + */ | |
| 57 | +public class ChatRecyclerAdapter extends | |
| 58 | + RecyclerView.Adapter<RecyclerView.ViewHolder> { | |
| 59 | + private Context context; | |
| 60 | + private List<ChatMessageBean> userList = new ArrayList<ChatMessageBean>(); | |
| 61 | + private ArrayList<String> imageList = new ArrayList<String>(); | |
| 62 | + private HashMap<Integer, Integer> imagePosition = new HashMap<Integer, Integer>(); | |
| 63 | + public static final int FROM_USER_MSG = 0;//接收消息类型 | |
| 64 | + public static final int TO_USER_MSG = 1;//发送消息类型 | |
| 65 | + public static final int FROM_USER_IMG = 2;//接收消息类型 | |
| 66 | + public static final int TO_USER_IMG = 3;//发送消息类型 | |
| 67 | + public static final int FROM_USER_VOICE = 4;//接收消息类型 | |
| 68 | + public static final int TO_USER_VOICE = 5;//发送消息类型 | |
| 69 | + private int mMinItemWith;// 设置对话框的最大宽度和最小宽度 | |
| 70 | + private int mMaxItemWith; | |
| 71 | + public Handler handler; | |
| 72 | + private Animation an; | |
| 73 | + private SendErrorListener sendErrorListener; | |
| 74 | + private VoiceIsRead voiceIsRead; | |
| 75 | + public List<String> unReadPosition = new ArrayList<String>(); | |
| 76 | + private int voicePlayPosition = -1; | |
| 77 | + private LayoutInflater mLayoutInflater; | |
| 78 | + private boolean isGif = true; | |
| 79 | + public boolean isPicRefresh = true; | |
| 80 | + private String parentUrl = "",childPhoto; | |
| 81 | + | |
| 82 | + public interface SendErrorListener { | |
| 83 | + public void onClick(int position); | |
| 84 | + } | |
| 85 | + | |
| 86 | + public void setSendErrorListener(SendErrorListener sendErrorListener) { | |
| 87 | + this.sendErrorListener = sendErrorListener; | |
| 88 | + } | |
| 89 | + | |
| 90 | + public interface VoiceIsRead { | |
| 91 | + public void voiceOnClick(int position); | |
| 92 | + } | |
| 93 | + | |
| 94 | + public void setVoiceIsReadListener(VoiceIsRead voiceIsRead) { | |
| 95 | + this.voiceIsRead = voiceIsRead; | |
| 96 | + } | |
| 97 | + | |
| 98 | + public ChatRecyclerAdapter(Context context, List<ChatMessageBean> userList,String childPhoto) { | |
| 99 | + this.context = context; | |
| 100 | + this.userList = userList; | |
| 101 | + mLayoutInflater = LayoutInflater.from(context); | |
| 102 | + // 获取系统宽度 | |
| 103 | + WindowManager wManager = (WindowManager) context | |
| 104 | + .getSystemService(Context.WINDOW_SERVICE); | |
| 105 | + DisplayMetrics outMetrics = new DisplayMetrics(); | |
| 106 | + wManager.getDefaultDisplay().getMetrics(outMetrics); | |
| 107 | + mMaxItemWith = (int) (outMetrics.widthPixels * 0.5f); | |
| 108 | + mMinItemWith = (int) (outMetrics.widthPixels * 0.15f); | |
| 109 | + handler = new Handler(); | |
| 110 | + parentUrl= AppConfig.getAppConfig(AppContext.getInstance()).get(AppConfig.USER_IMAGE); | |
| 111 | + this.childPhoto=childPhoto; | |
| 112 | + } | |
| 113 | + | |
| 114 | + public void setIsGif(boolean isGif) { | |
| 115 | + this.isGif = isGif; | |
| 116 | + } | |
| 117 | + | |
| 118 | + public void setImageList(ArrayList<String> imageList) { | |
| 119 | + this.imageList = imageList; | |
| 120 | + } | |
| 121 | + | |
| 122 | + public void setImagePosition(HashMap<Integer, Integer> imagePosition) { | |
| 123 | + this.imagePosition = imagePosition; | |
| 124 | + } | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * @param parent | |
| 128 | + * @param viewType | |
| 129 | + * @return | |
| 130 | + */ | |
| 131 | + @Override | |
| 132 | + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |
| 133 | + View view = null; | |
| 134 | + RecyclerView.ViewHolder holder = null; | |
| 135 | + switch (viewType) { | |
| 136 | + case FROM_USER_MSG: | |
| 137 | + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_msgfrom_list_item, parent, false); | |
| 138 | + holder = new FromUserMsgViewHolder(view); | |
| 139 | + break; | |
| 140 | + case FROM_USER_IMG: | |
| 141 | + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_imagefrom_list_item, parent, false); | |
| 142 | + holder = new FromUserImageViewHolder(view); | |
| 143 | + break; | |
| 144 | + case FROM_USER_VOICE: | |
| 145 | + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_voicefrom_list_item, parent, false); | |
| 146 | + holder = new FromUserVoiceViewHolder(view); | |
| 147 | + break; | |
| 148 | + case TO_USER_MSG: | |
| 149 | + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_msgto_list_item, parent, false); | |
| 150 | + holder = new ToUserMsgViewHolder(view); | |
| 151 | + break; | |
| 152 | + case TO_USER_IMG: | |
| 153 | + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_imageto_list_item, parent, false); | |
| 154 | + holder = new ToUserImgViewHolder(view); | |
| 155 | + break; | |
| 156 | + case TO_USER_VOICE: | |
| 157 | + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_voiceto_list_item, parent, false); | |
| 158 | + holder = new ToUserVoiceViewHolder(view); | |
| 159 | + break; | |
| 160 | + } | |
| 161 | + return holder; | |
| 162 | + } | |
| 163 | + | |
| 164 | + class FromUserMsgViewHolder extends RecyclerView.ViewHolder { | |
| 165 | + private ImageView headicon; | |
| 166 | + private TextView chat_time; | |
| 167 | + private GifTextView content; | |
| 168 | + | |
| 169 | + public FromUserMsgViewHolder(View view) { | |
| 170 | + super(view); | |
| 171 | + headicon = (ImageView) view | |
| 172 | + .findViewById(R.id.tb_other_user_icon); | |
| 173 | + chat_time = (TextView) view.findViewById(R.id.chat_time); | |
| 174 | + content = (GifTextView) view.findViewById(R.id.content); | |
| 175 | + } | |
| 176 | + } | |
| 177 | + | |
| 178 | + class FromUserImageViewHolder extends RecyclerView.ViewHolder { | |
| 179 | + private ImageView headicon; | |
| 180 | + private TextView chat_time; | |
| 181 | + private BubbleImageView image_Msg; | |
| 182 | + | |
| 183 | + public FromUserImageViewHolder(View view) { | |
| 184 | + super(view); | |
| 185 | + headicon = (ImageView) view | |
| 186 | + .findViewById(R.id.tb_other_user_icon); | |
| 187 | + chat_time = (TextView) view.findViewById(R.id.chat_time); | |
| 188 | + image_Msg = (BubbleImageView) view | |
| 189 | + .findViewById(R.id.image_message); | |
| 190 | + } | |
| 191 | + } | |
| 192 | + | |
| 193 | + class FromUserVoiceViewHolder extends RecyclerView.ViewHolder { | |
| 194 | + private ImageView headicon; | |
| 195 | + private TextView chat_time; | |
| 196 | + private LinearLayout voice_group; | |
| 197 | + private TextView voice_time; | |
| 198 | + private FrameLayout voice_image; | |
| 199 | + private View receiver_voice_unread; | |
| 200 | + private View voice_anim; | |
| 201 | + | |
| 202 | + public FromUserVoiceViewHolder(View view) { | |
| 203 | + super(view); | |
| 204 | + headicon = (ImageView) view | |
| 205 | + .findViewById(R.id.tb_other_user_icon); | |
| 206 | + chat_time = (TextView) view.findViewById(R.id.chat_time); | |
| 207 | + voice_group = (LinearLayout) view | |
| 208 | + .findViewById(R.id.voice_group); | |
| 209 | + voice_time = (TextView) view | |
| 210 | + .findViewById(R.id.voice_time); | |
| 211 | + receiver_voice_unread = (View) view | |
| 212 | + .findViewById(R.id.receiver_voice_unread); | |
| 213 | + voice_image = (FrameLayout) view | |
| 214 | + .findViewById(R.id.voice_receiver_image); | |
| 215 | + voice_anim = (View) view | |
| 216 | + .findViewById(R.id.id_receiver_recorder_anim); | |
| 217 | + } | |
| 218 | + } | |
| 219 | + | |
| 220 | + class ToUserMsgViewHolder extends RecyclerView.ViewHolder { | |
| 221 | + private ImageView headicon; | |
| 222 | + private TextView chat_time; | |
| 223 | + private GifTextView content; | |
| 224 | + private ImageView sendFailImg; | |
| 225 | + | |
| 226 | + public ToUserMsgViewHolder(View view) { | |
| 227 | + super(view); | |
| 228 | + headicon = (ImageView) view | |
| 229 | + .findViewById(R.id.tb_my_user_icon); | |
| 230 | + chat_time = (TextView) view | |
| 231 | + .findViewById(R.id.mychat_time); | |
| 232 | + content = (GifTextView) view | |
| 233 | + .findViewById(R.id.mycontent); | |
| 234 | + sendFailImg = (ImageView) view | |
| 235 | + .findViewById(R.id.mysend_fail_img); | |
| 236 | + } | |
| 237 | + } | |
| 238 | + | |
| 239 | + class ToUserImgViewHolder extends RecyclerView.ViewHolder { | |
| 240 | + private ImageView headicon; | |
| 241 | + private TextView chat_time; | |
| 242 | + private LinearLayout image_group; | |
| 243 | + private BubbleImageView image_Msg; | |
| 244 | + private ImageView sendFailImg; | |
| 245 | + | |
| 246 | + public ToUserImgViewHolder(View view) { | |
| 247 | + super(view); | |
| 248 | + headicon = (ImageView) view | |
| 249 | + .findViewById(R.id.tb_my_user_icon); | |
| 250 | + chat_time = (TextView) view | |
| 251 | + .findViewById(R.id.mychat_time); | |
| 252 | + sendFailImg = (ImageView) view | |
| 253 | + .findViewById(R.id.mysend_fail_img); | |
| 254 | + image_group = (LinearLayout) view | |
| 255 | + .findViewById(R.id.image_group); | |
| 256 | + image_Msg = (BubbleImageView) view | |
| 257 | + .findViewById(R.id.image_message); | |
| 258 | + } | |
| 259 | + } | |
| 260 | + | |
| 261 | + class ToUserVoiceViewHolder extends RecyclerView.ViewHolder { | |
| 262 | + private ImageView headicon; | |
| 263 | + private TextView chat_time; | |
| 264 | + private LinearLayout voice_group; | |
| 265 | + private TextView voice_time; | |
| 266 | + private FrameLayout voice_image; | |
| 267 | + private View receiver_voice_unread; | |
| 268 | + private View voice_anim; | |
| 269 | + private ImageView sendFailImg; | |
| 270 | + | |
| 271 | + public ToUserVoiceViewHolder(View view) { | |
| 272 | + super(view); | |
| 273 | + headicon = (ImageView) view | |
| 274 | + .findViewById(R.id.tb_my_user_icon); | |
| 275 | + chat_time = (TextView) view | |
| 276 | + .findViewById(R.id.mychat_time); | |
| 277 | + voice_group = (LinearLayout) view | |
| 278 | + .findViewById(R.id.voice_group); | |
| 279 | + voice_time = (TextView) view | |
| 280 | + .findViewById(R.id.voice_time); | |
| 281 | + voice_image = (FrameLayout) view | |
| 282 | + .findViewById(R.id.voice_image); | |
| 283 | + voice_anim = (View) view | |
| 284 | + .findViewById(R.id.id_recorder_anim); | |
| 285 | + sendFailImg = (ImageView) view | |
| 286 | + .findViewById(R.id.mysend_fail_img); | |
| 287 | + } | |
| 288 | + } | |
| 289 | + | |
| 290 | + /** | |
| 291 | + * @param holder | |
| 292 | + * @param position | |
| 293 | + */ | |
| 294 | + @Override | |
| 295 | + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { | |
| 296 | + ChatMessageBean tbub = userList.get(position); | |
| 297 | + int itemViewType = getItemViewType(position); | |
| 298 | + switch (itemViewType) { | |
| 299 | + case FROM_USER_MSG: | |
| 300 | + fromMsgUserLayout((FromUserMsgViewHolder) holder, tbub, position); | |
| 301 | + break; | |
| 302 | + case FROM_USER_IMG: | |
| 303 | + fromImgUserLayout((FromUserImageViewHolder) holder, tbub, position); | |
| 304 | + break; | |
| 305 | + case FROM_USER_VOICE: | |
| 306 | + fromVoiceUserLayout((FromUserVoiceViewHolder) holder, tbub, position); | |
| 307 | + break; | |
| 308 | + case TO_USER_MSG: | |
| 309 | + toMsgUserLayout((ToUserMsgViewHolder) holder, tbub, position); | |
| 310 | + break; | |
| 311 | + case TO_USER_IMG: | |
| 312 | + toImgUserLayout((ToUserImgViewHolder) holder, tbub, position); | |
| 313 | + break; | |
| 314 | + case TO_USER_VOICE: | |
| 315 | + toVoiceUserLayout((ToUserVoiceViewHolder) holder, tbub, position); | |
| 316 | + break; | |
| 317 | + } | |
| 318 | + } | |
| 319 | + | |
| 320 | + @Override | |
| 321 | + public int getItemViewType(int position) { | |
| 322 | + return userList.get(position).getType(); | |
| 323 | + } | |
| 324 | + | |
| 325 | + @Override | |
| 326 | + public int getItemCount() { | |
| 327 | + return userList.size(); | |
| 328 | + } | |
| 329 | + | |
| 330 | + private void fromMsgUserLayout(final FromUserMsgViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 331 | +// holder.headicon.setBackgroundResource(R.mipmap.tongbao_hiv); | |
| 332 | + if (!TextUtils.isEmpty(childPhoto)) | |
| 333 | + GlideUtils.showImg(context,holder.headicon,childPhoto); | |
| 334 | + else holder.headicon.setImageResource(R.drawable.header_icon); | |
| 335 | + /* time */ | |
| 336 | + if (position != 0) { | |
| 337 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 338 | + .getTime()); | |
| 339 | + if (showTime != null) { | |
| 340 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 341 | + holder.chat_time.setText(showTime); | |
| 342 | + } else { | |
| 343 | + holder.chat_time.setVisibility(View.GONE); | |
| 344 | + } | |
| 345 | + } else { | |
| 346 | + String showTime = getTime(tbub.getTime(), null); | |
| 347 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 348 | + holder.chat_time.setText(showTime); | |
| 349 | + } | |
| 350 | + holder.content.setVisibility(View.VISIBLE); | |
| 351 | + holder.content.setSpanText(handler, tbub.getUserContent(), isGif); | |
| 352 | + } | |
| 353 | + | |
| 354 | + private void fromImgUserLayout(final FromUserImageViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 355 | + if (!TextUtils.isEmpty(childPhoto)) | |
| 356 | + GlideUtils.showImg(context,holder.headicon,childPhoto); | |
| 357 | + else holder.headicon.setImageResource(R.drawable.header_icon); | |
| 358 | + /* time */ | |
| 359 | + if (position != 0) { | |
| 360 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 361 | + .getTime()); | |
| 362 | + if (showTime != null) { | |
| 363 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 364 | + holder.chat_time.setText(showTime); | |
| 365 | + } else { | |
| 366 | + holder.chat_time.setVisibility(View.GONE); | |
| 367 | + } | |
| 368 | + } else { | |
| 369 | + String showTime = getTime(tbub.getTime(), null); | |
| 370 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 371 | + holder.chat_time.setText(showTime); | |
| 372 | + } | |
| 373 | +// if (isPicRefresh) { | |
| 374 | + final String imageSrc = tbub.getImageLocal() == null ? "" : tbub | |
| 375 | + .getImageLocal(); | |
| 376 | + final String imageUrlSrc = tbub.getImageUrl() == null ? "" : tbub | |
| 377 | + .getImageUrl(); | |
| 378 | + final String imageIconUrl = tbub.getImageIconUrl() == null ? "" | |
| 379 | + : tbub.getImageIconUrl(); | |
| 380 | + File file = new File(imageSrc); | |
| 381 | + final boolean hasLocal = !imageSrc.equals("") | |
| 382 | + && FileSaveUtil.isFileExists(file); | |
| 383 | + int res; | |
| 384 | + res = R.drawable.chatfrom_bg_focused; | |
| 385 | +// Glide.with(context).load(imageSrc).transform(new CustomShapeTransformation(context, res)).into(holder.image_Msg); | |
| 386 | + Glide.with(context).load(imageSrc).placeholder(R.mipmap.cygs_cs).transform(new CustomShapeTransformation(context, res)).into(holder.image_Msg); | |
| 387 | + | |
| 388 | + holder.image_Msg.setOnClickListener(new View.OnClickListener() { | |
| 389 | + | |
| 390 | + @Override | |
| 391 | + public void onClick(View view) { | |
| 392 | + // TODO Auto-generated method stub | |
| 393 | + stopPlayVoice(); | |
| 394 | + Intent intent = new Intent(context, ImageViewActivity.class); | |
| 395 | + intent.putStringArrayListExtra("images", imageList); | |
| 396 | + intent.putExtra("clickedIndex", imagePosition.get(position)); | |
| 397 | + context.startActivity(intent); | |
| 398 | + } | |
| 399 | + | |
| 400 | + }); | |
| 401 | +// } | |
| 402 | + | |
| 403 | + } | |
| 404 | + | |
| 405 | + private void fromVoiceUserLayout(final FromUserVoiceViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 406 | + if (!TextUtils.isEmpty(childPhoto)) | |
| 407 | + GlideUtils.showImg(context,holder.headicon,childPhoto); | |
| 408 | + else holder.headicon.setImageResource(R.drawable.header_icon); | |
| 409 | + /* time */ | |
| 410 | + if (position != 0) { | |
| 411 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 412 | + .getTime()); | |
| 413 | + if (showTime != null) { | |
| 414 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 415 | + holder.chat_time.setText(showTime); | |
| 416 | + } else { | |
| 417 | + holder.chat_time.setVisibility(View.GONE); | |
| 418 | + } | |
| 419 | + } else { | |
| 420 | + String showTime = getTime(tbub.getTime(), null); | |
| 421 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 422 | + holder.chat_time.setText(showTime); | |
| 423 | + } | |
| 424 | + | |
| 425 | + holder.voice_group.setVisibility(View.VISIBLE); | |
| 426 | + if (holder.receiver_voice_unread != null) | |
| 427 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 428 | + if (holder.receiver_voice_unread != null && unReadPosition != null) { | |
| 429 | + for (String unRead : unReadPosition) { | |
| 430 | + if (unRead.equals(position + "")) { | |
| 431 | + holder.receiver_voice_unread | |
| 432 | + .setVisibility(View.VISIBLE); | |
| 433 | + break; | |
| 434 | + } | |
| 435 | + } | |
| 436 | + } | |
| 437 | + AnimationDrawable drawable; | |
| 438 | + holder.voice_anim.setId(position); | |
| 439 | + if (position == voicePlayPosition) { | |
| 440 | + holder.voice_anim | |
| 441 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 442 | + holder.voice_anim | |
| 443 | + .setBackgroundResource(R.drawable.voice_play_receiver); | |
| 444 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 445 | + .getBackground(); | |
| 446 | + drawable.start(); | |
| 447 | + } else { | |
| 448 | + holder.voice_anim | |
| 449 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 450 | + } | |
| 451 | + holder.voice_group.setOnClickListener(new View.OnClickListener() { | |
| 452 | + | |
| 453 | + @Override | |
| 454 | + public void onClick(View v) { | |
| 455 | + // TODO Auto-generated method stub | |
| 456 | + if (holder.receiver_voice_unread != null) | |
| 457 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 458 | + holder.voice_anim | |
| 459 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 460 | + stopPlayVoice(); | |
| 461 | + voicePlayPosition = holder.voice_anim.getId(); | |
| 462 | + AnimationDrawable drawable; | |
| 463 | + holder.voice_anim | |
| 464 | + .setBackgroundResource(R.drawable.voice_play_receiver); | |
| 465 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 466 | + .getBackground(); | |
| 467 | + drawable.start(); | |
| 468 | + String voicePath = tbub.getUserVoicePath() == null ? "" : tbub | |
| 469 | + .getUserVoicePath(); | |
| 470 | + File file = new File(voicePath); | |
| 471 | + if (!(!voicePath.equals("") && FileSaveUtil | |
| 472 | + .isFileExists(file))) { | |
| 473 | + voicePath = tbub.getUserVoiceUrl() == null ? "" | |
| 474 | + : tbub.getUserVoiceUrl(); | |
| 475 | + } | |
| 476 | + if (voiceIsRead != null) { | |
| 477 | + voiceIsRead.voiceOnClick(position); | |
| 478 | + } | |
| 479 | + MediaManager.playSound(voicePath, | |
| 480 | + new MediaPlayer.OnCompletionListener() { | |
| 481 | + | |
| 482 | + @Override | |
| 483 | + public void onCompletion(MediaPlayer mp) { | |
| 484 | + voicePlayPosition = -1; | |
| 485 | + holder.voice_anim | |
| 486 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 487 | + } | |
| 488 | + }); | |
| 489 | + } | |
| 490 | + | |
| 491 | + }); | |
| 492 | + float voiceTime = tbub.getUserVoiceTime(); | |
| 493 | + BigDecimal b = new BigDecimal(voiceTime); | |
| 494 | + float f1 = b.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); | |
| 495 | + holder.voice_time.setText(f1 + "\""); | |
| 496 | + ViewGroup.LayoutParams lParams = holder.voice_image | |
| 497 | + .getLayoutParams(); | |
| 498 | + lParams.width = (int) (mMinItemWith + mMaxItemWith / 60f | |
| 499 | + * tbub.getUserVoiceTime()); | |
| 500 | + holder.voice_image.setLayoutParams(lParams); | |
| 501 | + } | |
| 502 | + | |
| 503 | + private void toMsgUserLayout(final ToUserMsgViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 504 | +// holder.headicon.setBackgroundResource(R.mipmap.grzx_tx_s); | |
| 505 | +// holder.headicon.setImageDrawable(context.getResources() | |
| 506 | +// .getDrawable(R.mipmap.grzx_tx_s)); | |
| 507 | + if (!TextUtils.isEmpty(parentUrl)) | |
| 508 | + GlideUtils.showImg(context,holder.headicon,parentUrl); | |
| 509 | + else holder.headicon.setImageResource(R.drawable.header_icon); | |
| 510 | + /* time */ | |
| 511 | + if (position != 0) { | |
| 512 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 513 | + .getTime()); | |
| 514 | + if (showTime != null) { | |
| 515 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 516 | + holder.chat_time.setText(showTime); | |
| 517 | + } else { | |
| 518 | + holder.chat_time.setVisibility(View.GONE); | |
| 519 | + } | |
| 520 | + } else { | |
| 521 | + String showTime = getTime(tbub.getTime(), null); | |
| 522 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 523 | + holder.chat_time.setText(showTime); | |
| 524 | + } | |
| 525 | + | |
| 526 | + holder.content.setVisibility(View.VISIBLE); | |
| 527 | + holder.content.setSpanText(handler, tbub.getUserContent(), isGif); | |
| 528 | + } | |
| 529 | + | |
| 530 | + private void toImgUserLayout(final ToUserImgViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 531 | + if (!TextUtils.isEmpty(parentUrl)) | |
| 532 | + GlideUtils.showImg(context,holder.headicon,parentUrl); | |
| 533 | + else holder.headicon.setImageResource(R.drawable.header_icon); | |
| 534 | + switch (tbub.getSendState()) { | |
| 535 | + case ChatConst.SENDING: | |
| 536 | + an = AnimationUtils.loadAnimation(context, | |
| 537 | + R.anim.update_loading_progressbar_anim); | |
| 538 | + LinearInterpolator lin = new LinearInterpolator(); | |
| 539 | + an.setInterpolator(lin); | |
| 540 | + an.setRepeatCount(-1); | |
| 541 | + holder.sendFailImg | |
| 542 | + .setBackgroundResource(R.mipmap.xsearch_loading); | |
| 543 | + holder.sendFailImg.startAnimation(an); | |
| 544 | + an.startNow(); | |
| 545 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 546 | + break; | |
| 547 | + | |
| 548 | + case ChatConst.COMPLETED: | |
| 549 | + holder.sendFailImg.clearAnimation(); | |
| 550 | + holder.sendFailImg.setVisibility(View.GONE); | |
| 551 | + break; | |
| 552 | + | |
| 553 | + case ChatConst.SENDERROR: | |
| 554 | + holder.sendFailImg.clearAnimation(); | |
| 555 | + holder.sendFailImg | |
| 556 | + .setBackgroundResource(R.mipmap.msg_state_fail_resend_pressed); | |
| 557 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 558 | + holder.sendFailImg.setOnClickListener(new View.OnClickListener() { | |
| 559 | + | |
| 560 | + @Override | |
| 561 | + public void onClick(View view) { | |
| 562 | + // TODO Auto-generated method stub | |
| 563 | + if (sendErrorListener != null) { | |
| 564 | + sendErrorListener.onClick(position); | |
| 565 | + } | |
| 566 | + } | |
| 567 | + | |
| 568 | + }); | |
| 569 | + break; | |
| 570 | + default: | |
| 571 | + break; | |
| 572 | + } | |
| 573 | +// holder.headicon.setImageDrawable(context.getResources() | |
| 574 | +// .getDrawable(R.mipmap.grzx_tx_s)); | |
| 575 | + | |
| 576 | + /* time */ | |
| 577 | + if (position != 0) { | |
| 578 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 579 | + .getTime()); | |
| 580 | + if (showTime != null) { | |
| 581 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 582 | + holder.chat_time.setText(showTime); | |
| 583 | + } else { | |
| 584 | + holder.chat_time.setVisibility(View.GONE); | |
| 585 | + } | |
| 586 | + } else { | |
| 587 | + String showTime = getTime(tbub.getTime(), null); | |
| 588 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 589 | + holder.chat_time.setText(showTime); | |
| 590 | + } | |
| 591 | + | |
| 592 | +// if (isPicRefresh) { | |
| 593 | + holder.image_group.setVisibility(View.VISIBLE); | |
| 594 | + final String imageSrc = tbub.getImageLocal() == null ? "" : tbub | |
| 595 | + .getImageLocal(); | |
| 596 | + final String imageUrlSrc = tbub.getImageUrl() == null ? "" : tbub | |
| 597 | + .getImageUrl(); | |
| 598 | + final String imageIconUrl = tbub.getImageIconUrl() == null ? "" | |
| 599 | + : tbub.getImageIconUrl(); | |
| 600 | + File file = new File(imageSrc); | |
| 601 | + final boolean hasLocal = !imageSrc.equals("") | |
| 602 | + && FileSaveUtil.isFileExists(file); | |
| 603 | + int res; | |
| 604 | + res = R.drawable.chatto_bg_focused; | |
| 605 | +// Glide.with(context).load(imageSrc).transform(new CustomShapeTransformation(context, res)).into(holder.image_Msg); | |
| 606 | + Glide.with(context).load(imageSrc).placeholder(R.mipmap.cygs_cs).transform(new CustomShapeTransformation(context, res)).into(holder.image_Msg); | |
| 607 | + | |
| 608 | + holder.image_Msg.setOnClickListener(new View.OnClickListener() { | |
| 609 | + | |
| 610 | + @Override | |
| 611 | + public void onClick(View view) { | |
| 612 | + // TODO Auto-generated method stub | |
| 613 | + stopPlayVoice(); | |
| 614 | + Intent intent = new Intent(context, ImageViewActivity.class); | |
| 615 | + intent.putStringArrayListExtra("images", imageList); | |
| 616 | + intent.putExtra("clickedIndex", imagePosition.get(position)); | |
| 617 | + context.startActivity(intent); | |
| 618 | + } | |
| 619 | + | |
| 620 | + }); | |
| 621 | +// } | |
| 622 | + } | |
| 623 | + | |
| 624 | + private void toVoiceUserLayout(final ToUserVoiceViewHolder holder, final ChatMessageBean tbub, final int position) { | |
| 625 | + if (!TextUtils.isEmpty(parentUrl)) | |
| 626 | + GlideUtils.showImg(context,holder.headicon,parentUrl); | |
| 627 | + else holder.headicon.setImageResource(R.drawable.header_icon); | |
| 628 | + switch (tbub.getSendState()) { | |
| 629 | + case ChatConst.SENDING: | |
| 630 | + an = AnimationUtils.loadAnimation(context, | |
| 631 | + R.anim.update_loading_progressbar_anim); | |
| 632 | + LinearInterpolator lin = new LinearInterpolator(); | |
| 633 | + an.setInterpolator(lin); | |
| 634 | + an.setRepeatCount(-1); | |
| 635 | + holder.sendFailImg | |
| 636 | + .setBackgroundResource(R.mipmap.xsearch_loading); | |
| 637 | + holder.sendFailImg.startAnimation(an); | |
| 638 | + an.startNow(); | |
| 639 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 640 | + break; | |
| 641 | + | |
| 642 | + case ChatConst.COMPLETED: | |
| 643 | + holder.sendFailImg.clearAnimation(); | |
| 644 | + holder.sendFailImg.setVisibility(View.GONE); | |
| 645 | + break; | |
| 646 | + | |
| 647 | + case ChatConst.SENDERROR: | |
| 648 | + holder.sendFailImg.clearAnimation(); | |
| 649 | + holder.sendFailImg | |
| 650 | + .setBackgroundResource(R.mipmap.msg_state_fail_resend_pressed); | |
| 651 | + holder.sendFailImg.setVisibility(View.VISIBLE); | |
| 652 | + holder.sendFailImg.setOnClickListener(new View.OnClickListener() { | |
| 653 | + | |
| 654 | + @Override | |
| 655 | + public void onClick(View view) { | |
| 656 | + // TODO Auto-generated method stub | |
| 657 | + if (sendErrorListener != null) { | |
| 658 | + sendErrorListener.onClick(position); | |
| 659 | + } | |
| 660 | + } | |
| 661 | + | |
| 662 | + }); | |
| 663 | + break; | |
| 664 | + default: | |
| 665 | + break; | |
| 666 | + } | |
| 667 | +// holder.headicon.setImageDrawable(context.getResources() | |
| 668 | +// .getDrawable(R.mipmap.grzx_tx_s)); | |
| 669 | + | |
| 670 | + /* time */ | |
| 671 | + if (position != 0) { | |
| 672 | + String showTime = getTime(tbub.getTime(), userList.get(position - 1) | |
| 673 | + .getTime()); | |
| 674 | + if (showTime != null) { | |
| 675 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 676 | + holder.chat_time.setText(showTime); | |
| 677 | + } else { | |
| 678 | + holder.chat_time.setVisibility(View.GONE); | |
| 679 | + } | |
| 680 | + } else { | |
| 681 | + String showTime = getTime(tbub.getTime(), null); | |
| 682 | + holder.chat_time.setVisibility(View.VISIBLE); | |
| 683 | + holder.chat_time.setText(showTime); | |
| 684 | + } | |
| 685 | + holder.voice_group.setVisibility(View.VISIBLE); | |
| 686 | + if (holder.receiver_voice_unread != null) | |
| 687 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 688 | + if (holder.receiver_voice_unread != null && unReadPosition != null) { | |
| 689 | + for (String unRead : unReadPosition) { | |
| 690 | + if (unRead.equals(position + "")) { | |
| 691 | + holder.receiver_voice_unread | |
| 692 | + .setVisibility(View.VISIBLE); | |
| 693 | + break; | |
| 694 | + } | |
| 695 | + } | |
| 696 | + } | |
| 697 | + AnimationDrawable drawable; | |
| 698 | + holder.voice_anim.setId(position); | |
| 699 | + if (position == voicePlayPosition) { | |
| 700 | + holder.voice_anim.setBackgroundResource(R.mipmap.adj); | |
| 701 | + holder.voice_anim | |
| 702 | + .setBackgroundResource(R.drawable.voice_play_send); | |
| 703 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 704 | + .getBackground(); | |
| 705 | + drawable.start(); | |
| 706 | + } else { | |
| 707 | + holder.voice_anim.setBackgroundResource(R.mipmap.adj); | |
| 708 | + } | |
| 709 | + holder.voice_group.setOnClickListener(new View.OnClickListener() { | |
| 710 | + | |
| 711 | + @Override | |
| 712 | + public void onClick(View v) { | |
| 713 | + // TODO Auto-generated method stub | |
| 714 | + if (holder.receiver_voice_unread != null) | |
| 715 | + holder.receiver_voice_unread.setVisibility(View.GONE); | |
| 716 | + holder.voice_anim.setBackgroundResource(R.mipmap.adj); | |
| 717 | + stopPlayVoice(); | |
| 718 | + voicePlayPosition = holder.voice_anim.getId(); | |
| 719 | + AnimationDrawable drawable; | |
| 720 | + holder.voice_anim | |
| 721 | + .setBackgroundResource(R.drawable.voice_play_send); | |
| 722 | + drawable = (AnimationDrawable) holder.voice_anim | |
| 723 | + .getBackground(); | |
| 724 | + drawable.start(); | |
| 725 | + String voicePath = tbub.getUserVoiceUrl() == null ? "" | |
| 726 | + : tbub.getUserVoiceUrl(); | |
| 727 | + if (voiceIsRead != null) { | |
| 728 | + voiceIsRead.voiceOnClick(position); | |
| 729 | + } | |
| 730 | + MediaManager.playSound(voicePath, | |
| 731 | + new MediaPlayer.OnCompletionListener() { | |
| 732 | + | |
| 733 | + @Override | |
| 734 | + public void onCompletion(MediaPlayer mp) { | |
| 735 | + voicePlayPosition = -1; | |
| 736 | + holder.voice_anim | |
| 737 | + .setBackgroundResource(R.mipmap.adj); | |
| 738 | + } | |
| 739 | + }); | |
| 740 | + } | |
| 741 | + | |
| 742 | + }); | |
| 743 | + float voiceTime = tbub.getUserVoiceTime(); | |
| 744 | + BigDecimal b = new BigDecimal(voiceTime); | |
| 745 | + float f1 = b.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); | |
| 746 | + holder.voice_time.setText(f1 + "\""); | |
| 747 | + ViewGroup.LayoutParams lParams = holder.voice_image | |
| 748 | + .getLayoutParams(); | |
| 749 | + lParams.width = (int) (mMinItemWith + mMaxItemWith / 60f | |
| 750 | + * tbub.getUserVoiceTime()); | |
| 751 | + holder.voice_image.setLayoutParams(lParams); | |
| 752 | + } | |
| 753 | + | |
| 754 | + @SuppressLint("SimpleDateFormat") | |
| 755 | + public String getTime(String time, String before) { | |
| 756 | + String show_time = null; | |
| 757 | + if (before != null) { | |
| 758 | + try { | |
| 759 | + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
| 760 | + java.util.Date now = df.parse(time); | |
| 761 | + java.util.Date date = df.parse(before); | |
| 762 | + long l = now.getTime() - date.getTime(); | |
| 763 | + long day = l / (24 * 60 * 60 * 1000); | |
| 764 | + long hour = (l / (60 * 60 * 1000) - day * 24); | |
| 765 | + long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60); | |
| 766 | + if (min >= 1) { | |
| 767 | + show_time = time.substring(11); | |
| 768 | + } | |
| 769 | + } catch (Exception e) { | |
| 770 | + e.printStackTrace(); | |
| 771 | + } | |
| 772 | + } else { | |
| 773 | + show_time = time.substring(11); | |
| 774 | + } | |
| 775 | + String getDay = getDay(time); | |
| 776 | + if (show_time != null && getDay != null) | |
| 777 | + show_time = getDay + " " + show_time; | |
| 778 | + return show_time; | |
| 779 | + } | |
| 780 | + | |
| 781 | + @SuppressLint("SimpleDateFormat") | |
| 782 | + public static String returnTime() { | |
| 783 | + SimpleDateFormat sDateFormat = new SimpleDateFormat( | |
| 784 | + "yyyy-MM-dd HH:mm:ss"); | |
| 785 | + String date = sDateFormat.format(new java.util.Date()); | |
| 786 | + return date; | |
| 787 | + } | |
| 788 | + | |
| 789 | + @SuppressLint("SimpleDateFormat") | |
| 790 | + public String getDay(String time) { | |
| 791 | + String showDay = null; | |
| 792 | + String nowTime = returnTime(); | |
| 793 | + try { | |
| 794 | + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
| 795 | + java.util.Date now = df.parse(nowTime); | |
| 796 | + java.util.Date date = df.parse(time); | |
| 797 | + long l = now.getTime() - date.getTime(); | |
| 798 | + long day = l / (24 * 60 * 60 * 1000); | |
| 799 | + if (day >= 365) { | |
| 800 | + showDay = time.substring(0, 10); | |
| 801 | + } else if (day >= 1 && day < 365) { | |
| 802 | + showDay = time.substring(5, 10); | |
| 803 | + } | |
| 804 | + } catch (Exception e) { | |
| 805 | + e.printStackTrace(); | |
| 806 | + } | |
| 807 | + return showDay; | |
| 808 | + } | |
| 809 | + | |
| 810 | + public static Bitmap getLoacalBitmap(String url) { | |
| 811 | + try { | |
| 812 | + ByteArrayOutputStream out; | |
| 813 | + FileInputStream fis = new FileInputStream(url); | |
| 814 | + BufferedInputStream bis = new BufferedInputStream(fis); | |
| 815 | + out = new ByteArrayOutputStream(); | |
| 816 | + @SuppressWarnings("unused") | |
| 817 | + int hasRead = 0; | |
| 818 | + byte[] buffer = new byte[1024 * 2]; | |
| 819 | + while ((hasRead = bis.read(buffer)) > 0) { | |
| 820 | + // 读出多少数据,向输出流中写入多少 | |
| 821 | + out.write(buffer); | |
| 822 | + out.flush(); | |
| 823 | + } | |
| 824 | + out.close(); | |
| 825 | + fis.close(); | |
| 826 | + bis.close(); | |
| 827 | + byte[] data = out.toByteArray(); | |
| 828 | + // 长宽减半 | |
| 829 | + BitmapFactory.Options opts = new BitmapFactory.Options(); | |
| 830 | + opts.inSampleSize = 3; | |
| 831 | + return BitmapFactory.decodeByteArray(data, 0, data.length, opts); | |
| 832 | + } catch (FileNotFoundException e) { | |
| 833 | + e.printStackTrace(); | |
| 834 | + return null; | |
| 835 | + } catch (IOException e) { | |
| 836 | + // TODO Auto-generated catch block | |
| 837 | + e.printStackTrace(); | |
| 838 | + return null; | |
| 839 | + } | |
| 840 | + } | |
| 841 | + | |
| 842 | + public void stopPlayVoice() { | |
| 843 | + if (voicePlayPosition != -1) { | |
| 844 | + View voicePlay = (View) ((Activity) context) | |
| 845 | + .findViewById(voicePlayPosition); | |
| 846 | + if (voicePlay != null) { | |
| 847 | + if (getItemViewType(voicePlayPosition) == FROM_USER_VOICE) { | |
| 848 | + voicePlay | |
| 849 | + .setBackgroundResource(R.mipmap.receiver_voice_node_playing003); | |
| 850 | + } else { | |
| 851 | + voicePlay.setBackgroundResource(R.mipmap.adj); | |
| 852 | + } | |
| 853 | + } | |
| 854 | + MediaManager.pause(); | |
| 855 | + voicePlayPosition = -1; | |
| 856 | + } | |
| 857 | + } | |
| 858 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/activity/chartroom/fragment/ImageViewFragment.java
0 → 100644
| ... | ... | @@ -0,0 +1,71 @@ |
| 1 | +package com.shunzhi.parent.ui.activity.chartroom.fragment; | |
| 2 | + | |
| 3 | +import android.graphics.Bitmap; | |
| 4 | +import android.graphics.BitmapFactory; | |
| 5 | +import android.support.v4.app.Fragment; | |
| 6 | +import android.view.View; | |
| 7 | +import android.view.View.OnClickListener; | |
| 8 | +import android.widget.ProgressBar; | |
| 9 | + | |
| 10 | +import com.bumptech.glide.Glide; | |
| 11 | +import com.bumptech.glide.request.animation.GlideAnimation; | |
| 12 | +import com.bumptech.glide.request.target.SimpleTarget; | |
| 13 | +import com.polites.android.GestureImageView; | |
| 14 | +import com.shunzhi.parent.R; | |
| 15 | + | |
| 16 | +public class ImageViewFragment extends Fragment { | |
| 17 | + private String imageUrl; | |
| 18 | + private ProgressBar loadBar; | |
| 19 | + private GestureImageView imageGiv; | |
| 20 | + | |
| 21 | + public View onCreateView(android.view.LayoutInflater inflater, | |
| 22 | + android.view.ViewGroup container, | |
| 23 | + android.os.Bundle savedInstanceState) { | |
| 24 | + View view = inflater.inflate(R.layout.layout_images_view_item, container, | |
| 25 | + false); | |
| 26 | + init(view); | |
| 27 | + loadImage(imageUrl); | |
| 28 | + return view; | |
| 29 | + } | |
| 30 | + | |
| 31 | + private void init(View mView) { | |
| 32 | + loadBar = (ProgressBar) mView.findViewById(R.id.imageView_loading_pb); | |
| 33 | + imageGiv = (GestureImageView) mView | |
| 34 | + .findViewById(R.id.imageView_item_giv); | |
| 35 | + imageGiv.setOnClickListener(new OnClickListener() { | |
| 36 | + | |
| 37 | + @Override | |
| 38 | + public void onClick(View v) { | |
| 39 | + getActivity().finish(); | |
| 40 | + } | |
| 41 | + }); | |
| 42 | + } | |
| 43 | + | |
| 44 | + public void loadImage(String url) { | |
| 45 | + if (url.startsWith("http://")) { | |
| 46 | + Glide.with(this).load(url).asBitmap().into(new SimpleTarget<Bitmap>() { | |
| 47 | + @Override | |
| 48 | + public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { | |
| 49 | + if (resource != null) { | |
| 50 | + imageGiv.setImageBitmap(resource); | |
| 51 | + loadBar.setVisibility(View.GONE); | |
| 52 | + imageGiv.setVisibility(View.VISIBLE); | |
| 53 | + } | |
| 54 | + } | |
| 55 | + }); | |
| 56 | + } else { | |
| 57 | + imageGiv.setImageBitmap(BitmapFactory.decodeFile(url)); | |
| 58 | + loadBar.setVisibility(View.GONE); | |
| 59 | + imageGiv.setVisibility(View.VISIBLE); | |
| 60 | + } | |
| 61 | + } | |
| 62 | + | |
| 63 | + public String getImageUrl() { | |
| 64 | + return imageUrl; | |
| 65 | + } | |
| 66 | + | |
| 67 | + public void setImageUrl(String imageUrl) { | |
| 68 | + this.imageUrl = imageUrl; | |
| 69 | + } | |
| 70 | + | |
| 71 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/activity/message/LeaverMessagesActivity.java
0 → 100644
| ... | ... | @@ -0,0 +1,42 @@ |
| 1 | +package com.shunzhi.parent.ui.activity.message; | |
| 2 | + | |
| 3 | +import android.content.Intent; | |
| 4 | +import android.support.annotation.NonNull; | |
| 5 | +import android.support.v7.app.AppCompatActivity; | |
| 6 | +import android.os.Bundle; | |
| 7 | + | |
| 8 | +import com.share.mvpsdk.base.BasePresenter; | |
| 9 | +import com.share.mvpsdk.base.activity.BaseMVPCompatActivity; | |
| 10 | +import com.shunzhi.parent.R; | |
| 11 | +import com.shunzhi.parent.contract.leavermessage.LeaverMessage; | |
| 12 | +import com.shunzhi.parent.contract.leavermessage.LeaverMessageContract; | |
| 13 | +import com.shunzhi.parent.presenter.leavermessage.LeaverMessagePresenter; | |
| 14 | +import com.shunzhi.parent.ui.activity.chartroom.RecyclerViewChatActivity; | |
| 15 | + | |
| 16 | +import java.util.List; | |
| 17 | + | |
| 18 | +public class LeaverMessagesActivity extends BaseMVPCompatActivity<LeaverMessageContract.MyLeaverMessagePresenter,LeaverMessageContract.ILeaverMessageModel> | |
| 19 | +implements LeaverMessageContract.ILeverMessageView{ | |
| 20 | + | |
| 21 | + @Override | |
| 22 | + protected void initView(Bundle savedInstanceState) { | |
| 23 | + Intent intent = new Intent(this, RecyclerViewChatActivity.class); | |
| 24 | + startActivity(intent); | |
| 25 | + } | |
| 26 | + | |
| 27 | + @Override | |
| 28 | + protected int getLayoutId() { | |
| 29 | + return R.layout.activity_leaver_messages; | |
| 30 | + } | |
| 31 | + | |
| 32 | + @NonNull | |
| 33 | + @Override | |
| 34 | + public BasePresenter initPresenter() { | |
| 35 | + return LeaverMessagePresenter.newInstance(); | |
| 36 | + } | |
| 37 | + | |
| 38 | + @Override | |
| 39 | + public void ShowLeaverMessageList(List<LeaverMessage> leaverMessageList) { | |
| 40 | + | |
| 41 | + } | |
| 42 | +} | ... | ... |
app/src/main/java/com/shunzhi/parent/ui/fragment/report/ChengZhangFragment.java
| ... | ... | @@ -40,6 +40,7 @@ import com.shunzhi.parent.ui.activity.BankActivity; |
| 40 | 40 | import com.shunzhi.parent.ui.activity.MyChildActivity; |
| 41 | 41 | import com.shunzhi.parent.ui.activity.apply.ApplyReplaceCardActivity; |
| 42 | 42 | import com.shunzhi.parent.ui.activity.apply.ApplySigninActivity; |
| 43 | +import com.shunzhi.parent.ui.activity.chartroom.RecyclerViewChatActivity; | |
| 43 | 44 | import com.shunzhi.parent.ui.activity.mywebview.WebViewActivity; |
| 44 | 45 | |
| 45 | 46 | import java.util.List; |
| ... | ... | @@ -82,7 +83,7 @@ public class ChengZhangFragment extends BaseMVPCompatFragment<ReportContract.Rep |
| 82 | 83 | |
| 83 | 84 | private String type = "", jsonStr = ""; |
| 84 | 85 | |
| 85 | - LinearLayout layout_chengzhang, layout_report, layout_kaoqin, layout_buka, layout_qingjia; | |
| 86 | + LinearLayout layout_chengzhang, layout_report, layout_kaoqin, layout_buka, layout_qingjia,layout_liuyan; | |
| 86 | 87 | |
| 87 | 88 | RelativeLayout rl_noData; |
| 88 | 89 | |
| ... | ... | @@ -101,6 +102,7 @@ public class ChengZhangFragment extends BaseMVPCompatFragment<ReportContract.Rep |
| 101 | 102 | layout_kaoqin = view.findViewById(R.id.layout_kaoqin); |
| 102 | 103 | layout_buka = view.findViewById(R.id.layout_buka); |
| 103 | 104 | layout_qingjia = view.findViewById(R.id.layout_qingjia); |
| 105 | + layout_liuyan=view.findViewById(R.id.layout_liuyan); | |
| 104 | 106 | tvNoData = view.findViewById(R.id.tvNoData); |
| 105 | 107 | calendarView_month_mode = view.findViewById(R.id.calendarView_month_mode); |
| 106 | 108 | monthWeekMaterialCalendarView = view.findViewById(R.id.slidelayout); |
| ... | ... | @@ -108,6 +110,7 @@ public class ChengZhangFragment extends BaseMVPCompatFragment<ReportContract.Rep |
| 108 | 110 | layout_kaoqin.setOnClickListener(this); |
| 109 | 111 | layout_buka.setOnClickListener(this); |
| 110 | 112 | layout_qingjia.setOnClickListener(this); |
| 113 | + layout_liuyan.setOnClickListener(this); | |
| 111 | 114 | type = getArguments().getString("type"); |
| 112 | 115 | jsonStr = getArguments().getString("jsonStr"); |
| 113 | 116 | show(); |
| ... | ... | @@ -200,6 +203,13 @@ public class ChengZhangFragment extends BaseMVPCompatFragment<ReportContract.Rep |
| 200 | 203 | case R.id.layout_qingjia: |
| 201 | 204 | ToastUtils.showToast("正在努力开发中,敬请期待"); |
| 202 | 205 | break; |
| 206 | + case R.id.layout_liuyan://留言 | |
| 207 | + Bundle bundle = new Bundle(); | |
| 208 | + bundle.putString("childName",childBean.getStudentName()); | |
| 209 | + bundle.putString("childPhoto",childBean.getPhoto()); | |
| 210 | + startNewActivity(RecyclerViewChatActivity.class,bundle); | |
| 211 | +// startActivity(new Intent(getActivity(),RecyclerViewChatActivity.class)); | |
| 212 | + break; | |
| 203 | 213 | } |
| 204 | 214 | } |
| 205 | 215 | ... | ... |
app/src/main/res/anim/update_loading_progressbar_anim.xml
0 → 100644
| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<rotate xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:drawable="@mipmap/xsearch_loading" | |
| 4 | + android:fromDegrees="0" | |
| 5 | + android:toDegrees="359" | |
| 6 | + android:pivotX="50%" | |
| 7 | + android:pivotY="50%" | |
| 8 | + android:duration="700" | |
| 9 | + /> | |
| 0 | 10 | \ No newline at end of file | ... | ... |
903 Bytes
1 KB
135 Bytes
| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<shape xmlns:android="http://schemas.android.com/apk/res/android"> | |
| 3 | + <solid android:color="@android:color/white" /> | |
| 4 | + | |
| 5 | + <stroke | |
| 6 | + android:width="1dp" | |
| 7 | + android:color="@color/light_gray_2" /> | |
| 8 | + | |
| 9 | + <padding | |
| 10 | + android:bottom="1dp" | |
| 11 | + android:left="1dp" | |
| 12 | + android:right="1dp" | |
| 13 | + android:top="1dp" /> | |
| 14 | + <!-- | |
| 15 | + <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" | |
| 16 | + android:bottomRightRadius="5dp" android:bottomLeftRadius="5dp"/> --> | |
| 17 | +</shape> | |
| 0 | 18 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,32 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<selector xmlns:android="http://schemas.android.com/apk/res/android"> | |
| 3 | + | |
| 4 | + <item android:state_pressed="true"><shape android:shape="rectangle"> | |
| 5 | + <solid android:color="@color/light_blue2" /> | |
| 6 | + | |
| 7 | + <stroke android:width="1dp" android:color="@color/light_blue2" /> | |
| 8 | + | |
| 9 | + <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" /> | |
| 10 | + | |
| 11 | + <corners android:radius="2dp" /> | |
| 12 | + </shape></item> | |
| 13 | + <item android:state_focused="true"><shape android:shape="rectangle"> | |
| 14 | + <solid android:color="@color/light_blue2" /> | |
| 15 | + | |
| 16 | + <stroke android:width="1dp" android:color="@color/light_blue2" /> | |
| 17 | + | |
| 18 | + <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" /> | |
| 19 | + | |
| 20 | + <corners android:radius="2dp" /> | |
| 21 | + </shape></item> | |
| 22 | + <item><shape android:shape="rectangle"> | |
| 23 | + <solid android:color="@color/light_blue1" /> | |
| 24 | + | |
| 25 | + <stroke android:width="1dp" android:color="@color/light_blue1" /> | |
| 26 | + | |
| 27 | + <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" /> | |
| 28 | + | |
| 29 | + <corners android:radius="2dp" /> | |
| 30 | + </shape></item> | |
| 31 | + | |
| 32 | +</selector> | |
| 0 | 33 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,24 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<animation-list xmlns:android="http://schemas.android.com/apk/res/android" > | |
| 3 | + | |
| 4 | + <item | |
| 5 | + android:drawable="@mipmap/receiver_voice_node_playing000" | |
| 6 | + android:duration="300"> | |
| 7 | + </item> | |
| 8 | + | |
| 9 | + <item | |
| 10 | + android:drawable="@mipmap/receiver_voice_node_playing001" | |
| 11 | + android:duration="300"> | |
| 12 | + </item> | |
| 13 | + | |
| 14 | + <item | |
| 15 | + android:drawable="@mipmap/receiver_voice_node_playing002" | |
| 16 | + android:duration="300"> | |
| 17 | + </item> | |
| 18 | + | |
| 19 | + <item | |
| 20 | + android:drawable="@mipmap/receiver_voice_node_playing003" | |
| 21 | + android:duration="300"> | |
| 22 | + </item> | |
| 23 | + | |
| 24 | +</animation-list> | |
| 0 | 25 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,19 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<animation-list xmlns:android="http://schemas.android.com/apk/res/android" > | |
| 3 | + | |
| 4 | + <item | |
| 5 | + android:drawable="@mipmap/v_anim1" | |
| 6 | + android:duration="300"> | |
| 7 | + </item> | |
| 8 | + | |
| 9 | + <item | |
| 10 | + android:drawable="@mipmap/v_anim2" | |
| 11 | + android:duration="300"> | |
| 12 | + </item> | |
| 13 | + | |
| 14 | + <item | |
| 15 | + android:drawable="@mipmap/v_anim3" | |
| 16 | + android:duration="300"> | |
| 17 | + </item> | |
| 18 | + | |
| 19 | +</animation-list> | |
| 0 | 20 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,37 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="match_parent" | |
| 4 | + android:layout_height="match_parent" | |
| 5 | + android:orientation="vertical" > | |
| 6 | + <android.support.v4.view.ViewPager | |
| 7 | + android:id="@+id/images_vp" | |
| 8 | + android:layout_width="wrap_content" | |
| 9 | + android:layout_height="wrap_content"> | |
| 10 | + | |
| 11 | + </android.support.v4.view.ViewPager> | |
| 12 | + <LinearLayout | |
| 13 | + android:id="@+id/imageView_title_ll" | |
| 14 | + android:layout_width="match_parent" | |
| 15 | + android:layout_height="wrap_content" | |
| 16 | + android:layout_alignParentTop="true" | |
| 17 | + android:orientation="horizontal" | |
| 18 | + android:background="@color/zz_half_transparent" | |
| 19 | + android:paddingTop="5dp" | |
| 20 | + android:paddingBottom="5dp" | |
| 21 | + android:gravity="center"> | |
| 22 | + <TextView | |
| 23 | + android:id="@+id/imageView_current_tv" | |
| 24 | + android:layout_width="wrap_content" | |
| 25 | + android:layout_height="wrap_content" | |
| 26 | + android:text="1" | |
| 27 | + android:textSize="18sp" | |
| 28 | + android:textColor="@color/white"/> | |
| 29 | + <TextView | |
| 30 | + android:id="@+id/imageView_total_tv" | |
| 31 | + android:layout_width="wrap_content" | |
| 32 | + android:layout_height="wrap_content" | |
| 33 | + android:text="/8" | |
| 34 | + android:textSize="18sp" | |
| 35 | + android:textColor="@color/white"/> | |
| 36 | + </LinearLayout> | |
| 37 | +</RelativeLayout> | ... | ... |
| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + xmlns:app="http://schemas.android.com/apk/res-auto" | |
| 4 | + xmlns:tools="http://schemas.android.com/tools" | |
| 5 | + android:layout_width="match_parent" | |
| 6 | + android:layout_height="match_parent" | |
| 7 | + tools:context=".ui.activity.message.LeaverMessagesActivity"> | |
| 8 | + | |
| 9 | +</android.support.constraint.ConstraintLayout> | |
| 0 | 10 | \ No newline at end of file | ... | ... |
app/src/main/res/layout/layout_chengzhang.xml
| ... | ... | @@ -105,4 +105,43 @@ |
| 105 | 105 | |
| 106 | 106 | </LinearLayout> |
| 107 | 107 | |
| 108 | + | |
| 109 | + <TextView | |
| 110 | + android:layout_width="wrap_content" | |
| 111 | + android:layout_height="wrap_content" | |
| 112 | + android:layout_gravity="center_horizontal" | |
| 113 | + android:layout_marginTop="@dimen/size_dp_10" | |
| 114 | + android:text="云视窗" | |
| 115 | + android:textColor="@color/textColor" | |
| 116 | + android:textSize="@dimen/size_dp_16" /> | |
| 117 | + | |
| 118 | + <LinearLayout | |
| 119 | + android:id="@+id/layout_liuyan" | |
| 120 | + android:layout_width="match_parent" | |
| 121 | + android:layout_height="?android:actionBarSize" | |
| 122 | + android:layout_marginLeft="@dimen/size_dp_10" | |
| 123 | + android:layout_marginRight="@dimen/size_dp_10" | |
| 124 | + android:layout_marginTop="@dimen/size_dp_10" | |
| 125 | + android:background="@drawable/shape_corner_bg" | |
| 126 | + android:orientation="horizontal"> | |
| 127 | + | |
| 128 | + <ImageView | |
| 129 | + android:layout_width="wrap_content" | |
| 130 | + android:layout_height="wrap_content" | |
| 131 | + android:layout_gravity="center_vertical" | |
| 132 | + android:layout_margin="@dimen/size_dp_5" | |
| 133 | + android:scaleType="fitXY" | |
| 134 | + android:src="@drawable/kaoqin" /> | |
| 135 | + | |
| 136 | + <TextView | |
| 137 | + android:layout_width="wrap_content" | |
| 138 | + android:layout_height="wrap_content" | |
| 139 | + android:layout_gravity="center_vertical" | |
| 140 | + android:layout_marginLeft="@dimen/size_dp_15" | |
| 141 | + android:text="留言板" | |
| 142 | + android:textColor="@color/textColor" | |
| 143 | + android:textSize="@dimen/size_dp_16" /> | |
| 144 | + | |
| 145 | + </LinearLayout> | |
| 146 | + | |
| 108 | 147 | </LinearLayout> |
| 109 | 148 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,39 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="wrap_content" | |
| 4 | + android:layout_height="wrap_content" | |
| 5 | + android:padding="5dp"> | |
| 6 | + | |
| 7 | + <TextView | |
| 8 | + android:id="@+id/chat_time" | |
| 9 | + android:layout_width="wrap_content" | |
| 10 | + android:layout_height="wrap_content" | |
| 11 | + android:layout_alignParentTop="true" | |
| 12 | + android:layout_centerHorizontal="true" | |
| 13 | + android:textColor="@color/light_gray_6" | |
| 14 | + android:textSize="10sp" | |
| 15 | + android:visibility="gone" /> | |
| 16 | + | |
| 17 | + <ImageView | |
| 18 | + android:id="@+id/tb_other_user_icon" | |
| 19 | + android:layout_width="50dp" | |
| 20 | + android:layout_height="50dp" | |
| 21 | + android:layout_alignParentLeft="true" | |
| 22 | + android:layout_below="@id/chat_time" /> | |
| 23 | + | |
| 24 | + <LinearLayout | |
| 25 | + android:layout_width="wrap_content" | |
| 26 | + android:layout_height="wrap_content" | |
| 27 | + android:layout_below="@id/chat_time" | |
| 28 | + android:layout_margin="5dp" | |
| 29 | + android:layout_toRightOf="@+id/tb_other_user_icon" | |
| 30 | + android:orientation="horizontal"> | |
| 31 | + | |
| 32 | + <com.shunzhi.mychartlibrary.widget.BubbleImageView | |
| 33 | + android:id="@+id/image_message" | |
| 34 | + android:layout_width="wrap_content" | |
| 35 | + android:layout_height="wrap_content" | |
| 36 | + android:scaleType="centerCrop" /> | |
| 37 | + </LinearLayout> | |
| 38 | + | |
| 39 | +</RelativeLayout> | |
| 0 | 40 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,25 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout | |
| 3 | + xmlns:android="http://schemas.android.com/apk/res/android" | |
| 4 | + xmlns:gesture-image="http://schemas.polites.com/android" | |
| 5 | + android:id="@+id/image_view_rl" | |
| 6 | + android:layout_width="fill_parent" | |
| 7 | + android:layout_height="fill_parent" | |
| 8 | + android:orientation="vertical" | |
| 9 | + android:background="@color/zz_half_transparent"> | |
| 10 | + | |
| 11 | + <ProgressBar | |
| 12 | + android:id="@+id/imageView_loading_pb" | |
| 13 | + android:layout_width="wrap_content" | |
| 14 | + android:layout_height="wrap_content" | |
| 15 | + android:layout_centerInParent="true" | |
| 16 | + /> | |
| 17 | + | |
| 18 | + <com.polites.android.GestureImageView | |
| 19 | + android:id="@+id/imageView_item_giv" | |
| 20 | + android:layout_width="fill_parent" | |
| 21 | + android:layout_height="fill_parent" | |
| 22 | + gesture-image:min-scale="0.75" | |
| 23 | + gesture-image:max-scale="10.0" | |
| 24 | + android:visibility="gone"/> | |
| 25 | +</RelativeLayout> | ... | ... |
| ... | ... | @@ -0,0 +1,54 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="wrap_content" | |
| 4 | + android:layout_height="wrap_content" | |
| 5 | + android:padding="5dp"> | |
| 6 | + | |
| 7 | + <TextView | |
| 8 | + android:id="@+id/mychat_time" | |
| 9 | + android:layout_width="wrap_content" | |
| 10 | + android:layout_height="wrap_content" | |
| 11 | + android:layout_alignParentTop="true" | |
| 12 | + android:layout_centerHorizontal="true" | |
| 13 | + android:textColor="@color/light_gray_6" | |
| 14 | + android:textSize="10sp" | |
| 15 | + android:visibility="gone" /> | |
| 16 | + | |
| 17 | + <ImageView | |
| 18 | + android:id="@+id/tb_my_user_icon" | |
| 19 | + android:layout_width="50dp" | |
| 20 | + android:layout_height="50dp" | |
| 21 | + android:layout_alignParentRight="true" | |
| 22 | + android:layout_below="@id/mychat_time" /> | |
| 23 | + | |
| 24 | + <LinearLayout | |
| 25 | + android:layout_width="wrap_content" | |
| 26 | + android:layout_height="wrap_content" | |
| 27 | + android:layout_below="@id/mychat_time" | |
| 28 | + android:layout_toLeftOf="@+id/tb_my_user_icon" | |
| 29 | + android:orientation="horizontal"> | |
| 30 | + | |
| 31 | + <ImageView | |
| 32 | + android:id="@+id/mysend_fail_img" | |
| 33 | + android:layout_width="25dp" | |
| 34 | + android:layout_height="25dp" | |
| 35 | + android:layout_gravity="center_vertical" | |
| 36 | + android:background="@mipmap/msg_state_fail_resend_pressed" /> | |
| 37 | + | |
| 38 | + <LinearLayout | |
| 39 | + android:id="@+id/image_group" | |
| 40 | + android:layout_width="wrap_content" | |
| 41 | + android:layout_height="wrap_content" | |
| 42 | + android:layout_margin="5dp" | |
| 43 | + android:orientation="vertical" | |
| 44 | + android:visibility="gone"> | |
| 45 | + | |
| 46 | + <com.shunzhi.mychartlibrary.widget.BubbleImageView | |
| 47 | + android:id="@+id/image_message" | |
| 48 | + android:layout_width="wrap_content" | |
| 49 | + android:layout_height="wrap_content" | |
| 50 | + android:scaleType="centerCrop" /> | |
| 51 | + </LinearLayout> | |
| 52 | + </LinearLayout> | |
| 53 | + | |
| 54 | +</RelativeLayout> | |
| 0 | 55 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,40 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="wrap_content" | |
| 4 | + android:layout_height="wrap_content" | |
| 5 | + android:padding="5dp"> | |
| 6 | + | |
| 7 | + <TextView | |
| 8 | + android:id="@+id/chat_time" | |
| 9 | + android:layout_width="wrap_content" | |
| 10 | + android:layout_height="wrap_content" | |
| 11 | + android:layout_alignParentTop="true" | |
| 12 | + android:layout_centerHorizontal="true" | |
| 13 | + android:textColor="@color/light_gray_6" | |
| 14 | + android:textSize="10sp" | |
| 15 | + android:visibility="gone" /> | |
| 16 | + | |
| 17 | + <ImageView | |
| 18 | + android:id="@+id/tb_other_user_icon" | |
| 19 | + android:layout_width="50dp" | |
| 20 | + android:layout_height="50dp" | |
| 21 | + android:layout_alignParentLeft="true" | |
| 22 | + android:layout_below="@id/chat_time" /> | |
| 23 | + | |
| 24 | + <LinearLayout | |
| 25 | + android:layout_width="wrap_content" | |
| 26 | + android:layout_height="wrap_content" | |
| 27 | + android:layout_below="@id/chat_time" | |
| 28 | + android:layout_toRightOf="@+id/tb_other_user_icon" | |
| 29 | + android:orientation="horizontal"> | |
| 30 | + | |
| 31 | + <com.shunzhi.mychartlibrary.widget.GifTextView | |
| 32 | + android:id="@+id/content" | |
| 33 | + android:layout_width="wrap_content" | |
| 34 | + android:layout_height="wrap_content" | |
| 35 | + android:layout_margin="5dp" | |
| 36 | + android:background="@drawable/chatfrom_bg_focused" | |
| 37 | + android:textSize="16sp" /> | |
| 38 | + </LinearLayout> | |
| 39 | + | |
| 40 | +</RelativeLayout> | |
| 0 | 41 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,41 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="wrap_content" | |
| 4 | + android:layout_height="wrap_content" | |
| 5 | + android:padding="5dp"> | |
| 6 | + | |
| 7 | + <TextView | |
| 8 | + android:id="@+id/mychat_time" | |
| 9 | + android:layout_width="wrap_content" | |
| 10 | + android:layout_height="wrap_content" | |
| 11 | + android:layout_alignParentTop="true" | |
| 12 | + android:layout_centerHorizontal="true" | |
| 13 | + android:textColor="@color/light_gray_6" | |
| 14 | + android:textSize="10sp" | |
| 15 | + android:visibility="gone" /> | |
| 16 | + | |
| 17 | + <ImageView | |
| 18 | + android:id="@+id/tb_my_user_icon" | |
| 19 | + android:layout_width="50dp" | |
| 20 | + android:layout_height="50dp" | |
| 21 | + android:layout_alignParentRight="true" | |
| 22 | + android:layout_below="@id/mychat_time" /> | |
| 23 | + | |
| 24 | + <LinearLayout | |
| 25 | + android:layout_width="wrap_content" | |
| 26 | + android:layout_height="wrap_content" | |
| 27 | + android:layout_below="@id/mychat_time" | |
| 28 | + android:layout_toLeftOf="@+id/tb_my_user_icon" | |
| 29 | + android:orientation="horizontal"> | |
| 30 | + | |
| 31 | + <com.shunzhi.mychartlibrary.widget.GifTextView | |
| 32 | + android:id="@+id/mycontent" | |
| 33 | + android:layout_width="wrap_content" | |
| 34 | + android:layout_height="wrap_content" | |
| 35 | + android:layout_margin="5dp" | |
| 36 | + android:background="@drawable/chatto_bg_focused" | |
| 37 | + android:textColor="@color/white" | |
| 38 | + android:textSize="16sp" /> | |
| 39 | + </LinearLayout> | |
| 40 | + | |
| 41 | +</RelativeLayout> | |
| 0 | 42 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,19 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="match_parent" | |
| 4 | + android:layout_height="match_parent" | |
| 5 | + android:orientation="vertical" > | |
| 6 | + <TextView | |
| 7 | + android:id="@+id/pull_text" | |
| 8 | + android:layout_width="match_parent" | |
| 9 | + android:layout_height="wrap_content" | |
| 10 | + android:text="pull to refresh!" | |
| 11 | + /> | |
| 12 | + <com.maxi.chatdemo.widget.pulltorefresh.PullToRefreshRecyclerView | |
| 13 | + android:id="@+id/pull_list" | |
| 14 | + android:layout_width="match_parent" | |
| 15 | + android:layout_height="match_parent" | |
| 16 | + android:background="#ffffff" | |
| 17 | + /> | |
| 18 | + | |
| 19 | +</LinearLayout> | |
| 0 | 20 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,71 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="wrap_content" | |
| 4 | + android:layout_height="wrap_content" | |
| 5 | + android:padding="5dp"> | |
| 6 | + | |
| 7 | + <TextView | |
| 8 | + android:id="@+id/chat_time" | |
| 9 | + android:layout_width="wrap_content" | |
| 10 | + android:layout_height="wrap_content" | |
| 11 | + android:layout_alignParentTop="true" | |
| 12 | + android:layout_centerHorizontal="true" | |
| 13 | + android:textColor="@color/light_gray_6" | |
| 14 | + android:textSize="10sp" | |
| 15 | + android:visibility="gone" /> | |
| 16 | + | |
| 17 | + <ImageView | |
| 18 | + android:id="@+id/tb_other_user_icon" | |
| 19 | + android:layout_width="50dp" | |
| 20 | + android:layout_height="50dp" | |
| 21 | + android:layout_alignParentLeft="true" | |
| 22 | + android:layout_below="@id/chat_time" /> | |
| 23 | + | |
| 24 | + <LinearLayout | |
| 25 | + android:layout_width="wrap_content" | |
| 26 | + android:layout_height="wrap_content" | |
| 27 | + android:layout_below="@id/chat_time" | |
| 28 | + android:layout_toRightOf="@+id/tb_other_user_icon" | |
| 29 | + android:orientation="horizontal"> | |
| 30 | + | |
| 31 | + <LinearLayout | |
| 32 | + android:id="@+id/voice_group" | |
| 33 | + android:layout_width="wrap_content" | |
| 34 | + android:layout_height="wrap_content" | |
| 35 | + android:layout_margin="5dp" | |
| 36 | + android:orientation="horizontal" | |
| 37 | + android:visibility="gone"> | |
| 38 | + | |
| 39 | + <FrameLayout | |
| 40 | + android:id="@+id/voice_receiver_image" | |
| 41 | + android:layout_width="wrap_content" | |
| 42 | + android:layout_height="wrap_content" | |
| 43 | + android:layout_gravity="center" | |
| 44 | + android:background="@drawable/chatfrom_bg_focused"> | |
| 45 | + | |
| 46 | + <View | |
| 47 | + android:id="@+id/id_receiver_recorder_anim" | |
| 48 | + android:layout_width="15dp" | |
| 49 | + android:layout_height="15dp" | |
| 50 | + android:layout_gravity="center_vertical|left" | |
| 51 | + android:background="@mipmap/receiver_voice_node_playing003" /> | |
| 52 | + | |
| 53 | + <View | |
| 54 | + android:id="@+id/receiver_voice_unread" | |
| 55 | + android:layout_width="10dp" | |
| 56 | + android:layout_height="10dp" | |
| 57 | + android:layout_gravity="center_vertical|right" | |
| 58 | + android:background="@mipmap/msg_chat_voice_unread" /> | |
| 59 | + </FrameLayout> | |
| 60 | + | |
| 61 | + <TextView | |
| 62 | + android:id="@+id/voice_time" | |
| 63 | + android:layout_width="wrap_content" | |
| 64 | + android:layout_height="wrap_content" | |
| 65 | + android:layout_gravity="center_vertical" | |
| 66 | + android:textColor="@color/middle_gray_1" /> | |
| 67 | + </LinearLayout> | |
| 68 | + | |
| 69 | + </LinearLayout> | |
| 70 | + | |
| 71 | +</RelativeLayout> | |
| 0 | 72 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,70 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:layout_width="wrap_content" | |
| 4 | + android:layout_height="wrap_content" | |
| 5 | + android:padding="5dp"> | |
| 6 | + | |
| 7 | + <TextView | |
| 8 | + android:id="@+id/mychat_time" | |
| 9 | + android:layout_width="wrap_content" | |
| 10 | + android:layout_height="wrap_content" | |
| 11 | + android:layout_alignParentTop="true" | |
| 12 | + android:layout_centerHorizontal="true" | |
| 13 | + android:textColor="@color/light_gray_6" | |
| 14 | + android:textSize="10sp" | |
| 15 | + android:visibility="gone" /> | |
| 16 | + | |
| 17 | + <ImageView | |
| 18 | + android:id="@+id/tb_my_user_icon" | |
| 19 | + android:layout_width="50dp" | |
| 20 | + android:layout_height="50dp" | |
| 21 | + android:layout_alignParentRight="true" | |
| 22 | + android:layout_below="@id/mychat_time" /> | |
| 23 | + | |
| 24 | + <LinearLayout | |
| 25 | + android:layout_width="wrap_content" | |
| 26 | + android:layout_height="wrap_content" | |
| 27 | + android:layout_below="@id/mychat_time" | |
| 28 | + android:layout_toLeftOf="@+id/tb_my_user_icon" | |
| 29 | + android:orientation="horizontal"> | |
| 30 | + | |
| 31 | + <ImageView | |
| 32 | + android:id="@+id/mysend_fail_img" | |
| 33 | + android:layout_width="25dp" | |
| 34 | + android:layout_height="25dp" | |
| 35 | + android:layout_gravity="center_vertical" | |
| 36 | + android:background="@mipmap/msg_state_fail_resend_pressed" /> | |
| 37 | + | |
| 38 | + <LinearLayout | |
| 39 | + android:id="@+id/voice_group" | |
| 40 | + android:layout_width="wrap_content" | |
| 41 | + android:layout_height="wrap_content" | |
| 42 | + android:layout_margin="5dp" | |
| 43 | + android:orientation="horizontal" | |
| 44 | + android:visibility="gone"> | |
| 45 | + | |
| 46 | + <TextView | |
| 47 | + android:id="@+id/voice_time" | |
| 48 | + android:layout_width="wrap_content" | |
| 49 | + android:layout_height="wrap_content" | |
| 50 | + android:layout_gravity="center_vertical" | |
| 51 | + android:textColor="@color/middle_gray_1" /> | |
| 52 | + | |
| 53 | + <FrameLayout | |
| 54 | + android:id="@+id/voice_image" | |
| 55 | + android:layout_width="wrap_content" | |
| 56 | + android:layout_height="wrap_content" | |
| 57 | + android:layout_gravity="center" | |
| 58 | + android:background="@drawable/chatto_bg_focused"> | |
| 59 | + | |
| 60 | + <View | |
| 61 | + android:id="@+id/id_recorder_anim" | |
| 62 | + android:layout_width="15dp" | |
| 63 | + android:layout_height="15dp" | |
| 64 | + android:layout_gravity="center_vertical|right" | |
| 65 | + android:background="@mipmap/adj" /> | |
| 66 | + </FrameLayout> | |
| 67 | + </LinearLayout> | |
| 68 | + </LinearLayout> | |
| 69 | + | |
| 70 | +</RelativeLayout> | |
| 0 | 71 | \ No newline at end of file | ... | ... |
4.06 KB
3.79 KB
7.89 KB
2.24 KB
1.74 KB
1.81 KB
1.57 KB
1.42 KB
7.99 KB
7.99 KB
1.81 KB
1.59 KB
1.87 KB
3.02 KB
1.95 KB
2.25 KB
2.43 KB
3.96 KB
2.64 KB
3.34 KB
4.84 KB
1.78 KB
1.81 KB
7.24 KB
4.39 KB
2.13 KB
1.43 KB
1.21 KB
1.68 KB
1.8 KB
1.14 KB
2.54 KB
1.39 KB
1.85 KB
1.28 KB
1.98 KB
3.19 KB
3.9 KB
4.92 KB
3.37 KB
app/src/main/res/mipmap-hdpi/ic_launcher.png
1.72 KB
3.01 KB
828 Bytes
414 Bytes
3.01 KB
2.06 KB
142 KB
app/src/main/res/mipmap-xhdpi/ic_launcher.png
1.18 KB
592 Bytes
82 Bytes
162 Bytes
356 Bytes
591 Bytes
3.32 KB
17.4 KB
18.8 KB
20.2 KB
6.92 KB
14.3 KB
14.4 KB