Ever hid debug functions in your UI? Here is now a clean way to do it!
DebugKit lib for Android allows you to use a fancy hovering debug tool to trigger some actions directly in the app. This tool is very useful to trigger some event at runtime, and to have a written feedback directly on your testing phone screen.


Requirements
- Android SDK 15+
Installation
repositories {
jcenter()
}
dependencies {
compile 'com.hulab.android:debugkit:1.0.3'
}
Download Sourecode
Usage Code
final DevTool.Builder builder = new DevTool.Builder(mContext);
builder.addFunction(new DebugFunction() {
@Override
public String call() throws Exception {
log("doing some stuff...");
doSomeStuff();
return "Some stuff was done.";
}
}).addFunction(new DebugFunction() {
@Override
public String call() throws Exception {
log("doing some other stuff...");
doSomeStuff();
return "Some stuff was done.";
}
}).addFunction(new DebugFunction() {
@Override
public String call() throws Exception {
log("doing some stuff again and again...");
doSomeStuff();
return "Some stuff was done.";
}
});
// optional, DevToolFragment.DevToolTheme.DARK is set by default
builder.setTheme(DevToolFragment.DevToolTheme.DARK)
.build();
Result
Here we have 3 debug tools, from top to bottom:
- LIGHT theme with 5 defined functions
- Minified mode (clicking on the top left corner arrow)
- DARK theme with 3 defined functions and the logged text when clicking on each F1, F2 and F3

Ex code
public class ExampleActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private int mTextSize = 12;
private SeekBar mSeekbar;
private DevToolFragment.DevToolTheme mTheme = DevToolFragment.DevToolTheme.DARK;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
final TextView functionNumber = (TextView) findViewById(R.id.functions_number);
final Spinner themeSpinner = (Spinner) findViewById(R.id.theme_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.debugkit_themes, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
themeSpinner.setAdapter(adapter);
themeSpinner.setOnItemSelectedListener(this);
mSeekbar = (SeekBar) findViewById(R.id.seekBar);
mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
functionNumber.setText(Integer.toString(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
functionNumber.setText(Integer.toString(mSeekbar.getProgress()));
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final DevTool.Builder builder = new DevTool.Builder(ExampleActivity.this);
if (mSeekbar != null) {
for (int i = 0; i < mSeekbar.getProgress(); i++) {
builder.addFunction(doSomeStuff());
}
}
builder.setTextSize(mTextSize)
.setTheme(mTheme)
.build();
// After the tool has been built, you can set:
// builder.getTool().changeConsoleTextSize(mTextSize);
}
});
}
private DebugFunction doSomeStuff() {
return new DebugFunction() {
@Override
public String call() throws Exception {
// Do some kind of really debugging stuff...
return "Some stuff was done.";
}
};
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
mTheme = position == 0 ? DevToolFragment.DevToolTheme.DARK : DevToolFragment.DevToolTheme.LIGHT;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
mTheme = DevToolFragment.DevToolTheme.DARK;
}

Share your thoughts