OSDN Git Service

picture
authoryg <yg2010.6.11@qq.com>
Wed, 16 Nov 2016 08:42:59 +0000 (16:42 +0800)
committeryg <yg2010.6.11@qq.com>
Wed, 16 Nov 2016 08:42:59 +0000 (16:42 +0800)
37 files changed:
app/src/main/AndroidManifest.xml
app/src/main/java/cc/minsnail/activity/ChatActivity.java
app/src/main/java/cc/minsnail/activity/LoginActivity.java
app/src/main/java/cc/minsnail/activity/MainActivity.java
app/src/main/java/cc/minsnail/activity/SearchUserActivity.java [moved from app/src/main/java/cc/minsnail/activity/AddActivity.java with 72% similarity]
app/src/main/java/cc/minsnail/adapter/ChatAdapter.java
app/src/main/java/cc/minsnail/adapter/FriendsAdapter.java
app/src/main/java/cc/minsnail/adapter/MessageAdapter.java
app/src/main/java/cc/minsnail/adapter/RosterAdapter.java
app/src/main/java/cc/minsnail/adapter/TreeAdapter.java
app/src/main/java/cc/minsnail/beans/Configs.java [deleted file]
app/src/main/java/cc/minsnail/beans/YgText.java
app/src/main/java/cc/minsnail/beans/YgTreeNode.java
app/src/main/java/cc/minsnail/beans/YgUser.java
app/src/main/java/cc/minsnail/config/Config.java [new file with mode: 0644]
app/src/main/java/cc/minsnail/fragment/MessageFragment.java
app/src/main/java/cc/minsnail/fragment/RosterFragment.java
app/src/main/java/cc/minsnail/manager/OssManager.java
app/src/main/java/cc/minsnail/receiver/MsgReceiver.java
app/src/main/java/cc/minsnail/service/SmackService.java
app/src/main/java/cc/minsnail/tools/SharedHelper.java
app/src/main/java/cc/minsnail/tools/Utils.java
app/src/main/java/cc/minsnail/view/AudioRecordeButton.java
app/src/main/res/layout/activity_add.xml [deleted file]
app/src/main/res/layout/activity_chat.xml
app/src/main/res/layout/activity_search_user.xml [new file with mode: 0644]
app/src/main/res/layout/activity_search_user_toolbar.xml [moved from app/src/main/res/layout/activity_add_toolbar.xml with 100% similarity]
app/src/main/res/layout/chat_pic_item_1.xml
app/src/main/res/layout/chat_pic_item_2.xml
app/src/main/res/layout/fragment_message.xml
app/src/main/res/layout/fragment_roster.xml
app/src/main/res/layout/group_item.xml
app/src/main/res/layout/roster_item.xml [moved from app/src/main/res/layout/friend_item.xml with 86% similarity]
app/src/main/res/layout/toolbar.xml
app/src/main/res/menu/menu_main.xml
app/src/main/res/values/colors.xml
app/src/main/res/values/strings.xml

index f7a77f0..f855c13 100644 (file)
@@ -54,7 +54,7 @@
 
             </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"
index 857bc74..98c13bb 100644 (file)
@@ -10,6 +10,7 @@ import android.graphics.drawable.AnimationDrawable;
 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;
@@ -17,6 +18,7 @@ import android.os.RemoteException;
 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;
@@ -30,11 +32,28 @@ import android.widget.RelativeLayout;
 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;
@@ -42,6 +61,7 @@ import cc.minsnail.view.AudioRecordeButton;
 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.
@@ -52,10 +72,8 @@ public class ChatActivity extends AppCompatActivity {
     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;
     //发送图片按钮
@@ -72,8 +90,6 @@ public class ChatActivity extends AppCompatActivity {
     private ImageButton mChangeBtn;
     //录音按钮
     private AudioRecordeButton mAudioRecorderButton;
-    //聊天对方jid
-    private String mToJid;
     //消息展示listView
     private ListView mChatBox;
     //文本发送按钮
@@ -91,43 +107,65 @@ public class ChatActivity extends AppCompatActivity {
     //语音播放动画
     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);
@@ -139,63 +177,75 @@ public class ChatActivity extends AppCompatActivity {
         //设置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) {
@@ -206,17 +256,19 @@ public class ChatActivity extends AppCompatActivity {
                 }
             }
         });
