</meta-data>
</activity>
- <activity android:name="cc.minsnail.activity.AddActivity"
+ <activity android:name="cc.minsnail.activity.SearchUserActivity"
android:parentActivityName="cc.minsnail.activity.MainActivity"
android:screenOrientation="nosensor">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER"></category>
</intent-filter>
</activity>
+ <activity
+ android:name="cc.minsnail.activity.UserSummaryActivity"
+ android:screenOrientation="nosensor">
+ <intent-filter>
+ <category android:name="android.intent.category.LAUNCHER"></category>
+ </intent-filter>
+ </activity>
<service
android:name="cc.minsnail.service.SmackService"
android:process=":SmackService"
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
+import android.system.Os;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;
-import java.util.ArrayList;
+import com.alibaba.sdk.android.oss.ClientException;
+import com.alibaba.sdk.android.oss.ServiceException;
+import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
+import com.alibaba.sdk.android.oss.model.GetObjectRequest;
+import com.alibaba.sdk.android.oss.model.GetObjectResult;
+import com.alibaba.sdk.android.oss.model.PutObjectRequest;
+import com.alibaba.sdk.android.oss.model.PutObjectResult;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import cc.minsnail.adapter.ChatAdapter;
+import cc.minsnail.beans.ChatMessageItem;
import cc.minsnail.beans.YgText;
+import cc.minsnail.config.Config;
+import cc.minsnail.database.DataBaseManager;
import cc.minsnail.manager.MediaManager;
+import cc.minsnail.manager.OssManager;
import cc.minsnail.smackclient.R;
import cc.minsnail.tools.SharedHelper;
import cc.minsnail.tools.Utils;
import cc.minsnail.beans.YgInfo;
import cc.minsnail.beans.YgMessage;
import cc.minsnail.aidl.IServiceAidlInterface;
+import cc.minsnail.view.ImagePopupWindow;
/**
* Created by yg on 2016/9/23.
private static final int AUDIO_FINISH_RECORDER = 2;
private static final String TAG = "ChatActivity";
private SharedHelper mSharedHelper;
- //登录用户jid
- private String mJid;
//聊天对方用户
- private TextView mToUserName;
+ private TextView mFromNameView;
//更多消息形式
private ImageButton mMoreBtn;
//发送图片按钮
private ImageButton mChangeBtn;
//录音按钮
private AudioRecordeButton mAudioRecorderButton;
- //聊天对方jid
- private String mToJid;
//消息展示listView
private ListView mChatBox;
//文本发送按钮
//语音播放动画
private View mAnimView;
- Toolbar mToolbar;
+ private Toolbar mToolbar;
+
+ //登录用户jid
+ private String mToJid;
+ private String mToUserName;
+ private String mToName;
+ //聊天对方jid
+ private String mFromJid;
+ private String mFromUserName;
+ private String mFromName;
+
+ private DataBaseManager mDataBaseManager;
- YgInfo ygInfo;
- YgText ygText = new YgText();
- private Handler handler = new Handler(){
+ private boolean haveNews = false;
+ private OssManager mOssManger;
+ private ImagePopupWindow mImagePopupWindow;
+ private YgInfo ygInfo;
+ private YgText ygText = new YgText();
+ private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
- switch (msg.what){
+ switch (msg.what) {
case SEND_TEXT_CHAT:
- textSended();
+ textSent();
break;
case AUDIO_FINISH_RECORDER:
audioFinished();
break;
case EORROR:
- Toast.makeText(ChatActivity.this,ygInfo.getBody(),Toast.LENGTH_SHORT).show();
+ Toast.makeText(ChatActivity.this, ygInfo.getBody(), Toast.LENGTH_SHORT).show();
break;
}
}
};
- private void textSended(){
- YgMessage ygMessage = new YgMessage();
- ygMessage.setTo(mJid);
- ygMessage.setBody(ygText.toJson());
- ygMessage.setCustom(1);
- mChatAdapter.addChat(ygMessage);
- mChatBox.setSelection(mChatAdapter.getCount()-1);
- mContent.setText("");
- Log.d(TAG,"send success");
+
+ private void textSent() {
+ YgMessage ygMessage = new YgMessage();
+ ygMessage.setTo(mToJid);
+ ygMessage.setFrom(mFromJid);
+ ygMessage.setBody(ygText.toJson());
+ ygMessage.setCustom(1);
+ mChatAdapter.addChat(new ChatMessageItem(ygMessage));
+ mChatBox.setSelection(mChatAdapter.getCount() - 1);
+ haveNews = true;
+ mContent.setText("");
+ Log.d(TAG, "send success");
}
- private void audioFinished(){
+
+ private void audioFinished() {
YgMessage ygMessage = new YgMessage();
ygMessage.setCustom(1);
ygMessage.setBody(ygText.toJson());
- mChatAdapter.addChat(ygMessage);
- mChatBox.setSelection(mChatAdapter.getCount()-1);
+ ygMessage.setTo(mToJid);
+ ygMessage.setFrom(mFromJid);
+ mChatAdapter.addChat(new ChatMessageItem(ygMessage));
+ mChatBox.setSelection(mChatAdapter.getCount() - 1);
+ haveNews = true;
}
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置title
setTitle("");
initView();
- Log.i("username",mSharedHelper.get("mUserName","yg"));
+
//信息窗消
- mJid = mSharedHelper.get("mUserName","admin");
- Intent i = getIntent();
- mToUserName.setText(i.getStringExtra("name"));
- mToJid = i.getStringExtra("jid");
+ mToUserName = mSharedHelper.get(Config.KEY_TO_USERNAME, "admin");
+ mToJid = mToUserName;
+
+ mFromName = getIntent().getStringExtra(Config.KEY_FROM_NAME);
+ mFromNameView.setText(mFromName == null ? mFromUserName : mFromName);
+ mFromJid = getIntent().getStringExtra(Config.KEY_FROM_JID);
+ mFromUserName = mFromJid.split("@")[0];
//绑定后台服务
mConn = new ServiceConn();
Intent intent = new Intent("android.intent.action.SMACK_CLIENT_SERVICE");
intent.setPackage("cc.minsnail.www.smackclient");
- bindService(intent,mConn, Context.BIND_AUTO_CREATE);
+ bindService(intent, mConn, Context.BIND_AUTO_CREATE);
+
//初始化适配器
- mChatAdapter = new ChatAdapter(getApplicationContext(),new ArrayList<YgMessage>(),new OnAudioClickListener());
+ mChatAdapter = new ChatAdapter(ChatActivity.this, mDataBaseManager.queryChatMessageItems(mToUserName, mFromUserName), new OnAudioClickListener(), new OnImageClickListener());
mChatBox.setAdapter(mChatAdapter);
- if (i.getParcelableExtra("msg")!=null){
- mChatAdapter.addChat((YgMessage) i.getParcelableExtra("msg"));
+ mChatBox.setSelection(mChatAdapter.getCount() - 1);
+ if (getIntent().getParcelableExtra(Config.KEY_MESSAGE) != null) {
+ mChatAdapter.addChat(new ChatMessageItem((YgMessage) getIntent().getParcelableExtra(Config.KEY_MESSAGE)));
}
//注册消息接收器
mMsgRecervier = new MsgRecervier();
IntentFilter intentFilter = new IntentFilter("MsgRecerver");
intentFilter.setPriority(1000);
- registerReceiver(mMsgRecervier,intentFilter);
+ registerReceiver(mMsgRecervier, intentFilter);
//绑定事件
event();
+
+ mOssManger = OssManager.getInstance(ChatActivity.this);
}
- private void initView(){
- mToUserName = (TextView)mToolbar.findViewById(R.id.name);
- mChatBox = (ListView)findViewById(R.id.chatbox);
- mTextSendBtn = (Button)findViewById(R.id.send);
- mContent = (EditText)findViewById(R.id.content);
- mMoreBtn = (ImageButton)findViewById(R.id.more);
- mSubMenus = (RelativeLayout)findViewById(R.id.subMenus);
+
+ private void initView() {
+ mFromNameView = (TextView) mToolbar.findViewById(R.id.name);
+ mChatBox = (ListView) findViewById(R.id.chatbox);
+ mTextSendBtn = (Button) findViewById(R.id.send);
+ mContent = (EditText) findViewById(R.id.content);
+ mMoreBtn = (ImageButton) findViewById(R.id.more);
+ mSubMenus = (RelativeLayout) findViewById(R.id.subMenus);
mPhotoBtn = (ImageButton) findViewById(R.id.sendPic);
mAudioBtn = (ImageButton) findViewById(R.id.audio);
mChangeBtn = (ImageButton) findViewById(R.id.chanage);
mRecordWindow = (RelativeLayout) findViewById(R.id.sendAudio);
mTextWindow = (RelativeLayout) findViewById(R.id.sendText);
- mAudioRecorderButton = (AudioRecordeButton)findViewById(R.id.recorder_button);
+ mAudioRecorderButton = (AudioRecordeButton) findViewById(R.id.recorder_button);
mSharedHelper = new SharedHelper(ChatActivity.this);
+ mDataBaseManager = DataBaseManager.getInstance(ChatActivity.this);
+
+ mImagePopupWindow = new ImagePopupWindow(ChatActivity.this, mChatBox);
}
- private void event(){
+
+ private void event() {
//文本发送按钮
mTextSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String text = mContent.getText().toString().trim();
- if (!text.equals("")&&mSmackService!=null) {
+ if (!text.equals("") && mSmackService != null) {
ygText.setType("txt");
ygText.setBody(text);
new Thread(new Runnable() {
@Override
public void run() {
try {
- ygInfo = mSmackService.sendChatText(mToJid,ygText.toJson());
- if (ygInfo.getCode() == 200){
+ ygInfo = mSmackService.sendChatText(mFromJid, ygText.toJson());
+ if (ygInfo.getCode() == 200) {
handler.sendEmptyMessage(SEND_TEXT_CHAT);
- }else {
+ } else {
handler.sendEmptyMessage(EORROR);
}
} catch (RemoteException e) {
}
}
});
+
//打开子菜单按钮
mMoreBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- if (mSubMenus.getVisibility()==View.GONE) {
+ if (mSubMenus.getVisibility() == View.GONE) {
mSubMenus.setVisibility(View.VISIBLE);
- }else {
+ } else {
mSubMenus.setVisibility(View.GONE);
}
}
});
+
//打开图片选择器
mPhotoBtn.setOnClickListener(new View.OnClickListener() {
@Override
Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT);
intent1.addCategory(Intent.CATEGORY_OPENABLE);
intent1.setType("image/*");
- startActivityForResult(Intent.createChooser(intent1, "选择图片"),1);
+ startActivityForResult(Intent.createChooser(intent1, "选择图片"), 1);
}
});
+
mContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSubMenus.setVisibility(View.GONE);
}
});
+
mChangeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSubMenus.setVisibility(View.GONE);
}
});
+
mAudioBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSubMenus.setVisibility(View.GONE);
}
});
+
//录音完成监听
mAudioRecorderButton.setAudioFinishRecorderListener(new AudioRecordeButton.AudioFinishRecorderListener() {
@Override
public void onFinish(float seconds, final String filePath) {
- if (mSmackService!=null){
+ if (mSmackService != null) {
ygText.setType("audio");
- ygText.setLength((long)seconds);
+ ygText.setLength((long) seconds);
String str = Utils.file2string(filePath);
- if (str == null){
+ if (str == null) {
return;
}
- Log.i(TAG,str);
+ Log.i(TAG, str);
ygText.setBody(str);
new Thread(new Runnable() {
@Override
public void run() {
try {
- ygInfo = mSmackService.sendChatText(mToJid,ygText.toJson());
- if (ygInfo.getCode()==200){
+ ygInfo = mSmackService.sendChatText(mFromJid, ygText.toJson());
+ if (ygInfo.getCode() == 200) {
ygText.setBody(filePath);
handler.sendEmptyMessage(AUDIO_FINISH_RECORDER);
- }else {
+ } else {
handler.sendEmptyMessage(EORROR);
}
} catch (RemoteException e) {
}
});
}
- private class OnAudioClickListener implements View.OnClickListener{
- @Override
- public void onClick(View view) {
- //播放动画
- if (mAnimView != null){
- if (((String)mAnimView.getTag()).equals("left")){
- mAnimView.setBackgroundResource(R.mipmap.adjr);
- }else {
- mAnimView.setBackgroundResource(R.mipmap.adj);
- }
- mAnimView = null;
- }
- mAnimView = view.findViewById(R.id.recoder_anim);
- String tag = (String) mAnimView.getTag();
- if (tag.equals("left")){
- mAnimView.setBackgroundResource(R.drawable.audio_play_animr);
- }else {
- mAnimView.setBackgroundResource(R.drawable.audio_play_anim);
- }
- final AnimationDrawable anim = (AnimationDrawable) mAnimView.getBackground();
- anim.start();
- Log.i(TAG,"ok");
- //播放语言
- String filePath = ((TextView)view.findViewById(R.id.filePath)).getText().toString();
- Log.i(TAG,filePath);
- MediaManager.playSound(filePath, new MediaPlayer.OnCompletionListener() {
- @Override
- public void onCompletion(MediaPlayer mediaPlayer) {
- if (((String)mAnimView.getTag()).equals("left")){
- mAnimView.setBackgroundResource(R.mipmap.adjr);
- }else {
- mAnimView.setBackgroundResource(R.mipmap.adj);
- }
-
- }
- });
- }
- }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_chat,menu);
+ getMenuInflater().inflate(R.menu.menu_chat, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()){
+ switch (item.getItemId()) {
case R.id.menu_dtl:
- Intent intent = new Intent(ChatActivity.this,UserDetailsActivity.class);
+ Intent intent = new Intent(ChatActivity.this, UserDetailsActivity.class);
startActivity(intent);
break;
case R.id.menu_pic:
Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT);
intent1.addCategory(Intent.CATEGORY_OPENABLE);
intent1.setType("image/*");
- startActivityForResult(Intent.createChooser(intent1, "选择图片"),1);
+ startActivityForResult(Intent.createChooser(intent1, "选择图片"), 1);
break;
- case android.R.id.home:
- this.finish();
- return true;
default:
break;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// TODO: 2016/10/31
- if (resultCode == RESULT_OK){
- Uri uri = data.getData();
- Log.i(TAG,uri.getPath());
- if(mSmackService !=null){
- YgText ygText = new YgText();
+ if (resultCode == RESULT_OK) {
+ final Uri uri = data.getData();
+ final String filePath = uri.getPath();
+ final String finleName = filePath.substring(filePath.lastIndexOf("/") + 1);
+ Log.i(TAG, uri.getPath());
+ Log.i(TAG, filePath);
+ Log.i(TAG, finleName);
+ if (mSmackService != null) {
+ final YgText ygText = new YgText();
ygText.setType("pic");
- ygText.setBody(Utils.file2string(uri.getPath()));
- try {
- ygInfo = mSmackService.sendChatText(mToJid,ygText.toJson());
- if (ygInfo.getCode() == 200){
- YgMessage ygMessage = new YgMessage();
- ygMessage.setTo(mJid);
- ygText.setBody(uri.toString());
- ygMessage.setBody(ygText.toJson());
- ygMessage.setCustom(1);
- mChatAdapter.addChat(ygMessage);
- }else {
- Log.i(TAG,ygInfo.getBody());
+ final PutObjectRequest put = new PutObjectRequest(Config.OSS_BUCKET_NAME, finleName, uri.getPath());
+ mOssManger.oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
+ @Override
+ public void onSuccess(PutObjectRequest putObjectRequest, PutObjectResult putObjectResult) {
+ Log.i(TAG, "OSS success");
+ Log.i(TAG, putObjectRequest.getBucketName());
+ try {
+ ygText.setBody(finleName);
+ ygInfo = mSmackService.sendChatText(mFromJid, ygText.toJson());
+ if (ygInfo.getCode() == 200) {
+ YgMessage ygMessage = new YgMessage();
+ ygMessage.setTo(mToJid);
+ ygMessage.setFrom(mFromJid);
+ ygText.setBody(filePath);
+ ygMessage.setBody(ygText.toJson());
+ ygMessage.setCustom(1);
+ mChatAdapter.addChat(new ChatMessageItem(ygMessage));
+ haveNews = true;
+ } else {
+ Log.i(TAG, ygInfo.getBody());
+ }
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
}
- } catch (RemoteException e) {
- e.printStackTrace();
+
+ @Override
+ public void onFailure(PutObjectRequest putObjectRequest, ClientException e, ServiceException e1) {
+ Log.i(TAG, "OSS failure");
+ Log.e("RequestId", e1.getRequestId());
+ Log.e("ErrorCode", e1.getErrorCode());
+ Log.e("HostId", e1.getHostId());
+ Log.e("RawMessage", e1.getRawMessage());
+ }
+ });
+ }
+ }
+ }
+
+ private class OnAudioClickListener implements View.OnClickListener {
+
+ @Override
+ public void onClick(View view) {
+ //播放动画
+ if (mAnimView != null) {
+ if (((String) mAnimView.getTag()).equals("left")) {
+ mAnimView.setBackgroundResource(R.mipmap.adjr);
+ } else {
+ mAnimView.setBackgroundResource(R.mipmap.adj);
}
+ mAnimView = null;
+ }
+ mAnimView = view.findViewById(R.id.recoder_anim);
+ String tag = (String) mAnimView.getTag();
+ if (tag.equals("left")) {
+ mAnimView.setBackgroundResource(R.drawable.audio_play_animr);
+ } else {
+ mAnimView.setBackgroundResource(R.drawable.audio_play_anim);
}
+ final AnimationDrawable anim = (AnimationDrawable) mAnimView.getBackground();
+ anim.start();
+ Log.i(TAG, "ok");
+ //播放语言
+ String filePath = ((TextView) view.findViewById(R.id.filePath)).getText().toString();
+ Log.i(TAG, filePath);
+ MediaManager.playSound(filePath, new MediaPlayer.OnCompletionListener() {
+ @Override
+ public void onCompletion(MediaPlayer mediaPlayer) {
+ if (((String) mAnimView.getTag()).equals("left")) {
+ mAnimView.setBackgroundResource(R.mipmap.adjr);
+ } else {
+ mAnimView.setBackgroundResource(R.mipmap.adj);
+ }
+
+ }
+ });
}
}
- private class MsgRecervier extends BroadcastReceiver{
+ private class OnImageClickListener implements View.OnClickListener {
+
+ @Override
+ public void onClick(View view) {
+ String filePath = (String) view.getTag(R.id.TAG_IMAGE_FILE_PATH);
+ Toast.makeText(ChatActivity.this, filePath, Toast.LENGTH_SHORT).show();
+ mImagePopupWindow.show(filePath);
+
+ }
+ }
+
+ private class MsgRecervier extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
YgMessage ygMessage = intent.getParcelableExtra("msg");
- Log.i(TAG,"received message");
- if(ygMessage.getFrom().split("@")[0].equals(mToJid.split("@")[0])){
- mChatAdapter.addChat(ygMessage);
- mChatBox.setSelection(mChatAdapter.getCount()-1);
+ Log.i(TAG, "received message");
+ if (ygMessage.getFrom().split("@")[0].equals(mFromJid.split("@")[0])) {
+ ChatMessageItem item = new ChatMessageItem(ygMessage);
+ if (item.getType() == Config.INT_TYPE_PIC_L){
+ ossLoadImage(item);
+ }else {
+ mChatAdapter.addChat(item);
+ mChatBox.setSelection(mChatAdapter.getCount() - 1);
+ haveNews = true;
+ }
abortBroadcast();
}
}
}
+ private void ossLoadImage(final ChatMessageItem item){
+ final String fileName = item.getText();
+ Log.i(TAG,"recerve filename :"+fileName);
+ GetObjectRequest get = new GetObjectRequest(Config.OSS_BUCKET_NAME,fileName);
+ mOssManger.oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
+ @Override
+ public void onSuccess(GetObjectRequest getObjectRequest, GetObjectResult getObjectResult) {
+ InputStream inputStream = getObjectResult.getObjectContent();
+ File picPath = new File(new File(Environment.getExternalStorageDirectory(), Config.APP_PATH),Config.PIC_PATH);
+ if (!picPath.exists()) picPath.mkdirs();
+ String ext = fileName.substring(fileName.lastIndexOf(".")+1);
+ File file = new File(picPath,System.currentTimeMillis()+ext);
+ try {
+ OutputStream outputStream = new FileOutputStream(file);
+ byte[] buffer= new byte[1024];
+ int len;
+ while ((len=inputStream.read(buffer))!=-1){
+ outputStream.write(buffer,0,len);
+ }
+ inputStream.close();
+ outputStream.flush();
+ outputStream.close();
+
+ item.setText(file.getAbsolutePath());
+
+ mChatAdapter.addChat(item);
+ mChatBox.setSelection(mChatAdapter.getCount() - 1);
+ haveNews = true;
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Override
+ public void onFailure(GetObjectRequest getObjectRequest, ClientException e, ServiceException e1) {
+ // 请求异常
+ if (e != null) {
+ // 本地异常如网络异常等
+ e.printStackTrace();
+ }
+ if (e1 != null) {
+ // 服务异常
+ Log.e("ErrorCode", e1.getErrorCode());
+ Log.e("RequestId", e1.getRequestId());
+ Log.e("HostId", e1.getHostId());
+ Log.e("RawMessage", e1.getRawMessage());
+ }
+ }
+ });
+ }
private class ServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
- Log.d(TAG,"连接服务器成功");
+ Log.d(TAG, "连接服务器成功");
mSmackService = IServiceAidlInterface.Stub.asInterface(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
- Log.d(TAG,"连接服务失败");
+ Log.d(TAG, "连接服务失败");
mSmackService = null;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK){
- Log.i(TAG,"finish");
- this.finish();
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_BACK:
+ back();
+ return true;
+ default:
+ return super.onKeyDown(keyCode, event);
}
- return false;
+ }
+
+ private void back() {
+ Intent intent = new Intent(ChatActivity.this, MainActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
}
@Override
protected void onPause() {
- super.onPause();
+ if (haveNews) {
+ mChatAdapter.finish();
+ haveNews = false;
+ }
MediaManager.pause();
+ super.onPause();
}
@Override
import cc.minsnail.smackclient.R;
-public class LoginActivity extends AppCompatActivity{
- private static final int EORROR = 0;
- private static final int LOGINING = 1;
+public class LoginActivity extends AppCompatActivity {
+ private static final int ACTION_EORROR = 0;
+ private static final int ACTION_LOGIN = 1;
private static final int IS_LOGIN = 2;
private static final String TAG = "LoginActivity";
private AutoCompleteTextView mEmailView;
private IServiceAidlInterface mSmackService;
private YgInfo ygInfo;
- private Handler handler = new Handler(){
+ private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
- switch (msg.what){
- case LOGINING:
+ switch (msg.what) {
+ case ACTION_LOGIN:
case IS_LOGIN:
- startActivity(new Intent(LoginActivity.this,MainActivity.class));
+ startActivity(new Intent(LoginActivity.this, MainActivity.class));
+ finish();
break;
- case EORROR:
- Toast.makeText(LoginActivity.this,ygInfo.getBody(),Toast.LENGTH_SHORT).show();
+ case ACTION_EORROR:
+ Toast.makeText(LoginActivity.this, ygInfo.getBody(), Toast.LENGTH_SHORT).show();
+ finish();
break;
}
}
};
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPasswordView = (EditText) findViewById(R.id.password);
Intent i = getIntent();
- if (i.getStringExtra("user")!=null){
+ if (i.getStringExtra("user") != null) {
mEmailView.setText(i.getStringExtra("user"));
}
- mRegisterBtn = (Button)findViewById(R.id.register);
+ mRegisterBtn = (Button) findViewById(R.id.register);
Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
mEmailSignInButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
- if (mSmackService != null){
- final String userName = mEmailView.getText().toString().trim();
- final String pass = mPasswordView.getText().toString().trim();
- if (userName.equals("")){
- Toast.makeText(getApplicationContext(),"User name cannot be empty",Toast.LENGTH_SHORT).show();
- return;
- }
- if (pass.equals("")){
- Toast.makeText(getApplicationContext(),"Password cannot be empty",Toast.LENGTH_SHORT).show();
- return;
- }
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- ygInfo = mSmackService.login(userName,pass);
- if (ygInfo.getCode()==200){
- handler.sendEmptyMessage(LOGINING);
- }else {
- handler.sendEmptyMessage(EORROR);
- }
- } catch (RemoteException e) {
- e.printStackTrace();
- }
+ if (mSmackService != null) {
+ final String userName = mEmailView.getText().toString().trim();
+ final String pass = mPasswordView.getText().toString().trim();
+ if (userName.equals("")) {
+ Toast.makeText(getApplicationContext(), "User name cannot be empty", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if (pass.equals("")) {
+ Toast.makeText(getApplicationContext(), "Password cannot be empty", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ ygInfo = mSmackService.login(userName, pass);
+ if (ygInfo.getCode() == 200) {
+ handler.sendEmptyMessage(ACTION_LOGIN);
+ } else {
+ handler.sendEmptyMessage(ACTION_EORROR);
}
- }).start();
- }else {
- Log.e(TAG,"error");
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
}
- }
+ }).start();
+ } else {
+ Log.e(TAG, "error");
+ }
+ }
});
mRegisterBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
- Intent intent = new Intent(LoginActivity.this,RegisterActivity.class);
+ Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
startService(new Intent(LoginActivity.this, SmackService.class));
Intent intent = new Intent("android.intent.action.SMACK_CLIENT_SERVICE");
intent.setPackage("cc.minsnail.www.smackclient");
- bindService(intent,mConn,Context.BIND_AUTO_CREATE);
+ bindService(intent, mConn, Context.BIND_AUTO_CREATE);
}
+
class ServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
- Log.d(TAG,"连接服务器成功");
+ Log.d(TAG, "连接服务器成功");
mSmackService = IServiceAidlInterface.Stub.asInterface(iBinder);
- if (mSmackService != null){
+ if (mSmackService != null) {
new Thread(new Runnable() {
@Override
public void run() {
try {
- if (mSmackService.isLogin()){
+ if (mSmackService.isLogin()) {
handler.sendEmptyMessage(IS_LOGIN);
}
} catch (RemoteException e) {
@Override
public void onServiceDisconnected(ComponentName componentName) {
- Log.d(TAG,"连接服务失败");
+ Log.d(TAG, "连接服务失败");
mSmackService = null;
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK){
- Log.i(TAG,"finish");
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ Log.i(TAG, "finish");
this.finish();
}
return false;
}
+
@Override
protected void onDestroy() {
unbindService(mConn);
import android.app.FragmentTransaction;
import android.content.ComponentName;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
+import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
+import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ListView;
+import android.widget.PopupWindow;
import android.widget.TextView;
-import java.util.List;
-
-import cc.minsnail.adapter.FriendsAdapter;
import cc.minsnail.aidl.IServiceAidlInterface;
import cc.minsnail.fragment.MessageFragment;
import cc.minsnail.fragment.RosterFragment;
import cc.minsnail.smackclient.R;
import cc.minsnail.tools.SharedHelper;
+import cc.minsnail.view.ImagePopupWindow;
+
/**
* Created by yg on 2016/9/23.
*/
public class MainActivity extends AppCompatActivity {
private static final int SHOW_INFO = 1;
private static final String TAG = "MainActivity";
- private String mUser;
+ private String mToUserName;
private IServiceAidlInterface mSmackService;
private ServiceConn mConn;
private RosterFragment mRosterFragment;
private Toolbar mToolbar;
private TextView mToolbarTitle;
private SharedHelper mSharedHelper;
-
+ private ImagePopupWindow popupWindow;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case SHOW_INFO:
- mToolbar.setTitle(mUser);
- mSharedHelper.put("mUserName",mUser);
- Log.i("username",mSharedHelper.get("mUserName","yg"));
+ mToolbar.setTitle(mToUserName);
+ mSharedHelper.put("toUserName",mToUserName);
break;
}
}
//toolbar.setLogo(R.mipmap.ic_launcher);
mToolbar.setTitle("");
setSupportActionBar(mToolbar);
-
initView();
initEvent();
-
-
mConn = new ServiceConn();
Intent intent = new Intent("android.intent.action.SMACK_CLIENT_SERVICE");
intent.setPackage("cc.minsnail.www.smackclient");
bindService(intent,mConn, Context.BIND_AUTO_CREATE);
mSharedHelper = new SharedHelper(MainActivity.this);
+ popupWindow = new ImagePopupWindow(MainActivity.this,mMessage);
}
private void initView(){
mToolbarTitle = (TextView) mToolbar.findViewById(R.id.toolbar_title);
switch (item){
case 0:
if (mMessageFragment == null){
- mMessageFragment = new MessageFragment(mSmackService);
+ mMessageFragment = new MessageFragment();
transaction.add(R.id.main_fragment,mMessageFragment);
}else {
transaction.show(mMessageFragment);
public void run() {
if (mSmackService != null){
try {
- mUser = mSmackService.getAccountAttribute("username");
+ mToUserName = mSmackService.getAccountAttribute("username");
handler.sendEmptyMessage(SHOW_INFO);
} catch (RemoteException e) {
e.printStackTrace();
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.add_frd:
- Intent intent = new Intent(getApplicationContext(),AddActivity.class);
+ Intent intent = new Intent(getApplicationContext(),SearchUserActivity.class);
startActivity(intent);
break;
case R.id.add_grp:
// TODO: 2016/10/28
+ popupWindow.show();
+ break;
+ case R.id.loginout:
+ loginOut();
break;
}
return super.onOptionsItemSelected(item);
}
+ private void loginOut(){
+ AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
+ builder.setTitle(R.string.str_login_out_dialog_title)
+ .setMessage(R.string.str_login_out_dialog_message);
+ builder.setPositiveButton(R.string.str_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ // TODO: 2016/11/11
+ }
+ });
+
+ builder.setNegativeButton(R.string.str_cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ // TODO: 2016/11/11
+ }
+ });
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
class ServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
import android.os.RemoteException;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
/**
* Created by yg on 2016/9/26.
*/
-public class AddActivity extends AppCompatActivity {
+public class SearchUserActivity extends AppCompatActivity {
private static final int SEARCH_RESULT = 1;
- private static final String TAG = "AddActivity";
+ private static final String TAG = "SearchUserActivity";
private IServiceAidlInterface mSmackService;
private ServiceConn mConn;
private EditText mSearchWord;
private ListView mUsers;
- private Button mSearchBtn;
-
+ private ImageButton mSearchBtn;
private Toolbar mToolbar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_add);
+ setContentView(R.layout.activity_search_user);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
- mToolbar.setTitle("添加好友");
+ mToolbar.setTitle(R.string.str_search_user);
setSupportActionBar(mToolbar);
ActionBar actionBar = getSupportActionBar();
mConn = new ServiceConn();
Intent intent = new Intent("android.intent.action.SMACK_CLIENT_SERVICE");
intent.setPackage("cc.minsnail.www.smackclient");
- bindService(intent,mConn, Context.BIND_AUTO_CREATE);
+ bindService(intent, mConn, Context.BIND_AUTO_CREATE);
initEvent();
}
- private void initView(){
- mSearchWord = (EditText)findViewById(R.id.content);
- mUsers = (ListView)findViewById(R.id.users);
- mSearchBtn = (Button)findViewById(R.id.search);
+
+ private void initView() {
+ mSearchWord = (EditText) findViewById(R.id.content);
+ mUsers = (ListView) findViewById(R.id.users);
+ mSearchBtn = (ImageButton) findViewById(R.id.search_btn);
}
- private void initEvent(){
+
+ private void initEvent() {
mSearchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String text = mSearchWord.getText().toString();
- Log.d(TAG,text);
+ Log.d(TAG, text);
new Thread(new Runnable() {
@Override
public void run() {
- if (mSmackService != null){
+ if (mSmackService != null) {
try {
- mUserList = mSmackService.searchUser(text,true,true,true);
+ mUserList = mSmackService.searchUser(text, true, true, true);
handler.sendEmptyMessage(SEARCH_RESULT);
} catch (RemoteException e) {
e.printStackTrace();
mUsers.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
- TextView jid = (TextView)view.findViewById(R.id.user_jid);
- Log.d(TAG,jid.getText().toString());
- Intent intent = new Intent(getApplicationContext(),UserInfoActivity.class);
- intent.putExtra("jid",jid.getText().toString());
+ TextView jid = (TextView) view.findViewById(R.id.user_jid);
+ Log.d(TAG, jid.getText().toString());
+ Intent intent = new Intent(getApplicationContext(), UserInfoActivity.class);
+ intent.putExtra("jid", jid.getText().toString());
startActivity(intent);
}
});
}
+
private List mUserList;
- private Handler handler = new Handler(){
+ private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
- switch (msg.what){
+ switch (msg.what) {
case SEARCH_RESULT:
- mUsers.setAdapter(new FriendsAdapter(getApplicationContext(),mUserList));
+ mUsers.setAdapter(new FriendsAdapter(getApplicationContext(), mUserList));
break;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()){
- case android.R.id.home:
- this.finish();
- return true;
- }
+// switch (item.getItemId()) {
+// case android.R.id.home:
+// this.finish();
+// return true;
+// }
return super.onOptionsItemSelected(item);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK){
- Log.i(TAG,"finish");
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ Log.i(TAG, "finish");
this.finish();
}
return false;
}
+
@Override
protected void onDestroy() {
unbindService(mConn);
private class ServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
- Log.d(TAG,"连接服务器成功");
+ Log.d(TAG, "连接服务器成功");
mSmackService = IServiceAidlInterface.Stub.asInterface(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
- Log.d(TAG,"连接服务失败");
+ Log.d(TAG, "连接服务失败");
mSmackService = null;
}
}
import android.annotation.TargetApi;
import android.content.Context;
-import android.net.Uri;
import android.os.Build;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
+import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
-import java.io.File;
import java.util.List;
-import cc.minsnail.beans.YgText;
-import cc.minsnail.beans.YgMessage;
+import cc.minsnail.beans.ChatMessageItem;
+import cc.minsnail.config.Config;
+import cc.minsnail.database.DataBaseManager;
import cc.minsnail.smackclient.R;
+import cc.minsnail.view.ChatImageView;
/**
* Created by yg on 2016/9/23.
*/
public class ChatAdapter extends BaseAdapter {
- private static final int INT_TYPE_TXT_L = 0;
- private static final int INT_TYPE_TXT_R = 1;
- private static final int INT_TYPE_PIC_L = 2;
- private static final int INT_TYPE_PIC_R = 3;
- private static final int INT_TYPE_AUDIO_L = 4;
- private static final int INT_TYPE_AUDIO_R = 5;
- private static final String STR_TYYPE_TXT = "txt";
- private static final String STR_TYPE_PIC = "pic";
- private static final String STR_TYPE_AUDIO = "audio";
+ private static final String TAG = "ChatAdapter";
private Context mContext;
- private List<YgMessage> mDatas;
+ private List<ChatMessageItem> mDatas;
private LayoutInflater mInflater;
private int mMinItemWidth;
private int mMaxItemWidth;
+ private DataBaseManager mDataBaseManager;
private View.OnClickListener mOnAudioClickListener;
- public ChatAdapter(Context context,List<YgMessage> list,View.OnClickListener onAudioClickListener){
+ private View.OnClickListener mOnImageClickListener;
+
+ public ChatAdapter(Context context, List<ChatMessageItem> list, View.OnClickListener onAudioClickListener,View.OnClickListener onImageClickListener) {
this.mContext = context;
this.mDatas = list;
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
- mMaxItemWidth = (int)(outMetrics.widthPixels * 0.7f);
- mMinItemWidth = (int)(outMetrics.widthPixels * 0.15f);
+ mMaxItemWidth = (int) (outMetrics.widthPixels * 0.7f);
+ mMinItemWidth = (int) (outMetrics.widthPixels * 0.15f);
mInflater = LayoutInflater.from(mContext);
-
- this.mOnAudioClickListener = onAudioClickListener;
+ mDataBaseManager = DataBaseManager.getInstance(mContext);
+ mOnAudioClickListener = onAudioClickListener;
+ mOnImageClickListener = onImageClickListener;
}
- public void addChat(YgMessage map){
- this.mDatas.add(map);
+
+ public void addChat(ChatMessageItem item) {
+ mDataBaseManager.insertChatMessageItem(item);
+ this.mDatas.add(item);
notifyDataSetChanged();
}
+
@Override
public int getCount() {
return mDatas.size();
@Override
public int getItemViewType(int position) {
- int type = 0;
- YgText ygText = new YgText().createFromJson(mDatas.get(position).getBody());
- if (ygText == null) return 0;
- switch (ygText.getType()){
- case STR_TYYPE_TXT:
- if (mDatas.get(position).getCustom()==1){
- type = INT_TYPE_TXT_R;
- }else {
- type = INT_TYPE_TXT_L;
- }
- break;
- case STR_TYPE_PIC:
- if (mDatas.get(position).getCustom()==1){
- type = INT_TYPE_PIC_R;
- }else {
- type = INT_TYPE_PIC_L;
- }
- break;
- case STR_TYPE_AUDIO:
- if (mDatas.get(position).getCustom()==1){
- type = INT_TYPE_AUDIO_R;
- }else {
- type = INT_TYPE_AUDIO_L;
- }
- break;
- default:
- type = INT_TYPE_TXT_R;
- break;
- }
- return type;
+ return mDatas.get(position).getType();
}
@Override
PicHolderR picHolderR = null;
AudioHolderL audioHolderL = null;
AudioHolderR audioHolderR = null;
- YgText ygText = new YgText().createFromJson(mDatas.get(i).getBody());
- if (ygText == null) return null;
int type = getItemViewType(i);
- if (view == null){
- switch (type){
- case INT_TYPE_TXT_L:
- view = mInflater.inflate(R.layout.chat_txt_item_1,viewGroup,false);
+ ChatMessageItem item = mDatas.get(i);
+ if (view == null) {
+ switch (type) {
+ case Config.INT_TYPE_TXT_L:
+ view = mInflater.inflate(R.layout.chat_txt_item_1, viewGroup, false);
txtHolderL = new TxtHolderL();
txtHolderL.head = (ImageView) view.findViewById(R.id.head);
txtHolderL.text = (TextView) view.findViewById(R.id.text);
view.setTag(txtHolderL);
break;
- case INT_TYPE_TXT_R:
- view = mInflater.inflate(R.layout.chat_txt_item_2,viewGroup,false);
+ case Config.INT_TYPE_TXT_R:
+ view = mInflater.inflate(R.layout.chat_txt_item_2, viewGroup, false);
txtHolderR = new TxtHolderR();
txtHolderR.head = (ImageView) view.findViewById(R.id.head);
txtHolderR.text = (TextView) view.findViewById(R.id.text);
view.setTag(txtHolderR);
break;
- case INT_TYPE_PIC_L:
- view = mInflater.inflate(R.layout.chat_pic_item_1,viewGroup,false);
+ case Config.INT_TYPE_PIC_L:
+ view = mInflater.inflate(R.layout.chat_pic_item_1, viewGroup, false);
picHolderL = new PicHolderL();
picHolderL.head = (ImageView) view.findViewById(R.id.head);
- picHolderL.pic = (ImageView) view.findViewById(R.id.pic);
+ picHolderL.pic = (ChatImageView) view.findViewById(R.id.pic);
view.setTag(picHolderL);
break;
- case INT_TYPE_PIC_R:
- view = mInflater.inflate(R.layout.chat_pic_item_2,viewGroup,false);
+ case Config.INT_TYPE_PIC_R:
+ view = mInflater.inflate(R.layout.chat_pic_item_2, viewGroup, false);
picHolderR = new PicHolderR();
picHolderR.head = (ImageView) view.findViewById(R.id.head);
- picHolderR.pic = (ImageView) view.findViewById(R.id.pic);
+ picHolderR.pic = (ChatImageView) view.findViewById(R.id.pic);
view.setTag(picHolderR);
break;
- case INT_TYPE_AUDIO_L:
- view = mInflater.inflate(R.layout.chat_audio_item_1,viewGroup,false);
+ case Config.INT_TYPE_AUDIO_L:
+ view = mInflater.inflate(R.layout.chat_audio_item_1, viewGroup, false);
audioHolderL = new AudioHolderL();
audioHolderL.head = (ImageView) view.findViewById(R.id.head);
audioHolderL.filePath = (TextView) view.findViewById(R.id.filePath);
audioHolderL.recorder_len = (FrameLayout) view.findViewById(R.id.recoder_len);
view.setTag(audioHolderL);
break;
- case INT_TYPE_AUDIO_R:
- view = mInflater.inflate(R.layout.chat_audio_item_2,viewGroup,false);
+ case Config.INT_TYPE_AUDIO_R:
+ view = mInflater.inflate(R.layout.chat_audio_item_2, viewGroup, false);
audioHolderR = new AudioHolderR();
audioHolderR.head = (ImageView) view.findViewById(R.id.head);
audioHolderR.filePath = (TextView) view.findViewById(R.id.filePath);
view.setTag(audioHolderR);
break;
}
- }else {
- switch (type){
- case INT_TYPE_TXT_L:
+ } else {
+ switch (type) {
+ case Config.INT_TYPE_TXT_L:
txtHolderL = (TxtHolderL) view.getTag();
break;
- case INT_TYPE_TXT_R:
+ case Config.INT_TYPE_TXT_R:
txtHolderR = (TxtHolderR) view.getTag();
break;
- case INT_TYPE_PIC_L:
+ case Config.INT_TYPE_PIC_L:
picHolderL = (PicHolderL) view.getTag();
break;
- case INT_TYPE_PIC_R:
+ case Config.INT_TYPE_PIC_R:
picHolderR = (PicHolderR) view.getTag();
break;
- case INT_TYPE_AUDIO_L:
+ case Config.INT_TYPE_AUDIO_L:
audioHolderL = (AudioHolderL) view.getTag();
break;
- case INT_TYPE_AUDIO_R:
+ case Config.INT_TYPE_AUDIO_R:
audioHolderR = (AudioHolderR) view.getTag();
break;
}
}
- switch (type){
- case INT_TYPE_TXT_L:
- txtHolderL.text.setText(ygText.getBody());
+ switch (type) {
+ case Config.INT_TYPE_TXT_L:
+ txtHolderL.text.setText(item.getText());
break;
- case INT_TYPE_TXT_R:
- txtHolderR.text.setText(ygText.getBody());
+ case Config.INT_TYPE_TXT_R:
+ txtHolderR.text.setText(item.getText());
break;
- case INT_TYPE_PIC_L:
- //picHolderL;
+ case Config.INT_TYPE_PIC_L:
+ picHolderL.pic.setImageFile(item.getText());
+ picHolderL.pic.setTag(R.id.TAG_IMAGE_FILE_PATH,item.getText());
+ picHolderL.pic.setOnClickListener(mOnImageClickListener);
break;
- case INT_TYPE_PIC_R:
- //picHolderR;
+ case Config.INT_TYPE_PIC_R:
+ picHolderR.pic.setImageFile(item.getText());
+ picHolderR.pic.setTag(R.id.TAG_IMAGE_FILE_PATH,item.getText());
+ picHolderR.pic.setOnClickListener(mOnImageClickListener);
break;
- case INT_TYPE_AUDIO_L:
- audioHolderL.time.setText(ygText.getLength()+"\"");
- audioHolderL.filePath.setText(ygText.createFile().getAbsolutePath());
+ case Config.INT_TYPE_AUDIO_L:
+ audioHolderL.time.setText(item.getAudioLength() + "\"");
+ audioHolderL.filePath.setText(item.getText());
audioHolderL.recorder_len.setOnClickListener(mOnAudioClickListener);
break;
- case INT_TYPE_AUDIO_R:
- audioHolderR.time.setText(ygText.getLength()+"\"");
- audioHolderR.filePath.setText(ygText.getBody());
+ case Config.INT_TYPE_AUDIO_R:
+ audioHolderR.time.setText(item.getAudioLength() + "\"");
+ audioHolderR.filePath.setText(item.getText());
audioHolderR.recorder_len.setOnClickListener(mOnAudioClickListener);
break;
}
-// switch (ygText.getType()){
-// case "txt":
-// if ((mDatas.get(i).getCustom())==1){
-// view = mInflater.inflate(R.layout.chat_txt_item_2,viewGroup,false);
-// }else {
-// view = mInflater.inflate(R.layout.chat_txt_item_1,viewGroup,false);
-// }
-// ((TextView) view.findViewById(R.id.text)).setText(ygText.getBody());
-// break;
-// case "pic":
-// if ((mDatas.get(i).getCustom())==1){
-// view = mInflater.inflate(R.layout.chat_pic_item_2,viewGroup,false);
-// ((ImageView)view.findViewById(R.id.pic)).setImageURI(Uri.parse(ygText.getBody()));
-// return view;
-// }else {
-// view = mInflater.inflate(R.layout.chat_pic_item_1,viewGroup,false);
-// }
-// File file = ygText.createFile();
-// if (file!=null){
-// ((ImageView)view.findViewById(R.id.pic)).setImageURI(Uri.fromFile(file));
-// }
-// break;
-// case "audio":
-// if (mDatas.get(i).getCustom()==1){
-// view = mInflater.inflate(R.layout.chat_audio_item_2,null);
-// }else {
-// view = mInflater.inflate(R.layout.chat_audio_item_1,null);
-// }
-// ((TextView)view.findViewById(R.id.recorder_time)).setText(ygText.getLength()+"\"");
-// //ViewGroup.LayoutParams lp = view.findViewById(R.id.recoder_len).getLayoutParams();
-// //lp.width = (int)(mMinItemWidth+(mMaxItemWidth/(60f*ygText.getLength())));
-// if (mDatas.get(i).getCustom()==1){
-// ((TextView)view.findViewById(R.id.filePath)).setText(ygText.getBody());
-// }else {
-// ((TextView)view.findViewById(R.id.filePath)).setText(ygText.createFile().getAbsolutePath());
-// }
-// view.findViewById(R.id.recoder_len).setOnClickListener(mOnAudioClickListener);
-// break;
-// }
return view;
}
- class TxtHolderL{
+
+ class TxtHolderL {
ImageView head;
TextView text;
}
- class TxtHolderR{
+
+ class TxtHolderR {
ImageView head;
TextView text;
}
- class PicHolderL{
+
+ class PicHolderL {
ImageView head;
- ImageView pic;
+ ChatImageView pic;
}
- class PicHolderR{
+
+ class PicHolderR {
ImageView head;
- ImageView pic;
+ ChatImageView pic;
}
- class AudioHolderL{
+
+ class AudioHolderL {
ImageView head;
TextView time;
TextView filePath;
FrameLayout recorder_len;
}
- class AudioHolderR{
+
+ class AudioHolderR {
ImageView head;
TextView time;
TextView filePath;
FrameLayout recorder_len;
}
+ public void finish(){
+ if (mDatas.size()>0){
+ ChatMessageItem item = mDatas.get(mDatas.size()-1);
+ Log.i(TAG,"finish()---"+item.getFromUserName());
+ Log.i(TAG,item.getType()+"");
+ mDataBaseManager.updateMainMessageItem(item);
+ }
+ }
}
public View getView(int i, View view, ViewGroup viewGroup) {
Holder holder = null;
if (view == null){
- view = LayoutInflater.from(mContext).inflate(R.layout.friend_item,viewGroup,false);
+ view = LayoutInflater.from(mContext).inflate(R.layout.roster_item,viewGroup,false);
holder = new Holder();
holder.jid = (TextView) view.findViewById(R.id.user_jid);
holder.name = (TextView) view.findViewById(R.id.name);
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
+import android.widget.ListView;
import android.widget.TextView;
-import android.widget.Toast;
-import java.util.ArrayList;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Set;
-import cc.minsnail.beans.YgMessage;
-import cc.minsnail.beans.YgText;
+import cc.minsnail.beans.ChatMessageItem;
+import cc.minsnail.beans.MainMessageItem;
+import cc.minsnail.config.Config;
+import cc.minsnail.database.DataBaseManager;
+import cc.minsnail.fragment.MessageFragment;
import cc.minsnail.smackclient.R;
/**
public class MessageAdapter extends BaseAdapter {
private static final String TAG = "MessageAdapter";
private Context mContext;
- private List<YgMessage> mDatas;
+ private ListView mMessageView;
+ private List<MainMessageItem> mDatas;
private Map mUsers;
private LayoutInflater mInflater;
- public MessageAdapter(Context context,List datas){
+ private DataBaseManager mDataBaseManager;
+
+ public interface OnMainMessageItemClickListener{
+ void onItemClick(MainMessageItem item,int position);
+ }
+ private OnMainMessageItemClickListener mOnMainMessageItemClickListener;
+ public MessageAdapter(Context context, List<MainMessageItem> datas,ListView view) {
mContext = context;
mDatas = datas;
+ mMessageView = view;
mUsers = new HashMap();
mInflater = LayoutInflater.from(mContext);
+ mDataBaseManager = DataBaseManager.getInstance(mContext);
+
+ initUsersMap();
+
+ mMessageView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+ if (mOnMainMessageItemClickListener!=null){
+ mOnMainMessageItemClickListener.onItemClick(mDatas.get(i),i);
+ }
+ }
+ });
+ }
+ public void setOnMainMessageItemClickListener(OnMainMessageItemClickListener listener){
+ mOnMainMessageItemClickListener = listener;
}
- public void addMessage(YgMessage msg){
- if (mUsers.containsKey(msg.getFrom())){
- ((YgMessage) mUsers.get(msg.getFrom())).setBody(msg.getBody());
- }else {
- mUsers.put(msg.getFrom(),msg);
- mDatas.add(msg);
+ private void initUsersMap() {
+ for (MainMessageItem item : mDatas) {
+ if (!mUsers.containsKey(item.getFromUserName())) {
+ mUsers.put(item.getFromUserName(), item);
+ }
+ }
+ }
+
+ public void addMessage(MainMessageItem item) {
+ Log.i(TAG, "add main message "+item.getToUserName());
+ if (mUsers.containsKey(item.getFromUserName())) {
+ ((MainMessageItem) mUsers.get(item.getFromUserName())).setText(item.getText());
+ } else {
+ mUsers.put(item.getFromUserName(), item);
+
+ mDatas.add(item);
}
notifyDataSetChanged();
}
+
+ public void deleteMainMessageItem(int position){
+ mUsers.remove(mDatas.get(position));
+ mDatas.remove(position);
+ notifyDataSetChanged();
+ }
+
@Override
public int getCount() {
return mDatas.size();
return i;
}
+ private static final int INT_TYPE_TXT_L = 0;
+ private static final int INT_TYPE_TXT_R = 1;
+ private static final int INT_TYPE_PIC_L = 2;
+ private static final int INT_TYPE_PIC_R = 3;
+ private static final int INT_TYPE_AUDIO_L = 4;
+ private static final int INT_TYPE_AUDIO_R = 5;
+
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
- YgMessage msg = mDatas.get(i);
+ MainMessageItem item = mDatas.get(i);
Holder holder;
- if (view == null){
- view = mInflater.inflate(R.layout.message_item,viewGroup,false);
+ if (view == null) {
+ view = mInflater.inflate(R.layout.message_item, viewGroup, false);
holder = new Holder();
holder.jid = (TextView) view.findViewById(R.id.user_jid);
holder.head = (ImageView) view.findViewById(R.id.message_head);
holder.text = (TextView) view.findViewById(R.id.message_text);
holder.time = (TextView) view.findViewById(R.id.receive_time);
view.setTag(holder);
- }else {
+ } else {
holder = (Holder) view.getTag();
}
- YgText ygText = new YgText().createFromJson(msg.getBody());
- switch (ygText.getType()){
- case "txt":
- holder.text.setText(ygText.getBody());
+ switch (item.getType()) {
+ case INT_TYPE_TXT_L:
+ case INT_TYPE_TXT_R:
+ holder.text.setText(item.getText());
break;
- case "pic":
- holder.text.setText("图片");
+ case INT_TYPE_PIC_L:
+ case INT_TYPE_PIC_R:
+ holder.text.setText("[图片]");
break;
- case "audio":
- holder.text.setText("语音");
+ case INT_TYPE_AUDIO_L:
+ case INT_TYPE_AUDIO_R:
+ holder.text.setText("[语音]");
break;
}
- holder.jid.setText(msg.getFrom());
- holder.name.setText(msg.getFrom().split("@")[0]);
- holder.time.setText("13:46");
+ holder.jid.setText(item.getFromJid());
+ holder.name.setText(item.getFromUserName());
+ holder.time.setText(item.getTimeString());
return view;
}
- class Holder{
+
+ class Holder {
ImageView head;
TextView name;
TextView text;
TextView time;
TextView jid;
}
+
+ public void finish() {
+ mDataBaseManager.saveMainMessageItem(mDatas);
+ }
}
*/
public class RosterAdapter<T> extends TreeAdapter<T> {
private static final String TAG = "RosterAdapter";
+
public RosterAdapter(Context context, ListView tree, List<YgUserNode> datas, int defaultExpandLevel) throws IllegalAccessException {
super(context, tree, datas, defaultExpandLevel);
}
@Override
public int getItemViewType(int position) {
- for (YgTreeNode node:mVisibleNodes){
- if (node!=null){
- Log.i(TAG,node.getName());
- Log.i(TAG,node.getId()+"");
- Log.i(TAG,"------");
+ for (YgTreeNode node : mVisibleNodes) {
+ if (node != null) {
+ Log.i(TAG, node.getName());
+ Log.i(TAG, node.getId() + "");
+ Log.i(TAG, "------");
}
}
- if (mVisibleNodes.get(position).isRoot()){
+ if (mVisibleNodes.get(position).isRoot()) {
return 0;
}
return 1;
RosterHolder rosterHolder = null;
GroupHolder groupHolder = null;
int type = getItemViewType(position);
- if (view == null){
- switch (type){
+ if (view == null) {
+ switch (type) {
case 0:
- view = mInflater.inflate(R.layout.group_item,parent,false);
+ view = mInflater.inflate(R.layout.group_item, parent, false);
groupHolder = new GroupHolder();
groupHolder.groupName = (TextView) view.findViewById(R.id.group_name);
groupHolder.groupIcon = (ImageView) view.findViewById(R.id.group_icon);
+ groupHolder.groupSize = (TextView) view.findViewById(R.id.group_size);
view.setTag(groupHolder);
break;
case 1:
- view = mInflater.inflate(R.layout.friend_item,parent,false);
+ view = mInflater.inflate(R.layout.roster_item, parent, false);
rosterHolder = new RosterHolder();
rosterHolder.rosterName = (TextView) view.findViewById(R.id.name);
+ rosterHolder.rosterJid = (TextView) view.findViewById(R.id.roster_jid);
view.setTag(rosterHolder);
break;
}
- }else {
- switch (type){
+ } else {
+ switch (type) {
case 0:
groupHolder = (GroupHolder) view.getTag();
break;
break;
}
}
- switch (type){
+ switch (type) {
case 0:
groupHolder.groupName.setText(node.getName());
- if (node.isExpand()){
+ groupHolder.groupSize.setText(node.getChildren().size() + "");
+ if (node.isExpand()) {
groupHolder.groupIcon.setImageResource(R.mipmap.triangle_down);
- }else {
+ } else {
groupHolder.groupIcon.setImageResource(R.mipmap.triangle_right);
}
break;
case 1:
rosterHolder.rosterName.setText(node.getName());
+ rosterHolder.rosterJid.setText(node.getJid());
break;
}
return view;
}
- class RosterHolder{
+
+ class RosterHolder {
TextView rosterName;
+ TextView rosterJid;
}
- class GroupHolder{
+
+ class GroupHolder {
ImageView groupIcon;
TextView groupName;
+ TextView groupSize;
}
}
protected List<YgTreeNode> mVisibleNodes;
protected LayoutInflater mInflater;
protected ListView mTree;
- public interface OnTreeNodeClickListener{
- void onClick(YgTreeNode node,int position);
+
+ public interface OnTreeNodeClickListener {
+ void onClick(YgTreeNode node, int position);
}
+
private OnTreeNodeClickListener mNodeClickListener;
- public void setOnTreeNodeClickListener(OnTreeNodeClickListener listener){
+
+ public void setOnTreeNodeClickListener(OnTreeNodeClickListener listener) {
mNodeClickListener = listener;
}
+
public TreeAdapter(Context context, ListView tree, List<YgUserNode> datas, int defaultExpandLevel) throws IllegalAccessException {
mContext = context;
mInflater = LayoutInflater.from(mContext);
mTree = tree;
- mAllNodes = TreeHelper.getSortedNodes(datas,defaultExpandLevel);
+ mAllNodes = TreeHelper.getSortedNodes(datas, defaultExpandLevel);
mVisibleNodes = TreeHelper.filterVisibleNodes(mAllNodes);
mTree.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
expandOrCollapse(position);
- if (mNodeClickListener!=null){
- mNodeClickListener.onClick(mVisibleNodes.get(position),position);
+ if (mVisibleNodes.get(position).isLeaf() && mNodeClickListener != null) {
+ mNodeClickListener.onClick(mVisibleNodes.get(position), position);
}
}
});
private void expandOrCollapse(int position) {
YgTreeNode node = mVisibleNodes.get(position);
- if (node!=null){
+ if (node != null) {
if (node.isLeaf()) return;
node.setExpand(!node.isExpand());
mVisibleNodes = TreeHelper.filterVisibleNodes(mAllNodes);
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
YgTreeNode node = mVisibleNodes.get(i);
- view = getConvertView(node,i,view,viewGroup);
+ view = getConvertView(node, i, view, viewGroup);
// TODO: 2016/10/28
//view.setPadding(node.getLevel()*30,3,3,3);
return view;
}
- public abstract View getConvertView(YgTreeNode node,int position,View view,ViewGroup parent);
+
+ public abstract View getConvertView(YgTreeNode node, int position, View view, ViewGroup parent);
}
+++ /dev/null
-package cc.minsnail.beans;
-
-/**
- * Created by yg on 2016/10/21.
- */
-public class Configs {
- public static final String OPENFIRE_HOST = "192.168.2.22";
- public static final String OPENFIRE_SERVER_NAME = "yg";
- public static final String APP_PATH = "smackclient";
- public static final String PIC_PATH = "pic";
- public static final String AUDIO_PATH = "audio";
- public static final int BITMAP_SIZE = 100;//k
-}
import java.io.File;
+import cc.minsnail.config.Config;
import cc.minsnail.tools.Utils;
/**
if (type.equals("txt")) return null;
JSONObject object = new JSONObject(body);
File divce = Environment.getExternalStorageDirectory();
- File appPath = new File(divce,Configs.APP_PATH);
+ File appPath = new File(divce, Config.APP_PATH);
switch (type){
case "pic":
- File picPath = new File(appPath,Configs.PIC_PATH);
+ File picPath = new File(appPath, Config.PIC_PATH);
if (!picPath.exists()) picPath.mkdirs();
File file = new File(picPath,object.getString("fileName"));
if (Utils.string2file(object.getString("data"),file))return file;
break;
case "audio":
- File audioPath = new File(appPath,Configs.AUDIO_PATH);
+ File audioPath = new File(appPath, Config.AUDIO_PATH);
if (!audioPath.exists()) audioPath.mkdirs();
File audioFile = new File(audioPath,object.getString("fileName"));
if (Utils.string2file(object.getString("data"),audioFile)) return audioFile;
this.name = name;
}
public boolean isRoot(){
+ if(pid == -1) return false;
return parent == null;
}
public boolean isParentExpand(){
}
public String getUserName() {
+ if (userName==null)return jid.split("@")[0];
return userName;
}
}
public String getName(){
+ if (name==null)return jid.split("@")[0];
return name;
}
--- /dev/null
+package cc.minsnail.config;
+
+/**
+ * Created by yg on 2016/10/21.
+ */
+public class Config {
+ public static final String OPENFIRE_HOST = "192.168.2.18";
+ public static final int OPENFIRE_PORT = 5222;
+ public static final String OPENFIRE_SERVER_NAME = "yg";
+ public static final String MSG_RECEIVER_ACTION = "MsgRecerver";
+
+ public static final String APP_PATH = "smackclient";
+ public static final String PIC_PATH = "pic";
+ public static final String AUDIO_PATH = "audio";
+ public static final int BITMAP_SIZE = 100;//k
+ //SQLite
+ public static final String DATABASE_NAME = "SmackClient.db";
+ public static final int DATABASE_VERSION = 4;
+
+ public static final String TIME_FORMAT = "HH:mm";
+
+ public static final String KEY_MESSAGE = "msg";
+ public static final String KEY_TO_USERNAME = "toUserName";
+ public static final String KEY_TO_JID = "toJid";
+ public static final String KEY_TO_NAME = "toName";
+ public static final String KEY_FROM_USERNAME = "fromUserName";
+ public static final String KEY_FROM_JID = "fromJid";
+ public static final String KEY_FROM_NAME = "fromName";
+
+ public static final String OSS_ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
+ public static final String OSS_ACCESS_KEY_ID = "lHtglO8uAweVCN4G";
+ public static final String OSS_ACCESS_KEY_SECRET = "SwMXimlmpSwwbeURcCn0XwlFtEjK53";
+
+ public static final String OSS_BUCKET_NAME = "smackclient";
+
+
+
+ public static final int INT_TYPE_TXT_L = 0;
+ public static final int INT_TYPE_TXT_R = 1;
+ public static final int INT_TYPE_PIC_L = 2;
+ public static final int INT_TYPE_PIC_R = 3;
+ public static final int INT_TYPE_AUDIO_L = 4;
+ public static final int INT_TYPE_AUDIO_R = 5;
+}
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
-import android.os.RemoteException;
+import android.os.Environment;
import android.support.annotation.Nullable;
import android.util.Log;
+import android.view.ContextMenu;
import android.view.LayoutInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
+import com.alibaba.sdk.android.oss.ClientException;
+import com.alibaba.sdk.android.oss.ServiceException;
+import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
+import com.alibaba.sdk.android.oss.model.GetObjectRequest;
+import com.alibaba.sdk.android.oss.model.GetObjectResult;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.util.ArrayList;
-import java.util.List;
import cc.minsnail.activity.ChatActivity;
-import cc.minsnail.adapter.FriendsAdapter;
import cc.minsnail.adapter.MessageAdapter;
import cc.minsnail.aidl.IServiceAidlInterface;
+import cc.minsnail.beans.ChatMessageItem;
+import cc.minsnail.beans.MainMessageItem;
import cc.minsnail.beans.YgMessage;
+import cc.minsnail.config.Config;
+import cc.minsnail.database.DataBaseManager;
+import cc.minsnail.manager.OssManager;
import cc.minsnail.smackclient.R;
+import cc.minsnail.tools.SharedHelper;
/**
* Created by yg on 2016/10/27.
private static final String TAG = "MessageFragment";
private Context mContext;
private View mView;
- private ListView mMessage;
+ private ListView mMessageView;
private IServiceAidlInterface mSmackService;
private MessageAdapter mMessageAdapter;
+ private DataBaseManager mDataBaseManager;
private MsgRecervier mMsgRecervier;
- public MessageFragment(IServiceAidlInterface service){
- mSmackService = service;
+ private SharedHelper mSharedHelper;
+
+ private String mToUserName;
+ private String mToJid;
+ private OssManager mOssManager;
+
+ public MessageFragment() {
}
+// public MessageFragment(IServiceAidlInterface service) {
+// mSmackService = service;
+// }
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
- mMessageAdapter = new MessageAdapter(mContext,new ArrayList());
+ mDataBaseManager = DataBaseManager.getInstance(mContext);
+ mSharedHelper = new SharedHelper(mContext);
+ mOssManager = OssManager.getInstance(mContext);
+ Log.i(TAG, "onAttach");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- mView = inflater.inflate(R.layout.fragment_message,container,false);
+ mView = inflater.inflate(R.layout.fragment_message, container, false);
+ Log.i(TAG, "onCreateView");
return mView;
}
super.onActivityCreated(savedInstanceState);
initView();
initEvent();
+ Log.i(TAG, "onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
+ mToUserName = mSharedHelper.get(Config.KEY_TO_USERNAME, "admin");
+ //mToJid = mSharedHelper.get(Config.KEY_TO_JID,"");
showMessage();
mMsgRecervier = new MsgRecervier();
IntentFilter intentFilter = new IntentFilter("MsgRecerver");
intentFilter.setPriority(500);
- mContext.registerReceiver(mMsgRecervier,intentFilter);
+ mContext.registerReceiver(mMsgRecervier, intentFilter);
+ Log.i(TAG, "onStart()");
+ }
+
+ private void initEvent() {
+// mMessage.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+// @Override
+// public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+// String name = ((TextView) view.findViewById(R.id.user_name)).getText().toString();
+// String jid = ((TextView) view.findViewById(R.id.user_jid)).getText().toString();
+// Intent intent = new Intent(mContext, ChatActivity.class);
+// intent.putExtra("fromJid", jid);
+// intent.putExtra("fromUserName", name);
+// mContext.startActivity(intent);
+// }
+// });
}
- private void initEvent(){
- mMessage.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+
+ public void showMessage() {
+ // TODO: 2016/10/28
+
+ mMessageAdapter = new MessageAdapter(mContext, mDataBaseManager.querMainMessageItems(mToUserName), mMessageView);
+ mMessageView.setAdapter(mMessageAdapter);
+ mMessageAdapter.setOnMainMessageItemClickListener(new MessageAdapter.OnMainMessageItemClickListener() {
@Override
- public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
- String name = ((TextView)view.findViewById(R.id.user_name)).getText().toString();
- String jid = ((TextView)view.findViewById(R.id.user_jid)).getText().toString();
- Intent intent = new Intent(mContext,ChatActivity.class);
- intent.putExtra("jid",jid);
- intent.putExtra("name",name);
+ public void onItemClick(MainMessageItem item, int position) {
+ Intent intent = new Intent(mContext, ChatActivity.class);
+ intent.putExtra(Config.KEY_FROM_JID, item.getFromJid());
+ intent.putExtra(Config.KEY_FROM_NAME, item.getFromUserName());
mContext.startActivity(intent);
}
});
+ registerForContextMenu(mMessageView);
}
- public void showMessage(){
- // TODO: 2016/10/28
- mMessage.setAdapter(mMessageAdapter);
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ getActivity().getMenuInflater().inflate(R.menu.main_context_menu, menu);
}
- private void initView(){
- mMessage = (ListView) mView.findViewById(R.id.message);
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
+ switch (item.getItemId()) {
+ case R.id.context_manu_item_delete:
+ mMessageAdapter.deleteMainMessageItem(menuInfo.position);
+ return true;
+ default:
+ return super.onContextItemSelected(item);
+ }
+ }
+
+ private void initView() {
+ mMessageView = (ListView) mView.findViewById(R.id.message);
}
private class MsgRecervier extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
YgMessage ygMessage = intent.getParcelableExtra("msg");
- Log.i(TAG,"received message");
- mMessageAdapter.addMessage(ygMessage);
- //mMessage.setSelection(mMessageAdapter.getCount()-1);
+ Log.i(TAG, "received message");
+ MainMessageItem item = new MainMessageItem(ygMessage);
+ if (item.getType() == Config.INT_TYPE_PIC_L) {
+ ossLoadImage(item);
+ } else {
+ mDataBaseManager.insertChatMessageItem(item);
+ mMessageAdapter.addMessage(item);
+ }
abortBroadcast();
}
}
+ private void ossLoadImage(final MainMessageItem item) {
+ final String fileName = item.getText();
+ GetObjectRequest get = new GetObjectRequest(Config.OSS_BUCKET_NAME, fileName);
+ mOssManager.oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
+ @Override
+ public void onSuccess(GetObjectRequest getObjectRequest, GetObjectResult getObjectResult) {
+ InputStream inputStream = getObjectResult.getObjectContent();
+ File picPath = new File(new File(Environment.getExternalStorageDirectory(), Config.APP_PATH), Config.PIC_PATH);
+ if (!picPath.exists()) picPath.mkdirs();
+ String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
+ File file = new File(picPath, System.currentTimeMillis() + ext);
+ try {
+ OutputStream outputStream = new FileOutputStream(file);
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, len);
+ }
+ inputStream.close();
+ outputStream.flush();
+ outputStream.close();
+
+ item.setText(file.getAbsolutePath());
+ mDataBaseManager.insertChatMessageItem(item);
+ mMessageAdapter.addMessage(item);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onFailure(GetObjectRequest getObjectRequest, ClientException e, ServiceException e1) {
+ // 请求异常
+ if (e != null) {
+ // 本地异常如网络异常等
+ e.printStackTrace();
+ }
+ if (e1 != null) {
+ // 服务异常
+ Log.e("ErrorCode", e1.getErrorCode());
+ Log.e("RequestId", e1.getRequestId());
+ Log.e("HostId", e1.getHostId());
+ Log.e("RawMessage", e1.getRawMessage());
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onPause() {
+ Log.i(TAG, "onPause");
+ mMessageAdapter.finish();
+ super.onPause();
+ }
+
+ @Override
+ public void onResume() {
+ Log.i(TAG, "onResume");
+ super.onResume();
+ }
+
+ @Override
+ public void onStop() {
+ Log.i(TAG, "onStop");
+ super.onStop();
+ }
+
@Override
public void onDestroy() {
- super.onDestroy();
+ Log.i(TAG, "onDestroy");
mContext.unregisterReceiver(mMsgRecervier);
+ super.onDestroy();
}
}
import java.util.List;
import cc.minsnail.activity.ChatActivity;
+import cc.minsnail.activity.UserSummaryActivity;
import cc.minsnail.adapter.FriendsAdapter;
import cc.minsnail.adapter.RosterAdapter;
+import cc.minsnail.adapter.TreeAdapter;
import cc.minsnail.aidl.IServiceAidlInterface;
+import cc.minsnail.beans.YgTreeNode;
import cc.minsnail.beans.YgUser;
import cc.minsnail.beans.YgUserNode;
+import cc.minsnail.config.Config;
import cc.minsnail.smackclient.R;
/**
private IServiceAidlInterface mSmackService;
private View mView;
private ListView mRoster;
- private Handler handler = new Handler(){
+ private RosterAdapter mRosterAdapter;
+ private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
- switch (msg.what){
+ switch (msg.what) {
case GET_ROSTER:
- List<YgUserNode> nodes = new ArrayList<>();
- for (int i=0;i<mRosterList.size();i++){
- YgUser user = (YgUser) mRosterList.get(i);
- YgUserNode node = new YgUserNode();
- node.setId(user.getId());
- node.setPid(user.getPid());
- node.setJid(user.getJid());
- node.setUserName(user.getUsername());
- node.setName(user.getName());
- nodes.add(node);
- }
- try {
- mRoster.setAdapter(new RosterAdapter<YgUserNode>(mContext,mRoster,nodes,1));
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
+ getRoster();
break;
}
}
};
- public RosterFragment(IServiceAidlInterface smackservice){
- mSmackService = smackservice;
+
+ private List mRosterList;
+
+ private void getRoster() {
+ List<YgUserNode> nodes = new ArrayList<>();
+ for (int i = 0; i < mRosterList.size(); i++) {
+ YgUser user = (YgUser) mRosterList.get(i);
+ YgUserNode node = new YgUserNode();
+ node.setId(user.getId());
+ node.setPid(user.getPid());
+ node.setJid(user.getJid());
+ node.setUserName(user.getUsername());
+ node.setName(user.getName());
+ nodes.add(node);
+ }
+ try {
+ mRosterAdapter = new RosterAdapter<YgUserNode>(mContext, mRoster, nodes, 0);
+ mRosterAdapter.setOnTreeNodeClickListener(new TreeAdapter.OnTreeNodeClickListener() {
+ @Override
+ public void onClick(YgTreeNode node, int position) {
+ Intent intent = new Intent(mContext, UserSummaryActivity.class);
+ intent.putExtra(Config.KEY_FROM_JID, node.getJid());
+ intent.putExtra(Config.KEY_FROM_NAME,node.getName());
+ startActivity(intent);
+ }
+ });
+ mRoster.setAdapter(mRosterAdapter);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public RosterFragment() {
}
+
+ public RosterFragment(IServiceAidlInterface smackService) {
+ mSmackService = smackService;
+ }
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
+
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- mView = inflater.inflate(R.layout.fragment_roster,container,false);
+ mView = inflater.inflate(R.layout.fragment_roster, container, false);
return mView;
}
initView();
initEvent();
}
+
@Override
public void onStart() {
super.onStart();
showRoster();
}
- private List mRosterList;
- private void showRoster(){
+
+ private void showRoster() {
new Thread(new Runnable() {
@Override
public void run() {
- if (mSmackService!=null){
+ if (mSmackService != null) {
try {
mRosterList = mSmackService.getRoster();
handler.sendEmptyMessage(GET_ROSTER);
}
}).start();
}
- private void initView(){
+
+ private void initView() {
mRoster = (ListView) mView.findViewById(R.id.main_list_roster);
}
- private void initEvent(){
- mRoster.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
- String name = ((TextView)view.findViewById(R.id.name)).getText().toString();
- String tojid = ((TextView)view.findViewById(R.id.user_jid)).getText().toString();
- String myname = getActivity().getTitle().toString();
- Intent intent = new Intent(mContext,ChatActivity.class);
- intent.putExtra("myname",myname);
- intent.putExtra("jid",tojid);
- intent.putExtra("name",name);
- startActivity(intent);
- }
- });
+
+ private void initEvent() {
+
}
}
import com.alibaba.sdk.android.oss.OSSClient;
import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;
+import com.alibaba.sdk.android.oss.model.GetBucketACLRequest;
+import com.alibaba.sdk.android.oss.model.GetObjectRequest;
+
+import cc.minsnail.config.Config;
/**
* Created by yg on 2016/10/28.
*/
public class OssManager {
- private static final String endpoint="http://smackclient.oss-cn-shanghai.aliyuncs.com";
- private static final String accessKeyId = "";
- private static final String accessKeySecret = "";
- private OSSCredentialProvider credentialProvider;
- private ClientConfiguration config;
- private OSS oss;
- private Context context;
- public OssManager(Context context){
- this.context = context;
- credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId,accessKeySecret);
- config = new ClientConfiguration();
+ private static OssManager mOssManager;
+ private OSSCredentialProvider mCredentialProvider;
+ private ClientConfiguration mConfig;
+ public OSS oss;
+ private Context mContext;
+
+ private OssManager(Context context) {
+ mContext = context;
+ mCredentialProvider = new OSSPlainTextAKSKCredentialProvider(Config.OSS_ACCESS_KEY_ID, Config.OSS_ACCESS_KEY_SECRET);
+ mConfig = new ClientConfiguration();
//config.setConnectionTimeout(15*1000);
- oss = new OSSClient(context,endpoint,credentialProvider,config);
+ oss = new OSSClient(context, "http://"+Config.OSS_ENDPOINT, mCredentialProvider, mConfig);
+ }
+
+ public static OssManager getInstance(Context context) {
+ if (mOssManager == null) {
+ synchronized (OssManager.class) {
+ if (mOssManager == null) mOssManager = new OssManager(context);
+ }
+ }
+ return mOssManager;
}
+
+ public String imageObjectKey(String objectKey){
+ String bb = "http://"+Config.OSS_BUCKET_NAME+"."+Config.OSS_ENDPOINT;
+ return null;
+ }
+
}
import cc.minsnail.activity.ChatActivity;
import cc.minsnail.beans.YgMessage;
+import cc.minsnail.config.Config;
import cc.minsnail.smackclient.R;
/**
*/
public class MsgReceiver extends BroadcastReceiver {
private static final String TAG = "MsgRecerver";
+
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(TAG)){
- Log.i(TAG,"received message");
+ if (intent.getAction().equals(TAG)) {
+ Log.i(TAG, "received message");
YgMessage ygMessage = intent.getParcelableExtra("msg");
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(context);
- Intent i = new Intent(context,ChatActivity.class);
- if (ygMessage.getTo()==null){
- i.putExtra("myname","admin");
- }else {
- i.putExtra("myname",ygMessage.getTo().split("@")[0]);
- }
- i.putExtra("jid",ygMessage.getFrom());
- i.putExtra("name",ygMessage.getFrom().split("@")[0]);
- i.putExtra("msg",ygMessage);
- PendingIntent pi = PendingIntent.getActivity(context,0,i,0);
+ Intent i = new Intent(context, ChatActivity.class);
+ i.putExtra(Config.KEY_FROM_JID, ygMessage.getFrom());
+ i.putExtra(Config.KEY_FROM_NAME, ygMessage.getFrom().split("@")[0]);
+ i.putExtra("msg", ygMessage);
+ PendingIntent pi = PendingIntent.getActivity(context, 0, i, 0);
builder.setContentTitle(ygMessage.getFrom().split("@")[0])
.setContentText("新消息")
.setTicker(ygMessage.getFrom())
.setWhen(System.currentTimeMillis())
.setAutoCancel(true);
builder.setContentIntent(pi);
- notificationManager.notify((int) (Math.random()*100),builder.build());
+ notificationManager.notify((int) (Math.random() * 100), builder.build());
abortBroadcast();
}
}
import java.util.List;
import java.util.Map;
-import cc.minsnail.beans.Configs;
+import cc.minsnail.config.Config;
import cc.minsnail.beans.YgInfo;
import cc.minsnail.beans.YgMessage;
import cc.minsnail.beans.YgUser;
import cc.minsnail.beans.YgUserIQ;
import cc.minsnail.beans.YgVCard;
import cc.minsnail.aidl.IServiceAidlInterface.Stub;
-import cc.minsnail.tools.Utils;
/**
//服务是否第一次启动
private static boolean isFirstStart = true;
//文件保存根目录
- private static final String RootDir = Configs.APP_PATH;
+ private static final String RootDir = Config.APP_PATH;
//主机地址
- private static final String SERVERHOST = Configs.OPENFIRE_HOST;
+ private static final String SERVERHOST = Config.OPENFIRE_HOST;
//端口号
- private static final int PORT = 5222;
+ private static final int PORT = Config.OPENFIRE_PORT;
//服务名称
- private static final String SERVERNAME = Configs.OPENFIRE_SERVER_NAME;
+ private static final String SERVERNAME = Config.OPENFIRE_SERVER_NAME;
//搜索用户组服务地址
- private static final String GROUP_CHAT_SERVICE = "conference."+SERVERNAME;
- private static final String SEARCH_USER_SERVICE = "search."+SERVERNAME;
+ private static final String GROUP_CHAT_SERVICE = "conference." + SERVERNAME;
+ private static final String SEARCH_USER_SERVICE = "search." + SERVERNAME;
//是否登录
private static boolean isLogin = false;
//登录用户名
private static String loginName;
//接收消息广播接收器行为标志
- private static final String MSG_RECEIVER_ACTION = "MsgRecerver";
+ private static final String MSG_RECEIVER_ACTION = Config.MSG_RECEIVER_ACTION;
//连接配置对象
private static ConnectionConfiguration config;
//连接服务器对象
//搜索用户管理对象
private static UserSearchManager userSearchManager;
//消息监听器
- private static MessageListener messageListener= null;
+ private static MessageListener messageListener = null;
//花名册管理对象
private static Roster roster;
//花名册监听器
//消息包监听器
private static PacketListener msgPacketlistener;
//聊天资源集
- private Map<String,Chat> Chats = new HashMap<>();
+ private Map<String, Chat> Chats = new HashMap<>();
+
@Nullable
@Override
public IBinder onBind(Intent intent) {
@Override
public void onCreate() {
super.onCreate();
- Log.i(TAG,"onCreate");
+ Log.i(TAG, "onCreate");
packetListener = new PacketListener() {
@Override
public void processPacket(Packet packet) {
- Log.d(TAG,"packet");
- Log.i(TAG,packet.toXML());
+ Log.d(TAG, "packet");
+ Log.i(TAG, packet.toXML());
}
};
msgPacketlistener = new PacketListener() {
@Override
public void processPacket(Packet packet) {
- Log.d(TAG,"recerved message");
+ Log.d(TAG, "recerved message");
Intent toMsgRecerver = new Intent(MSG_RECEIVER_ACTION);
- toMsgRecerver.putExtra("msg",new YgMessage().getFromMessage((Message)packet));
- sendOrderedBroadcast(toMsgRecerver,null);
+ toMsgRecerver.putExtra("msg", new YgMessage().getFromMessage((Message) packet));
+ sendOrderedBroadcast(toMsgRecerver, null);
}
};
//监听收到Message消息
chatManagerListener = new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean b) {
- if (b){
+ if (b) {
chat.addMessageListener(getMessageListener());
- Log.i(TAG,"chat created");
+ Log.i(TAG, "chat created");
}
}
};
fileTransferListener = new FileTransferListener() {
@Override
public void fileTransferRequest(final FileTransferRequest fileTransferRequest) {
- Log.i(TAG,"received file");
+ Log.i(TAG, "received file");
String mimeType = fileTransferRequest.getMimeType();
String description = fileTransferRequest.getDescription();
String subDir = null;
- switch (mimeType){
+ switch (mimeType) {
case "image/jpeg":
subDir = "pic";
break;
default:
break;
}
- File dir = new File(new File(Environment.getExternalStorageDirectory(),RootDir),subDir);
+ File dir = new File(new File(Environment.getExternalStorageDirectory(), RootDir), subDir);
if (!dir.exists()) dir.mkdirs();
- final File file = new File(dir,fileTransferRequest.getFileName());
+ final File file = new File(dir, fileTransferRequest.getFileName());
new Thread(new Runnable() {
@Override
public void run() {
IncomingFileTransfer incomingFileTransfer = fileTransferRequest.accept();
try {
incomingFileTransfer.recieveFile(file);
- while(!incomingFileTransfer.isDone()) {
- if(incomingFileTransfer.getStatus().equals(FileTransfer.Status.error)) {
- Log.e(TAG,"ERROR!!! " + incomingFileTransfer.getError());
+ while (!incomingFileTransfer.isDone()) {
+ if (incomingFileTransfer.getStatus().equals(FileTransfer.Status.error)) {
+ Log.e(TAG, "ERROR!!! " + incomingFileTransfer.getError());
file.delete();
} else {
- Log.i(TAG,incomingFileTransfer.getStatus().toString());
- Log.i(TAG,incomingFileTransfer.getProgress()+"");
+ Log.i(TAG, incomingFileTransfer.getStatus().toString());
+ Log.i(TAG, incomingFileTransfer.getProgress() + "");
}
Thread.sleep(1000);
}
- if (file != null){
- Log.i(TAG,"file:"+file.getAbsolutePath());
+ if (file != null) {
+ Log.i(TAG, "file:" + file.getAbsolutePath());
}
} catch (XMPPException e) {
e.printStackTrace();
invitationListener = new InvitationListener() {
@Override
public void invitationReceived(Connection connection, String room, String inviter, String reason, String password, Message message) {
- Log.i(TAG,"收到邀请");
- Log.i(TAG,connection.getUser());
- MultiUserChat muc = new MultiUserChat(connection,room);
+ Log.i(TAG, "收到邀请");
+ Log.i(TAG, connection.getUser());
+ MultiUserChat muc = new MultiUserChat(connection, room);
try {
- muc.join(room,password);
+ muc.join(room, password);
} catch (XMPPException e) {
e.printStackTrace();
}
invitationRejectionListener = new InvitationRejectionListener() {
@Override
public void invitationDeclined(String invitee, String reason) {
- Log.i(TAG,"邀请"+invitee+"被拒绝,原因是:"+reason);
+ Log.i(TAG, "邀请" + invitee + "被拒绝,原因是:" + reason);
}
};
subPacketListener = new PacketListener() {
@Override
public void processPacket(Packet packet) {
- Log.i(TAG,"received sub");
- Log.i(TAG,packet.toXML());
+ Log.i(TAG, "received sub");
+ Log.i(TAG, packet.toXML());
}
};
rosterListener = new RosterListener() {
@Override
public void entriesAdded(Collection<String> collection) {
- Log.i(TAG,"add enrtry");
+ Log.i(TAG, "add enrtry");
}
@Override
public void entriesUpdated(Collection<String> collection) {
- Log.i(TAG,"update enrtry");
+ Log.i(TAG, "update enrtry");
}
@Override
public void entriesDeleted(Collection<String> collection) {
- Log.i(TAG,"delete enrtry");
+ Log.i(TAG, "delete enrtry");
}
@Override
public void presenceChanged(Presence presence) {
- Log.i(TAG,"presence change");
+ Log.i(TAG, "presence change");
}
};
}
+
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- Log.i(TAG,"onStart");
+ Log.i(TAG, "onStart");
if (isFirstStart)
new Thread(new Runnable() {
@Override
public void run() {
- init();
+ init();
}
}).start();
isFirstStart = false;
/**
* 初始化连接
*/
- private void init(){
- config = new ConnectionConfiguration(SERVERHOST,PORT);
+ private void init() {
+ config = new ConnectionConfiguration(SERVERHOST, PORT);
config.setSASLAuthenticationEnabled(false);
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setCompressionEnabled(true);
try {
connection.connect();
configure(ProviderManager.getInstance());
- connection.addPacketListener(packetListener,new AndFilter());
- connection.addPacketListener(msgPacketlistener,new PacketTypeFilter(Message.class));
- connection.addPacketListener(subPacketListener,new PacketTypeFilter(Presence.class));
+ connection.addPacketListener(packetListener, new AndFilter());
+ connection.addPacketListener(msgPacketlistener, new PacketTypeFilter(Message.class));
+ connection.addPacketListener(subPacketListener, new PacketTypeFilter(Presence.class));
accountManager = connection.getAccountManager();
chatManager = connection.getChatManager();
chatManager.addChatListener(chatManagerListener);
messageEventManager = new MessageEventManager(connection);
fileTransferManager = new FileTransferManager(connection);
fileTransferManager.addFileTransferListener(fileTransferListener);
- MultiUserChat.addInvitationListener(connection,invitationListener);
- Log.i(TAG,connection.getServiceName());
+ MultiUserChat.addInvitationListener(connection, invitationListener);
+ Log.i(TAG, connection.getServiceName());
} catch (XMPPException e) {
e.printStackTrace();
XMPPError error = e.getXMPPError();
- switch (error.getCode()){
- case 502:
- Log.e(TAG,"无法连接远程服务器");
- break;
- case 504:
- Log.e(TAG,error.getMessage());
- break;
+ if(error!=null){
+ switch (error.getCode()) {
+ case 502:
+ Log.e(TAG, "无法连接远程服务器");
+ break;
+ case 504:
+ Log.e(TAG, error.getMessage());
+ break;
+ }
}
- Log.e(TAG,"Unable to connect to server");
+ Log.e(TAG, "Unable to connect to server");
}
}
- private XMPPConnection getConnection(){
- if (connection==null){
+
+ private XMPPConnection getConnection() {
+ if (connection == null) {
init();
return connection;
}
}
return connection;
}
+
/**
* 用户注册
+ *
* @param username
* @param password
* @return
*/
- private YgInfo _register(String username, String password){
+ private YgInfo _register(String username, String password) {
YgInfo info = new YgInfo();
try {
- if (accountManager.supportsAccountCreation()){
- accountManager.createAccount(username,password);
+ if (accountManager.supportsAccountCreation()) {
+ accountManager.createAccount(username, password);
info.setCode(200);
info.setBody(accountManager.getAccountInstructions());
- }else {
+ } else {
info.setCode(400);
info.setBody("The server could not create a new account");
}
}
return info;
}
- private YgInfo _register(String username,String password,Map<String,String> attributes){
+
+ private YgInfo _register(String username, String password, Map<String, String> attributes) {
YgInfo ygInfo = new YgInfo();
try {
- if (accountManager.supportsAccountCreation()){
- accountManager.createAccount(username,password,attributes);
+ if (accountManager.supportsAccountCreation()) {
+ accountManager.createAccount(username, password, attributes);
ygInfo.setCode(200);
- ygInfo.setBody(accountManager.getAccountInstructions()==null?"register success":accountManager.getAccountInstructions());
- }else {
+ ygInfo.setBody(accountManager.getAccountInstructions() == null ? "register success" : accountManager.getAccountInstructions());
+ } else {
ygInfo.setCode(400);
ygInfo.setBody("The server could not create a new account");
}
e.printStackTrace();
XMPPError error = e.getXMPPError();
ygInfo.getFromXMPPError(error);
- switch (error.getCode()){
+ switch (error.getCode()) {
case 409:
ygInfo.setBody("User already exists");
break;
}
return ygInfo;
}
- private YgInfo _register(YgUserIQ ygUserIQ){
+
+ private YgInfo _register(YgUserIQ ygUserIQ) {
YgInfo ygInfo = new YgInfo();
ygUserIQ.setTo(SERVERNAME);
- try{
+ try {
getConnection().sendPacket(ygUserIQ);
ygInfo.setCode(200);
ygInfo.setBody("register success");
- Log.i(TAG,ygUserIQ.toXML());
- }catch (Exception e){
+ Log.i(TAG, ygUserIQ.toXML());
+ } catch (Exception e) {
ygInfo.setCode(400);
ygInfo.setBody(e.getMessage());
}
return ygInfo;
}
- private String _getAccountAttribute(String attribute){
+
+ private String _getAccountAttribute(String attribute) {
String str = null;
- try{
+ try {
str = accountManager.getAccountAttribute(attribute);
- }catch (Exception e){
- Log.e(TAG,"No response from server");
+ } catch (Exception e) {
+ Log.e(TAG, "No response from server");
}
return str;
}
+
/**
* 登录到服务器
+ *
* @param username
* @param password
* @return
*/
- private YgInfo _login(String username,String password){
+ private YgInfo _login(String username, String password) {
YgInfo info = new YgInfo();
- if (isLogin && username.equals(loginName)){
+ if (isLogin && username.equals(loginName)) {
info.setCode(200);
info.setBody("Already logged in to server.");
return info;
}
- if (isLogin && !username.equals(loginName)){
+ if (isLogin && !username.equals(loginName)) {
info.setCode(400);
info.setBody("A user has logged in, please exit and then log in");
return info;
}
try {
- if (connection!=null&&connection.isConnected()) {
+ if (connection != null && connection.isConnected()) {
connection.login(username, password);
isLogin = true;
loginName = username;
info.setCode(200);
info.setBody("login success");
testMethod();
- }else {
- Log.e(TAG,"未连接服务器");
+ } else {
+ Log.e(TAG, "未连接服务器");
info.setCode(400);
info.setBody("Server not connected");
}
} catch (XMPPException e) {
e.printStackTrace();
XMPPError error = e.getXMPPError();
- if (error!=null){
+ if (error != null) {
info.setCode(error.getCode());
info.setBody(error.getMessage());
- }else {
+ } else {
info.setCode(400);
info.setBody("No response from the server");
}
}
return info;
}
- private Chat createChat(String toUser){
+
+ private Chat createChat(String toUser) {
toUser = checkUser(toUser);
Chat chat = Chats.get(toUser);
if (chat != null) return chat;
- chat = chatManager.createChat(toUser,messageListener);
- Chats.put(toUser,chat);
+ chat = chatManager.createChat(toUser, messageListener);
+ Chats.put(toUser, chat);
return chat;
}
+
/**
* 发送文本字符
+ *
* @param text
* @param toUser
* @return
*/
- private YgInfo _sendChatMessage(String toUser,String text){
+ private YgInfo _sendChatMessage(String toUser, String text) {
YgInfo ygInfo = new YgInfo();
Chat chat = createChat(toUser);
try {
}
return ygInfo;
}
- private YgInfo _sendChatMessage(String toUser,Message message){
+
+ private YgInfo _sendChatMessage(String toUser, Message message) {
YgInfo ygInfo = new YgInfo();
Chat chat = createChat(toUser);
try {
}
return ygInfo;
}
- private void createGroup(){
+
+ private void createGroup() {
roster.createGroup("aiqingliao");
}
- private void getGroups(){
+
+ private void getGroups() {
Collection<RosterGroup> groups = roster.getGroups();
- for (RosterGroup group : groups) {
- Log.i(TAG,group.getName());
+ for (RosterGroup group : groups) {
+ Log.i(TAG, group.getName());
}
}
- private void _sendFile(String toUser, final File file, final String description){
- if(!toUser.contains("@"))toUser +=("@"+getConnection().getServiceName()+"/Smack");
+
+ private void _sendFile(String toUser, final File file, final String description) {
+ if (!toUser.contains("@")) toUser += ("@" + getConnection().getServiceName() + "/Smack");
final String finalToUser = toUser;
new Thread(new Runnable() {
@Override
public void run() {
OutgoingFileTransfer outgoingFileTransfer = fileTransferManager.createOutgoingFileTransfer(finalToUser);
try {
- outgoingFileTransfer.sendFile(file,description);
- while(!outgoingFileTransfer.isDone()) {
- if(outgoingFileTransfer.getStatus().equals(FileTransfer.Status.error)) {
- Log.e(TAG,"ERROR!!! " + outgoingFileTransfer.getError());
+ outgoingFileTransfer.sendFile(file, description);
+ while (!outgoingFileTransfer.isDone()) {
+ if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.error)) {
+ Log.e(TAG, "ERROR!!! " + outgoingFileTransfer.getError());
} else {
- Log.i(TAG,outgoingFileTransfer.getStatus().toString());
- Log.i(TAG,outgoingFileTransfer.getProgress()+"");
+ Log.i(TAG, outgoingFileTransfer.getStatus().toString());
+ Log.i(TAG, outgoingFileTransfer.getProgress() + "");
}
//smackListener.sendingFileStatus(outgoingFileTransfer.getStatus().toString(),outgoingFileTransfer.getProgress(),outgoingFileTransfer.getError().getMessage());
Thread.sleep(1000);
}
}).start();
}
- private boolean createInstantRoom(String nickname,String room,Form form){
- MultiUserChat muc = new MultiUserChat(getConnection(),room+"@"+GROUP_CHAT_SERVICE);
+
+ private boolean createInstantRoom(String nickname, String room, Form form) {
+ MultiUserChat muc = new MultiUserChat(getConnection(), room + "@" + GROUP_CHAT_SERVICE);
try {
muc.create(nickname);
muc.sendConfigurationForm(form);
- Log.i(TAG,"创建"+room+"房间成功");
+ Log.i(TAG, "创建" + room + "房间成功");
} catch (XMPPException e) {
e.printStackTrace();
XMPPError error = e.getXMPPError();
- Log.e(TAG,error.getMessage());
- switch (error.getCode()){
+ Log.e(TAG, error.getMessage());
+ switch (error.getCode()) {
case 401:
- Log.e(TAG,"无权限创建房间");
+ Log.e(TAG, "无权限创建房间");
break;
}
return false;
}
return true;
}
- private boolean createReservedRoom(String nickname,String room){
- MultiUserChat muc = new MultiUserChat(getConnection(),room+"@"+GROUP_CHAT_SERVICE);
+
+ private boolean createReservedRoom(String nickname, String room) {
+ MultiUserChat muc = new MultiUserChat(getConnection(), room + "@" + GROUP_CHAT_SERVICE);
try {
muc.create(nickname);
Form answerForm = muc.getConfigurationForm().createAnswerForm();
}
return true;
}
- private MultiUserChat joinRoom(String nickname,String room,String password){
- MultiUserChat muc = new MultiUserChat(getConnection(),room+"@"+GROUP_CHAT_SERVICE);
+
+ private MultiUserChat joinRoom(String nickname, String room, String password) {
+ MultiUserChat muc = new MultiUserChat(getConnection(), room + "@" + GROUP_CHAT_SERVICE);
try {
- muc.join(nickname,password);
- Log.i(TAG,"加入"+room+"房间成功");
+ muc.join(nickname, password);
+ Log.i(TAG, "加入" + room + "房间成功");
} catch (XMPPException e) {
e.printStackTrace();
- Log.i(TAG,e.getMessage());
+ Log.i(TAG, e.getMessage());
XMPPError error = e.getXMPPError();
- switch (error.getCode()){
+ switch (error.getCode()) {
case 401:
- Log.e(TAG,"密码不正确");
+ Log.e(TAG, "密码不正确");
break;
case 404:
- Log.e(TAG,"group chat cc.minsnail.cc.minsnail.service 标识有误");
+ Log.e(TAG, "group chat cc.minsnail.cc.minsnail.service 标识有误");
break;
}
return null;
}
return muc;
}
- private void inviteAddtoRoom(String myNickname,String room,String password,String invitee,String reason){
- MultiUserChat muc = this.joinRoom(myNickname,room,password);
+
+ private void inviteAddtoRoom(String myNickname, String room, String password, String invitee, String reason) {
+ MultiUserChat muc = this.joinRoom(myNickname, room, password);
muc.addInvitationRejectionListener(invitationRejectionListener);
- muc.invite(checkUser(invitee),reason);
+ muc.invite(checkUser(invitee), reason);
}
- private void inviteAddtoRoom(String myNickname,String room,String password,String invitee,String reason,Message message){
- MultiUserChat muc = this.joinRoom(myNickname,room,password);
+
+ private void inviteAddtoRoom(String myNickname, String room, String password, String invitee, String reason, Message message) {
+ MultiUserChat muc = this.joinRoom(myNickname, room, password);
muc.addInvitationRejectionListener(invitationRejectionListener);
- muc.invite(message,checkUser(invitee),reason);
+ muc.invite(message, checkUser(invitee), reason);
}
- private YgVCard _getVCard(){
+
+ private YgVCard _getVCard() {
YgVCard ygVCard = new YgVCard();
if (!isLogin) return null;
VCard vCard = new VCard();
}
return ygVCard;
}
- private YgVCard _getVCard(String user){
+
+ private YgVCard _getVCard(String user) {
VCard vCard = new VCard();
YgVCard ygVCard = new YgVCard();
try {
- vCard.load(getConnection(),checkUser(user));
+ vCard.load(getConnection(), checkUser(user));
ygVCard.setUser(vCard.getNickName());
ygVCard.setFirstName(vCard.getFirstName());
ygVCard.setLastName(vCard.getLastName());
e.printStackTrace();
XMPPError error = e.getXMPPError();
ygVCard.getFromXMPPError(error);
- switch (error.getCode()){
+ switch (error.getCode()) {
case 408:
ygVCard.setBody("request-timeout(408)");
break;
}
return ygVCard;
}
- private void _setVCard(Map<String,String> info){
+
+ private void _setVCard(Map<String, String> info) {
VCard vCard = new VCard();
try {
vCard.setEmailHome("yg2010.6.11@qq.com");
e.printStackTrace();
}
}
- private void setVCard(String user,Map<String,String> info){
+
+ private void setVCard(String user, Map<String, String> info) {
VCard vCard = new VCard();
try {
- vCard.load(getConnection(),checkUser(user));
+ vCard.load(getConnection(), checkUser(user));
//vCard.setEmailHome("");
e.printStackTrace();
}
}
- private RoomInfo getRoomInfo(String room){
+
+ private RoomInfo getRoomInfo(String room) {
try {
- return MultiUserChat.getRoomInfo(getConnection(),room+"@"+GROUP_CHAT_SERVICE);
+ return MultiUserChat.getRoomInfo(getConnection(), room + "@" + GROUP_CHAT_SERVICE);
} catch (XMPPException e) {
e.printStackTrace();
return null;
}
}
- private YgInfo _setSubscriptionMode(String mode){
+
+ private YgInfo _setSubscriptionMode(String mode) {
YgInfo ygInfo = new YgInfo();
- switch (mode){
+ switch (mode) {
case "accept_all":
roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all);
ygInfo.setCode(200);
}
return ygInfo;
}
- private List<YgUser> _searchUser(String str, boolean username, boolean name, boolean email){
- Log.i(TAG,"search users...");
- if (!username||!name||!email) return null;
+
+ private List<YgUser> _searchUser(String str, boolean username, boolean name, boolean email) {
+ Log.i(TAG, "search users...");
+ if (!username || !name || !email) return null;
List users = new ArrayList();
try {
- if (userSearchManager != null){
+ if (userSearchManager != null) {
Form searchForm = userSearchManager.getSearchForm(SEARCH_USER_SERVICE);
Form answerForm = searchForm.createAnswerForm();
- if (username) answerForm .setAnswer("Username",true);
- if (name) answerForm.setAnswer("Name",true);
- if (email) answerForm.setAnswer("Email",true);
- answerForm.setAnswer("search",str);
- ReportedData data = userSearchManager.getSearchResults(answerForm,SEARCH_USER_SERVICE);
+ if (username) answerForm.setAnswer("Username", true);
+ if (name) answerForm.setAnswer("Name", true);
+ if (email) answerForm.setAnswer("Email", true);
+ answerForm.setAnswer("search", str);
+ ReportedData data = userSearchManager.getSearchResults(answerForm, SEARCH_USER_SERVICE);
Iterator<ReportedData.Row> iterator = data.getRows();
- while (iterator.hasNext()){
+ while (iterator.hasNext()) {
ReportedData.Row row = iterator.next();
YgUser user = new YgUser();
user.setName(row.getValues("Username").next().toString());
user.setFirstName(row.getValues("Name").next().toString());
user.setJid(row.getValues("jid").next().toString());
user.setCode(200);
- Log.e(TAG,row.getValues("Username").next().toString());
+ Log.e(TAG, row.getValues("Username").next().toString());
users.add(user);
}
- }else {
+ } else {
YgUser user = new YgUser();
user.setCode(400);
user.setBody("Not connected to server");
e.printStackTrace();
XMPPError error = e.getXMPPError();
YgUser user = new YgUser();
- if (error!=null){
+ if (error != null) {
user.setCode(error.getCode());
user.setBody(error.getMessage());
}
}
return users;
}
- private List<YgUser> _getRoster(){
+
+ private List<YgUser> _getRoster() {
List users = new ArrayList();
Map groups = new HashMap();
Collection<RosterEntry> entries = null;
- if (roster != null){
+ if (roster != null) {
entries = roster.getEntries();
- }else {
+ } else {
YgUser user = new YgUser();
user.setCode(400);
user.setBody("Not connected to server");
users.add(user);
}
- Log.i(TAG,"friend list");
- int i=1;
+ Log.i(TAG, "friend list");
+ int i = 1;
int pid;
Iterator iteratorEntry = entries.iterator();
- while (iteratorEntry.hasNext()){
+ while (iteratorEntry.hasNext()) {
YgUser ygUserEntry = new YgUser();
RosterEntry entry = (RosterEntry) iteratorEntry.next();
Iterator iteratorGroup = entry.getGroups().iterator();
- if (iteratorGroup.hasNext()){
+ if (iteratorGroup.hasNext()) {
RosterGroup group = (RosterGroup) iteratorGroup.next();
- if (!groups.containsKey(group.getName())){
+ if (!groups.containsKey(group.getName())) {
YgUser ygUserGroup = new YgUser();
ygUserGroup.setId(i);
ygUserGroup.setName(group.getName());
users.add(ygUserGroup);
- groups.put(group.getName(),i);
+ groups.put(group.getName(), i);
pid = i;
i++;
- }else {
+ } else {
pid = (int) groups.get(group.getName());
}
- }else {
+ } else {
pid = -1;
}
ygUserEntry.setId(i);
ygUserEntry.setJid(entry.getUser());
ygUserEntry.setCode(200);
users.add(ygUserEntry);
- Log.i(TAG,entry.getName());
+ Log.i(TAG, entry.getName());
i++;
}
// for(RosterEntry entry:entries){
// }
return users;
}
- private YgInfo _addFriend(String user,String name,String[] groups){
+
+ private YgInfo _addFriend(String user, String name, String[] groups) {
YgInfo info = new YgInfo();
try {
roster.createGroup("yhhy");
- roster.createEntry(checkUser(user),name,new String[]{"yhhy"});
+ roster.createEntry(checkUser(user), name, new String[]{"yhhy"});
info.setCode(200);
- info.setBody("add "+user+"success");
- Log.i(TAG,"添加"+user+"好友成功");
+ info.setBody("add " + user + "success");
+ Log.i(TAG, "添加" + user + "好友成功");
} catch (XMPPException e) {
e.printStackTrace();
e.getMessage();
XMPPError error = e.getXMPPError();
- if (error!=null){
+ if (error != null) {
info.setCode(error.getCode());
info.setBody(error.getMessage());
- }else {
+ } else {
info.setCode(400);
info.setBody(e.getMessage());
}
}
return info;
}
- private boolean _isLogin(){
+
+ private boolean _isLogin() {
return isLogin;
}
- private String checkUser(String user){
- if (user==null)return "admin@"+getConnection().getServiceName();
- if(!user.contains("@"))user +=("@"+getConnection().getServiceName());
+
+ private String checkUser(String user) {
+ if (user == null) return "admin@" + getConnection().getServiceName();
+ if (!user.contains("@")) user += ("@" + getConnection().getServiceName());
return user;
}
- private void _sendIQ(){
+
+ private void _sendIQ() {
YgUserIQ iq = new YgUserIQ(IQ.Type.SET);
- iq.setTo("yg."+SERVERNAME);
+ iq.setTo("yg." + SERVERNAME);
iq.setUsername("hlllg");
iq.setPassword("123456");
iq.setEmail("ddff@qq.com");
iq.setBirth("12/2/2016");
- Log.i(TAG,iq.toXML());
+ Log.i(TAG, iq.toXML());
connection.sendPacket(iq);
}
- private void _disconnect(){
- if (connection!=null && connection.isConnected()) connection.disconnect();
+
+ private void _disconnect() {
+ if (connection != null && connection.isConnected()) connection.disconnect();
}
- private void testMethod(){
- Log.i(TAG,"testMethod");
+
+ private void testMethod() {
+ Log.i(TAG, "testMethod");
//createGroup();
getGroups();
//Log.i(TAG,roster.getGroupCount()+"");
// for (RosterEntry entry:rosterEntries){
// Log.i(TAG,entry.getName());
// }
- Log.i(TAG,"stop test");
+ Log.i(TAG, "stop test");
//_sendIQ();
//Log.i(TAG,roster.getEntry("zj@1546e5j729.imwork.net/Smack")!=null?"true":"false");
//Log.i(TAG,roster.getEntry("zj")!=null?"true":"false");
}
- private MessageListener getMessageListener(){
- if (messageListener !=null) return messageListener;
- messageListener = new MessageListener(){
+
+ private MessageListener getMessageListener() {
+ if (messageListener != null) return messageListener;
+ messageListener = new MessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
- Log.i(TAG,message.toXML());
+ Log.i(TAG, message.toXML());
}
};
return messageListener;
}
- private final class MyAdilInterface extends Stub{
+
+ private final class MyAdilInterface extends Stub {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
- public YgInfo register(String username,String password){
- return _register(username,password);
- };
- public YgInfo createAccount(String username,String password,String name,String email){
+ public YgInfo register(String username, String password) {
+ return _register(username, password);
+ }
+
+ public YgInfo createAccount(String username, String password, String name, String email) {
Map map = new HashMap();
- map.put("name",name);
- map.put("email",email);
- return _register(username,password,map);
+ map.put("name", name);
+ map.put("email", email);
+ return _register(username, password, map);
}
- public YgInfo registUser(String username,String password,YgUserConfig config){
+
+ public YgInfo registUser(String username, String password, YgUserConfig config) {
//_sendIQ();
- YgInfo ygInfo= new YgInfo();
- if (username==null|username.equals("")|password==null|password.equals("")){
+ YgInfo ygInfo = new YgInfo();
+ if (username == null | username.equals("") | password == null | password.equals("")) {
ygInfo.setCode(400);
ygInfo.setBody("User name or password can not be empty");
return ygInfo;
YgUserIQ ygUserIQ = new YgUserIQ(IQ.Type.SET);
ygUserIQ.setUsername(username);
ygUserIQ.setPassword(password);
- if (config!=null){
+ if (config != null) {
ygUserIQ.addYgUserConfig(config);
}
ygInfo = _register(ygUserIQ);
return ygInfo;
}
+
public YgInfo login(String name, String password) throws RemoteException {
- return _login(name,password);
+ return _login(name, password);
}
- public String getAccountAttribute(String attribute){
+
+ public String getAccountAttribute(String attribute) {
return _getAccountAttribute(attribute);
}
- public boolean isLogin(){
+
+ public boolean isLogin() {
return _isLogin();
}
- public List getRoster(){
+
+ public List getRoster() {
return _getRoster();
}
- public YgVCard getVCard(){
+
+ public YgVCard getVCard() {
return _getVCard();
}
- public YgVCard getOneVCard(String user){
+
+ public YgVCard getOneVCard(String user) {
return _getVCard(user);
}
- public void setVCard(){
+
+ public void setVCard() {
_setVCard(null);
}
- public YgInfo sendChatText(String toUser,String text){
- return _sendChatMessage(toUser,text);
+
+ public YgInfo sendChatText(String toUser, String text) {
+ return _sendChatMessage(toUser, text);
}
- public YgInfo sendChatMessage(String toUser,YgMessage ygMessage){
+
+ public YgInfo sendChatMessage(String toUser, YgMessage ygMessage) {
YgInfo ygInfo = new YgInfo();
Message message = new Message();
message.setTo(ygMessage.getTo());
message.setFrom(ygMessage.getFrom());
- switch (ygMessage.getType()){
+ switch (ygMessage.getType()) {
case "chat":
message.setType(Message.Type.chat);
break;
default:
break;
}
- ygInfo = _sendChatMessage(ygMessage.getTo(),message);
+ ygInfo = _sendChatMessage(ygMessage.getTo(), message);
return ygInfo;
}
- public List searchUser(String str,boolean username,boolean name,boolean email){
- return _searchUser(str,username,name,email);
+
+ public List searchUser(String str, boolean username, boolean name, boolean email) {
+ return _searchUser(str, username, name, email);
}
- public YgInfo setSubscriptionMode(String mode){
+
+ public YgInfo setSubscriptionMode(String mode) {
return _setSubscriptionMode(mode);
}
- public YgInfo addFriend(String user,String name,String[] groups){
- return _addFriend(user,name,groups);
+
+ public YgInfo addFriend(String user, String name, String[] groups) {
+ return _addFriend(user, name, groups);
}
- public void sendFile(String toUser, String filePath,String description){
+
+ public void sendFile(String toUser, String filePath, String description) {
File file = new File(filePath);
- _sendFile(toUser,file,description);
+ _sendFile(toUser, file, description);
}
- public void disconnect(){
+
+ public void disconnect() {
_disconnect();
}
+
@Override
public void basicTypes(YgInfo anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
- Log.d(TAG,anInt.getBody());
+ Log.d(TAG, anInt.getBody());
}
}
+
private void configure(ProviderManager pm) {
- pm.addIQProvider("query", "jabber:iq:private",new PrivateDataManager.PrivateDataIQProvider());
+ pm.addIQProvider("query", "jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());
try {
- pm.addIQProvider("query", "jabber:iq:time",Class.forName("org.jivesoftware.smackx.packet.Time"));
+ pm.addIQProvider("query", "jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
} catch (ClassNotFoundException e) {
- Log.w("TestClient","Can't load class for org.jivesoftware.smackx.packet.Time");
+ Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time");
}
- pm.addExtensionProvider("x", "jabber:x:roster",new RosterExchangeProvider());
- pm.addExtensionProvider("x", "jabber:x:event",new MessageEventProvider());
- pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",new XHTMLExtensionProvider());
- pm.addExtensionProvider("x", "jabber:x:conference",new GroupChatInvitation.Provider());
- pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",new DiscoverItemsProvider());
- pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",new DiscoverInfoProvider());
+ pm.addExtensionProvider("x", "jabber:x:roster", new RosterExchangeProvider());
+ pm.addExtensionProvider("x", "jabber:x:event", new MessageEventProvider());
+ pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
+ pm.addExtensionProvider("composing", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
+ pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
+ pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
+ pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
+ pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());
+ pm.addExtensionProvider("x", "jabber:x:conference", new GroupChatInvitation.Provider());
+ pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
+ pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());
pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
- pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",new MUCUserProvider());
- pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",new MUCAdminProvider());
- pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",new MUCOwnerProvider());
- pm.addExtensionProvider("x", "jabber:x:delay",new DelayInformationProvider());
+ pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", new MUCUserProvider());
+ pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
+ pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());
+ pm.addExtensionProvider("x", "jabber:x:delay", new DelayInformationProvider());
try {
- pm.addIQProvider("query", "jabber:iq:version",Class.forName("org.jivesoftware.smackx.packet.Version"));
+ pm.addIQProvider("query", "jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
} catch (ClassNotFoundException e) {
// Not sure what's happening here.
}
pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
- pm.addIQProvider("offline", "http://jabber.org/protocol/offline",new OfflineMessageRequest.Provider());
- pm.addExtensionProvider("offline","http://jabber.org/protocol/offline",new OfflineMessageInfo.Provider());
+ pm.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());
+ pm.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());
pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());
- pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup",new SharedGroupsInfo.Provider());
- pm.addExtensionProvider("addresses","http://jabber.org/protocol/address",new MultipleAddressesProvider());
- pm.addIQProvider("si", "http://jabber.org/protocol/si",new StreamInitiationProvider());
- pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",new BytestreamsProvider());
+ pm.addIQProvider("sharedgroup", "http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider());
+ pm.addExtensionProvider("addresses", "http://jabber.org/protocol/address", new MultipleAddressesProvider());
+ pm.addIQProvider("si", "http://jabber.org/protocol/si", new StreamInitiationProvider());
+ pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
ServiceDiscoveryManager serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
if (serviceDiscoveryManager == null)
- serviceDiscoveryManager= new ServiceDiscoveryManager(connection);
+ serviceDiscoveryManager = new ServiceDiscoveryManager(connection);
serviceDiscoveryManager.addFeature("http://jabber.org/protocol/disco#info");
serviceDiscoveryManager.addFeature("jabber:iq:privacy");
FileTransferNegotiator.setServiceEnabled(connection, true);
public class SharedHelper {
private static final String preference_file_key = "cc.minsnail.smackclient.SHARED_MY";
private Context mContext;
- public SharedHelper(Context context){
+
+ public SharedHelper(Context context) {
mContext = context;
}
- public void put(String key,String value){
- SharedPreferences preferences = mContext.getSharedPreferences(preference_file_key,mContext.MODE_PRIVATE);
+
+ public void put(String key, String value) {
+ SharedPreferences preferences = mContext.getSharedPreferences(preference_file_key, mContext.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
- editor.putString(key,value);
+ editor.putString(key, value);
editor.commit();
}
- public String get(String key,String defaultValue){
- SharedPreferences preferences = mContext.getSharedPreferences(preference_file_key,mContext.MODE_PRIVATE);
- return preferences.getString(key,defaultValue);
+
+ public String get(String key, String defaultValue) {
+ SharedPreferences preferences = mContext.getSharedPreferences(preference_file_key, mContext.MODE_PRIVATE);
+ return preferences.getString(key, defaultValue);
}
}
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.media.ImageWriter;
import android.net.Uri;
-import android.util.Log;
-import org.jivesoftware.smack.util.Base64;
import org.json.JSONException;
import org.json.JSONObject;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
-import java.io.FileWriter;
import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import cc.minsnail.beans.Configs;
+import cc.minsnail.config.Config;
/**
* Created by yg on 2016/10/20.
*/
public class Utils {
private static final int Base64_TAG = 1;
- public static String file2string(String filePath){
+
+ public static String file2string(String filePath) {
File file = new File(filePath);
String data = file2string(file);
if (data != null) return data;
return null;
}
- public static String file2string(File file){
+
+ public static String file2string(File file) {
if (file == null) return null;
if (!(file.isFile())) return null;
FileInputStream reader;
JSONObject jsonObject = new JSONObject();
try {
reader = new FileInputStream(file);
- if (reader==null) return null;
- writer = new ByteArrayOutputStream((int)file.length());
+ if (reader == null) return null;
+ writer = new ByteArrayOutputStream((int) file.length());
byte[] buf = new byte[1024];
int len;
- while (-1!=(len = reader.read(buf))){
- writer.write(buf,0,len);
+ while (-1 != (len = reader.read(buf))) {
+ writer.write(buf, 0, len);
}
reader.close();
writer.flush();
writer.close();
- String str = android.util.Base64.encodeToString(writer.toByteArray(),Base64_TAG);
+ String str = android.util.Base64.encodeToString(writer.toByteArray(), Base64_TAG);
- jsonObject.put("fileName",fileName);
- jsonObject.put("data",str);
+ jsonObject.put("fileName", fileName);
+ jsonObject.put("data", str);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return jsonObject.toString();
}
- public static boolean string2file(String res,Object fileOrPath){
+
+ public static boolean string2file(String res, Object fileOrPath) {
ByteArrayInputStream reader = null;
FileOutputStream writer = null;
File file = null;
try {
- if (fileOrPath instanceof File){
- file = (File)fileOrPath;
- if (!(file.getParentFile().exists())){
+ if (fileOrPath instanceof File) {
+ file = (File) fileOrPath;
+ if (!(file.getParentFile().exists())) {
file.getParentFile().mkdirs();
}
if (!file.exists()) file.createNewFile();
- }else if (fileOrPath instanceof String){
+ } else if (fileOrPath instanceof String) {
String fileName = (String) fileOrPath;
file = new File(fileName);
- if (!(file.getParentFile().exists())){
+ if (!(file.getParentFile().exists())) {
file.getParentFile().mkdirs();
}
}
if (file == null) return false;
writer = new FileOutputStream(file);
- byte[] bytes = android.util.Base64.decode(res,Base64_TAG);
+ byte[] bytes = android.util.Base64.decode(res, Base64_TAG);
reader = new ByteArrayInputStream(bytes);
byte[] buf = new byte[1024];
int len;
- while (-1!=(len = reader.read(buf))){
- writer.write(buf,0,len);
+ while (-1 != (len = reader.read(buf))) {
+ writer.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
return false;
- }finally {
+ } finally {
try {
reader.close();
writer.flush();
return true;
}
- public static Bitmap bitmapCompress(Uri uri){
+ public static Bitmap bitmapCompress(Uri uri) {
Bitmap bitmap = BitmapFactory.decodeFile(uri.getPath());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int quality = 100;
- while (((baos.toByteArray().length)/1024) > Configs.BITMAP_SIZE){
+ while (((baos.toByteArray().length) / 1024) > Config.BITMAP_SIZE) {
baos.reset();
- quality -=2;
- bitmap.compress(Bitmap.CompressFormat.JPEG,quality,baos);
+ quality -= 2;
+ bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
}
- return BitmapFactory.decodeByteArray(baos.toByteArray(),0,1);
+ return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, 1);
}
}
import android.view.View;
import android.widget.Button;
+import cc.minsnail.config.Config;
import cc.minsnail.manager.AudioManager;
import cc.minsnail.manager.DialogManager;
import cc.minsnail.smackclient.R;
/**
* Created by yg on 2016/10/24.
*/
-public class AudioRecordeButton extends Button implements AudioManager.AudioStateListener{
+public class AudioRecordeButton extends Button implements AudioManager.AudioStateListener {
private static final int DISTANCE_Y_CANCEL = 50;
private static final int DISTANCE_X_CANCEL = 10;
private static final int STATE_NORMAL = 1;
private static final int STATE_RECORDING = 2;
- private static final int STATE_WANT_CANCEL =3;
+ private static final int STATE_WANT_CANCEL = 3;
private int mCurState = STATE_NORMAL;
- private boolean isRecording=false;
+ private boolean isRecording = false;
private DialogManager mDialogManager;
private AudioManager mAudioManager;
- private float mTime=0;
+ private float mTime = 0;
//是否触发 long click
private boolean mReady;
+
public AudioRecordeButton(Context context) {
- this(context,null);
+ this(context, null);
}
public AudioRecordeButton(Context context, AttributeSet attrs) {
super(context, attrs);
mDialogManager = new DialogManager(getContext());
- String dir = Environment.getExternalStorageDirectory()+"/smackclient";
+ String dir = Environment.getExternalStorageDirectory() + "/" + Config.APP_PATH + "/" + Config.AUDIO_PATH;
mAudioManager = AudioManager.getInstance(dir);
mAudioManager.setAudioStateListener(this);
setOnLongClickListener(new OnLongClickListener() {
}
});
}
+
//录音完成 callback
- public interface AudioFinishRecorderListener{
- void onFinish(float seconds,String filePath);
+ public interface AudioFinishRecorderListener {
+ void onFinish(float seconds, String filePath);
}
+
private AudioFinishRecorderListener mListener;
- public void setAudioFinishRecorderListener(AudioFinishRecorderListener listener){
+
+ public void setAudioFinishRecorderListener(AudioFinishRecorderListener listener) {
mListener = listener;
}
+
//获取音量
private Runnable mGetVoiceLevelRunnable = new Runnable() {
@Override
public void run() {
- while (isRecording){
+ while (isRecording) {
try {
Thread.sleep(100);
- mTime +=0.1f;
+ mTime += 0.1f;
mHandler.sendEmptyMessage(MSG_VOICE_CHANGED);
} catch (InterruptedException e) {
e.printStackTrace();
private static final int MSG_AUDIO_PREPARED = 0x110;
private static final int MSG_VOICE_CHANGED = 0x111;
private static final int MSG_DIALOG_DIMMIS = 0x112;
- private Handler mHandler = new Handler(){
+ private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- switch (msg.what){
+ switch (msg.what) {
case MSG_AUDIO_PREPARED:
mDialogManager.showRecordingDialog();
isRecording = true;
}
}
};
+
@Override
public void wellPrepare() {
mHandler.sendEmptyMessage(MSG_AUDIO_PREPARED);
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
- int x = (int)event.getX();
- int y = (int)event.getY();
- switch (action){
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+ switch (action) {
case MotionEvent.ACTION_DOWN:
changeState(STATE_RECORDING);
break;
case MotionEvent.ACTION_MOVE:
- if (isRecording){
- if (wantToCancel(x,y)){
+ if (isRecording) {
+ if (wantToCancel(x, y)) {
changeState(STATE_WANT_CANCEL);
- }else {
+ } else {
changeState(STATE_RECORDING);
}
}
break;
case MotionEvent.ACTION_UP:
- if (!mReady){
+ if (!mReady) {
reset();
return super.onTouchEvent(event);
}
- if (!isRecording||mTime < 0.6f){
+ if (!isRecording || mTime < 0.6f) {
mDialogManager.tooShort();
mAudioManager.cancel();
- mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMMIS,1300);
- }else if (mCurState == STATE_RECORDING){
+ mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMMIS, 1300);
+ } else if (mCurState == STATE_RECORDING) {
//正常录制结束
// TODO: 2016/10/25
mDialogManager.dimissDialog();
mAudioManager.release();
- if (mListener != null){
- mListener.onFinish(mTime,mAudioManager.getCurrentFilePath());
+ if (mListener != null) {
+ mListener.onFinish(mTime, mAudioManager.getCurrentFilePath());
}
- }else if (mCurState == STATE_WANT_CANCEL){
+ } else if (mCurState == STATE_WANT_CANCEL) {
mDialogManager.dimissDialog();
mAudioManager.cancel();
}
}
private boolean wantToCancel(int x, int y) {
- if (x<0||x>getWidth()){
+ if (x < 0 || x > getWidth()) {
return true;
}
- if ((y <-DISTANCE_Y_CANCEL) || y> (getWidth() + DISTANCE_Y_CANCEL)){
+ if ((y < -DISTANCE_Y_CANCEL) || y > (getWidth() + DISTANCE_Y_CANCEL)) {
return true;
}
return false;
}
private void changeState(int state) {
- if (mCurState != state){
+ if (mCurState != state) {
mCurState = state;
- switch (state){
+ switch (state) {
case STATE_NORMAL:
setBackgroundResource(R.drawable.button_background);
setText(R.string.str_recorder_normal);
break;
case STATE_RECORDING:
setText(R.string.str_recorder_recording);
- if (isRecording){
+ if (isRecording) {
mDialogManager.recording();
}
break;
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <include layout="@layout/activity_chat_toolbar"></include>
-
- <EditText
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/content"
- android:layout_gravity="center_horizontal" />
-
- <ListView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/users" />
-
- <Button
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="搜索"
- android:id="@+id/search"
- android:layout_gravity="center_horizontal" />
-</LinearLayout>
\ No newline at end of file
android:id="@+id/chatbox"
android:dividerHeight="10dp"
android:background="#ebebeb"
- android:divider="@null"/>
+ android:divider="@null"
+ android:paddingTop="10dp"/>
<View
android:layout_width="match_parent"
android:layout_height="3px"
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical" android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#e4e3e3">
+ <include layout="@layout/activity_chat_toolbar"></include>
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dp"
+ android:background="#fff">
+ <EditText
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/content"
+ android:hint="@string/str_search_user_hint"
+ android:layout_gravity="center_horizontal"
+ android:layout_toLeftOf="@+id/search_btn"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true" />
+ <ImageButton
+ android:layout_width="40dp"
+ android:layout_height="30dp"
+ android:id="@+id/search_btn"
+ android:src="@mipmap/ic_search"
+ android:background="@drawable/button_background"
+ android:layout_gravity="right"
+ android:layout_centerVertical="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true" />
+ </RelativeLayout>
+ <View
+ android:layout_width="wrap_content"
+ android:layout_height="1px"
+ android:background="#ccc"
+ ></View>
+ <ListView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/users"
+ android:layout_marginTop="10dp"
+ android:background="#fff"/>
+</LinearLayout>
\ No newline at end of file
android:paddingTop="5dp"
android:paddingBottom="5dp">
<ImageView
- android:layout_width="40dp"
- android:layout_height="40dp"
+ android:layout_width="60dp"
+ android:layout_height="60dp"
android:id="@+id/head"
android:src="@mipmap/head"
android:layout_alignParentTop="true" />
- <ImageView
+ <cc.minsnail.view.ChatImageView
android:layout_width="150sp"
android:layout_height="120sp"
android:id="@+id/pic"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp">
- <ImageView
+ <cc.minsnail.view.ChatImageView
android:layout_width="150sp"
android:layout_height="120sp"
android:id="@+id/pic"
android:layout_toLeftOf="@+id/head"
android:src="@mipmap/head"/>
<ImageView
- android:layout_width="40dp"
- android:layout_height="40dp"
+ android:layout_width="60dp"
+ android:layout_height="60dp"
android:id="@+id/head"
android:src="@mipmap/head"
android:layout_alignParentTop="true"
android:id="@+id/message"
android:layout_below="@+id/toolbar"
android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
+ android:layout_alignParentStart="true"
+ android:background="#fff"/>
</LinearLayout>
\ No newline at end of file
<ListView
android:id="@+id/main_list_roster"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:background="#fff"
+ android:paddingTop="10dp">
</ListView>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:paddingLeft="20dp"
- android:paddingRight="20dp">
- <ImageView
- android:id="@+id/group_icon"
+ android:paddingRight="20dp"
+ android:background="#f5f5f5">
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@mipmap/triangle_right"/>
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+ <ImageView
+ android:id="@+id/group_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@mipmap/triangle_right" />
+ <TextView
+ android:id="@+id/group_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="New Text"
+ android:textColor="#080808"
+ android:paddingLeft="20dp" />
+ </LinearLayout>
+
<TextView
- android:id="@+id/group_name"
+ android:id="@+id/group_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="New Text"
- android:textColor="#080808"
- android:paddingLeft="20dp"/>
-</LinearLayout>
\ No newline at end of file
+ android:text="12"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true" />
+</RelativeLayout>
\ No newline at end of file
android:paddingTop="5dp"
android:paddingRight="20dp"
android:paddingLeft="20dp"
- android:paddingBottom="5dp">
+ android:paddingBottom="5dp"
+ android:background="#fff">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
-
+ <TextView
+ android:id="@+id/roster_jid"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
</LinearLayout>
\ No newline at end of file
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="kkkk"/>
+ android:minHeight="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:elevation="1dp"
+ android:navigationIcon="@mipmap/ic_launcher"
+ android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
+ <TextView
+ android:id="@+id/name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:layout_gravity="center"
+ android:textColor="#040404"
+ android:textSize="20sp"
+ />
+ </android.support.v7.widget.Toolbar>
</LinearLayout>
\ No newline at end of file
android:id="@+id/add_grp"
android:title="@string/str_add_grp"
app:showAsAction="collapseActionView"></item>
+ <item
+ android:id="@+id/loginout"
+ android:title="@string/str_login_out"
+ app:showAsAction="collapseActionView"
+ ></item>
</menu>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <color name="colorPrimary">#ebeeec</color>
+ <color name="colorPrimary">#17241b</color>
<color name="colorPrimaryDark">#051107</color>
<color name="colorAccent">#9fa497</color>
</resources>
<string name="str_add_frd">添加好友</string>
<string name="str_add_grp">添加分组</string>
+ <string name="str_login_out">退出登录</string>
+
+ <string name="str_delete">删除</string>
+ <string name="str_search_user">搜索好友</string>
+ <string name="str_search_user_hint">用户名/邮箱/昵称</string>
+
+ <string name="str_login_out_dialog_title">注意</string>
+ <string name="str_login_out_dialog_message">退出登录?</string>
+ <string name="str_ok">确定</string>
+ <string name="str_cancel">取消</string>
+
+
+ <item type="id" name="TAG_IMAGE_FILE_PATH"></item>
</resources>