made bug report works again
This commit is contained in:
parent
593027bad0
commit
9e991346e1
|
@ -35,11 +35,16 @@ Twidere is a powerful twitter client for Android 4.0+, which gives you a full Ma
|
||||||
|
|
||||||
## Credits ##
|
## Credits ##
|
||||||
|
|
||||||
|
### Material re-design ###
|
||||||
|
|
||||||
|
* [@Uucky_Lee](https://twitter.com/Uucky_Lee)
|
||||||
|
|
||||||
### Icon designers ###
|
### Icon designers ###
|
||||||
|
|
||||||
* [@lordfriend](https://twitter.com/#!/lordfriend)
|
* [@Linkzero](https://twitter.com/Linkzero)
|
||||||
* [@ilovinheart](https://twitter.com/#!/ilovinheart) (0.0.7 version)
|
* [@lordfriend](https://twitter.com//lordfriend)
|
||||||
* [@Rieya](https://twitter.com/#!/Rieya) (0.0.6 version)
|
* [@ilovinheart](https://twitter.com/ilovinheart) (0.0.7 version)
|
||||||
|
* [@Rieya](https://twitter.com/Rieya) (0.0.6 version)
|
||||||
|
|
||||||
Thanks to their excellent design!
|
Thanks to their excellent design!
|
||||||
|
|
||||||
|
@ -91,7 +96,7 @@ Bitcoin: 1FHAVAzge7cj1LfCTMfnLL49DgA3mVUCuW
|
||||||
|
|
||||||
[@TwidereProject/donators](https://twitter.com/TwidereProject/lists/donators), if you haven't find your name, please contact @TwidereProject :)
|
[@TwidereProject/donators](https://twitter.com/TwidereProject/lists/donators), if you haven't find your name, please contact @TwidereProject :)
|
||||||
|
|
||||||
Buy me a bread or anything you want :)
|
Buy me a ~~bread~~ [game](http://steamcommunity.com/id/mariotaku/wishlist) or anything you want :)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
/build
|
/build
|
||||||
|
|
||||||
|
res-localized/
|
|
@ -44,6 +44,11 @@ android {
|
||||||
versionNameSuffix String.format(" (dev %s)", format.format(new Date()))
|
versionNameSuffix String.format(" (dev %s)", format.format(new Date()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sourceSets {
|
||||||
|
main {
|
||||||
|
res.srcDirs = [project.file("src/$name/res"), project.file("src/$name/res-localized")]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
|
|
@ -590,8 +590,8 @@
|
||||||
android:windowSoftInputMode="stateAlwaysHidden"/>
|
android:windowSoftInputMode="stateAlwaysHidden"/>
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.support.UsageStatisticsActivity"
|
android:name=".activity.support.UsageStatisticsActivity"
|
||||||
android:label="@string/title_activity_usage_statistics" >
|
android:theme="@android:style/Theme.NoDisplay"
|
||||||
</activity>
|
android:label="@string/usage_statistics"/>
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".service.RefreshService"
|
android:name=".service.RefreshService"
|
||||||
|
|
|
@ -54,6 +54,7 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
|
||||||
import org.mariotaku.twidere.view.holder.StatusViewHolder;
|
import org.mariotaku.twidere.view.holder.StatusViewHolder;
|
||||||
|
|
||||||
import edu.tsinghua.spice.Utilies.SpiceProfilingUtil;
|
import edu.tsinghua.spice.Utilies.SpiceProfilingUtil;
|
||||||
|
import edu.tsinghua.spice.Utilies.TypeMappingUtil;
|
||||||
|
|
||||||
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
|
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
|
||||||
|
|
||||||
|
@ -354,17 +355,21 @@ public abstract class AbsStatusesFragment<Data> extends BaseSupportFragment impl
|
||||||
twitter.destroyFavoriteAsync(status.account_id, status.id);
|
twitter.destroyFavoriteAsync(status.account_id, status.id);
|
||||||
//spice
|
//spice
|
||||||
SpiceProfilingUtil.profile(activity, status.account_id, status.id + ",Unfavor,"
|
SpiceProfilingUtil.profile(activity, status.account_id, status.id + ",Unfavor,"
|
||||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
+ status.account_id + "," + status.user_id + "," + status.reply_count
|
||||||
|
+ "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||||
SpiceProfilingUtil.log(activity, status.id + ",Unfavor,"
|
SpiceProfilingUtil.log(activity, status.id + ",Unfavor,"
|
||||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
+ status.account_id + "," + status.user_id + "," + status.reply_count
|
||||||
|
+ "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||||
//end
|
//end
|
||||||
} else {
|
} else {
|
||||||
twitter.createFavoriteAsync(status.account_id, status.id);
|
twitter.createFavoriteAsync(status.account_id, status.id);
|
||||||
//spice
|
//spice
|
||||||
SpiceProfilingUtil.profile(activity, status.account_id, status.id + ",Favor,"
|
SpiceProfilingUtil.profile(activity, status.account_id, status.id + ",Favor,"
|
||||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
+ status.account_id + "," + status.user_id + "," + status.reply_count
|
||||||
|
+ "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||||
SpiceProfilingUtil.log(activity, status.id + ",Favor,"
|
SpiceProfilingUtil.log(activity, status.id + ",Favor,"
|
||||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
+ status.account_id + "," + status.user_id + "," + status.reply_count
|
||||||
|
+ "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||||
//end
|
//end
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -452,6 +457,16 @@ public abstract class AbsStatusesFragment<Data> extends BaseSupportFragment impl
|
||||||
final ParcelableStatus status = mAdapter.getStatus(position);
|
final ParcelableStatus status = mAdapter.getStatus(position);
|
||||||
if (status == null) return;
|
if (status == null) return;
|
||||||
Utils.openMedia(getActivity(), status, media);
|
Utils.openMedia(getActivity(), status, media);
|
||||||
|
//spice
|
||||||
|
SpiceProfilingUtil.log(getActivity(),
|
||||||
|
status.id + ",Clicked," + status.account_id + "," + status.user_id + ","
|
||||||
|
+ status.text_plain.length() + "," + media.media_url + ","
|
||||||
|
+ TypeMappingUtil.getMediaType(media.type) + "," + status.timestamp);
|
||||||
|
SpiceProfilingUtil.profile(getActivity(), status.account_id,
|
||||||
|
status.id + ",Clicked," + status.account_id + "," + status.user_id + ","
|
||||||
|
+ status.text_plain.length() + "," + media.media_url + ","
|
||||||
|
+ TypeMappingUtil.getMediaType(media.type) + "," + status.timestamp);
|
||||||
|
//end
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRefreshProgressOffset() {
|
private void updateRefreshProgressOffset() {
|
||||||
|
|
|
@ -391,7 +391,7 @@ public class StatusFragment extends BaseSupportFragment
|
||||||
+ "," + status.text_plain.length() + "," + status.timestamp);
|
+ "," + status.text_plain.length() + "," + status.timestamp);
|
||||||
} else {
|
} else {
|
||||||
for (final ParcelableMedia spiceMedia : status.media) {
|
for (final ParcelableMedia spiceMedia : status.media) {
|
||||||
if (TypeMappingUtil.getMediaType(spiceMedia.type).equals("image")) {
|
if (spiceMedia.type == ParcelableMedia.TYPE_IMAGE) {
|
||||||
SpiceProfilingUtil.profile(getActivity(), status.account_id,
|
SpiceProfilingUtil.profile(getActivity(), status.account_id,
|
||||||
status.id + ",PreviewM," + status.account_id + "," + status.user_id
|
status.id + ",PreviewM," + status.account_id + "," + status.user_id
|
||||||
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||||
|
|
|
@ -24,28 +24,24 @@ import android.os.Build;
|
||||||
import android.os.Build.VERSION;
|
import android.os.Build.VERSION;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.JsonReader;
|
import android.util.JsonReader;
|
||||||
|
import android.util.JsonWriter;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.squareup.okhttp.MediaType;
|
|
||||||
import com.squareup.okhttp.OkHttpClient;
|
|
||||||
import com.squareup.okhttp.Request;
|
|
||||||
import com.squareup.okhttp.Request.Builder;
|
|
||||||
import com.squareup.okhttp.RequestBody;
|
|
||||||
import com.squareup.okhttp.Response;
|
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.acra.ErrorReporter;
|
import org.acra.ErrorReporter;
|
||||||
import org.acra.ReportField;
|
import org.acra.ReportField;
|
||||||
import org.acra.collector.CrashReportData;
|
import org.acra.collector.CrashReportData;
|
||||||
import org.acra.sender.ReportSender;
|
import org.acra.sender.ReportSender;
|
||||||
import org.acra.sender.ReportSenderException;
|
import org.acra.sender.ReportSenderException;
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.mariotaku.twidere.BuildConfig;
|
import org.mariotaku.twidere.BuildConfig;
|
||||||
import org.mariotaku.twidere.Constants;
|
import org.mariotaku.twidere.Constants;
|
||||||
import org.mariotaku.twidere.app.TwidereApplication;
|
import org.mariotaku.twidere.app.TwidereApplication;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
@ -63,7 +59,7 @@ public class BugReporter implements Constants {
|
||||||
|
|
||||||
public static class GitHubIssueReportSender implements ReportSender {
|
public static class GitHubIssueReportSender implements ReportSender {
|
||||||
|
|
||||||
private static final String AUTH_TOKEN = "208aacee0f51338a85ba5e9e3da54859981456ca";
|
private static final String AUTH_TOKEN = "be96f826b8d1947e3a988cace182b57bf8b2cd00";
|
||||||
private static final String USER_REPO = "mariotaku-bugreport/Twidere-Android.bugreport.test";
|
private static final String USER_REPO = "mariotaku-bugreport/Twidere-Android.bugreport.test";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -83,23 +79,19 @@ public class BugReporter implements Constants {
|
||||||
titleBuilder.append(checksum);
|
titleBuilder.append(checksum);
|
||||||
titleBuilder.append(" ");
|
titleBuilder.append(" ");
|
||||||
titleBuilder.append(titleContent);
|
titleBuilder.append(titleContent);
|
||||||
final JSONObject json = new JSONObject();
|
|
||||||
try {
|
|
||||||
json.put("title", titleBuilder.toString());
|
|
||||||
json.put("body", bodyBuilder.toString());
|
|
||||||
} catch (JSONException e) {
|
|
||||||
throw new ReportSenderException("Error processing report json", e);
|
|
||||||
}
|
|
||||||
final OkHttpClient client = new OkHttpClient();
|
|
||||||
final Request.Builder searchIssueBuilder = new Request.Builder();
|
|
||||||
final String query = String.format(Locale.ROOT, "%s repo:%s", checksum, USER_REPO);
|
final String query = String.format(Locale.ROOT, "%s repo:%s", checksum, USER_REPO);
|
||||||
final Uri.Builder searchIssueUrlBuilder = Uri.parse("https://api.github.com/search/issues").buildUpon();
|
final Uri.Builder searchIssueUrlBuilder = Uri.parse("https://api.github.com/search/issues").buildUpon();
|
||||||
searchIssueUrlBuilder.appendQueryParameter("q", query);
|
searchIssueUrlBuilder.appendQueryParameter("q", query);
|
||||||
searchIssueBuilder.url(searchIssueUrlBuilder.build().toString());
|
HttpURLConnection searchIssueConnection = null;
|
||||||
authorizeRequest(searchIssueBuilder);
|
int searchIssueConnectionStatus = -1;
|
||||||
try {
|
try {
|
||||||
final Response response = client.newCall(searchIssueBuilder.build()).execute();
|
searchIssueConnection = (HttpURLConnection) new URL(searchIssueUrlBuilder.build().toString()).openConnection();
|
||||||
final JsonReader jsonReader = new JsonReader(response.body().charStream());
|
searchIssueConnection.setRequestMethod("GET");
|
||||||
|
authorizeRequest(searchIssueConnection);
|
||||||
|
searchIssueConnection.setDoInput(true);
|
||||||
|
searchIssueConnectionStatus = searchIssueConnection.getResponseCode();
|
||||||
|
final InputStreamReader reader = new InputStreamReader(searchIssueConnection.getInputStream());
|
||||||
|
final JsonReader jsonReader = new JsonReader(reader);
|
||||||
boolean isDuplicate = false;
|
boolean isDuplicate = false;
|
||||||
jsonReader.beginObject();
|
jsonReader.beginObject();
|
||||||
while (jsonReader.hasNext()) {
|
while (jsonReader.hasNext()) {
|
||||||
|
@ -115,18 +107,34 @@ public class BugReporter implements Constants {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
final String msg = "Network error when searching issues";
|
final String msg = "Network error when searching issues, code " + searchIssueConnectionStatus;
|
||||||
Log.w(LOGTAG, msg, e);
|
Log.w(LOGTAG, msg, e);
|
||||||
throw new ReportSenderException(msg, e);
|
throw new ReportSenderException(msg, e);
|
||||||
|
} finally {
|
||||||
|
if (searchIssueConnection != null) {
|
||||||
|
searchIssueConnection.disconnect();
|
||||||
}
|
}
|
||||||
final RequestBody issueBody = RequestBody.create(MediaType.parse("application/json"), json.toString());
|
}
|
||||||
final Request.Builder createIssueBuilder = new Request.Builder();
|
|
||||||
createIssueBuilder.url(String.format(Locale.ROOT, "https://api.github.com/repos/%s/issues", USER_REPO));
|
createIssue(bodyBuilder.toString(), titleBuilder.toString());
|
||||||
createIssueBuilder.post(issueBody);
|
}
|
||||||
authorizeRequest(createIssueBuilder);
|
|
||||||
|
private void createIssue(String body, String title) throws ReportSenderException {
|
||||||
|
HttpURLConnection createIssueConnection;
|
||||||
try {
|
try {
|
||||||
final Response response = client.newCall(createIssueBuilder.build()).execute();
|
createIssueConnection = (HttpURLConnection) new URL(String.format(Locale.ROOT, "https://api.github.com/repos/%s/issues", USER_REPO)).openConnection();
|
||||||
final String location = response.header("Location");
|
createIssueConnection.setRequestMethod("POST");
|
||||||
|
authorizeRequest(createIssueConnection);
|
||||||
|
createIssueConnection.setRequestProperty("Content-Type", "application/json");
|
||||||
|
createIssueConnection.setDoOutput(true);
|
||||||
|
final JsonWriter writer = new JsonWriter(new OutputStreamWriter(createIssueConnection.getOutputStream()));
|
||||||
|
writer.beginObject();
|
||||||
|
writer.name("title").value(title);
|
||||||
|
writer.name("body").value(body);
|
||||||
|
writer.endObject();
|
||||||
|
writer.flush();
|
||||||
|
createIssueConnection.connect();
|
||||||
|
final String location = createIssueConnection.getHeaderField("Location");
|
||||||
if (!TextUtils.isEmpty(location)) {
|
if (!TextUtils.isEmpty(location)) {
|
||||||
Log.d(LOGTAG, "Issue created at " + location);
|
Log.d(LOGTAG, "Issue created at " + location);
|
||||||
}
|
}
|
||||||
|
@ -166,10 +174,10 @@ public class BugReporter implements Constants {
|
||||||
bodyBuilder.append("\n````");
|
bodyBuilder.append("\n````");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void authorizeRequest(Builder builder) {
|
private void authorizeRequest(HttpURLConnection builder) {
|
||||||
builder.header("Authorization", "token " + AUTH_TOKEN);
|
builder.setRequestProperty("Authorization", String.format(Locale.ROOT, "token %s", AUTH_TOKEN));
|
||||||
builder.header("Accept", "application/vnd.github.v3+json");
|
builder.setRequestProperty("Accept", "application/vnd.github.v3+json");
|
||||||
builder.header("User-Agent", "Twidere (" + BuildConfig.VERSION_NAME + ")");
|
builder.setRequestProperty("User-Agent", "Twidere (" + BuildConfig.VERSION_NAME + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -729,10 +729,6 @@
|
||||||
<string name="permission_description_shorten_status">Application can shorten tweet for Twidere, so it can access your tweet to send.</string>
|
<string name="permission_description_shorten_status">Application can shorten tweet for Twidere, so it can access your tweet to send.</string>
|
||||||
<string name="permission_description_upload_media">Application can upload media for Twidere, so it can access media in your tweet to send.</string>
|
<string name="permission_description_upload_media">Application can upload media for Twidere, so it can access media in your tweet to send.</string>
|
||||||
<string name="permission_description_sync_timeline">Application can sync read position for Twidere, so it can access your read position.</string>
|
<string name="permission_description_sync_timeline">Application can sync read position for Twidere, so it can access your read position.</string>
|
||||||
<string name="title_activity_usage_statistics">UsageStatisticsActivity</string>
|
|
||||||
|
|
||||||
<string name="hello_world">Hello world!</string>
|
|
||||||
<string name="action_settings">Settings</string>
|
|
||||||
<string name="usage_statistics_notification_summary">Help us improve Twidere!</string>
|
<string name="usage_statistics_notification_summary">Help us improve Twidere!</string>
|
||||||
<string name="from_name">From <xliff:g id="name">%1$s</xliff:g></string>
|
<string name="from_name">From <xliff:g id="name">%1$s</xliff:g></string>
|
||||||
<string name="from_name_and_name">From <xliff:g id="name">%1$s</xliff:g> and <xliff:g id="name">%2$s</xliff:g></string>
|
<string name="from_name_and_name">From <xliff:g id="name">%1$s</xliff:g> and <xliff:g id="name">%2$s</xliff:g></string>
|
||||||
|
|
Loading…
Reference in New Issue