+
         //打开子菜单按钮
         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
@@ -224,15 +276,17 @@ public class ChatActivity extends AppCompatActivity {
                 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) {
@@ -241,6 +295,7 @@ public class ChatActivity extends AppCompatActivity {
                 mSubMenus.setVisibility(View.GONE);
             }
         });
+
         mAudioBtn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -249,28 +304,29 @@ public class ChatActivity extends AppCompatActivity {
                 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) {
@@ -282,67 +338,26 @@ public class ChatActivity extends AppCompatActivity {
             }
         });
     }
-    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;
         }
@@ -353,72 +368,217 @@ public class ChatActivity extends AppCompatActivity {
     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
index 1844dfc..acb01d6 100644 (file)
@@ -33,9 +33,9 @@ import cc.minsnail.service.SmackService;
 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;
@@ -45,20 +45,23 @@ public class LoginActivity extends AppCompatActivity{
     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);
@@ -68,49 +71,49 @@ public class LoginActivity extends AppCompatActivity{
 
         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);
             }
         });
@@ -118,19 +121,20 @@ public class LoginActivity extends AppCompatActivity{
         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) {
@@ -143,18 +147,19 @@ public class LoginActivity extends AppCompatActivity{
 
         @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);
index f251833..4a4c699 100644 (file)
@@ -4,39 +4,41 @@ import android.app.FragmentManager;
 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;
@@ -46,15 +48,14 @@ public class MainActivity extends AppCompatActivity {
     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;
             }
         }
@@ -67,17 +68,15 @@ public class MainActivity extends AppCompatActivity {
         //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);
@@ -110,7 +109,7 @@ public class MainActivity extends AppCompatActivity {
         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);
@@ -142,7 +141,7 @@ public class MainActivity extends AppCompatActivity {
             public void run() {
                 if (mSmackService != null){
                     try {
-                        mUser = mSmackService.getAccountAttribute("username");
+                        mToUserName = mSmackService.getAccountAttribute("username");
                         handler.sendEmptyMessage(SHOW_INFO);
                     } catch (RemoteException e) {
                         e.printStackTrace();
@@ -161,16 +160,40 @@ public class MainActivity extends AppCompatActivity {
     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) {
@@ -11,6 +11,7 @@ import android.os.Message;
 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;
@@ -19,6 +20,7 @@ import android.view.View;
 import android.widget.AdapterView;
 import android.widget.Button;
 import android.widget.EditText;
+import android.widget.ImageButton;
 import android.widget.ListView;
 import android.widget.TextView;
 
@@ -31,22 +33,21 @@ import cc.minsnail.smackclient.R;
 /**
  * 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();
@@ -57,27 +58,29 @@ public class AddActivity extends AppCompatActivity {
         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();
@@ -90,21 +93,22 @@ public class AddActivity extends AppCompatActivity {
         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;
             }
         }
@@ -112,21 +116,22 @@ public class AddActivity extends AppCompatActivity {
 
     @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);
@@ -136,13 +141,13 @@ public class AddActivity extends AppCompatActivity {
     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;
         }
     }
index 52fdba0..f159ee4 100644 (file)
@@ -2,60 +2,61 @@ package cc.minsnail.adapter;
 
 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();
@@ -73,36 +74,7 @@ public class ChatAdapter extends BaseAdapter {
 
     @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
@@ -119,41 +91,40 @@ public class ChatAdapter extends BaseAdapter {
         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);
@@ -161,8 +132,8 @@ public class ChatAdapter extends BaseAdapter {
                     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);
@@ -171,119 +142,98 @@ public class ChatAdapter extends BaseAdapter {
                     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);
+        }
+    }
 }
index 9f136dd..befac65 100644 (file)
@@ -41,7 +41,7 @@ public class FriendsAdapter extends BaseAdapter {
     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);
index cf42004..4976ad5 100644 (file)
@@ -5,20 +5,25 @@ import android.util.Log;
 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;
 
 /**
@@ -27,24 +32,64 @@ 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();
@@ -60,12 +105,19 @@ public class MessageAdapter extends BaseAdapter {
         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);
@@ -73,31 +125,38 @@ public class MessageAdapter extends BaseAdapter {
             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);
+    }
 }
index 440b75e..f39703d 100644 (file)
@@ -19,20 +19,21 @@ import cc.minsnail.smackclient.R;
  */
 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;
@@ -48,24 +49,26 @@ public class RosterAdapter<T> extends TreeAdapter<T> {
         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;
@@ -74,26 +77,32 @@ public class RosterAdapter<T> extends TreeAdapter<T> {
                     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;
     }
 }
index 7948ce7..b9f009f 100644 (file)
@@ -23,25 +23,29 @@ public abstract class TreeAdapter<T> extends BaseAdapter {
     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);
                 }
             }
         });
@@ -49,7 +53,7 @@ public abstract class TreeAdapter<T> extends BaseAdapter {
 
     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);
@@ -75,10 +79,11 @@ public abstract class TreeAdapter<T> extends BaseAdapter {
     @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);
 }
diff --git a/app/src/main/java/cc/minsnail/beans/Configs.java b/app/src/main/java/cc/minsnail/beans/Configs.java
deleted file mode 100644 (file)
index dfc8974..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-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
-}
index 2b79452..2a149a4 100644 (file)
@@ -7,6 +7,7 @@ import org.json.JSONObject;
 
 import java.io.File;
 
