Skip to content

Instantly share code, notes, and snippets.

@importre
Forked from pyricau/LeakSlackUploadService.java
Last active August 29, 2015 14:21
Show Gist options
  • Save importre/a01b965eaefcd489d02d to your computer and use it in GitHub Desktop.
Save importre/a01b965eaefcd489d02d to your computer and use it in GitHub Desktop.

Revisions

  1. @pyricau pyricau created this gist May 9, 2015.
    75 changes: 75 additions & 0 deletions LeakSlackUploadService.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    import android.util.Log;
    import com.squareup.leakcanary.AnalysisResult;
    import com.squareup.leakcanary.DisplayLeakService;
    import com.squareup.leakcanary.HeapDump;
    import retrofit.RestAdapter;
    import retrofit.RetrofitError;
    import retrofit.http.Multipart;
    import retrofit.http.POST;
    import retrofit.http.Part;
    import retrofit.mime.TypedFile;

    public final class LeakSlackUploadService extends DisplayLeakService {

    /** See https://api.slack.com/ for documentation. */
    public interface SlackApi {
    String TOKEN = "xoxp-SOME-USER-TOKEN";

    String MEMORY_LEAK_CHANNEL = "SOME-CHANNEL-TOKEN";

    @Multipart @POST("/api/files.upload") UploadFileResponse uploadFile(@Part("token") String token,
    @Part("file") TypedFile file, @Part("filetype") String filetype,
    @Part("filename") String filename, @Part("title") String title,
    @Part("initial_comment") String initialComment, @Part("channels") String channels);
    }

    public static class UploadFileResponse {
    boolean ok;
    String error;

    @Override public String toString() {
    return "UploadFileResponse{" +
    "ok=" + ok +
    ", error='" + error + '\'' +
    '}';
    }
    }

    private static final String TAG = "LeakListenerService";

    private static String classSimpleName(String className) {
    int separator = className.lastIndexOf('.');
    return separator == -1 ? className : className.substring(separator + 1);
    }

    private SlackApi slackApi;

    @Override public void onCreate() {
    super.onCreate();
    slackApi = new RestAdapter.Builder() //
    .setEndpoint("https://slack.com") //
    .build() //
    .create(SlackApi.class);
    }

    @Override
    protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
    if (!result.leakFound || result.excludedLeak) {
    return;
    }
    String name = classSimpleName(result.className);
    if (!heapDump.referenceName.equals("")) {
    name += "(" + heapDump.referenceName + ")";
    }

    String title = name + " has leaked";
    String initialComment = leakInfo;
    try {
    slackApi.uploadFile(SlackApi.TOKEN,
    new TypedFile("application/octet-stream", heapDump.heapDumpFile), null,
    heapDump.heapDumpFile.getName(), title, initialComment, SlackApi.MEMORY_LEAK_CHANNEL);
    } catch (RetrofitError e) {
    Log.e(TAG, "Error when uploading heap dump", e);
    }
    }
    }
    5 changes: 5 additions & 0 deletions SquareDebugApplication.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    public class SquareDebugApplication extends SquareApplication {
    @Override protected RefWatcher installLeakCanary() {
    return LeakCanary.install(app, LeakSlackUploadService.class);
    }
    }