From 6c50013743b8e062011f4aba95b71fed02ef4d02 Mon Sep 17 00:00:00 2001 From: kb10uy Date: Mon, 6 Jul 2015 23:49:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E3=81=A9=E3=81=86=E3=81=9B=E4=BD=95?= =?UTF-8?q?=E3=82=82=E5=A4=89=E3=82=8F=E3=82=89=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/kb10uy/tencocoa/AccountsListActivity.java | 4 +++- .../kb10uy/tencocoa/TencocoaReadPermissionService.java | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java b/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java index f11abd5..6e46686 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java +++ b/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java @@ -106,10 +106,11 @@ protected AccessToken doInBackground(String... params) { return mTwitter.getOAuthAccessToken(mRequestToken, params[0]); } catch (TwitterException e) { e.printStackTrace(); + return null; } catch (IllegalStateException e) { + e.printStackTrace(); return null; } - return null; } @Override @@ -176,6 +177,7 @@ protected String doInBackground(Void... params) { protected void onPostExecute(String url) { if (url != null) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); } } diff --git a/app/src/main/java/org/kb10uy/tencocoa/TencocoaReadPermissionService.java b/app/src/main/java/org/kb10uy/tencocoa/TencocoaReadPermissionService.java index 4d313bf..c06c397 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/TencocoaReadPermissionService.java +++ b/app/src/main/java/org/kb10uy/tencocoa/TencocoaReadPermissionService.java @@ -18,6 +18,7 @@ import twitter4j.TwitterException; import twitter4j.User; import twitter4j.auth.AccessToken; +import twitter4j.auth.RequestToken; public class TencocoaReadPermissionService extends Service { @@ -28,6 +29,7 @@ public class TencocoaReadPermissionService extends Service { private Twitter mTwitter; private NotificationManager mNotificationManager; private TencocoaReadPermissionServiceBinder mBinder = new TencocoaReadPermissionServiceBinder(); + private RequestToken storedToken; @Override public void onCreate() { @@ -83,6 +85,14 @@ public User getTargetUser() { return null; } + public void storeOAuthRequestToken(RequestToken token) { + storedToken = token; + } + + public RequestToken recallOAuthRequestToken() { + return storedToken; + } + public class TencocoaReadPermissionServiceBinder extends Binder { public TencocoaReadPermissionService getService() { return TencocoaReadPermissionService.this; From 3b2c9bb445291a94a6cb0341ad04e6ead2d629ca Mon Sep 17 00:00:00 2001 From: kb10uy Date: Wed, 8 Jul 2015 00:24:24 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=E3=83=AA=E3=83=97=E3=81=AA=E3=81=A9?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E5=AE=9F=E8=A3=85=20=E3=81=82=E3=81=A8?= =?UTF-8?q?=E8=AA=8D=E8=A8=BC=E5=95=8F=E9=A1=8C=E3=82=92=E5=BC=B7=E5=BC=95?= =?UTF-8?q?=E3=81=AB=E8=A7=A3=E6=B1=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kb10uy/tencocoa/AccountsListActivity.java | 19 +- .../org/kb10uy/tencocoa/MainActivity.java | 11 ++ .../tencocoa/StatusDetailDialogFragment.java | 12 +- .../TencocoaWritePermissionService.java | 31 +++ .../kb10uy/tencocoa/model/TencocoaHelper.java | 18 ++ .../fragment_status_detail_dialog.xml | 27 ++- .../res/layout/activity_first_setting.xml | 179 +++++++++--------- .../layout/fragment_status_detail_dialog.xml | 28 ++- app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/strings_settings.xml | 2 + 10 files changed, 240 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java b/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java index 6e46686..d813f2c 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java +++ b/app/src/main/java/org/kb10uy/tencocoa/AccountsListActivity.java @@ -43,10 +43,11 @@ public class AccountsListActivity extends AppCompatActivity { ArrayList accounts; GeneralListAdapter accountsAdapter; Intent resultIntent = new Intent(); + SharedPreferences pref; @Override protected void onCreate(Bundle savedInstanceState) { - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); + pref = PreferenceManager.getDefaultSharedPreferences(this); TencocoaHelper.setCurrentTheme(this, pref.getString(getString(R.string.preference_appearance_theme), "Black")); super.onCreate(savedInstanceState); setContentView(R.layout.activity_accounts_list); @@ -96,6 +97,7 @@ protected void onSaveInstanceState(Bundle outState) { protected void onNewIntent(Intent intent) { if (intent == null || intent.getData() == null || !intent.getData().toString().startsWith(mCallback)) return; + Uri data = intent.getData(); String verifier = intent.getData().getQueryParameter("oauth_verifier"); final Activity ta = this; @@ -103,6 +105,11 @@ protected void onNewIntent(Intent intent) { @Override protected AccessToken doInBackground(String... params) { try { + if (mRequestToken == null) { + String rt = pref.getString(getString(R.string.preference_twitter_request_token), ""); + String rts = pref.getString(getString(R.string.preference_twitter_request_token_secret), ""); + mRequestToken = new RequestToken(rt, rts); + } return mTwitter.getOAuthAccessToken(mRequestToken, params[0]); } catch (TwitterException e) { e.printStackTrace(); @@ -121,6 +128,10 @@ protected void onPostExecute(AccessToken accessToken) { } else { Toast.makeText(ta, R.string.text_activity_accounts_list_failed, Toast.LENGTH_SHORT).show(); } + pref.edit() + .putString(getString(R.string.preference_twitter_request_token), mRequestToken.getToken()) + .putString(getString(R.string.preference_twitter_request_token_secret), mRequestToken.getTokenSecret()) + .apply(); } }; task.execute(verifier); @@ -145,7 +156,7 @@ public boolean onOptionsItemSelected(MenuItem item) { newOAuthAuthorize(); return true; case android.R.id.home: - setResult(RESULT_CANCELED, resultIntent); + setResult(RESULT_CANCELED); finish(); return true; } @@ -166,6 +177,10 @@ private void newOAuthAuthorize() { protected String doInBackground(Void... params) { try { mRequestToken = mTwitter.getOAuthRequestToken(mCallback); + pref.edit() + .putString(getString(R.string.preference_twitter_request_token), mRequestToken.getToken()) + .putString(getString(R.string.preference_twitter_request_token_secret), mRequestToken.getTokenSecret()) + .apply(); return mRequestToken.getAuthorizationURL(); } catch (TwitterException e) { e.printStackTrace(); diff --git a/app/src/main/java/org/kb10uy/tencocoa/MainActivity.java b/app/src/main/java/org/kb10uy/tencocoa/MainActivity.java index 0cf89f8..afbb4fe 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/MainActivity.java +++ b/app/src/main/java/org/kb10uy/tencocoa/MainActivity.java @@ -40,6 +40,7 @@ import java.util.concurrent.CountDownLatch; import io.realm.Realm; +import twitter4j.StatusUpdate; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.User; @@ -171,6 +172,7 @@ protected void onDestroy() { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_CANCELED) return; final TwitterAccountInformation info = (TwitterAccountInformation) data.getSerializableExtra("Information"); bindTencocoaServices(); switch (requestCode) { @@ -544,6 +546,15 @@ protected Realm doInBackground(Void... params) { statusCache.setIsRetweeted(true); statusCache.setIsFavorited(true); break; + case StatusDetailDialogFragment.ACTION_REPLY: + NewStatusDialogFragment dialog = NewStatusDialogFragment.newInstance(); + dialog.show(getFragmentManager(), "NewStatus"); + break; + case StatusDetailDialogFragment.ACTION_REPLY_BLANK: + StatusUpdate update = new StatusUpdate(TencocoaHelper.createReplyTemplate(status)); + update.setInReplyToStatusId(status.getShowingStatus().getId()); + mWritePermissionService.updateStatus(update); + break; } realm.commitTransaction(); return realm; diff --git a/app/src/main/java/org/kb10uy/tencocoa/StatusDetailDialogFragment.java b/app/src/main/java/org/kb10uy/tencocoa/StatusDetailDialogFragment.java index 21fa1b5..d4bb344 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/StatusDetailDialogFragment.java +++ b/app/src/main/java/org/kb10uy/tencocoa/StatusDetailDialogFragment.java @@ -52,7 +52,7 @@ private void setStatusInfo(Dialog view) { ((TextView) view.findViewById(R.id.StatusDetailTextViewScreenName)).setText(user.getScreenName()); ((TextView) view.findViewById(R.id.StatusDetailTextViewStatusText)).setText(mTargetStatus.getReplacedText()); ((TextView) view.findViewById(R.id.StatusDetailTextViewCreatedAt)).setText(TencocoaHelper.getAbsoluteTimeString(mTargetStatus.getShowingStatus().getCreatedAt())); - Glide.with(getActivity()).load(user.getOriginalProfileImageURLHttps()).into(((ImageView) view.findViewById(R.id.StatusDetailImageViewUserProfile))); + Glide.with(getActivity()).load(user.getBiggerProfileImageURLHttps()).into(((ImageView) view.findViewById(R.id.StatusDetailImageViewUserProfile))); ToggleButton tbFav = (ToggleButton) view.findViewById(R.id.StatusDetailButtonFav); tbFav.setChecked(mTargetStatus.isFavorited()); @@ -72,6 +72,14 @@ private void setStatusInfo(Dialog view) { mListener.onStatusDetailAction(ACTION_RETWEET, mTargetStatus); dismiss(); }); + view.findViewById(R.id.StatusDetailButtonReply).setOnClickListener(v -> { + mListener.onStatusDetailAction(ACTION_RETWEET, mTargetStatus); + dismiss(); + }); + view.findViewById(R.id.StatusDetailButtonReplyBlank).setOnClickListener(v -> { + mListener.onStatusDetailAction(ACTION_RETWEET, mTargetStatus); + dismiss(); + }); view.findViewById(R.id.StatusDetailButtonOthers).setOnClickListener(v -> { dismiss(); //favorite(); @@ -117,6 +125,8 @@ public void onDetach() { public static final int ACTION_FAVORITE_AND_RETWEET = 3; public static final int ACTION_RETWEET = 4; public static final int ACTION_UNRETWEET = 5; + public static final int ACTION_REPLY = 6; + public static final int ACTION_REPLY_BLANK = 7; public interface StatusDetailInteractionListener { void onStatusDetailAction(int type, TencocoaStatus status); diff --git a/app/src/main/java/org/kb10uy/tencocoa/TencocoaWritePermissionService.java b/app/src/main/java/org/kb10uy/tencocoa/TencocoaWritePermissionService.java index 8ea1364..34a44a3 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/TencocoaWritePermissionService.java +++ b/app/src/main/java/org/kb10uy/tencocoa/TencocoaWritePermissionService.java @@ -13,6 +13,7 @@ import org.kb10uy.tencocoa.model.TwitterAccountInformation; import org.kb10uy.tencocoa.model.TwitterHelper; +import twitter4j.StatusUpdate; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.auth.AccessToken; @@ -101,6 +102,36 @@ protected void onPostExecute(String result) { task.execute(statusText); } + public void updateStatus(StatusUpdate status) { + AsyncTask task = new AsyncTask() { + @Override + protected String doInBackground(StatusUpdate... params) { + if (currentUser == null) return null; + try { + mTwitter.tweets().updateStatus(params[0]); + return ""; + } catch (TwitterException e) { + e.printStackTrace(); + return e.getErrorMessage(); + } + } + + @Override + protected void onPostExecute(String result) { + super.onPostExecute(result); + if (result.equals("")) { + showNotification(R.string.notification_update_status_success, R.string.notification_update_status_success); + } else { + StringBuilder sb = new StringBuilder(); + sb.append(getString(R.string.notification_update_status_fail)); + sb.append(result); + showNotification(sb.toString(), sb.toString()); + } + } + }; + task.execute(status); + } + public void favoriteStatus(long id) { AsyncTask task = new AsyncTask() { @Override diff --git a/app/src/main/java/org/kb10uy/tencocoa/model/TencocoaHelper.java b/app/src/main/java/org/kb10uy/tencocoa/model/TencocoaHelper.java index d4c5ebe..071494a 100644 --- a/app/src/main/java/org/kb10uy/tencocoa/model/TencocoaHelper.java +++ b/app/src/main/java/org/kb10uy/tencocoa/model/TencocoaHelper.java @@ -18,6 +18,10 @@ import java.util.Date; import java.util.Locale; +import twitter4j.Status; +import twitter4j.User; +import twitter4j.UserMentionEntity; + public class TencocoaHelper { public static final char numberSuffixes[] = new char[]{' ', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'}; private static SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault()); @@ -103,4 +107,18 @@ public static void setCurrentTheme(Context ctx, String theme) { break; } } + + public static String createReplyTemplate(TencocoaStatus status) { + StringBuilder builder = new StringBuilder(); + Status target = status.getShowingStatus(); + User tweeter = target.getUser(); + builder.append("@").append(target.getUser().getScreenName()).append(" "); + UserMentionEntity[] entities = target.getUserMentionEntities(); + if (entities == null) return builder.toString(); + for (UserMentionEntity e : entities) { + if (tweeter.getId() == e.getId()) continue; + builder.append("@").append(e.getScreenName()).append(" "); + } + return builder.toString(); + } } diff --git a/app/src/main/res/layout-sw600dp/fragment_status_detail_dialog.xml b/app/src/main/res/layout-sw600dp/fragment_status_detail_dialog.xml index 4dc2a06..577159e 100644 --- a/app/src/main/res/layout-sw600dp/fragment_status_detail_dialog.xml +++ b/app/src/main/res/layout-sw600dp/fragment_status_detail_dialog.xml @@ -87,6 +87,15 @@ android:layout_height="wrap_content" android:orientation="horizontal"> + + + + + +