+import cc.minsnail.config.Config;
 import cc.minsnail.tools.Utils;
 
 /**
@@ -57,16 +58,16 @@ public class YgText {
             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;
index aa2a915..52f16fe 100644 (file)
@@ -25,6 +25,7 @@ public class YgTreeNode {
         this.name = name;
     }
     public boolean isRoot(){
+        if(pid == -1) return false;
         return parent == null;
     }
     public boolean isParentExpand(){
@@ -107,6 +108,7 @@ public class YgTreeNode {
     }
 
     public String getUserName() {
+        if (userName==null)return jid.split("@")[0];
         return userName;
     }
 
index 71928b0..728b0b5 100644 (file)
@@ -110,6 +110,7 @@ public class YgUser extends YgInfo implements Parcelable{
     }
 
     public String getName(){
+        if (name==null)return jid.split("@")[0];
         return name;
     }
 
diff --git a/app/src/main/java/cc/minsnail/config/Config.java b/app/src/main/java/cc/minsnail/config/Config.java
new file mode 100644 (file)
index 0000000..07f94fe
--- /dev/null
@@ -0,0 +1,44 @@
+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;
+}
index 021c410..a0beae4 100644 (file)
@@ -6,25 +6,43 @@ import android.content.Context;
 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.
@@ -33,25 +51,38 @@ public class MessageFragment extends Fragment {
     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;
     }
 
@@ -60,53 +91,165 @@ public class MessageFragment extends Fragment {
         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();
     }
 }
index e0324ae..eec1b23 100644 (file)
@@ -19,11 +19,15 @@ import java.util.ArrayList;
 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;
 
 /**
@@ -35,43 +39,66 @@ public class RosterFragment extends Fragment {
     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;
     }
 
@@ -81,17 +108,18 @@ public class RosterFragment extends Fragment {
         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);
@@ -102,22 +130,12 @@ public class RosterFragment extends Fragment {
             }
         }).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() {
+
     }
 }
index a129e3f..e8bd3b7 100644 (file)
@@ -7,24 +7,42 @@ import com.alibaba.sdk.android.oss.OSS;
 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;
+    }
+
 }
index e2b89ed..98a0f95 100644 (file)
@@ -12,6 +12,7 @@ import android.util.Log;
 
 import cc.minsnail.activity.ChatActivity;
 import cc.minsnail.beans.YgMessage;
+import cc.minsnail.config.Config;
 import cc.minsnail.smackclient.R;
 
 /**
@@ -19,24 +20,20 @@ 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())
@@ -44,7 +41,7 @@ public class MsgReceiver extends BroadcastReceiver {
                     .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();
         }
     }
index 17d285d..5fddce4 100644 (file)
@@ -80,7 +80,7 @@ import java.util.Iterator;
 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;
@@ -88,7 +88,6 @@ import cc.minsnail.beans.YgUserConfig;
 import cc.minsnail.beans.YgUserIQ;
 import cc.minsnail.beans.YgVCard;
 import cc.minsnail.aidl.IServiceAidlInterface.Stub;
-import cc.minsnail.tools.Utils;
 
 
 /**
@@ -99,22 +98,22 @@ public class SmackService extends Service {
     //服务是否第一次启动
     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;
     //连接服务器对象
@@ -130,7 +129,7 @@ public class SmackService extends Service {
     //搜索用户管理对象
     private static UserSearchManager userSearchManager;
     //消息监听器
-    private static MessageListener messageListener= null;
+    private static MessageListener messageListener = null;
     //花名册管理对象
     private static Roster roster;
     //花名册监听器
@@ -150,7 +149,8 @@ public class SmackService extends Service {
     //消息包监听器
     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) {
@@ -160,21 +160,21 @@ public class SmackService extends Service {
     @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消息
@@ -182,9 +182,9 @@ public class SmackService extends Service {
         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");
                 }
             }
         };
@@ -194,38 +194,38 @@ public class SmackService extends Service {
         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();
@@ -239,11 +239,11 @@ public class SmackService extends Service {
         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();
                 }
@@ -252,46 +252,47 @@ public class SmackService extends Service {
         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;
@@ -301,8 +302,8 @@ public class SmackService extends Service {
     /**
      * 初始化连接
      */
