package com.mgw.member.service;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.zip.ZipException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ProgressDialog;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.View;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMContactManager;
import com.easemob.chat.EMGroup;
import com.easemob.chat.EMGroupManager;
import com.easemob.exceptions.EaseMobException;
import com.google.gson.Gson;
import com.hx.hxchat.db.UserDao;
import com.hx.hxchat.domain.User;
import com.hx.hxchat.otto.GetHxInfoNoticeEvent;
import com.hx.hxchat.utils.UserUtils;
import com.mgw.member.bean.AppUpdateInfoBean;
import com.mgw.member.manager.BaseApplication;
import com.mgw.member.manager.ThreadManager;
import com.mgw.member.manager.UpdateManager;
import com.mgw.member.ottoEvent.AppShouldUpdateEvent;
import com.mgw.member.ottoEvent.BusProvider;
import com.mgw.member.ui.activity.UpdateAlertDialog;
import com.mgw.member.ui.activity.cityleague.CityleagueActivity;
import com.mgw.member.uitls.FileUtils;
import com.mgw.member.uitls.HomeWatcher;
import com.mgw.member.uitls.HomeWatcher.OnHomePressedListener;
import com.mgw.member.uitls.LogUtils;
import com.mgw.member.uitls.UIUtils;
import com.mgw.member.uitls.UnZipFiles;
import com.mgw.member.uitls.Utils;
import com.squareup.otto.Produce;
import com.squareup.otto.Subscribe;
public class Myservice extends Service implements OnHomePressedListener {
String TAG = "Myservice";
/*
* 百度地图定位
*/
public LocationClient mLocationClient = null;
public BDLocationListener myListener = null;
private Context mContext;
private HomeWatcher mHomeWatcher;
/** 解压路径 */
private static final String htmlsavePath = Environment.getExternalStorageDirectory().getPath() + "/mgw" + "/unziphtml";
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
BusProvider.getInstance().register(this);
LogUtils.i("service onCreate");
mContext = this;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
BusProvider.getInstance().unregister(this);
LogUtils.i("service onDestroy");
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
LogUtils.i("service onStart");
mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(this);
mHomeWatcher.startWatch();
initData();
GetLoaction();
}
/**
* 初始化数据 将apk自带的自拍文件夹解压到本地的htmlsavePath文件夹下,然后检查是否需要更新
* */
private void initData() {
ThreadManager.getSinglePool().execute(new Runnable() {
@Override
public void run() {
int int1 = getSharedPreferences("mgw_data", 0).getInt("starttime", 1);
if (int1 <= 1) {
UnZipFiles unZipFiles = new UnZipFiles();
try {
File file = new File(htmlsavePath);
if (!file.exists()) {
file.mkdirs();
}
Log.i("unzip文件夹", htmlsavePath);
unZipFiles.upZipinputstreamFile(getAssets().open("html.zip"), htmlsavePath);
SharedPreferences.Editor spEditor = getSharedPreferences("mgw_data", 0).edit();
spEditor.putInt("starttime", ++int1);
resetshowSplash();
spEditor.commit();
// TODO
} catch (ZipException e) {
e.printStackTrace();
LogUtils.e(TAG, e.toString());
} catch (IOException e) {
LogUtils.e(TAG, e.toString());
e.printStackTrace();
}
// getcod1();
updateApk();
} else {
// getcod1();
updateApk();
}
}
});
}
/**
*
* 如果检测到有apk更新直接下载apk,如果没有apk更新但是有html包更新, 获取每个html版本的地址传给updatamanager进行下载
*/
private void updateApk() {
LogUtils.i(TAG, "updateApk");
new AsyncTask<Void, Void, String>() {
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(Void... params) {
String res = Utils.getAppUpdateInfo(getVersionName(), getHtmlVersionCode());
LogUtils.e("RES:" + res + ",getVersionName()=" + getVersionName() + ",getHtmlVersionCode()=" + getHtmlVersionCode());
Gson gson = new Gson();
if (res != null && res.contains("</body>")) {
// 可能是连接了没有网的wifi
return "ok";
}
AppUpdateInfoBean updateInfoBean = gson.fromJson(res, AppUpdateInfoBean.class);
if (updateInfoBean != null && "0".equals(updateInfoBean.flag) && updateInfoBean.items.size() > 0) {
if (updateInfoBean.items.get(0).IsReplace.equals("1")) {
// 第一个是apk更新
// 进行apk更新,跳转更新apk
BaseApplication.getApplication().isHtmlupdate = false;
BaseApplication.getApplication().isApKupdate = true;
BaseApplication.getApplication().fv_exp = updateInfoBean.items.get(0).FVersion_Explain;
BaseApplication.getApplication().FVersion_Name = updateInfoBean.items.get(0).FVersion_Name;
BaseApplication.getApplication().FVersion_FileURL = updateInfoBean.items.get(0).FVersion_FileURL;
LogUtils.w(TAG, "update apk更新");
return "";
} else if (updateInfoBean.items.get(0).IsReplace.equals("0")) {
BaseApplication.getApplication().isApKupdate = false;
BaseApplication.getApplication().isHtmlupdate = true;
// 第一个是不是apk更新 apk更新 依次下载更新下载更新直到完成更新进入登录页面
int size = updateInfoBean.items.size();
LogUtils.w(TAG, "update html0更新开始");
for (int i = 0; i < size; i++) {
LogUtils.w(TAG, "update 当前htnl版本" + getHtmlVersionCode() + "下载版本:" + updateInfoBean.items.get(i).FVersion_Name);
if (updateInfoBean.items.get(i).FVersion_Name.compareTo(getHtmlVersionCode()) > 0) {
// 首先下载,
File downLoad = Utils.downLoad(updateInfoBean.items.get(i).FVersion_FileURL, UpdateManager.htmlsavePath, "html.zip", null);
if (downLoad != null) {
// 然后解压,
UnZipFiles unZipFiles = new UnZipFiles();
File file = new File(UpdateManager.unziphtmlsavePath);
if (!file.exists()) {
file.mkdirs();
}
try {
unZipFiles.upZipFile(new File(UpdateManager.htmlsavePath + "html.zip"), UpdateManager.unziphtmlsavePath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LogUtils.e(e);
}
}
LogUtils.w(TAG, "update html0更新结束");
resetshowSplash();
BaseApplication.getApplication().isHtmlupdate = false;
} else {
LogUtils.w(TAG, "update html0g过小");
}
//
}
return "ok1";
}
}
LogUtils.w(TAG, "update 无更新");
BaseApplication.getApplication().isHtmlupdate = false;
return "ok";
}
protected void onPostExecute(Void result) {
};
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}.execute();
// if (res != null) {
// try {
// if (new JSONObject(res).optJSONArray("items") == null) {
// return;
// }
// JSONArray array = new JSONObject(res).getJSONArray("items");
// /*
// * 如果检测到有apk更新直接弹出下载apk对话框,如果没有apk更新但是有html包更新,
// * 获取每个html版本的地址传给updatamanager进行下载
// */
// for (int i = array.length() - 1; i >= 0; i--) {
// JSONObject obj = array.getJSONObject(i);
// if (obj.getInt("IsReplace") == 1 &&
// obj.getString("FVersion_Name").compareTo(getVersionName()) > 0) {
//
// flag = 0;
// tips[0] = obj.getString("FVersion_FileURL");
// tips[1] = obj.getString("FVersion_Explain");
// tips[2] = obj.getString("FVersion_Name");
// tips[3] = obj.getString("IsReplace");
// // SharedPreferences.Editor spEditor =
// // getSharedPreferences("mgw_data", 0).edit();
// // spEditor.putString("htmlcode",
// // obj.getString("FVersion_Name"));
// // spEditor.commit();
// handler.sendMessage(handler.obtainMessage(flag, tips));
// return;
// // 这里有时可能需要处理一下,判断条件有可能会出问题
// } else if (obj.getInt("IsReplace") == 0 &&
// obj.getString("FVersion_Name").compareTo(getSharedPreferences("mgw_data",
// 0).getString("htmlcode", getVersionName())) > 0) {
//
// SharedPreferences.Editor spEditor = getSharedPreferences("mgw_data",
// 0).edit();
// spEditor.putString("htmlcode", obj.getString("FVersion_Name"));
// spEditor.commit();
// flag = 0;
// if (tips[0] != null) {
// tips[0] = tips[0] + ";" + obj.getString("FVersion_FileURL");
// } else {
// tips[0] = obj.getString("FVersion_FileURL");
// }
//
// tips[1] = obj.getString("FVersion_Explain");
// tips[2] = obj.getString("FVersion_Name");
// tips[3] = obj.getString("IsReplace");
// }
//
// }
// tips[4] = array.length() + "";
// } catch (JSONException e) {
// e.printStackTrace();
// }
// }
//
// handler.sendMessage(handler.obtainMessage(flag, tips));
}
/** 本地的html版本号 */
private String LocalHtmlcod = "";
/**
* 如果检测到有apk更新直接下载apk,如果没有apk更新但是有html包更新, 获取每个html版本的地址传给updatamanager进行下载
*/
private void getcod1() {
String[] tips = new String[5];
int flag = 1;
LocalHtmlcod = getSharedPreferences("mgw_data", 0).getString("htmlcode", getVersionName());
LogUtils.i(TAG, "getcod1");
String res = Utils.getAppUpdateInfo(LocalHtmlcod);
if (res != null) {
try {
if (new JSONObject(res).optJSONArray("items") == null) {
return;
}
JSONArray array = new JSONObject(res).getJSONArray("items");
/*
* 如果检测到有apk更新直接弹出下载apk对话框,如果没有apk更新但是有html包更新,
* 获取每个html版本的地址传给updatamanager进行下载
*/
for (int i = array.length() - 1; i >= 0; i--) {
JSONObject obj = array.getJSONObject(i);
if (obj.getInt("IsReplace") == 1 && obj.getString("FVersion_Name").compareTo(getVersionName()) > 0) {
flag = 0;
tips[0] = obj.getString("FVersion_FileURL");
tips[1] = obj.getString("FVersion_Explain");
tips[2] = obj.getString("FVersion_Name");
tips[3] = obj.getString("IsReplace");
// SharedPreferences.Editor spEditor =
// getSharedPreferences("mgw_data", 0).edit();
// spEditor.putString("htmlcode",
// obj.getString("FVersion_Name"));
// spEditor.commit();
handler.sendMessage(handler.obtainMessage(flag, tips));
return;
// 这里有时可能需要处理一下,判断条件有可能会出问题
} else if (obj.getInt("IsReplace") == 0 && obj.getString("FVersion_Name").compareTo(getSharedPreferences("mgw_data", 0).getString("htmlcode", getVersionName())) > 0) {
SharedPreferences.Editor spEditor = getSharedPreferences("mgw_data", 0).edit();
spEditor.putString("htmlcode", obj.getString("FVersion_Name"));
spEditor.commit();
flag = 0;
if (tips[0] != null) {
tips[0] = tips[0] + ";" + obj.getString("FVersion_FileURL");
} else {
tips[0] = obj.getString("FVersion_FileURL");
}
tips[1] = obj.getString("FVersion_Explain");
tips[2] = obj.getString("FVersion_Name");
tips[3] = obj.getString("IsReplace");
}
}
tips[4] = array.length() + "";
} catch (JSONException e) {
e.printStackTrace();
}
}
handler.sendMessage(handler.obtainMessage(flag, tips));
}
/**
* 这个handler用来接收gecod1()方法传回来的结果,如果有则调用updatemanager下载最新apk/html
*/
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
String[] tips = (String[]) msg.obj;
if (tips[3].equals("1")) {
// SharedPreferences.Editor sharedata =
// getSharedPreferences("mgw_data", 0).edit();
// sharedata.putString("mgw_data", "");
// sharedata.putString("mgw_pwd", "");
// sharedata.commit();
// apk
UpdateManager mUpdateManager = new UpdateManager(getApplicationContext(), tips[0], tips[1], tips[2]);
// mUpdateManager.checkUpdateInfo();
// startUpdateAlert(tips[0],tips[1],tips[2]);
AppShouldUpdateEvent appShouldUpdateEvent = getAppShouldUpdateEvent();
appShouldUpdateEvent.setCanUpdate(true);
appShouldUpdateEvent.setFVersion_FileURL(tips[0]);
appShouldUpdateEvent.setFv_exp(tips[1]);
appShouldUpdateEvent.setFVersion_Name(tips[2]);
BusProvider.getInstance().post(appShouldUpdateEvent);
} else {
// html
UpdateManager manager = new UpdateManager(getApplicationContext(), tips[0], tips[4]);
manager.checkUpdateInfo();
}
} else {
}
super.handleMessage(msg);
}
};
/**
* 跳转到升级activity
*
* @param FVersion_Name
* @param fv_exp
* @param url
* @param updateManager
*/
private void startUpdateAlert(String fv_exp, String FVersion_Name, String url) {
Intent intent = new Intent(mContext, UpdateAlertDialog.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("fv_exp", fv_exp);
intent.putExtra("FVersion_Name", FVersion_Name);
intent.putExtra("FVersion_FileURL", url);
mContext.startActivity(intent);
}
/** 获取当前apk版本 */
public String getVersionName() {
try {
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_CONFIGURATIONS);
return pInfo.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return "1.0";
}
private String getHtmlVersionCode() {
String readProperties = FileUtils.readProperties(UpdateManager.unziphtmlsavePath + "/version.txt", "version", "1.0.0");
//
LogUtils.i(TAG, "getHtmlVersionCode:" + readProperties);
if (readProperties == null) {
return "1.0.0";
}
return readProperties;
}
private void resetshowSplash() {
String readProperties = FileUtils.readProperties(UpdateManager.unziphtmlsavePath + "/version.txt", "showsplash", "false");
if (readProperties == null) {
return;
}
if ("false".equals(readProperties)) {
return;
}
if ("true".equals(readProperties)) {
SharedPreferences sharedPreferences = getSharedPreferences("mgw_data", Context.MODE_PRIVATE);
Editor edit = sharedPreferences.edit();
edit.putInt("useCount", 0);
edit.commit();
}
LogUtils.i(TAG, "resetshowSplash:" + readProperties);
}
/**
* 百度定位
*/
private void GetLoaction() {
mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
myListener = new MyLocationListener();
mLocationClient.registerLocationListener(myListener); // 注册监听函数
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
option.setScanSpan(30000);
mLocationClient.setLocOption(option);
mLocationClient.start();
mLocationClient.requestLocation();
}
/**
* 百度定位监听器
*/
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || location.getLongitude() == 0.0f) {
CityleagueActivity.m_lng = 0;
CityleagueActivity.m_lat = 0;
mLocationClient.stop();
mLocationClient.unRegisterLocationListener(myListener);
return;
}
CityleagueActivity.m_lng = location.getLongitude();
CityleagueActivity.m_lat = location.getLatitude();
CityleagueActivity.m_city = location.getCity();
mLocationClient.stop();
mLocationClient.unRegisterLocationListener(myListener);
SharedPreferences.Editor sharedata = getSharedPreferences("mgw_data", 0).edit();
sharedata.putString("lng", String.valueOf(CityleagueActivity.m_lng));
sharedata.putString("lat", String.valueOf(CityleagueActivity.m_lat));
if (CityleagueActivity.m_city != null) {
sharedata.putString("city", CityleagueActivity.m_city);
sharedata.putString("currentcityname", CityleagueActivity.m_city);
sharedata.putString("currentcityID", "");
}
/*
* 1、设置本地城市编号 2、如果本地城市编号获取到了那么所在城市编号也获取到了。
*/
sharedata.commit();
}
@Override
public void onReceivePoi(BDLocation arg0) {
// TODO Auto-generated method stub
mLocationClient.stop();
mLocationClient.unRegisterLocationListener(myListener);
}
}
@Override
public void onHomePressed() {
UpdateManager.DismissDialog();
}
@Override
public void onHomeLongPressed() {
// UpdateManager.DismissDialog();
}
@Produce
public AppShouldUpdateEvent getAppShouldUpdateEvent() {
LogUtils.i("otto" + "appShouldUpdateEvent ");
AppShouldUpdateEvent appShouldUpdateEvent = new AppShouldUpdateEvent();
return appShouldUpdateEvent;
}
@Subscribe
public void GetHxInfoNoticeEvent(GetHxInfoNoticeEvent GetHxInfoNoticeEvent) {
if (GetHxInfoNoticeEvent != null && GetHxInfoNoticeEvent.isNeedRefresh()) {
// processContactsAndGroups(GetHxInfoNoticeEvent.getGroupId());
inithxAsyn(GetHxInfoNoticeEvent.getGroupId());
}
}
private void inithxAsyn(String groupId) {
// TODO Auto-generated method stub
Runnable runnable = new Runnable() {
@Override
public void run() {
LogUtils.i("otto", "inithxAsyn");
EMGroupManager.getInstance().loadAllGroups();
EMChatManager.getInstance().loadAllConversations();
boolean login = false;
Map<String, User> userlist = new HashMap<String, User>();
try {
JSONObject jo = UserUtils.getfriendinfo();
int flag = jo.getInt("flag");
if (flag == 0) {
if (!jo.isNull("items")) {
JSONArray array = jo.getJSONArray("items");
userlist.clear();
for (int i = 0; i < array.length(); i++) {
jo = array.getJSONObject(i);
User user = new User();
user.setNick(jo.getString("NickName"));
user.setAvatar(jo.getString("MemberPic"));
user.setUsername(jo.getString("UserId"));
user.setreferee(jo.getString("referee"));
userlist.put(user.getUsername(), user);
}
}
}
// }
// 添加user"申请与通知"
User newFriends = new User();
newFriends.setUsername(com.hx.hxchat.Constant.NEW_FRIENDS_USERNAME);
newFriends.setNick("申请与通知");
newFriends.setHeader("");
userlist.put(com.hx.hxchat.Constant.NEW_FRIENDS_USERNAME, newFriends);
// 添加"群聊"
User groupUser = new User();
groupUser.setUsername(com.hx.hxchat.Constant.GROUP_USERNAME);
groupUser.setNick("群聊");
groupUser.setHeader("");
userlist.put(com.hx.hxchat.Constant.GROUP_USERNAME, groupUser);
// TODO 存入内存
BaseApplication.getApplication().setContactList(userlist);
// TODO 存入db
UserDao dao = new UserDao(mContext);
List<User> users = new ArrayList<User>(userlist.values());
dao.saveContactList(users);
// TODO 获取黑名单列表
List<String> blackList = EMContactManager.getInstance().getBlackListUsernamesFromServer();
EMContactManager.getInstance().saveBlackList(blackList);
// TODO
// 获取群聊列表,sdk会把群组存入到EMGroupManager和db中(),群聊里只有groupid和groupname等简单信息,不包含members
List<EMGroup> groupsFromServer = EMGroupManager.getInstance().getGroupsFromServer();
// for (EMGroup dd : groupsFromServer) {
// EMGroup groupFromServer = EMGroupManager.getInstance().getGroupFromServer(dd.getGroupId());
// List<String> members = groupFromServer.getMembers();
// EMGroupManager.getInstance().createOrUpdateLocalGroup(groupFromServer);
// // EMGroup group =
// //
// EMGroupManager.getInstance().getGroup(dd.getGroupId());
// LogUtils.i(TAG, "members:" + members.toString() + "local members:");
// }
login = true;
} catch (Exception ex) {
ex.printStackTrace();
login = false;
UIUtils.showToastSafe("get list failed");
LogUtils.e(TAG, ex.toString());
}
}
};
ThreadManager.getSinglePool().execute(runnable);
}
}