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