package com.prateekj.snooper;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Handler;
import android.support.v4.content.LocalBroadcastManager;
import com.prateekj.snooper.networksnooper.activity.HttpCallListActivity;
import com.prateekj.snooper.infra.CurrentActivityManager;
import com.prateekj.snooper.networksnooper.model.HttpCall;
import com.prateekj.snooper.realm.RealmFactory;
import com.prateekj.snooper.networksnooper.repo.SnooperRepo;
import com.prateekj.snooper.infra.BackgroundManager;
import java.io.IOException;
public class AndroidSnooper implements BackgroundManager.Listener, SnooperShakeAction, CurrentActivityManager.Listener {
public static final String ACTION_END_SNOOPER_FLOW = "com.snooper.END_SNOOPER_FLOW";
private Context context;
private static AndroidSnooper androidSnooper;
private SnooperRepo snooperRepo;
private ShakeDetector shakeDetector;
private Activity currentActivity;
private AndroidSnooper() {}
public void record(final HttpCall httpCall) throws IOException {
Handler handler = new Handler(context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
AndroidSnooper.this.snooperRepo.save(httpCall);
}
});
}
@Override
public void onBecameForeground() {
registerSensorListener();
}
@Override
public void onBecameBackground() {
unRegisterSensorListener();
}
@Override
public void currentActivity(Activity activity) {
this.currentActivity = activity;
}
@Override
public void startSnooperFlow() {
Intent intent = new Intent(AndroidSnooper.this.context, HttpCallListActivity.class);
this.currentActivity.startActivity(intent);
}
@Override
public void endSnooperFlow() {
Intent intent = new Intent(ACTION_END_SNOOPER_FLOW);
LocalBroadcastManager.getInstance(AndroidSnooper.this.context).sendBroadcast(intent);
}
public static AndroidSnooper init(Application application) {
if (androidSnooper != null) {
return androidSnooper;
}
androidSnooper = new AndroidSnooper();
androidSnooper.context = application;
androidSnooper.snooperRepo = new SnooperRepo(RealmFactory.create(androidSnooper.context));
androidSnooper.shakeDetector = new ShakeDetector(new SnooperShakeListener(androidSnooper));
BackgroundManager.getInstance(application).registerListener(androidSnooper);
CurrentActivityManager.getInstance(application).registerListener(androidSnooper);
return androidSnooper;
}
public static AndroidSnooper getInstance() {
if (androidSnooper == null) {
throw new RuntimeException("Android Snooper is not initialized yet");
}
return androidSnooper;
}
private void registerSensorListener() {
SensorManager sManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
Sensor sensor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sManager.registerListener(shakeDetector, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
private void unRegisterSensorListener() {
SensorManager sManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
sManager.unregisterListener(shakeDetector);
}
}