|
|
@@ -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); |
|
|
} |
|
|
} |
|
|
} |