Skip to content

Instantly share code, notes, and snippets.

@jonfhancock
Created June 14, 2016 16:12
Show Gist options
  • Save jonfhancock/4651f978ebbaa34e31efe3adeef0f123 to your computer and use it in GitHub Desktop.
Save jonfhancock/4651f978ebbaa34e31efe3adeef0f123 to your computer and use it in GitHub Desktop.
This method can be called by your Application class onCreate(), or even your first Activity. After that, for debug builds only, you can manipulate StrictMode settings at any time without inconveniencing your QA team.
/**
* For debug builds, this adds the ability to set up StrictMode on the fly via the command line with a command like
* adb shell am broadcast -a com.your.pakcage.action_change_strict_mode --ez enabled true --esa penalties log\,flash\,death
*/
private void setupStrictModeReceiver() {
if (BuildConfig.DEBUG) {
final String tag = "StrictModeReceiver";
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.your.package.action_change_strict_mode");
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(tag, "Got a command to change strict mode");
boolean enabled = intent.getBooleanExtra("enabled", false);
String[] penalties = intent.getStringArrayExtra("penalties");
if(penalties == null || penalties.length == 0){
penalties = new String[]{"log"};
}
Log.d(tag,"Enabling StrictMode with penalties = " + Arrays.toString(penalties));
StrictMode.ThreadPolicy threadPolicy;
StrictMode.VmPolicy vmPolicy;
if (enabled) {
final StrictMode.ThreadPolicy.Builder thredPolicyBuilder = new StrictMode.ThreadPolicy.Builder();
thredPolicyBuilder
.detectAll()
.permitDiskReads()
.permitDiskWrites();
for(int i = 0;i<penalties.length;i++) {
switch (penalties[i]) {
case "death":
thredPolicyBuilder.penaltyLog();
break;
case "dialog":
thredPolicyBuilder.penaltyDialog();
break;
case "flash":
thredPolicyBuilder.penaltyFlashScreen();
break;
case "deathOnNetwork":
thredPolicyBuilder.penaltyDeathOnNetwork();
break;
case "dropbox":
thredPolicyBuilder.penaltyDropBox();
case "log":
default:
thredPolicyBuilder.penaltyLog();
}
}
threadPolicy = thredPolicyBuilder.build();
final StrictMode.VmPolicy.Builder vmPolicyBuilder = new StrictMode.VmPolicy.Builder();
vmPolicyBuilder.detectAll();
for(int i = 0;i<penalties.length;i++) {
switch (penalties[i]) {
case "death":
vmPolicyBuilder.penaltyLog();
break;
case "dialog":
case "flash":
case "deathOnNetwork":
// These don't apply to VmPolicy.
break;
case "dropbox":
vmPolicyBuilder.penaltyDropBox();
case "log":
default:
vmPolicyBuilder.penaltyLog();
}
}
vmPolicy = vmPolicyBuilder.build();
}else{
Log.d(tag,"Disabling StrictMode");
vmPolicy = StrictMode.VmPolicy.LAX;
threadPolicy = StrictMode.ThreadPolicy.LAX;
}
StrictMode.setVmPolicy(vmPolicy);
StrictMode.setThreadPolicy(threadPolicy);
}
}, intentFilter);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment