/*
* Copyright (c) 2015 [1076559197@qq.com | tchen0707@gmail.com]
*
* Licensed under the Apache License, Version 2.0 (the "License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.youku.service.acc;
import java.io.File;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.IBinder;
import android.os.RemoteException;
import android.text.TextUtils;
import com.baseproject.utils.Logger;
import com.baseproject.utils.Util;
public class AcceleraterService extends Service {
public static final String ACTION_START_SERVER = "com.youku.acc.ACTION_START_SERVER";
public static final String ACTION_STOP_SERVER = "com.youku.acc.ACTION_STOP_SERVER";
public static final String ACTION_START_SUCCESS = "com.youku.acc.ACTION_START_SUCCESS";
public static final String ACTION_START_FAILURE = "com.youku.acc.ACTION_START_FAILURE";
private static final String TAG = "Accelerater_Service";
AcceleraterServiceManager mAccServiceManager;
/** 初始化注册网络广播的锁,防止错误的网络变化 */
private boolean mInitLock = false;
private BroadcastReceiver mNetworkReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
if (mInitLock) {
mInitLock = false;
return;
}
if (Util.hasInternet()) {
if (Util.isWifi()) {// wifi可用加速器
Logger.d(TAG, "network --------> wifi");
mAccServiceManager.resumeAcc();
} else {// 2g/3g不可用加速器
Logger.d(TAG, "network --------> 2/3g");
mAccServiceManager.pauseAcc();
}
} else {
Logger.d(TAG, "network --------> no network");
mAccServiceManager.pauseAcc();
}
}
};
private IAcceleraterService.Stub mBinder = new IAcceleraterService.Stub() {
@Override
public void stop() throws RemoteException {
mAccServiceManager.stopAcc();
}
@Override
public void start() throws RemoteException {
int flag = mAccServiceManager.startAcc(AcceleraterService.this);
if (flag == 0) {
Intent intent = new Intent(ACTION_START_SUCCESS);
AcceleraterService.this.sendBroadcast(intent);
} else {
Intent intent = new Intent(ACTION_START_FAILURE);
AcceleraterService.this.sendBroadcast(intent);
}
}
@Override
public int resume() throws RemoteException {
return mAccServiceManager.resumeAcc();
}
@Override
public int pause() throws RemoteException {
return mAccServiceManager.pauseAcc();
}
@Override
public int isAvailable() throws RemoteException {
return mAccServiceManager.isAccAvailable();
}
@Override
public int getHttpProxyPort() throws RemoteException {
return mAccServiceManager.getAccHttpProxyPort();
}
@Override
public boolean isACCEnable() throws RemoteException {
return AcceleraterServiceManager.isACCEnable();
}
@Override
public String getAccPort() throws RemoteException {
return AcceleraterServiceManager.ACC_PORT;
}
@Override
public String getVersionName() throws RemoteException {
return AcceleraterServiceManager.getAccVersionName();
}
@Override
public int getVersionCode() throws RemoteException {
return AcceleraterServiceManager.getAccVersionCode();
}
@Override
public int getCurrentStatus() throws RemoteException {
return mAccServiceManager.getCurrentStatus();
}
};
@Override
public void onCreate() {
Logger.d(TAG, "onCreate()");
mAccServiceManager = AcceleraterServiceManager.getInstance();
mInitLock = true;
IntentFilter i = new IntentFilter();
i.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkReceiver, i);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Logger.d(TAG, "onStartCommand() intent = " + intent);
AccInitData.printAll(this);
if (intent == null) {
if (Util.hasInternet() && !Util.isWifi()) {
mAccServiceManager.pauseAcc();
return START_NOT_STICKY;
}
if (!AcceleraterServiceManager.isACCEnable()) {
Logger.d(TAG, "ACC启动失败/手机不满足ACC运行条件");
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.STARTED) {
mAccServiceManager.pauseAcc();
}
}else {
Logger.d(TAG, "status = " + mAccServiceManager.getCurrentStatus());
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.INIT) {
mAccServiceManager.startAcc(this);
} else if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.PAUSED) {
mAccServiceManager.resumeAcc();
}
}
return START_NOT_STICKY;
}
String action = intent.getAction();
if (action == null) {
return START_NOT_STICKY;
}
if (action.equals(ACTION_START_SERVER)) {// 启动ACC
Intent i = new Intent("android.intent.action.DOWNLOAD_TRACKER");
i.putExtra("from", AcceleraterServiceManager.FROM_ACC);
if (Util.hasInternet() && !Util.isWifi()) {
mAccServiceManager.pauseAcc();
i.putExtra(AcceleraterServiceManager.RESTRICTBY, "9-网络环境不满足要求");
sendBroadcast(i);
Logger.d(TAG, "统计失败原因");
return START_STICKY;
}
// String cachePath =AcceleraterServiceManager.getDefauleSDCardPath();
// if (cachePath != null
// && TextUtils.getTrimmedLength(cachePath) > 0) {
// File f = new File(cachePath + "/youku/youkudisk/");
// if (!f.exists()) {
// if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.STARTED) {
// mAccServiceManager.pauseAcc();
// }
// i.putExtra(AcceleraterServiceManager.RESTRICTBY, "10-无youkudisk文件夹");
// sendBroadcast(i);
// Logger.d(TAG, "统计失败原因");
// return START_STICKY;
// }
// } else {
// if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.STARTED) {
// mAccServiceManager.pauseAcc();
// }
// i.putExtra(AcceleraterServiceManager.RESTRICTBY, "7-获取缓存路径失败:" + cachePath);
// sendBroadcast(i);
// Logger.d(TAG, "统计失败原因");
// return START_STICKY;
// }
if (!AcceleraterServiceManager.isACCEnable()) {
Logger.d(TAG, "ACC启动失败/手机不满足ACC运行条件");
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.STARTED) {
mAccServiceManager.pauseAcc();
}
i.putExtra(AcceleraterServiceManager.RESTRICTBY, AcceleraterServiceManager.sFailReason);
sendBroadcast(i);
Logger.d(TAG, "统计失败原因");
} else {
Logger.d(TAG, "status = " + mAccServiceManager.getCurrentStatus());
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.INIT) {
mAccServiceManager.startAcc(this);
return START_STICKY;
}
if (checkCacheDir(i) == -1) {
return START_STICKY;
}
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.PAUSED) {
if (-1 == mAccServiceManager.resumeAcc()) {
i.putExtra(AcceleraterServiceManager.RESTRICTBY, "8-resumeAcc失败");
sendBroadcast(i);
Logger.d(TAG, "统计失败原因");
}
}
}
} else if (action.equals(ACTION_STOP_SERVER)) {
mAccServiceManager.pauseAcc();
}
return START_STICKY;
}
private int checkCacheDir(Intent intent) {
String cachePath =AcceleraterServiceManager.getDefauleSDCardPath();
if (cachePath != null
&& TextUtils.getTrimmedLength(cachePath) > 0) {
File f = new File(cachePath + "/youku/youkudisk/");
if (!f.exists()) {
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.STARTED) {
mAccServiceManager.pauseAcc();
}
intent.putExtra(AcceleraterServiceManager.RESTRICTBY, "10-无youkudisk文件夹");
sendBroadcast(intent);
Logger.d(TAG, "统计失败原因");
return -1;
}
} else {
if (mAccServiceManager.getCurrentStatus() == AcceleraterStatus.STARTED) {
mAccServiceManager.pauseAcc();
}
intent.putExtra(AcceleraterServiceManager.RESTRICTBY, "7-获取缓存路径失败:" + cachePath);
sendBroadcast(intent);
Logger.d(TAG, "统计失败原因");
return -1;
}
return 0;
}
@Override
public IBinder onBind(Intent intent) {
Logger.d(TAG, "AcceleraterService onBind()");
return mBinder;
}
@Override
public void onDestroy() {
Logger.d(TAG, "AcceleraterService onDestroy()");
unregisterReceiver(mNetworkReceiver);
super.onDestroy();
}
}