-    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);
@@ -311,9 +312,9 @@ public class SmackService extends Service {
         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);
@@ -325,24 +326,27 @@ public class SmackService extends Service {
             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;
         }
@@ -355,20 +359,22 @@ public class SmackService extends Service {
         }
         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");
             }
@@ -380,14 +386,15 @@ public class SmackService extends Service {
         }
         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");
             }
@@ -395,7 +402,7 @@ public class SmackService extends Service {
             e.printStackTrace();
             XMPPError error = e.getXMPPError();
             ygInfo.getFromXMPPError(error);
-            switch (error.getCode()){
+            switch (error.getCode()) {
                 case 409:
                     ygInfo.setBody("User already exists");
                     break;
@@ -407,88 +414,95 @@ public class SmackService extends Service {
         }
         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 {
@@ -502,7 +516,8 @@ public class SmackService extends Service {
         }
         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 {
@@ -516,30 +531,33 @@ public class SmackService extends Service {
         }
         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);
@@ -552,27 +570,29 @@ public class SmackService extends Service {
             }
         }).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();
@@ -584,38 +604,42 @@ public class SmackService extends Service {
         }
         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();
@@ -633,11 +657,12 @@ public class SmackService extends Service {
         }
         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());
@@ -646,7 +671,7 @@ public class SmackService extends Service {
             e.printStackTrace();
             XMPPError error = e.getXMPPError();
             ygVCard.getFromXMPPError(error);
-            switch (error.getCode()){
+            switch (error.getCode()) {
                 case 408:
                     ygVCard.setBody("request-timeout(408)");
                     break;
@@ -656,7 +681,8 @@ public class SmackService extends Service {
         }
         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");
@@ -665,10 +691,11 @@ public class SmackService extends Service {
             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("");
 
@@ -677,17 +704,19 @@ public class SmackService extends Service {
             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);
@@ -710,31 +739,32 @@ public class SmackService extends Service {
         }
         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");
@@ -743,47 +773,48 @@ public class SmackService extends Service {
             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);
@@ -792,7 +823,7 @@ public class SmackService extends Service {
             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){
@@ -817,51 +848,57 @@ public class SmackService extends Service {
 //        }
         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()+"");
@@ -871,39 +908,43 @@ public class SmackService extends Service {
 //        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;
@@ -911,113 +952,129 @@ public class SmackService extends Service {
             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);
index b769f3a..be70b66 100644 (file)
@@ -9,17 +9,20 @@ import android.content.SharedPreferences;
 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);
     }
 }
index 47b9093..6f52ee7 100644 (file)
@@ -3,43 +3,35 @@ package cc.minsnail.tools;
 
 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;
@@ -48,20 +40,20 @@ public class Utils {
         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;
@@ -74,37 +66,38 @@ public class Utils {
         }
         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();
@@ -116,16 +109,16 @@ public class Utils {
         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);
     }
 }
index 6084b15..1733b03 100644 (file)
@@ -9,6 +9,7 @@ import android.view.MotionEvent;
 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;
@@ -16,29 +17,30 @@ 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() {
@@ -51,22 +53,26 @@ public class AudioRecordeButton extends Button implements AudioManager.AudioStat
             }
         });
     }
