package com.fizzbuzz.android.versionutil;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.Build;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.os.StrictMode.VmPolicy;
import com.fizzbuzz.android.versionutil.VersionedStrictModeWrapper.StrictModeWrapper.ThreadPolicyWrapper;
import com.fizzbuzz.android.versionutil.VersionedStrictModeWrapper.StrictModeWrapper.VmPolicyWrapper;
public class VersionedStrictModeWrapper {
public interface StrictModeWrapper {
public void init(Context context);
public ThreadPolicyWrapper allowThreadDiskReads();
public ThreadPolicyWrapper allowThreadDiskWrites();
public ThreadPolicyWrapper allowThreadNetwork();
public void setThreadPolicy(ThreadPolicyWrapper wrapper);
public void setVmPolicy(VmPolicyWrapper wrapper);
public static interface ThreadPolicyWrapper {
}
public static interface VmPolicyWrapper {
}
}
static public StrictModeWrapper getInstance() {
StrictModeWrapper wrapper = null;
final int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion >= Build.VERSION_CODES.GINGERBREAD) {
wrapper = new GingerbreadStrictModeWrapper();
}
else {
wrapper = new NoopStrictModeWrapper();
}
return wrapper;
}
static class NoopStrictModeWrapper implements StrictModeWrapper {
@Override
public void init(final Context context) {
}
@Override
public ThreadPolicyWrapper allowThreadDiskReads() {
return null;
}
@Override
public ThreadPolicyWrapper allowThreadDiskWrites() {
return null;
}
@Override
public ThreadPolicyWrapper allowThreadNetwork() {
return null;
}
@Override
public void setThreadPolicy(final ThreadPolicyWrapper wrapper) {
};
@Override
public void setVmPolicy(final VmPolicyWrapper wrapper) {
};
}
@SuppressLint("NewApi")
static class GingerbreadStrictModeWrapper implements StrictModeWrapper {
@Override
public void init(final Context context) {
if ((context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
StrictMode.enableDefaults();
}
}
@Override
public ThreadPolicyWrapper allowThreadDiskReads() {
return new GingerbreadThreadPolicyWrapper(StrictMode.allowThreadDiskReads());
}
@Override
public ThreadPolicyWrapper allowThreadDiskWrites() {
return new GingerbreadThreadPolicyWrapper(StrictMode.allowThreadDiskWrites());
}
@Override
public ThreadPolicyWrapper allowThreadNetwork() {
ThreadPolicy origPolicy = StrictMode.getThreadPolicy();
ThreadPolicy newPolicy = new ThreadPolicy.Builder(origPolicy).permitNetwork().build();
StrictMode.setThreadPolicy(newPolicy);
return new GingerbreadThreadPolicyWrapper(origPolicy);
}
@Override
public void setThreadPolicy(final ThreadPolicyWrapper wrapper) {
StrictMode.setThreadPolicy(((GingerbreadThreadPolicyWrapper) wrapper).getPolicy());
}
@Override
public void setVmPolicy(final VmPolicyWrapper wrapper) {
StrictMode.setVmPolicy(((GingerbreadVmPolicyWrapper) wrapper).getPolicy());
}
}
static class GingerbreadThreadPolicyWrapper implements ThreadPolicyWrapper {
private final ThreadPolicy mPolicy;
public GingerbreadThreadPolicyWrapper(final StrictMode.ThreadPolicy policy) {
mPolicy = policy;
}
public StrictMode.ThreadPolicy getPolicy() {
return mPolicy;
}
}
static class GingerbreadVmPolicyWrapper implements VmPolicyWrapper {
private final VmPolicy mPolicy;
public GingerbreadVmPolicyWrapper(final StrictMode.VmPolicy policy) {
mPolicy = policy;
}
public StrictMode.VmPolicy getPolicy() {
return mPolicy;
}
}
}