diff --git a/README.markdown b/README.markdown index 3ab45bc72..8946ca980 100644 --- a/README.markdown +++ b/README.markdown @@ -35,11 +35,16 @@ Twidere is a powerful twitter client for Android 4.0+, which gives you a full Ma ## Credits ## +### Material re-design ### + +* [@Uucky_Lee](https://twitter.com/Uucky_Lee) + ### Icon designers ### -* [@lordfriend](https://twitter.com/#!/lordfriend) -* [@ilovinheart](https://twitter.com/#!/ilovinheart) (0.0.7 version) -* [@Rieya](https://twitter.com/#!/Rieya) (0.0.6 version) +* [@Linkzero](https://twitter.com/Linkzero) +* [@lordfriend](https://twitter.com//lordfriend) +* [@ilovinheart](https://twitter.com/ilovinheart) (0.0.7 version) +* [@Rieya](https://twitter.com/Rieya) (0.0.6 version) 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 :) -Buy me a bread or anything you want :) +Buy me a ~~bread~~ [game](http://steamcommunity.com/id/mariotaku/wishlist) or anything you want :) --- diff --git a/twidere/.gitignore b/twidere/.gitignore index 796b96d1c..a7dec9624 100644 --- a/twidere/.gitignore +++ b/twidere/.gitignore @@ -1 +1,3 @@ /build + +res-localized/ \ No newline at end of file diff --git a/twidere/build.gradle b/twidere/build.gradle index f56847eb8..9c7eb2e83 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -44,6 +44,11 @@ android { 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 { diff --git a/twidere/src/main/AndroidManifest.xml b/twidere/src/main/AndroidManifest.xml index b3f39b95f..6ae4359b1 100644 --- a/twidere/src/main/AndroidManifest.xml +++ b/twidere/src/main/AndroidManifest.xml @@ -1,60 +1,60 @@ + package="org.mariotaku.twidere" + android:installLocation="auto"> - + + android:required="false"/> + android:required="false"/> + android:required="false"/> + android:required="false"/> + android:required="false"/> + android:required="false"/> + android:required="true"/> - - - - - - - - - - - + + + + + + + + + + + + android:label="@string/app_name"/> + android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/> + android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/> + android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/> + android:theme="@style/Theme.Blank"> + android:required="false"/> + android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA"/> + android:value="true"/> + android:value="480dp"/> + android:value="640dp"/> + android:value="240dp"/> + android:value="320dp"/> + android:value="true"/> + android:windowSoftInputMode="adjustNothing"> - + - - - + + + + android:windowSoftInputMode="adjustResize"> - + - - - + + + + android:windowSoftInputMode="adjustResize"> - + - + - + - + + android:resource="@xml/searchable"/> + android:value=".activity.support.HomeActivity"/> - - - - - - - - + android:windowSoftInputMode="adjustResize"> + + + + + + + + - + - - - + + + - + - - + + + android:value=".activity.support.HomeActivity"/> + android:windowSoftInputMode="adjustResize"> - + - + + android:windowSoftInputMode="adjustResize"> - + - + + android:windowSoftInputMode="adjustResize"> - + - + + android:windowSoftInputMode="adjustResize"> - - + + - + + android:value=".activity.support.HomeActivity"/> + android:label="@string/filters"> - + - + + android:value=".activity.support.HomeActivity"/> + android:windowSoftInputMode="adjustResize"/> + android:theme="@style/Theme.Blank.Dialog"> - + - + + android:label="@string/browser"> - + - + - - - + + + + android:theme="@style/Theme.Twidere.Light.NoDisplay"/> + android:windowSoftInputMode="adjustResize"> + android:value=".activity.support.HomeActivity"/> - + - - + + + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:scheme="twidere"/> + android:launchMode="singleTop"> - + - + + android:value=".activity.support.HomeActivity"/> + android:launchMode="singleTop"> - + - + + android:value=".activity.support.HomeActivity"/> + android:theme="@style/Theme.Twidere.Viewer"> - + - - + + - - - + + + + android:windowSoftInputMode="adjustResize"> - - + + - + + android:windowSoftInputMode="adjustResize"> - - - + + + - + + android:windowSoftInputMode="adjustResize"> - + - + + android:theme="@style/Theme.Blank"/> + android:windowSoftInputMode="adjustResize"> - - + + - + + android:theme="@style/Theme.Twidere.Dark.NoDisplay"> - + - + + android:theme="@style/Theme.Blank.Dialog"> - + - + + android:exported="false"> - + - + + android:theme="@style/Theme.Blank.Dialog"> - - + + - + + android:theme="@style/Theme.Twidere.Wizard"/> + android:theme="@android:style/Theme.NoDisplay"/> + android:theme="@android:style/Theme.NoDisplay"/> + android:theme="@style/Theme.Blank.Dialog"> - + - + + android:theme="@style/Theme.Launcher"> + android:scheme="http"/> + android:scheme="https"/> + android:scheme="http"/> + android:scheme="https"/> + android:scheme="http"/> + android:scheme="https"/> - - + + - - + + + android:theme="@style/Theme.Launcher"> - + - + + android:resource="@drawable/ic_assist_twidere"/> + android:windowSoftInputMode="adjustResize"> - + - + + android:windowSoftInputMode="stateAlwaysHidden"/> - + android:theme="@android:style/Theme.NoDisplay" + android:label="@string/usage_statistics"/> + android:settingsActivity=".activity.SettingsActivity"/> + android:label="@string/label_background_operation_service"/> + android:settingsActivity=".activity.support.UsageStatisticsActivity"/> + android:settingsActivity=".activity.support.UsageStatisticsActivity"/> + android:permission="com.google.android.apps.dashclock.permission.READ_EXTENSION_DATA"> - + + android:value="2"/> + android:value="true"/> + android:value="@string/dashclock_home_unread_count_description"/> + android:permission="com.google.android.apps.dashclock.permission.READ_EXTENSION_DATA"> - + + android:value="2"/> + android:value="true"/> + android:value="@string/dashclock_mentions_unread_count_description"/> + android:permission="com.google.android.apps.dashclock.permission.READ_EXTENSION_DATA"> - + + android:value="2"/> + android:value="true"/> + android:value="@string/dashclock_messages_unread_count_description"/> - - + android:process=":wallpaper"> + + + android:resource="@xml/nyan_wallpaper"/> - - + android:process=":daydream"> + + @@ -697,50 +697,50 @@ android:authorities="twidere" android:exported="true" android:grantUriPermissions="true" - android:label="@string/label_tweetstore_provider" /> + android:label="@string/label_tweetstore_provider"/> + android:exported="true"/> + android:authorities="org.mariotaku.twidere.provider.SearchRecentSuggestions"/> - + - + + android:label="@string/twidere_test"> - + + android:scheme="android_secret_code"/> + android:exported="false"> - - - - + + + + + android:exported="false"> - - - - + + + + diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java index affbd69fb..4ab7dfe57 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java @@ -54,6 +54,7 @@ import org.mariotaku.twidere.view.holder.GapViewHolder; import org.mariotaku.twidere.view.holder.StatusViewHolder; import edu.tsinghua.spice.Utilies.SpiceProfilingUtil; +import edu.tsinghua.spice.Utilies.TypeMappingUtil; import static org.mariotaku.twidere.util.Utils.setMenuForStatus; @@ -354,17 +355,21 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl twitter.destroyFavoriteAsync(status.account_id, status.id); //spice 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," - + 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 } else { twitter.createFavoriteAsync(status.account_id, status.id); //spice 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," - + 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 } break; @@ -452,6 +457,16 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl final ParcelableStatus status = mAdapter.getStatus(position); if (status == null) return; 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() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index aa43c2a00..1eea5add8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -391,7 +391,7 @@ public class StatusFragment extends BaseSupportFragment + "," + status.text_plain.length() + "," + status.timestamp); } else { 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, status.id + ",PreviewM," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/BugReporter.java b/twidere/src/main/java/org/mariotaku/twidere/util/BugReporter.java index f72c7d249..0207665bc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/BugReporter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/BugReporter.java @@ -24,28 +24,24 @@ import android.os.Build; import android.os.Build.VERSION; import android.text.TextUtils; import android.util.JsonReader; +import android.util.JsonWriter; 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.ErrorReporter; import org.acra.ReportField; import org.acra.collector.CrashReportData; import org.acra.sender.ReportSender; import org.acra.sender.ReportSenderException; -import org.json.JSONException; -import org.json.JSONObject; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.app.TwidereApplication; 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.util.Locale; import java.util.Scanner; @@ -63,7 +59,7 @@ public class BugReporter implements Constants { 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"; @Override @@ -83,23 +79,19 @@ public class BugReporter implements Constants { titleBuilder.append(checksum); titleBuilder.append(" "); 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 Uri.Builder searchIssueUrlBuilder = Uri.parse("https://api.github.com/search/issues").buildUpon(); searchIssueUrlBuilder.appendQueryParameter("q", query); - searchIssueBuilder.url(searchIssueUrlBuilder.build().toString()); - authorizeRequest(searchIssueBuilder); + HttpURLConnection searchIssueConnection = null; + int searchIssueConnectionStatus = -1; try { - final Response response = client.newCall(searchIssueBuilder.build()).execute(); - final JsonReader jsonReader = new JsonReader(response.body().charStream()); + searchIssueConnection = (HttpURLConnection) new URL(searchIssueUrlBuilder.build().toString()).openConnection(); + 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; jsonReader.beginObject(); while (jsonReader.hasNext()) { @@ -115,18 +107,34 @@ public class BugReporter implements Constants { return; } } 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); 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)); - createIssueBuilder.post(issueBody); - authorizeRequest(createIssueBuilder); + + createIssue(bodyBuilder.toString(), titleBuilder.toString()); + } + + private void createIssue(String body, String title) throws ReportSenderException { + HttpURLConnection createIssueConnection; try { - final Response response = client.newCall(createIssueBuilder.build()).execute(); - final String location = response.header("Location"); + createIssueConnection = (HttpURLConnection) new URL(String.format(Locale.ROOT, "https://api.github.com/repos/%s/issues", USER_REPO)).openConnection(); + 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)) { Log.d(LOGTAG, "Issue created at " + location); } @@ -166,10 +174,10 @@ public class BugReporter implements Constants { bodyBuilder.append("\n````"); } - private void authorizeRequest(Builder builder) { - builder.header("Authorization", "token " + AUTH_TOKEN); - builder.header("Accept", "application/vnd.github.v3+json"); - builder.header("User-Agent", "Twidere (" + BuildConfig.VERSION_NAME + ")"); + private void authorizeRequest(HttpURLConnection builder) { + builder.setRequestProperty("Authorization", String.format(Locale.ROOT, "token %s", AUTH_TOKEN)); + builder.setRequestProperty("Accept", "application/vnd.github.v3+json"); + builder.setRequestProperty("User-Agent", "Twidere (" + BuildConfig.VERSION_NAME + ")"); } } } diff --git a/twidere/src/main/res/values/strings.xml b/twidere/src/main/res/values/strings.xml index 9f1911548..1c0d8c9f7 100644 --- a/twidere/src/main/res/values/strings.xml +++ b/twidere/src/main/res/values/strings.xml @@ -729,10 +729,6 @@ Application can shorten tweet for Twidere, so it can access your tweet to send. Application can upload media for Twidere, so it can access media in your tweet to send. Application can sync read position for Twidere, so it can access your read position. - UsageStatisticsActivity - - Hello world! - Settings Help us improve Twidere! From %1$s From %1$s and %2$s