+
     //录音完成 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();
@@ -77,10 +83,10 @@ public class AudioRecordeButton extends Button implements AudioManager.AudioStat
     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;
@@ -97,6 +103,7 @@ public class AudioRecordeButton extends Button implements AudioManager.AudioStat
             }
         }
     };
+
     @Override
     public void wellPrepare() {
         mHandler.sendEmptyMessage(MSG_AUDIO_PREPARED);
@@ -105,39 +112,39 @@ public class AudioRecordeButton extends Button implements AudioManager.AudioStat
     @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();
                 }
@@ -157,19 +164,19 @@ public class AudioRecordeButton extends Button implements AudioManager.AudioStat
     }
 
     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);
@@ -177,7 +184,7 @@ public class AudioRecordeButton extends Button implements AudioManager.AudioStat
                     break;
                 case STATE_RECORDING:
                     setText(R.string.str_recorder_recording);
-                    if (isRecording){
+                    if (isRecording) {
                         mDialogManager.recording();
                     }
                     break;
diff --git a/app/src/main/res/layout/activity_add.xml b/app/src/main/res/layout/activity_add.xml
deleted file mode 100644 (file)
index a33e3aa..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?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
index 2772837..ffa2fe1 100644 (file)
@@ -18,7 +18,8 @@
             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"
diff --git a/app/src/main/res/layout/activity_search_user.xml b/app/src/main/res/layout/activity_search_user.xml
new file mode 100644 (file)
index 0000000..caeff59
--- /dev/null
@@ -0,0 +1,43 @@
+<?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
index bb7caaf..dc96de3 100644 (file)
@@ -5,12 +5,12 @@
     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"
index 93ae563..1f880ff 100644 (file)
@@ -4,7 +4,7 @@
     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"
@@ -14,8 +14,8 @@
         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"
index 8d4f3e3..187145f 100644 (file)
@@ -8,5 +8,6 @@
         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
index eb80ecb..54bf631 100644 (file)
@@ -5,7 +5,9 @@
     <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
index d010c2c..ffb9907 100644 (file)
@@ -1,20 +1,35 @@
 <?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
similarity index 86%
rename from app/src/main/res/layout/friend_item.xml
rename to app/src/main/res/layout/roster_item.xml
index 00ca40f..57cb3e6 100644 (file)
@@ -6,7 +6,8 @@
     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"
@@ -39,5 +40,9 @@
             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
index ae8afc0..228771f 100644 (file)
@@ -3,9 +3,25 @@
     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
index 8831f61..f5a7f74 100644 (file)
@@ -9,4 +9,9 @@
         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
index 5e7600f..88374fe 100644 (file)
@@ -1,6 +1,6 @@
 <?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>
index eeb2719..d3ca7f4 100644 (file)
 
     <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>