package tv.danmaku.android.support;
import tv.danmaku.android.BuildHelper;
import android.annotation.TargetApi;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.os.StrictMode.VmPolicy;
public class StrictModeHelper {
/*--------------------------------------
* Thread Policy
*/
private static final boolean THREAD__DETECT_CUSTOM_SLOW_CALLS = true;
private static final boolean THREAD__DETECT_DISK_READS = false;
private static final boolean THREAD__DETECT_DISK_WRITES = false;
private static final boolean THREAD__DETECT_NETWORK = true;
private enum ThreadPenalty {
Death, DeathOnNetwork, Dialog, DropBox, FlashScreen, Log
};
private static ThreadPenalty sThreadPenalty = ThreadPenalty.Log;
/*--------------------------------------
* VM Policy
*/
private static final boolean VM__DETECT_LEAKED_CLOSABLE_OBJECT = true;
private static final boolean VM__DETECT_LEAKED_REGISTRATION_OBJECTS = true;
private static final boolean VM__DETECT_LEAKED_SQLLITE_OBJECTS = true;
private enum VmPenalty {
Death, DropBox, Log
};
private static VmPenalty sVmPenalty = VmPenalty.Log;
/*--------------------------------------
* Methods
*/
@TargetApi(16)
public static void setStrictMode_Predefined() {
if (!BuildHelper.isApi9_GingerBreadOrLater())
return;
/*--------------------------------------
* Thread Policy
*/
ThreadPolicy.Builder threadPolicyBuilder = new ThreadPolicy.Builder();
if (THREAD__DETECT_CUSTOM_SLOW_CALLS)
if (BuildHelper.isApi11_HoneyCombOrLater())
threadPolicyBuilder = threadPolicyBuilder
.detectCustomSlowCalls();
if (THREAD__DETECT_DISK_READS)
threadPolicyBuilder = threadPolicyBuilder.detectDiskReads();
if (THREAD__DETECT_DISK_WRITES)
threadPolicyBuilder = threadPolicyBuilder.detectDiskWrites();
if (THREAD__DETECT_NETWORK)
threadPolicyBuilder = threadPolicyBuilder.detectNetwork();
switch (sThreadPenalty) {
case Death:
threadPolicyBuilder = threadPolicyBuilder.penaltyDeath();
break;
case Dialog:
threadPolicyBuilder = threadPolicyBuilder.penaltyDialog();
break;
case DropBox:
threadPolicyBuilder = threadPolicyBuilder.penaltyDropBox();
break;
case Log:
threadPolicyBuilder = threadPolicyBuilder.penaltyLog();
break;
case DeathOnNetwork:
if (BuildHelper.isApi11_HoneyCombOrLater())
threadPolicyBuilder = threadPolicyBuilder
.penaltyDeathOnNetwork();
else
threadPolicyBuilder = threadPolicyBuilder.penaltyLog();
break;
case FlashScreen:
if (BuildHelper.isApi11_HoneyCombOrLater())
threadPolicyBuilder = threadPolicyBuilder.penaltyFlashScreen();
else
threadPolicyBuilder = threadPolicyBuilder.penaltyLog();
break;
}
StrictMode.setThreadPolicy(threadPolicyBuilder.build());
/*--------------------------------------
* VM Policy
*/
VmPolicy.Builder vmPolicyBuilder = new VmPolicy.Builder();
if (VM__DETECT_LEAKED_CLOSABLE_OBJECT)
if (BuildHelper.isApi11_HoneyCombOrLater())
vmPolicyBuilder = vmPolicyBuilder.detectLeakedClosableObjects();
if (VM__DETECT_LEAKED_REGISTRATION_OBJECTS)
if (BuildHelper.isApi16_JellyBeanOrLater())
vmPolicyBuilder = vmPolicyBuilder
.detectLeakedRegistrationObjects();
if (VM__DETECT_LEAKED_SQLLITE_OBJECTS)
vmPolicyBuilder = vmPolicyBuilder.detectLeakedSqlLiteObjects();
switch (sVmPenalty) {
case Death:
vmPolicyBuilder = vmPolicyBuilder.penaltyDeath();
break;
case DropBox:
vmPolicyBuilder = vmPolicyBuilder.penaltyDropBox();
break;
case Log:
vmPolicyBuilder = vmPolicyBuilder.penaltyLog();
break;
}
StrictMode.setVmPolicy(vmPolicyBuilder.build());
}
@TargetApi(9)
public static void setStrictMode_DetectAll_PenaltyDeatch() {
if (BuildHelper.isApi9_GingerBreadOrLater()) {
StrictMode.setThreadPolicy(new ThreadPolicy.Builder().detectAll()
.penaltyDeath().build());
StrictMode.setVmPolicy(new VmPolicy.Builder().detectAll()
.penaltyDeath().build());
}
}
}