package com.konka.music.core.providers.downloads;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import android.util.Log;
public class RealSystemFacade implements SystemFacade {
private Context mContext;
private NotificationManager mNotificationManager;
// 2 GB
private static final long DOWNLOAD_MAX_BYTES_OVER_MOBILE = 2 * 1024 * 1024 * 1024L;
// 1 GB
private static final long DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE = 1024 * 1024 * 1024;
private static final ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(3);//下载app用的线程池
public RealSystemFacade(Context context) {
mContext = context;
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
}
/**
* 获取当前时间戳
*/
@Override
public long currentTimeMillis() {
return System.currentTimeMillis();
}
/**
* 获取网络类型
*/
@Override
public Integer getActiveNetworkType() {
ConnectivityManager connectivity = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
Log.w(Constants.TAG, "couldn't get connectivity manager");
return null;
}
NetworkInfo activeInfo = connectivity.getActiveNetworkInfo();
if (activeInfo == null) {
if (Constants.LOGVV) {
Log.v(Constants.TAG, "network is not available");
}
return null;
}
return activeInfo.getType();
}
/**
* 网络是否漫游
*/
@Override
public boolean isNetworkRoaming() {
ConnectivityManager connectivity = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
Log.w(Constants.TAG, "couldn't get connectivity manager");
return false;
}
NetworkInfo info = connectivity.getActiveNetworkInfo();
boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
final TelephonyManager mgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
boolean isRoaming = isMobile && mgr.isNetworkRoaming();
if (Constants.LOGVV && isRoaming) {
Log.v(Constants.TAG, "network is roaming");
}
return isRoaming;
}
@Override
public Long getMaxBytesOverMobile() {
return DOWNLOAD_MAX_BYTES_OVER_MOBILE;
}
@Override
public Long getRecommendedMaxBytesOverMobile() {
return DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE;
}
@Override
public void sendBroadcast(Intent intent) {
mContext.sendBroadcast(intent);
}
@Override
public boolean userOwnsPackage(int uid, String packageName) throws NameNotFoundException {
return mContext.getPackageManager().getApplicationInfo(packageName, 0).uid == uid;
}
@Override
public void postNotification(long id, Notification notification) {
/**
* TODO: The system notification manager takes ints, not longs, as IDs, but the download manager uses IDs take straight from the database, which are longs. This will have to be dealt with at some point.
*/
mNotificationManager.notify((int) id, notification);
}
@Override
public void cancelNotification(long id) {
mNotificationManager.cancel((int) id);
}
@Override
public void cancelAllNotifications() {
mNotificationManager.cancelAll();
}
@Override
public void startThread(Thread thread, boolean joinToThreadPool) {
if(joinToThreadPool){
threadPoolExecutor.execute(thread);
}else{
thread.start();
}
}
}